prisma-effect-kysely 5.3.4 → 5.4.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 +36 -0
- package/dist/effect/join-table.d.ts +2 -2
- package/dist/effect/join-table.d.ts.map +1 -1
- package/dist/effect/join-table.js +5 -14
- package/dist/effect/join-table.js.map +1 -1
- package/dist/kysely/type.d.ts.map +1 -1
- package/dist/kysely/type.js +5 -0
- package/dist/kysely/type.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,41 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 5.4.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- e1a7cbc: feat: use branded ID types in implicit M:N join table schemas
|
|
8
|
+
|
|
9
|
+
Join table schemas now reference branded ID types (e.g., `ProductId`, `SellerId`) instead of raw `Schema.UUID`/`Schema.String`/`Schema.Number`. This means Kysely queries on implicit many-to-many join tables return properly branded types, eliminating the need for manual `Schema.decodeSync` workarounds at query sites.
|
|
10
|
+
|
|
11
|
+
Before:
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
columnType(Schema.UUID, Schema.Never, Schema.Never);
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
After:
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
columnType(ProductId, Schema.Never, Schema.Never);
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
The branded ID schemas are guaranteed to exist in the generated output because they are emitted during model schema generation, which runs before join table generation.
|
|
24
|
+
|
|
25
|
+
## 5.3.5
|
|
26
|
+
|
|
27
|
+
### Patch Changes
|
|
28
|
+
|
|
29
|
+
- 167f816: fix: wrap Json fields with columnType to prevent Kysely TS2589
|
|
30
|
+
|
|
31
|
+
Kysely's built-in `InsertType<T>` and `UpdateType<T>` are distributive conditional
|
|
32
|
+
types that recursively expand `JsonValue` unions, causing TS2589 on `.values()` and
|
|
33
|
+
`.set()` calls for tables with Json fields.
|
|
34
|
+
|
|
35
|
+
By wrapping Json fields with `columnType(JsonValue, JsonValue, JsonValue)` in the
|
|
36
|
+
generated output, Kysely's `InsertType` takes the ColumnType fast path (extracts via
|
|
37
|
+
`infer`) instead of distributing over the recursive union.
|
|
38
|
+
|
|
3
39
|
## 5.3.4
|
|
4
40
|
|
|
5
41
|
### Patch Changes
|
|
@@ -12,7 +12,7 @@ import type { JoinTableInfo } from '../prisma/relation.js';
|
|
|
12
12
|
* Example:
|
|
13
13
|
* - Database columns: A, B (Prisma requirement for implicit many-to-many)
|
|
14
14
|
* - TypeScript fields: product_id, product_tag_id (semantic names)
|
|
15
|
-
* - Types: columnType(
|
|
15
|
+
* - Types: columnType(ProductId, Schema.Never, Schema.Never) (read-only, branded)
|
|
16
16
|
*/
|
|
17
|
-
export declare function generateJoinTableSchema(joinTable: JoinTableInfo,
|
|
17
|
+
export declare function generateJoinTableSchema(joinTable: JoinTableInfo, _dmmf: DMMF.Document): string;
|
|
18
18
|
//# sourceMappingURL=join-table.d.ts.map
|
|
@@ -1 +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,uBAAuB,CAAC;
|
|
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,uBAAuB,CAAC;AAG3D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,UA6BrF"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { isUuidField } from '../prisma/type.js';
|
|
2
1
|
import { toPascalCase, toSnakeCase } from '../utils/naming.js';
|
|
3
2
|
/**
|
|
4
3
|
* Generate Effect Schema for an implicit many-to-many join table
|
|
@@ -12,25 +11,17 @@ import { toPascalCase, toSnakeCase } from '../utils/naming.js';
|
|
|
12
11
|
* Example:
|
|
13
12
|
* - Database columns: A, B (Prisma requirement for implicit many-to-many)
|
|
14
13
|
* - TypeScript fields: product_id, product_tag_id (semantic names)
|
|
15
|
-
* - Types: columnType(
|
|
14
|
+
* - Types: columnType(ProductId, Schema.Never, Schema.Never) (read-only, branded)
|
|
16
15
|
*/
|
|
17
|
-
export function generateJoinTableSchema(joinTable,
|
|
16
|
+
export function generateJoinTableSchema(joinTable, _dmmf) {
|
|
18
17
|
const { tableName, relationName, modelA, modelB } = joinTable;
|
|
19
18
|
// Generate semantic snake_case field names from model names
|
|
20
19
|
// e.g., "Product" -> "product_id", "ProductTag" -> "product_tag_id"
|
|
21
20
|
const columnAFieldName = `${toSnakeCase(modelA)}_id`;
|
|
22
21
|
const columnBFieldName = `${toSnakeCase(modelB)}_id`;
|
|
23
|
-
//
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
const modelAIdField = modelADef?.fields.find((f) => f.isId);
|
|
27
|
-
const modelBIdField = modelBDef?.fields.find((f) => f.isId);
|
|
28
|
-
// Determine base schema type for each ID field
|
|
29
|
-
const modelABaseType = modelAIdField && isUuidField(modelAIdField) ? 'Schema.UUID' : 'Schema.String';
|
|
30
|
-
const modelBBaseType = modelBIdField && isUuidField(modelBIdField) ? 'Schema.UUID' : 'Schema.String';
|
|
31
|
-
// Handle Int ID fields
|
|
32
|
-
const modelASchemaType = modelAIdField?.type === 'Int' ? 'Schema.Number' : modelABaseType;
|
|
33
|
-
const modelBSchemaType = modelBIdField?.type === 'Int' ? 'Schema.Number' : modelBBaseType;
|
|
22
|
+
// Reference branded ID schemas (e.g., ProductId, SellerId) generated earlier in the output
|
|
23
|
+
const modelASchemaType = `${toPascalCase(modelA)}Id`;
|
|
24
|
+
const modelBSchemaType = `${toPascalCase(modelB)}Id`;
|
|
34
25
|
// Use columnType for read-only FK fields (can't insert/update join table rows directly)
|
|
35
26
|
// Schema.propertySignature + Schema.fromKey maps TypeScript name to database column
|
|
36
27
|
const columnAField = ` ${columnAFieldName}: Schema.propertySignature(columnType(${modelASchemaType}, Schema.Never, Schema.Never)).pipe(Schema.fromKey("A"))`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"join-table.js","sourceRoot":"","sources":["../../src/effect/join-table.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"join-table.js","sourceRoot":"","sources":["../../src/effect/join-table.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE/D;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,uBAAuB,CAAC,SAAwB,EAAE,KAAoB;IACpF,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAE9D,4DAA4D;IAC5D,oEAAoE;IACpE,MAAM,gBAAgB,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;IACrD,MAAM,gBAAgB,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC;IAErD,2FAA2F;IAC3F,MAAM,gBAAgB,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC;IACrD,MAAM,gBAAgB,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC;IAErD,wFAAwF;IACxF,oFAAoF;IACpF,MAAM,YAAY,GAAG,KAAK,gBAAgB,yCAAyC,gBAAgB,0DAA0D,CAAC;IAC9J,MAAM,YAAY,GAAG,KAAK,gBAAgB,yCAAyC,gBAAgB,0DAA0D,CAAC;IAE9J,oEAAoE;IACpE,MAAM,UAAU,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;IAE9C,oDAAoD;IACpD,OAAO,MAAM,SAAS;0BACE,MAAM,SAAS,MAAM;wBACvB,gBAAgB,KAAK,gBAAgB;eAC9C,UAAU;EACvB,YAAY;EACZ,YAAY;;cAEA,UAAU,aAAa,UAAU,GAAG,CAAC;AACnD,CAAC"}
|
|
@@ -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;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAI3D;;;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;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../src/kysely/type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAI3D;;;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;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,UAc1F;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,UAMrE;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,UAQhG;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,UAIzD;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,SAAS,EAAE,aAAa,UAIzE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,IAAI,CAAC,KAAK,EAAE,EAC7B,UAAU,GAAE,aAAa,EAAO,UAajC"}
|
package/dist/kysely/type.js
CHANGED
|
@@ -29,6 +29,11 @@ export function applyKyselyHelpers(fieldType, field, modelName) {
|
|
|
29
29
|
else if (needsGenerated(field)) {
|
|
30
30
|
return `generated(${fieldType})`;
|
|
31
31
|
}
|
|
32
|
+
// Wrap Json fields with columnType so Kysely's distributive InsertType/UpdateType
|
|
33
|
+
// takes the ColumnType fast path instead of recursively expanding JsonValue
|
|
34
|
+
if (field.type === 'Json') {
|
|
35
|
+
return `columnType(${fieldType}, ${fieldType}, ${fieldType})`;
|
|
36
|
+
}
|
|
32
37
|
return fieldType;
|
|
33
38
|
}
|
|
34
39
|
/**
|
package/dist/kysely/type.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/kysely/type.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"type.js","sourceRoot":"","sources":["../../src/kysely/type.ts"],"names":[],"mappings":"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"}
|