From 8fbf32490171e36016e231d394d6c31ccdc24a08 Mon Sep 17 00:00:00 2001 From: gonzaloriestra <14979109+gonzaloriestra@users.noreply.github.com> Date: Wed, 13 May 2026 00:50:38 +0000 Subject: [PATCH] [Refactor] Fix incorrect Promise.all usage in app preDeployValidation Corrected the Promise.all([this.allExtensions.map(...)]) anti-pattern to properly await extension validations. Added a regression test to ensure that rejections in extension validation are correctly caught by the app's preDeployValidation method. --- packages/app/src/cli/models/app/app.test.ts | 18 ++++++++++++++++++ packages/app/src/cli/models/app/app.ts | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/app/src/cli/models/app/app.test.ts b/packages/app/src/cli/models/app/app.test.ts index 954c5a22159..18c071ff861 100644 --- a/packages/app/src/cli/models/app/app.test.ts +++ b/packages/app/src/cli/models/app/app.test.ts @@ -851,3 +851,21 @@ function createPackageJson(tmpDir: string, type: string, version: string) { const dirPath = joinPath(tmpDir, 'node_modules', '@shopify', type) return mkdir(dirPath).then(() => writeFile(packagePath, JSON.stringify(packageJson))) } + +describe('preDeployValidation awaiting', () => { + test('awaits extension validation and catches rejections', async () => { + // Given + const extension = await testUIExtension() + vi.spyOn(extension, 'preDeployValidation').mockImplementation(async () => { + await new Promise((resolve) => setTimeout(resolve, 10)) + throw new Error('Validation failed') + }) + + const app = testApp({ + allExtensions: [extension], + }) + + // When / Then + await expect(app.preDeployValidation()).rejects.toThrow('Validation failed') + }) +}) diff --git a/packages/app/src/cli/models/app/app.ts b/packages/app/src/cli/models/app/app.ts index df707939e2b..3bf2b55b38b 100644 --- a/packages/app/src/cli/models/app/app.ts +++ b/packages/app/src/cli/models/app/app.ts @@ -405,7 +405,7 @@ export class App< } } - await Promise.all([this.allExtensions.map((ext) => ext.preDeployValidation())]) + await Promise.all(this.allExtensions.map((ext) => ext.preDeployValidation())) } extensionsForType(specification: {identifier: string; externalIdentifier: string}): ExtensionInstance[] {