Skip to content

Commit

Permalink
Changed compared key from name to type in generateJoinFields (#87)
Browse files Browse the repository at this point in the history
* Changed compared key from name to type in generateJoinFields

* Add changeset

---------

Co-authored-by: Valtýr Örn Kjartansson <[email protected]>
  • Loading branch information
Bayezid1989 and valtyr authored Feb 9, 2024
1 parent 4526321 commit 04de4dc
Show file tree
Hide file tree
Showing 3 changed files with 228 additions and 1 deletion.
5 changes: 5 additions & 0 deletions .changeset/cyan-kids-knock.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"prisma-kysely": patch
---

Fixed automatic relation code generation bug. Thanks @Bayezid1989 🥳
222 changes: 222 additions & 0 deletions src/helpers/generateImplicitManyToManyModels.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -290,3 +290,225 @@ test("it filters out many-to-one relations safely", () => {
},
]);
});

test("it generates correct field types when field types are defferent", () => {
const newModels = generateImplicitManyToManyModels([
{
name: "Category",
fields: [
{
name: "id",
type: "String",
isId: true,
hasDefaultValue: true,
isList: false,
isReadOnly: false,
isRequired: true,
isUnique: true,
kind: "scalar",
},
{
name: "posts",
kind: "object",
isList: true,
isRequired: true,
isUnique: false,
isId: false,
isReadOnly: false,
type: "Post",
hasDefaultValue: false,
relationName: "CategoryToPost",
relationFromFields: [],
relationToFields: [],
isGenerated: false,
isUpdatedAt: false,
},
],
primaryKey: null,
dbName: null,
uniqueFields: [],
uniqueIndexes: [],
},
{
name: "Post",
fields: [
{
name: "id",
type: "Int",
isId: true,
hasDefaultValue: true,
isList: false,
isReadOnly: false,
isRequired: true,
isUnique: true,
kind: "scalar",
},
{
name: "categories",
kind: "object",
isList: true,
isRequired: true,
isUnique: false,
isId: false,
isReadOnly: false,
type: "Category",
hasDefaultValue: false,
relationName: "CategoryToPost",
relationFromFields: [],
relationToFields: [],
isGenerated: false,
isUpdatedAt: false,
},
],
primaryKey: null,
dbName: null,
uniqueFields: [],
uniqueIndexes: [],
},
]);

expect(newModels).toEqual<DMMF.Model[]>([
{
name: "CategoryToPost",
dbName: "_CategoryToPost",
fields: [
{
hasDefaultValue: false,
isId: false,
isList: false,
isReadOnly: true,
isRequired: true,
isUnique: false,
kind: "scalar",
name: "A",
type: "String",
},
{
hasDefaultValue: false,
isId: false,
isList: false,
isReadOnly: true,
isRequired: true,
isUnique: false,
kind: "scalar",
name: "B",
type: "Int",
},
],
primaryKey: null,
uniqueFields: [],
uniqueIndexes: [],
},
]);
});

test("it generates correct field types when a field name is defferent from model name", () => {
const newModels = generateImplicitManyToManyModels([
{
name: "Category",
fields: [
{
name: "id",
type: "String",
isId: true,
hasDefaultValue: true,
isList: false,
isReadOnly: false,
isRequired: true,
isUnique: true,
kind: "scalar",
},
{
name: "articles",
kind: "object",
isList: true,
isRequired: true,
isUnique: false,
isId: false,
isReadOnly: false,
type: "Post",
hasDefaultValue: false,
relationName: "CategoryToPost",
relationFromFields: [],
relationToFields: [],
isGenerated: false,
isUpdatedAt: false,
},
],
primaryKey: null,
dbName: null,
uniqueFields: [],
uniqueIndexes: [],
},
{
name: "Post",
fields: [
{
name: "id",
type: "Int",
isId: true,
hasDefaultValue: true,
isList: false,
isReadOnly: false,
isRequired: true,
isUnique: true,
kind: "scalar",
},
{
name: "categories",
kind: "object",
isList: true,
isRequired: true,
isUnique: false,
isId: false,
isReadOnly: false,
type: "Category",
hasDefaultValue: false,
relationName: "CategoryToPost",
relationFromFields: [],
relationToFields: [],
isGenerated: false,
isUpdatedAt: false,
},
],
primaryKey: null,
dbName: null,
uniqueFields: [],
uniqueIndexes: [],
},
]);

expect(newModels).toEqual<DMMF.Model[]>([
{
name: "CategoryToPost",
dbName: "_CategoryToPost",
fields: [
{
hasDefaultValue: false,
isId: false,
isList: false,
isReadOnly: true,
isRequired: true,
isUnique: false,
kind: "scalar",
name: "A",
type: "String",
},
{
hasDefaultValue: false,
isId: false,
isList: false,
isReadOnly: true,
isRequired: true,
isUnique: false,
kind: "scalar",
name: "B",
type: "Int",
},
],
primaryKey: null,
uniqueFields: [],
uniqueIndexes: [],
},
]);
});
2 changes: 1 addition & 1 deletion src/helpers/generateImplicitManyToManyModels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ function generateJoinFields(
): DMMF.Field[] {
if (fields.length !== 2) throw new Error("Huh?");

const sortedFields = sorted(fields, (a, b) => a.name.localeCompare(b.name));
const sortedFields = sorted(fields, (a, b) => a.type.localeCompare(b.type));
const A = sortedFields[0];
const B = sortedFields[1];

Expand Down

0 comments on commit 04de4dc

Please sign in to comment.