diff --git a/.changeset/fix-org-not-found-error.md b/.changeset/fix-org-not-found-error.md new file mode 100644 index 00000000000..eae2e65b2bc --- /dev/null +++ b/.changeset/fix-org-not-found-error.md @@ -0,0 +1,5 @@ +--- +'@shopify/app': patch +--- + +Fix crash when organization is not found in app-management-client by throwing NoOrgError instead of accessing properties on undefined diff --git a/packages/app/src/cli/utilities/developer-platform-client/app-management-client.test.ts b/packages/app/src/cli/utilities/developer-platform-client/app-management-client.test.ts index 38dbe655974..847387e98af 100644 --- a/packages/app/src/cli/utilities/developer-platform-client/app-management-client.test.ts +++ b/packages/app/src/cli/utilities/developer-platform-client/app-management-client.test.ts @@ -1772,6 +1772,28 @@ describe('organizations', () => { }) }) +describe('orgAndApps', () => { + test('throws NoOrgError if organization is not found', async () => { + // Given + const client = AppManagementClient.getInstance() + client.businessPlatformToken = () => Promise.resolve('business-platform-token') + client.session = () => Promise.resolve({token: '', accountInfo: {type: 'UnknownAccount'}}) as any + + vi.mocked(businessPlatformRequestDoc).mockResolvedValue({ + currentUserAccount: {organization: null}, + }) + vi.mocked(appManagementRequestDoc).mockResolvedValue({ + appsConnection: {edges: [], pageInfo: {hasNextPage: false}}, + }) + + // When + const got = () => client.orgAndApps('1') + + // Then + await expect(got).rejects.toThrow('No Organization found') + }) +}) + describe('singleton pattern', () => { test('getInstance returns the same instance', () => { // Given/When diff --git a/packages/app/src/cli/utilities/developer-platform-client/app-management-client.ts b/packages/app/src/cli/utilities/developer-platform-client/app-management-client.ts index fafa1512a97..168fcc8c0b8 100644 --- a/packages/app/src/cli/utilities/developer-platform-client/app-management-client.ts +++ b/packages/app/src/cli/utilities/developer-platform-client/app-management-client.ts @@ -7,6 +7,7 @@ import { OrganizationExpFlagsQueryVariables, OrganizationExpFlags, } from '../../api/graphql/business-platform-organizations/generated/organization_exp_flags.js' +import {NoOrgError} from '../../services/dev/fetch.js' import {environmentVariableNames} from '../../constants.js' import {RemoteSpecification} from '../../api/graphql/extension_specifications.js' import { @@ -411,7 +412,11 @@ export class AppManagementClient implements DeveloperPlatformClient { this.orgFromId(organizationId), this.appsForOrg(organizationId), ]) - return {organization: organization!, apps, hasMorePages} + if (!organization) { + const {accountInfo} = await this.session() + throw new NoOrgError(accountInfo, organizationId) + } + return {organization, apps, hasMorePages} } async appsForOrg(organizationId: string, term = ''): Promise> {