From d1cbe4c61ed99bbeccf1be49721e0aa7b74edd71 Mon Sep 17 00:00:00 2001 From: Harminder Virk Date: Fri, 14 Feb 2025 11:11:36 +0530 Subject: [PATCH] fix: relationships to accept ids (#11399) --- .changeset/great-badgers-play.md | 6 ++ packages/core/types/src/dml/index.ts | 28 ++++++++ .../__tests__/medusa-service-typings.spec.ts | 65 ++++++++++++++++++- .../src/modules-sdk/types/medusa-service.ts | 5 +- 4 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 .changeset/great-badgers-play.md diff --git a/.changeset/great-badgers-play.md b/.changeset/great-badgers-play.md new file mode 100644 index 0000000000..0adb7261bc --- /dev/null +++ b/.changeset/great-badgers-play.md @@ -0,0 +1,6 @@ +--- +"@medusajs/types": patch +"@medusajs/utils": patch +--- + +fix: relationships to accept ids diff --git a/packages/core/types/src/dml/index.ts b/packages/core/types/src/dml/index.ts index 3f25730a07..adff56b039 100644 --- a/packages/core/types/src/dml/index.ts +++ b/packages/core/types/src/dml/index.ts @@ -213,6 +213,27 @@ export type InferSchemaFields = Prettify< } & InferForeignKeys > +/** + * Infers the types of the schema fields from the DML entity + * for module services + */ +export type InferSchemaFieldsForModuleServices = + Prettify< + { + [K in keyof Schema]: Schema[K] extends RelationshipType + ? Schema[K]["type"] extends "belongsTo" + ? string + : Schema[K]["type"] extends "hasOne" | "hasOneWithFK" + ? string + : Schema[K]["type"] extends "hasMany" + ? string[] + : Schema[K]["type"] extends "manyToMany" + ? string[] + : never + : Schema[K]["$dataType"] + } & InferForeignKeys + > + /** * Infers the schema properties without the relationships */ @@ -247,6 +268,13 @@ export type Infer = T extends IDmlEntity ? EntityConstructor> : never +export type InferEntityForModuleService = T extends IDmlEntity< + infer Schema, + any +> + ? InferSchemaFieldsForModuleServices + : never + /** * The actions to cascade from a given entity to its * relationship. diff --git a/packages/core/utils/src/modules-sdk/__tests__/medusa-service-typings.spec.ts b/packages/core/utils/src/modules-sdk/__tests__/medusa-service-typings.spec.ts index 47dc55e549..2037c89b4f 100644 --- a/packages/core/utils/src/modules-sdk/__tests__/medusa-service-typings.spec.ts +++ b/packages/core/utils/src/modules-sdk/__tests__/medusa-service-typings.spec.ts @@ -6,9 +6,28 @@ import { InferTypeOf } from "@medusajs/types" const Blog = model.define("Blog", { id: model.text(), title: model.text(), + tags: model.manyToMany(() => Tag), + comments: model.hasMany(() => Comment), description: model.text().nullable(), }) +const Tag = model.define("Tag", { + id: model.text(), + title: model.text(), +}) + +const Comment = model.define("Comment", { + id: model.text(), + post: model.belongsTo(() => Blog), + author: model.belongsTo(() => User), + description: model.text().nullable(), +}) + +const User = model.define("User", { + id: model.text(), + username: model.text(), +}) + type BlogDTO = { id: number title: string @@ -55,7 +74,7 @@ const containerMock = { describe("Medusa Service typings", () => { describe("create", () => { test("type-hint model properties", () => { - class BlogService extends MedusaService({ Blog }) {} + class BlogService extends MedusaService({ Blog, Comment }) {} const blogService = new BlogService(containerMock) expectTypeOf(blogService.createBlogs).parameters.toEqualTypeOf< @@ -63,6 +82,8 @@ describe("Medusa Service typings", () => { Partial<{ id: string | undefined title: string | undefined + comments: string[] | undefined + tags: string[] | undefined description: string | null | undefined }>, ...rest: any[] @@ -71,6 +92,36 @@ describe("Medusa Service typings", () => { Partial<{ id: string | undefined title: string | undefined + comments: string[] | undefined + tags: string[] | undefined + description: string | null | undefined + }>[], + ...rest: any[] + ] + >() + expectTypeOf(blogService.createBlogs).returns.toEqualTypeOf< + Promise> | Promise[]> + >() + + expectTypeOf(blogService.createComments).parameters.toEqualTypeOf< + | [ + Partial<{ + id: string | undefined + post: string | undefined + author: string | undefined + post_id: string | undefined + author_id: string | undefined + description: string | null | undefined + }>, + ...rest: any[] + ] + | [ + Partial<{ + id: string | undefined + post: string | undefined + author: string | undefined + post_id: string | undefined + author_id: string | undefined description: string | null | undefined }>[], ...rest: any[] @@ -143,6 +194,8 @@ describe("Medusa Service typings", () => { Partial<{ id: string | undefined title: string | undefined + comments: string[] | undefined + tags: string[] | undefined description: string | null | undefined }>, ...rest: any[] @@ -152,6 +205,8 @@ describe("Medusa Service typings", () => { | Partial<{ id: string | undefined title: string | undefined + comments: string[] | undefined + tags: string[] | undefined description: string | null | undefined }>[] | { @@ -160,11 +215,15 @@ describe("Medusa Service typings", () => { | Partial<{ id: string | undefined title: string | undefined + comments: string[] | undefined + tags: string[] | undefined description: string | null | undefined }> | Partial<{ id: string | undefined title: string | undefined + comments: string[] | undefined + tags: string[] | undefined description: string | null | undefined }>[] } @@ -174,11 +233,15 @@ describe("Medusa Service typings", () => { | Partial<{ id: string | undefined title: string | undefined + comments: string[] | undefined + tags: string[] | undefined description: string | null | undefined }> | Partial<{ id: string | undefined title: string | undefined + comments: string[] | undefined + tags: string[] | undefined description: string | null | undefined }>[] }[] diff --git a/packages/core/utils/src/modules-sdk/types/medusa-service.ts b/packages/core/utils/src/modules-sdk/types/medusa-service.ts index eb66ceeae9..f6ec59eb59 100644 --- a/packages/core/utils/src/modules-sdk/types/medusa-service.ts +++ b/packages/core/utils/src/modules-sdk/types/medusa-service.ts @@ -3,11 +3,12 @@ import { Context, FindConfig, IDmlEntity, - InferEntityType, Pluralize, Prettify, RestoreReturn, SoftDeleteReturn, + InferEntityType, + InferEntityForModuleService, } from "@medusajs/types" import { DmlEntity } from "../../dml" @@ -45,7 +46,7 @@ export type ModelConfigurationsToConfigTemplate = { ? InstanceType : any inputDto: T[Key] extends DmlEntity - ? Omit, DMLDTOExcludeProperties> + ? Omit, DMLDTOExcludeProperties> : T[Key] extends Constructor ? InstanceType : any