From fd3965974dc0b750d377ff621387d34611760957 Mon Sep 17 00:00:00 2001 From: Adrien de Peretti Date: Wed, 10 Dec 2025 19:38:06 +0100 Subject: [PATCH] feat(): Pluralized props for list readonly link (#14190) * feat(): Pluralized props for list readonly link * Create perfect-jeans-end.md * handle backward compat * Add tests case --- .changeset/perfect-jeans-end.md | 5 ++ .../link-modules/define-link.spec.ts | 61 +++++++++++++++++++ .../core/utils/src/modules-sdk/define-link.ts | 51 +++++++++++----- 3 files changed, 102 insertions(+), 15 deletions(-) create mode 100644 .changeset/perfect-jeans-end.md diff --git a/.changeset/perfect-jeans-end.md b/.changeset/perfect-jeans-end.md new file mode 100644 index 0000000000..dfe1e286f9 --- /dev/null +++ b/.changeset/perfect-jeans-end.md @@ -0,0 +1,5 @@ +--- +"@medusajs/utils": patch +--- + +feat(): Pluralized props for list readonly link diff --git a/integration-tests/modules/__tests__/link-modules/define-link.spec.ts b/integration-tests/modules/__tests__/link-modules/define-link.spec.ts index 83cfa8ff64..133fd8d620 100644 --- a/integration-tests/modules/__tests__/link-modules/define-link.spec.ts +++ b/integration-tests/modules/__tests__/link-modules/define-link.spec.ts @@ -627,6 +627,67 @@ medusaIntegrationTestRunner({ ], }) }) + + it("should generate a read-only link definition with pluralized alias when isList is true", async () => { + const currencyLinks = CurrencyModule.linkable + const regionLinks = RegionModule.linkable + + defineLink( + { + linkable: currencyLinks.currency, + field: "region_id", + }, + { + linkable: regionLinks.region, + }, + { + readOnly: true, + isList: true, + } + ) + + const linkDefinition = MedusaModule.getCustomLinks() + .map((linkDefinition: any) => { + const definition = linkDefinition( + MedusaModule.getAllJoinerConfigs() + ) + return definition.isReadOnlyLink && definition + }) + .filter(Boolean)[0] + + expect(linkDefinition).toEqual({ + isLink: true, + isReadOnlyLink: true, + extends: [ + { + serviceName: "currency", + entity: "Currency", + fieldAlias: undefined, + relationship: { + serviceName: "region", + entity: "Region", + primaryKey: "id", + foreignKey: "region_id", + alias: "region", + isList: true, + }, + }, + { + serviceName: "currency", + entity: "Currency", + fieldAlias: undefined, + relationship: { + serviceName: "region", + entity: "Region", + primaryKey: "id", + foreignKey: "region_id", + alias: "regions", + isList: true, + }, + }, + ], + }) + }) }) }, }) diff --git a/packages/core/utils/src/modules-sdk/define-link.ts b/packages/core/utils/src/modules-sdk/define-link.ts index af7beb7d01..6ae8568e93 100644 --- a/packages/core/utils/src/modules-sdk/define-link.ts +++ b/packages/core/utils/src/modules-sdk/define-link.ts @@ -517,24 +517,45 @@ ${serviceBObj.module}: { }`) } + const extendsConfig: ModuleJoinerConfig["extends"] = [ + { + serviceName: serviceAObj.module, + entity: serviceAObj.entity, + fieldAlias: buildFieldAlias(readOnlyLinkOptions?.shortcut), + relationship: { + serviceName: serviceBObj.module, + entity: serviceBObj.entity, + primaryKey: serviceBObj.primaryKey, + foreignKey: serviceAObj.field, + alias: serviceBObj.alias, + isList: readOnlyLinkOptions?.isList ?? serviceAObj.isList, + }, + }, + ] + + if (readOnlyLinkOptions?.isList || serviceAObj.isList) { + extendsConfig.push({ + serviceName: serviceAObj.module, + entity: serviceAObj.entity, + fieldAlias: buildFieldAlias(readOnlyLinkOptions?.shortcut), + relationship: { + serviceName: serviceBObj.module, + entity: serviceBObj.entity, + primaryKey: serviceBObj.primaryKey, + foreignKey: serviceAObj.field, + alias: + readOnlyLinkOptions?.isList ?? serviceAObj.isList + ? pluralize(serviceBObj.alias) + : serviceBObj.alias, + isList: readOnlyLinkOptions?.isList ?? serviceAObj.isList, + }, + }) + } + return { isLink: true, isReadOnlyLink: true, - extends: [ - { - serviceName: serviceAObj.module, - entity: serviceAObj.entity, - fieldAlias: buildFieldAlias(readOnlyLinkOptions?.shortcut), - relationship: { - serviceName: serviceBObj.module, - entity: serviceBObj.entity, - primaryKey: serviceBObj.primaryKey, - foreignKey: serviceAObj.field, - alias: serviceBObj.alias, - isList: readOnlyLinkOptions?.isList ?? serviceAObj.isList, - }, - }, - ], + extends: extendsConfig, } }