diff --git a/.changeset/tricky-ways-join.md b/.changeset/tricky-ways-join.md new file mode 100644 index 0000000000..1623e2730f --- /dev/null +++ b/.changeset/tricky-ways-join.md @@ -0,0 +1,6 @@ +--- +"@medusajs/orchestration": patch +"@medusajs/modules-sdk": patch +--- + +Remote joiner options autoCreateServiceNameAlias diff --git a/packages/modules-sdk/src/remote-query.ts b/packages/modules-sdk/src/remote-query.ts index e630c252c6..123149f7ec 100644 --- a/packages/modules-sdk/src/remote-query.ts +++ b/packages/modules-sdk/src/remote-query.ts @@ -58,7 +58,8 @@ export class RemoteQuery { this.remoteJoiner = new RemoteJoiner( servicesConfig_ as JoinerServiceConfig[], - this.remoteFetchData.bind(this) + this.remoteFetchData.bind(this), + { autoCreateServiceNameAlias: false } ) } diff --git a/packages/orchestration/src/__tests__/joiner/remote-joiner-data.ts b/packages/orchestration/src/__tests__/joiner/remote-joiner-data.ts index 72f0083187..54ecbe554a 100644 --- a/packages/orchestration/src/__tests__/joiner/remote-joiner-data.ts +++ b/packages/orchestration/src/__tests__/joiner/remote-joiner-data.ts @@ -768,4 +768,38 @@ describe("RemoteJoiner", () => { }, }) }) + + it("It shouldn't register the service name as an alias if option autoCreateServiceNameAlias is false", async () => { + const newJoiner = new RemoteJoiner( + serviceConfigs, + fetchServiceDataCallback, + { autoCreateServiceNameAlias: false } + ) + + const query = { + service: "user", + fields: ["id", "name", "email"], + } + + const data = await newJoiner.query(query) + + expect(data).toEqual( + expect.arrayContaining([ + { + id: 1, + name: "John Doe", + email: "johndoe@example.com", + }, + ]) + ) + + const queryWithAlias = { + alias: "user", + fields: ["id", "name", "email"], + } + + expect(newJoiner.query(queryWithAlias)).rejects.toThrowError( + `Service with alias "user" was not found.` + ) + }) }) diff --git a/packages/orchestration/src/joiner/remote-joiner.ts b/packages/orchestration/src/joiner/remote-joiner.ts index a4ccf74d9c..a42959a5b1 100644 --- a/packages/orchestration/src/joiner/remote-joiner.ts +++ b/packages/orchestration/src/joiner/remote-joiner.ts @@ -119,9 +119,16 @@ export class RemoteJoiner { constructor( private serviceConfigs: ModuleJoinerConfig[], - private remoteFetchData: RemoteFetchDataCallback + private remoteFetchData: RemoteFetchDataCallback, + private options: { + autoCreateServiceNameAlias?: boolean + } = {} ) { - this.serviceConfigs = this.buildReferences(serviceConfigs) + this.options.autoCreateServiceNameAlias ??= true + + this.serviceConfigs = this.buildReferences( + JSON.parse(JSON.stringify(serviceConfigs)) + ) } public setFetchDataCallback(remoteFetchData: RemoteFetchDataCallback): void { @@ -133,6 +140,7 @@ export class RemoteJoiner { string, { fieldAlias; relationships: JoinerRelationship[] } > = new Map() + for (const service of serviceConfigs) { if (this.serviceConfigCache.has(service.serviceName!)) { throw new Error(`Service "${service.serviceName}" is already defined.`) @@ -152,7 +160,9 @@ export class RemoteJoiner { service.alias = [service.alias] } - service.alias.push({ name: service.serviceName! }) + if (this.options.autoCreateServiceNameAlias) { + service.alias.push({ name: service.serviceName! }) + } // handle alias.name as array for (let idx = 0; idx < service.alias.length; idx++) { @@ -197,7 +207,11 @@ export class RemoteJoiner { serviceName: service.serviceName!, args, }) - this.cacheServiceConfig(serviceConfigs, undefined, alias.name) + this.cacheServiceConfig( + serviceConfigs, + undefined, + alias.name as string + ) } this.cacheServiceConfig(serviceConfigs, service.serviceName) @@ -276,7 +290,7 @@ export class RemoteJoiner { private cacheServiceConfig( serviceConfigs, serviceName?: string, - serviceAlias?: string | string[] + serviceAlias?: string ): void { if (serviceAlias) { const name = `alias_${serviceAlias}`