diff --git a/packages/amplify-util-uibuilder/src/__tests__/shouldRenderComponents.test.ts b/packages/amplify-util-uibuilder/src/__tests__/shouldRenderComponents.test.ts index be53cf27936..94504846995 100644 --- a/packages/amplify-util-uibuilder/src/__tests__/shouldRenderComponents.test.ts +++ b/packages/amplify-util-uibuilder/src/__tests__/shouldRenderComponents.test.ts @@ -3,7 +3,6 @@ import { $TSContext, AmplifyCategories, AmplifySupportedService, CloudformationProviderFacade, } from 'amplify-cli-core'; import aws from 'aws-sdk'; // eslint-disable-line import/no-extraneous-dependencies -import { AmplifyStudioClient } from '../clients'; import { shouldRenderComponents } from '../commands/utils/shouldRenderComponents'; const awsMock = aws as any; @@ -34,7 +33,6 @@ CloudformationProviderFacade.isAmplifyAdminApp = jest.fn().mockReturnValue({ describe('should render components', () => { let context: $TSContext | any; - let client: AmplifyStudioClient; beforeAll(async () => { // set metadata response @@ -69,31 +67,29 @@ describe('should render components', () => { }, }, }; - - client = await AmplifyStudioClient.setClientInfo(context); }); it('works with a valid config', async () => { - const shouldIt = await shouldRenderComponents(context, client); + const shouldIt = await shouldRenderComponents(context); expect(shouldIt).toBe(true); }); it("doesn't work if --no-codegen flag is set", async () => { context.input.options['no-codegen'] = true; - const shouldIt = await shouldRenderComponents(context, client); + const shouldIt = await shouldRenderComponents(context); expect(shouldIt).toBe(false); }); it("doesn't work if provider is not awscloudformation", async () => { context.exeInfo.projectConfig.providers = []; - const shouldIt = await shouldRenderComponents(context, client); + const shouldIt = await shouldRenderComponents(context); expect(shouldIt).toBe(false); }); it('should return false if frontend is ios', async () => { context.exeInfo.projectConfig.frontend = 'ios'; - const shouldIt = await shouldRenderComponents(context, client); + const shouldIt = await shouldRenderComponents(context); expect(shouldIt).toBe(false); }); it('should return false if frontend is vue', async () => { context.exeInfo.projectConfig.javascript.framework = 'vue'; - const shouldIt = await shouldRenderComponents(context, client); + const shouldIt = await shouldRenderComponents(context); expect(shouldIt).toBe(false); }); }); diff --git a/packages/amplify-util-uibuilder/src/__tests__/syncAmplifyUiComponents.test.ts b/packages/amplify-util-uibuilder/src/__tests__/syncAmplifyUiComponents.test.ts index 7aa78bde0dd..b0d3d0ede9b 100644 --- a/packages/amplify-util-uibuilder/src/__tests__/syncAmplifyUiComponents.test.ts +++ b/packages/amplify-util-uibuilder/src/__tests__/syncAmplifyUiComponents.test.ts @@ -11,7 +11,6 @@ import { import { AmplifyStudioClient } from '../clients'; import * as createUiBuilderComponentDependency from '../commands/utils/codegenResources'; import { exampleSchema } from './utils'; -import { GenericDataModel, GenericDataSchema } from '@aws-amplify/codegen-ui'; jest.mock('amplify-cli-core', () => ({ ...jest.requireActual('amplify-cli-core'), @@ -21,7 +20,7 @@ jest.mock('amplify-cli-core', () => ({ }, })); jest.mock('../commands/utils/featureFlags', () => ({ - getTransformerVersion: jest.fn().mockImplementation(() => 2) + getTransformerVersion: jest.fn().mockReturnValue(2), })); const awsMock = aws as any; @@ -259,8 +258,11 @@ describe('should sync amplify ui builder components', () => { }); it('should not autogen forms for join tables or unsupported models', async () => { - expect(Object.keys(exampleSchema.models)).toStrictEqual(['Author', 'JoinTable', 'EmptyModel' ]) - createUiBuilderComponentDependencyMock.createUiBuilderForm = jest.fn().mockImplementation((context, schema, dataSchema) => ({name: schema.dataType.dataTypeName})); + expect(Object.keys(exampleSchema.models)).toStrictEqual(['Author', 'JoinTable', 'EmptyModel']); + createUiBuilderComponentDependencyMock.createUiBuilderForm = jest.fn().mockImplementation( + // eslint-disable-next-line @typescript-eslint/no-unused-vars + (_ctx, schema, _dataSchema) => ({ name: schema.dataType.dataTypeName }), + ); const forms = generateUiBuilderForms(context, [], exampleSchema, true); expect(forms.every(form => form.resultType === 'SUCCESS')).toBeTruthy(); // only create & update form for author model diff --git a/packages/amplify-util-uibuilder/src/clients/amplify-studio-client.ts b/packages/amplify-util-uibuilder/src/clients/amplify-studio-client.ts index 93572418c7b..67be2bf46e8 100644 --- a/packages/amplify-util-uibuilder/src/clients/amplify-studio-client.ts +++ b/packages/amplify-util-uibuilder/src/clients/amplify-studio-client.ts @@ -58,6 +58,22 @@ export default class AmplifyStudioClient { #envName: string; metadata: StudioMetadata; isGraphQLSupported = false; + + /** + * static function meant to check if given appId is studio enabled + */ + static isAmplifyApp = async (context: $TSContext, appId: string): Promise<boolean> => { + try { + const { isAdminApp } = await CloudformationProviderFacade.isAmplifyAdminApp(context, appId); + return isAdminApp; + } catch (err) { + // return false is admin app failed check + // this means we wont run codegen-ui + printer.debug(`Failed admin app check: ${err.message}`); + return false; + } + } + /** * Used to configure the AWS Amplify clients. */ @@ -230,13 +246,4 @@ export default class AmplifyStudioClient { throw new Error(`Models not found in AmplifyBackend:GetBackendAPIModels response: ${err.message}`); } }; - - isAmplifyApp = async (context: $TSContext): Promise<boolean> => { - try { - const { isAdminApp } = await CloudformationProviderFacade.isAmplifyAdminApp(context, this.#appId); - return isAdminApp; - } catch (err) { - throw new Error(`Failed admin app check: ${err.message}`); - } - } } diff --git a/packages/amplify-util-uibuilder/src/commands/generateComponents.ts b/packages/amplify-util-uibuilder/src/commands/generateComponents.ts index 1c9c476139e..f2284f3a384 100644 --- a/packages/amplify-util-uibuilder/src/commands/generateComponents.ts +++ b/packages/amplify-util-uibuilder/src/commands/generateComponents.ts @@ -19,12 +19,12 @@ import { * Pulls ui components from Studio backend and generates the code in the user's file system */ export const run = async (context: $TSContext): Promise<void> => { - const studioClient = await AmplifyStudioClient.setClientInfo(context); - if (!(await shouldRenderComponents(context, studioClient))) { + if (!(await shouldRenderComponents(context))) { return; } const spinner = ora(''); try { + const studioClient = await AmplifyStudioClient.setClientInfo(context); const [componentSchemas, themeSchemas, formSchemas, dataSchema] = await Promise.all([ studioClient.listComponents(), studioClient.listThemes(), diff --git a/packages/amplify-util-uibuilder/src/commands/utils/shouldRenderComponents.ts b/packages/amplify-util-uibuilder/src/commands/utils/shouldRenderComponents.ts index a7bfe07eb95..e973b0bb91d 100644 --- a/packages/amplify-util-uibuilder/src/commands/utils/shouldRenderComponents.ts +++ b/packages/amplify-util-uibuilder/src/commands/utils/shouldRenderComponents.ts @@ -2,11 +2,12 @@ import { $TSContext } from 'amplify-cli-core'; import { printer } from 'amplify-prompts'; import { AmplifyStudioClient } from '../../clients'; +import { getAppId } from './environmentHelpers'; /** * process to decide if we should render components */ -export const shouldRenderComponents = async (context: $TSContext, studioClient: AmplifyStudioClient): Promise<boolean> => { +export const shouldRenderComponents = async (context: $TSContext): Promise<boolean> => { if (process.env.FORCE_RENDER) { printer.debug('Forcing component render since environment variable flag is set.'); return true; @@ -36,7 +37,7 @@ export const shouldRenderComponents = async (context: $TSContext, studioClient: return false; } - if (!(await studioClient.isAmplifyApp(context))) { + if (!(await AmplifyStudioClient.isAmplifyApp(context, getAppId(context)))) { printer.debug('Not pulling components because this project is not Amplify Studio enabled.'); return false; }