From c36fa71f54cdce1fb889560c3254d8f662c03cae Mon Sep 17 00:00:00 2001 From: John Hockett Date: Tue, 19 Jul 2022 16:28:27 -0700 Subject: [PATCH] Revert "feat(uibuilder): nested collections support (#10763)" (#10777) This reverts commit 2918eb9fd4495f45a90c5de806e347ee1f03520e. --- .../src/aws-utils/aws-amplify-backend.ts | 16 +-- packages/amplify-util-uibuilder/package.json | 10 +- .../__tests__/cloneComponentsFromEnv.test.ts | 38 +++---- .../src/__tests__/generateComponents.test.ts | 72 ++++-------- .../__tests__/getAmplifyDataSchema.test.ts | 102 ----------------- .../__tests__/syncAmplifyUiComponents.test.ts | 36 +++--- .../src/clients/amplify-client-factory.ts | 90 --------------- .../src/clients/index.ts | 1 - .../src/commands/cloneComponentsFromEnv.ts | 57 +++++----- .../src/commands/generateComponents.ts | 18 +-- .../commands/utils/amplifyUiBuilderService.ts | 22 ++++ .../utils/createUiBuilderComponent.ts | 16 +-- .../src/commands/utils/environmentHelpers.ts | 32 ------ .../commands/utils/getAmplifyDataSchema.ts | 46 -------- .../utils/syncAmplifyUiBuilderComponents.ts | 107 ++++++++---------- yarn.lock | 24 ++-- 16 files changed, 176 insertions(+), 511 deletions(-) delete mode 100644 packages/amplify-util-uibuilder/src/__tests__/getAmplifyDataSchema.test.ts delete mode 100644 packages/amplify-util-uibuilder/src/clients/amplify-client-factory.ts delete mode 100644 packages/amplify-util-uibuilder/src/clients/index.ts create mode 100644 packages/amplify-util-uibuilder/src/commands/utils/amplifyUiBuilderService.ts delete mode 100644 packages/amplify-util-uibuilder/src/commands/utils/environmentHelpers.ts delete mode 100644 packages/amplify-util-uibuilder/src/commands/utils/getAmplifyDataSchema.ts diff --git a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-amplify-backend.ts b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-amplify-backend.ts index 45927959451..d74ae643a30 100644 --- a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-amplify-backend.ts +++ b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-amplify-backend.ts @@ -1,19 +1,13 @@ import AWS from 'aws-sdk'; -import { $TSContext } from 'amplify-cli-core'; import aws from './aws'; import { loadConfiguration } from '../configuration-manager'; +import { $TSContext } from 'amplify-cli-core'; -/** - * Amplify Backend Class - */ export class AmplifyBackend { private static instance: AmplifyBackend; private readonly context: $TSContext; public amplifyBackend: AWS.AmplifyBackend; - /** - * Configures the instance for the Amplify Backend Client - */ static async getInstance(context: $TSContext, options = {}): Promise { if (!AmplifyBackend.instance) { let cred = {}; @@ -29,12 +23,6 @@ export class AmplifyBackend { private constructor(context: $TSContext, creds, options = {}) { this.context = context; - const { AMPLIFY_BACKEND_ENDPOINT, AMPLIFY_BACKEND_REGION } = process.env; - this.amplifyBackend = new aws.AmplifyBackend({ - ...creds, - ...options, - ...(AMPLIFY_BACKEND_ENDPOINT && { endpoint: AMPLIFY_BACKEND_ENDPOINT }), - ...(AMPLIFY_BACKEND_REGION && { region: AMPLIFY_BACKEND_REGION }), - }); + this.amplifyBackend = new aws.AmplifyBackend({ ...creds, ...options }); } } diff --git a/packages/amplify-util-uibuilder/package.json b/packages/amplify-util-uibuilder/package.json index 08709db6464..59af90bf214 100644 --- a/packages/amplify-util-uibuilder/package.json +++ b/packages/amplify-util-uibuilder/package.json @@ -13,8 +13,8 @@ "access": "public" }, "dependencies": { - "@aws-amplify/codegen-ui": "^2.3.0", - "@aws-amplify/codegen-ui-react": "^2.3.0", + "@aws-amplify/codegen-ui": "^2.2.0", + "@aws-amplify/codegen-ui-react": "^2.2.0", "amplify-cli-core": "2.11.0", "amplify-prompts": "2.2.0", "aws-sdk": "^2.1113.0", @@ -22,7 +22,6 @@ }, "devDependencies": { "@types/fs-extra": "^8.0.1", - "@types/jest": "^26.0.20", "@types/semver": "^7.1.0" }, "jest": { @@ -34,7 +33,6 @@ "collectCoverage": true, "collectCoverageFrom": [ "src/**/*.ts", - "!**/*.test.ts", "!**/node_modules/**", "!src/__tests__/**", "!lib/**" @@ -45,7 +43,7 @@ ], "testEnvironment": "node", "testURL": "http://localhost/", - "testRegex": "((src/(__tests__|__e2e__|__e2e_v2__))/.*.test.ts)$", + "testRegex": "(src/(__tests__|__e2e__|__e2e_v2__)/.*.test.ts)$", "moduleFileExtensions": [ "ts", "tsx", @@ -61,4 +59,4 @@ "usePathForSuiteName": "true", "addFileAttribute": "true" } -} \ No newline at end of file +} diff --git a/packages/amplify-util-uibuilder/src/__tests__/cloneComponentsFromEnv.test.ts b/packages/amplify-util-uibuilder/src/__tests__/cloneComponentsFromEnv.test.ts index 01b3af4cda6..91cb3c6f486 100644 --- a/packages/amplify-util-uibuilder/src/__tests__/cloneComponentsFromEnv.test.ts +++ b/packages/amplify-util-uibuilder/src/__tests__/cloneComponentsFromEnv.test.ts @@ -1,23 +1,21 @@ import * as extractArgsDependency from '../commands/utils/extractArgs'; import * as listUiBuilderComponentsDependency from '../commands/utils/syncAmplifyUiBuilderComponents'; import { run } from '../commands/cloneComponentsFromEnv'; - -const extractArgsDependencyMock = extractArgsDependency as any; -const listUiBuilderComponentsDependencyMock = listUiBuilderComponentsDependency as any; - +const extractArgsDependency_mock = extractArgsDependency as any; +const listUiBuilderComponentsDependency_mock = listUiBuilderComponentsDependency as any; +jest.mock('aws-sdk', () => { + return { + AmplifyUIBuilder: jest.fn(() => { + return { + createComponent: () => ({ + promise: () => true, + }), + }; + }), + }; +}); jest.mock('../commands/utils/extractArgs'); jest.mock('../commands/utils/syncAmplifyUiBuilderComponents'); -jest.mock('../clients', () => ({ - AmplifyClientFactory: { - setClientInfo: jest.fn(), - amplifyUiBuilder: { - createComponent: () => ({ - promise: () => true, - }), - }, - amplifyBackend: jest.fn(), - }, -})); describe('can clone components to new environment', () => { let context: any; @@ -26,20 +24,14 @@ describe('can clone components to new environment', () => { amplify: { invokePluginMethod: () => true, }, - input: { - options: { - appId: 'testAppId', - envName: 'testEnvName', - }, - }, }; - extractArgsDependencyMock.extractArgs = jest.fn().mockImplementation(() => ({ + extractArgsDependency_mock.extractArgs = jest.fn().mockImplementation(() => ({ sourceEnvName: 'sourceEnvName', newEnvName: 'newEnvName', appId: 'appId', environmentName: 'environmentName', })); - listUiBuilderComponentsDependencyMock.listUiBuilderComponents = jest.fn().mockImplementation((context: any, envName: any) => { + listUiBuilderComponentsDependency_mock.listUiBuilderComponents = jest.fn().mockImplementation((context: any, envName: any) => { if (envName === 'newEnvName') { return { entities: [], diff --git a/packages/amplify-util-uibuilder/src/__tests__/generateComponents.test.ts b/packages/amplify-util-uibuilder/src/__tests__/generateComponents.test.ts index bd0289f9ef5..5f675d8da26 100644 --- a/packages/amplify-util-uibuilder/src/__tests__/generateComponents.test.ts +++ b/packages/amplify-util-uibuilder/src/__tests__/generateComponents.test.ts @@ -3,51 +3,31 @@ import * as notifyMissingPackagesDependency from '../commands/utils/notifyMissin import * as listUiBuilderComponentsDependency from '../commands/utils/syncAmplifyUiBuilderComponents'; import * as generateUiBuilderComponentsDependency from '../commands/utils/syncAmplifyUiBuilderComponents'; import * as generateUiBuilderThemesDependency from '../commands/utils/syncAmplifyUiBuilderComponents'; -import * as syncAmplifyBackendModelsDependency from '../commands/utils/getAmplifyDataSchema'; import * as listUiBuilderThemesDependency from '../commands/utils/syncAmplifyUiBuilderComponents'; import * as generateAmplifyUiBuilderIndexFileDependency from '../commands/utils/createUiBuilderComponent'; import { run } from '../commands/generateComponents'; - jest.mock('../commands/utils/syncAmplifyUiBuilderComponents'); jest.mock('../commands/utils/createUiBuilderComponent'); jest.mock('../commands/utils/shouldRenderComponents'); jest.mock('../commands/utils/notifyMissingPackages'); -jest.mock('../clients', () => ({ - AmplifyClientFactory: { - setClientInfo: jest.fn(), - amplifyUiBuilder: { - createComponent: () => ({ - promise: () => true, - }), - }, - amplifyBackend: jest.fn(), - }, -})); - -const shouldRenderComponentsDependencyMock = shouldRenderComponentsDependency as any; -const notifyMissingPackagesDependencyMock = notifyMissingPackagesDependency as any; -const listUiBuilderComponentsDependencyMock = listUiBuilderComponentsDependency as any; -const generateUiBuilderComponentsDependencyMock = generateUiBuilderComponentsDependency as any; -const generateUiBuilderThemesDependencyMock = generateUiBuilderThemesDependency as any; -const syncAmplifyBackendModelsDependencyMock = syncAmplifyBackendModelsDependency as any; -const listUiBuilderThemesDependencyMock = listUiBuilderThemesDependency as any; -const generateAmplifyUiBuilderIndexFileDependencyMock = generateAmplifyUiBuilderIndexFileDependency as any; +const shouldRenderComponentsDependency_mock = shouldRenderComponentsDependency as any; +const notifyMissingPackagesDependency_mock = notifyMissingPackagesDependency as any; +const listUiBuilderComponentsDependency_mock = listUiBuilderComponentsDependency as any; +const generateUiBuilderComponentsDependency_mock = generateUiBuilderComponentsDependency as any; +const generateUiBuilderThemesDependency_mock = generateUiBuilderThemesDependency as any; +const listUiBuilderThemesDependency_mock = listUiBuilderThemesDependency as any; +const generateAmplifyUiBuilderIndexFileDependency_mock = generateAmplifyUiBuilderIndexFileDependency as any; -shouldRenderComponentsDependencyMock.shouldRenderComponents = jest.fn().mockImplementation(() => true); -notifyMissingPackagesDependencyMock.notifyMissingPackages = jest.fn().mockImplementation(() => true); +shouldRenderComponentsDependency_mock.shouldRenderComponents = jest.fn().mockImplementation(() => true); +notifyMissingPackagesDependency_mock.notifyMissingPackages = jest.fn().mockImplementation(() => true); describe('can generate components', () => { let context: any; let schemas: any; + let generateUiBuilderComponents: any; + let generateUiBuilderThemes: any; beforeEach(() => { - context = { - input: { - options: { - appId: 'testAppId', - envName: 'testEnvName', - }, - }, - }; + context = {}; schemas = { entities: [ { @@ -58,29 +38,15 @@ describe('can generate components', () => { }, ], }; - listUiBuilderComponentsDependencyMock.listUiBuilderComponents = jest.fn().mockImplementation(() => schemas); - listUiBuilderThemesDependencyMock.listUiBuilderThemes = jest.fn().mockImplementation(() => schemas); - generateUiBuilderComponentsDependencyMock.generateUiBuilderComponents = jest.fn().mockImplementation(() => schemas.entities); - generateUiBuilderThemesDependencyMock.generateUiBuilderThemes = jest.fn().mockImplementation(() => schemas.entities); - syncAmplifyBackendModelsDependencyMock.getAmplifyBackendModels = jest.fn().mockImplementation(() => ({ - models: { - Blog: { - id: { - name: 'id', - isArray: false, - type: 'ID', - isRequired: true, - attributes: [], - }, - }, - }, - })); - generateAmplifyUiBuilderIndexFileDependencyMock.generateAmplifyUiBuilderIndexFile = jest.fn().mockImplementation(() => true); + listUiBuilderComponentsDependency_mock.listUiBuilderComponents = jest.fn().mockImplementation(() => schemas); + listUiBuilderThemesDependency_mock.listUiBuilderThemes = jest.fn().mockImplementation(() => schemas); + generateUiBuilderComponentsDependency_mock.generateUiBuilderComponents = jest.fn().mockImplementation(() => schemas.entities); + generateUiBuilderThemesDependency_mock.generateUiBuilderThemes = jest.fn().mockImplementation(() => schemas.entities); + generateAmplifyUiBuilderIndexFileDependency_mock.generateAmplifyUiBuilderIndexFile = jest.fn().mockImplementation(() => true); }); - it('runs generateComponents', async () => { await run(context); - expect(generateUiBuilderComponentsDependencyMock.generateUiBuilderComponents).toBeCalledTimes(1); - expect(generateUiBuilderThemesDependencyMock.generateUiBuilderThemes).toBeCalledTimes(1); + expect(generateUiBuilderComponentsDependency_mock.generateUiBuilderComponents).toBeCalledTimes(1); + expect(generateUiBuilderThemesDependency_mock.generateUiBuilderThemes).toBeCalledTimes(1); }); }); diff --git a/packages/amplify-util-uibuilder/src/__tests__/getAmplifyDataSchema.test.ts b/packages/amplify-util-uibuilder/src/__tests__/getAmplifyDataSchema.test.ts deleted file mode 100644 index 6a1e16fc62e..00000000000 --- a/packages/amplify-util-uibuilder/src/__tests__/getAmplifyDataSchema.test.ts +++ /dev/null @@ -1,102 +0,0 @@ -import aws, { AmplifyBackend } from 'aws-sdk'; // eslint-disable-line import/no-extraneous-dependencies -import { $TSContext, AmplifyCategories, AmplifySupportedService } from 'amplify-cli-core'; // eslint-disable-line import/no-extraneous-dependencies -import { getAmplifyDataSchema } from '../commands/utils/getAmplifyDataSchema'; -import { AmplifyClientFactory } from '../clients'; - -const awsMock = aws as any; - -jest.mock('amplify-cli-core', () => ({ - ...jest.requireActual('amplify-cli-core'), - stateManager: { - getCurrentMeta: jest.fn(() => ({ - [AmplifyCategories.API]: { - MyResourceName: { - service: AmplifySupportedService.APPSYNC, - }, - }, - })), - }, - FeatureFlags: { - getBoolean: () => false, - getNumber: () => 0, - }, -})); - -// eslint-disable-next-line spellcheck/spell-checker, no-useless-escape -const getMockedSchema = (): string => `export const schema = {\n \"models\": {\n \"Blog\": {\n \"name\": \"Blog\",\n \"fields\": {\n \"id\": {\n \"name\": \"id\",\n \"isArray\": false,\n \"type\": \"ID\",\n \"isRequired\": true,\n \"attributes\": []\n },\n \"title\": {\n \"name\": \"title\",\n \"isArray\": false,\n \"type\": \"String\",\n \"isRequired\": false,\n \"attributes\": []\n },\n \"content\": {\n \"name\": \"content\",\n \"isArray\": false,\n \"type\": \"String\",\n \"isRequired\": false,\n \"attributes\": []\n },\n \"status\": {\n \"name\": \"status\",\n \"isArray\": false,\n \"type\": {\n \"enum\": \"Status\"\n },\n \"isRequired\": false,\n \"attributes\": []\n },\n \"createdAt\": {\n \"name\": \"createdAt\",\n \"isArray\": false,\n \"type\": \"AWSDateTime\",\n \"isRequired\": false,\n \"attributes\": [],\n \"isReadOnly\": true\n },\n \"updatedAt\": {\n \"name\": \"updatedAt\",\n \"isArray\": false,\n \"type\": \"AWSDateTime\",\n \"isRequired\": false,\n \"attributes\": [],\n \"isReadOnly\": true\n }\n },\n \"syncable\": true,\n \"pluralName\": \"Blogs\",\n \"attributes\": [\n {\n \"type\": \"model\",\n \"properties\": {}\n },\n {\n \"type\": \"auth\",\n \"properties\": {\n \"rules\": [\n {\n \"allow\": \"public\",\n \"operations\": [\n \"create\",\n \"update\",\n \"delete\",\n \"read\"\n ]\n }\n ]\n }\n }\n ]\n }\n },\n \"enums\": {\n \"Status\": {\n \"name\": \"Status\",\n \"values\": [\n \"ENABLED\",\n \"DISABLED\"\n ]\n }\n },\n \"nonModels\": {},\n \"version\": \"demo\"\n};`; - -describe('should sync amplify backend models', () => { - let context: $TSContext | any; - - beforeEach(() => { - context = { - exeInfo: { - projectConfig: { - javascript: { - config: { - SourceDir: 'src', - }, - }, - }, - }, - amplify: { - invokePluginMethod: () => ({}), - }, - parameters: { - argv: [], - }, - input: { - options: { - appId: 'testAppId', - envName: 'testEnvName', - }, - }, - }; - AmplifyClientFactory.flushAll(); - }); - - it('should get AmplifyBackend', async () => { - await AmplifyClientFactory.setClientInfo(context); - const backend = AmplifyClientFactory.amplifyBackend; - expect(backend).toBeInstanceOf(AmplifyBackend); - }); - - it('should getAmplifyBackendModels', async () => { - awsMock.AmplifyBackend = jest.fn(() => ({ - getBackendAPIModels: jest.fn(() => ({ - promise: jest.fn(() => ({ - Models: getMockedSchema(), - })), - })), - })); - await AmplifyClientFactory.setClientInfo(context); - const { dataSchema } = await getAmplifyDataSchema(context, 'testEnv'); - expect(dataSchema).toBeDefined(); - expect(Object.keys(dataSchema!.models)).toContain('Blog'); - }); - - it('should handle Models not found', async () => { - awsMock.AmplifyBackend = jest.fn(() => ({ - getBackendAPIModels: jest.fn(() => ({ - promise: jest.fn(() => ({ - Models: undefined, - })), - })), - })); - await AmplifyClientFactory.setClientInfo(context); - const { dataSchema, error } = await getAmplifyDataSchema(context, 'testEnv'); - expect(dataSchema).toBeUndefined(); - expect(error?.message).toBe('Models not found in AmplifyBackend:GetBackendAPIModels response'); - }); - - it('should handle network error', async () => { - awsMock.AmplifyBackend = jest.fn(() => ({ - getBackendAPIModels: jest.fn(() => ({ - promise: jest.fn().mockRejectedValue(new Error('Network Error')), - })), - })); - await AmplifyClientFactory.setClientInfo(context); - const { error } = await getAmplifyDataSchema(context, 'testEnv'); - expect(error?.message).toBe('Network Error'); - }); -}); diff --git a/packages/amplify-util-uibuilder/src/__tests__/syncAmplifyUiComponents.test.ts b/packages/amplify-util-uibuilder/src/__tests__/syncAmplifyUiComponents.test.ts index cdd61907554..2dc62d38377 100644 --- a/packages/amplify-util-uibuilder/src/__tests__/syncAmplifyUiComponents.test.ts +++ b/packages/amplify-util-uibuilder/src/__tests__/syncAmplifyUiComponents.test.ts @@ -1,22 +1,19 @@ import { $TSContext } from 'amplify-cli-core'; -import aws from 'aws-sdk'; -import * as CLICore from 'amplify-cli-core'; import { generateUiBuilderComponents, + getEnvName, + getAppId, listUiBuilderComponents, listUiBuilderThemes, + resolveAppId, generateUiBuilderThemes, } from '../commands/utils/syncAmplifyUiBuilderComponents'; -import { - getEnvName, - getAppId, - resolveAppId, -} from '../commands/utils/environmentHelpers'; -import { AmplifyClientFactory } from '../clients'; +import { getAmplifyUIBuilderService } from '../commands/utils/amplifyUiBuilderService' +import aws from 'aws-sdk'; +import * as CLICore from 'amplify-cli-core'; import * as createUiBuilderComponentDependency from '../commands/utils/createUiBuilderComponent'; - const aws_mock = aws as any; -const createUiBuilderComponentDependencyMock = createUiBuilderComponentDependency as any; +const createUiBuilderComponentDependency_mock = createUiBuilderComponentDependency as any; describe('should sync amplify ui builder components', () => { let context: $TSContext | any; beforeEach(() => { @@ -71,8 +68,8 @@ describe('should sync amplify ui builder components', () => { })), })); - createUiBuilderComponentDependencyMock.createUiBuilderComponent = jest.fn(); - createUiBuilderComponentDependencyMock.createUiBuilderTheme = jest.fn(); + createUiBuilderComponentDependency_mock.createUiBuilderComponent = jest.fn(); + createUiBuilderComponentDependency_mock.createUiBuilderTheme = jest.fn(); }); it('pulls components from aws-sdk and passes them to createUiBuilderComponent', () => { @@ -80,14 +77,14 @@ describe('should sync amplify ui builder components', () => { }); it('does not throw an error when createUiBuilderComponent fails', () => { - createUiBuilderComponentDependencyMock.createUiBuilderComponent = jest.fn(() => { + createUiBuilderComponentDependency_mock.createUiBuilderComponent = jest.fn(() => { throw new Error('ahhh!'); }); expect(async () => generateUiBuilderComponents(context, [])).not.toThrow(); }); it('does not throw an error when createUiBuilderThemes fails', () => { - createUiBuilderComponentDependencyMock.createUiBuilderComponent = jest.fn(() => { + createUiBuilderComponentDependency_mock.createUiBuilderComponent = jest.fn(() => { throw new Error('ahhh!'); }); expect(async () => generateUiBuilderThemes(context, [])).not.toThrow(); @@ -96,8 +93,7 @@ describe('should sync amplify ui builder components', () => { it('can getAmplifyUIBuilderService', async () => { process.env.UI_BUILDER_ENDPOINT = 'https://mock-endpoint.com'; process.env.UI_BUILDER_REGION = 'mock-region'; - await AmplifyClientFactory.setClientInfo(context); - const service = AmplifyClientFactory.amplifyUiBuilder; + const service = await getAmplifyUIBuilderService(context, 'testEnv', 'testAppId'); expect(Object.keys(service)).toContain('exportComponents'); expect(Object.keys(service)).toContain('exportThemes'); }); @@ -128,24 +124,24 @@ describe('should sync amplify ui builder components', () => { expect(async () => await getAppId(context)).rejects.toThrowError(); }); it('can generate ui builder components', async () => { - createUiBuilderComponentDependencyMock.createUiBuilderComponent = jest.fn().mockImplementation(() => ({})); + createUiBuilderComponentDependency_mock.createUiBuilderComponent = jest.fn().mockImplementation(() => ({})); const components = generateUiBuilderComponents(context, [{}, {}]); expect(components.every(component => component.resultType === 'SUCCESS')).toBeTruthy(); }); it('can handle failed generation generate ui builder components', async () => { - createUiBuilderComponentDependencyMock.createUiBuilderComponent = jest.fn().mockImplementation(() => { + createUiBuilderComponentDependency_mock.createUiBuilderComponent = jest.fn().mockImplementation(() => { throw new Error('ahh!'); }); const components = generateUiBuilderComponents(context, [{}, {}]); expect(components.every(component => component.resultType === 'FAILURE')).toBeTruthy(); }); it('can generate ui builder themes', async () => { - createUiBuilderComponentDependencyMock.createUiBuilderTheme = jest.fn().mockImplementation(() => ({})); + createUiBuilderComponentDependency_mock.createUiBuilderTheme = jest.fn().mockImplementation(() => ({})); const themes = generateUiBuilderThemes(context, [{}, {}]); expect(themes.every(theme => theme.resultType === 'SUCCESS')).toBeTruthy(); }); it('can handle failed generation generate ui builder themes', async () => { - createUiBuilderComponentDependencyMock.createUiBuilderTheme = jest.fn().mockImplementation(() => { + createUiBuilderComponentDependency_mock.createUiBuilderTheme = jest.fn().mockImplementation(() => { throw new Error('ahh!'); }); const themes = generateUiBuilderThemes(context, [{}, {}]); diff --git a/packages/amplify-util-uibuilder/src/clients/amplify-client-factory.ts b/packages/amplify-util-uibuilder/src/clients/amplify-client-factory.ts deleted file mode 100644 index 3a9b51af258..00000000000 --- a/packages/amplify-util-uibuilder/src/clients/amplify-client-factory.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { $TSAny, $TSContext } from 'amplify-cli-core'; -import { AmplifyUIBuilder, AmplifyBackend } from 'aws-sdk'; -import { getAppId, getEnvName } from '../commands/utils/environmentHelpers'; - -const CLIENT_INFO_NOT_SET = `Please ensure 'setClientInfo' has been called.`; -class AwsAmplifyClients { - #amplifyUiBuilder: AmplifyUIBuilder | undefined; - - #amplifyBackend: AmplifyBackend | undefined; - - get amplifyUiBuilder(): AmplifyUIBuilder { - if (!this.#amplifyUiBuilder) { - throw new Error(CLIENT_INFO_NOT_SET); - } - return this.#amplifyUiBuilder; - } - - get amplifyBackend(): AmplifyBackend { - if (!this.#amplifyBackend) { - throw new Error(CLIENT_INFO_NOT_SET); - } - return this.#amplifyBackend; - } - - flushAll(): void { - this.#amplifyUiBuilder = undefined; - this.#amplifyBackend = undefined; - } - - /** - * Used to configure the AWS Amplify clients. - */ - async setClientInfo(context: $TSContext, environmentName?: string, appId?: string): Promise { - const resolvedEnvName = getEnvName(context, environmentName); - const resolvedAppId = await getAppId(context, appId); - await this.buildClients(context, resolvedEnvName, resolvedAppId); - } - - /* - * Builds the clients - */ - private async buildClients(context: $TSContext, environmentName: string, appId: string): Promise { - const awsConfigInfo = (await context.amplify.invokePluginMethod(context, 'awscloudformation', undefined, 'loadConfigurationForEnv', [ - context, - environmentName, - appId, - ])) as $TSAny; - - this.buildAmplifyUiBuilderClient(awsConfigInfo); - this.buildAmplifyBackendClient(awsConfigInfo); - } - - /** - * Builds the Amplify UIBuilder Client - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - private buildAmplifyUiBuilderClient(awsConfigInfo: any): void { - const awsConfig = { ...awsConfigInfo }; - if (process.env.UI_BUILDER_ENDPOINT) { - awsConfig.endpoint = process.env.UI_BUILDER_ENDPOINT; - } - - if (process.env.UI_BUILDER_REGION) { - awsConfig.region = process.env.UI_BUILDER_REGION; - } - - this.#amplifyUiBuilder = new AmplifyUIBuilder(awsConfig); - } - - /** - * Builds the Amplify Backend Client - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - private buildAmplifyBackendClient(awsConfigInfo: any): void { - const awsConfig = { ...awsConfigInfo }; - if (process.env.AMPLIFY_BACKEND_ENDPOINT) { - awsConfig.endpoint = process.env.AMPLIFY_BACKEND_ENDPOINT; - } - - if (process.env.AMPLIFY_BACKEND_REGION) { - awsConfig.region = process.env.AMPLIFY_BACKEND_REGION; - } - - this.#amplifyBackend = new AmplifyBackend(awsConfig); - } -} - -const clientFactory = new AwsAmplifyClients(); - -export default clientFactory; diff --git a/packages/amplify-util-uibuilder/src/clients/index.ts b/packages/amplify-util-uibuilder/src/clients/index.ts deleted file mode 100644 index d4abef896df..00000000000 --- a/packages/amplify-util-uibuilder/src/clients/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as AmplifyClientFactory } from './amplify-client-factory'; diff --git a/packages/amplify-util-uibuilder/src/commands/cloneComponentsFromEnv.ts b/packages/amplify-util-uibuilder/src/commands/cloneComponentsFromEnv.ts index b23765b6f68..14c6da5e073 100644 --- a/packages/amplify-util-uibuilder/src/commands/cloneComponentsFromEnv.ts +++ b/packages/amplify-util-uibuilder/src/commands/cloneComponentsFromEnv.ts @@ -1,27 +1,21 @@ -import { printer } from 'amplify-prompts'; -import { $TSContext } from 'amplify-cli-core'; -import { AmplifyUIBuilder } from 'aws-sdk'; import { extractArgs } from './utils/extractArgs'; import { listUiBuilderComponents } from './utils/syncAmplifyUiBuilderComponents'; -import { AmplifyClientFactory } from '../clients'; +import { printer } from 'amplify-prompts'; +import { $TSContext } from 'amplify-cli-core'; +import { getAmplifyUIBuilderService } from './utils/amplifyUiBuilderService'; -/** - * Clones the components from the source to new environment - */ -export const run = async (context: $TSContext): Promise => { +export async function run(context: $TSContext) { printer.debug('Running create components command in amplify-util-uibuilder'); const args = extractArgs(context); const sourceEnvName = args.sourceEnvName ? args.sourceEnvName : context.exeInfo.sourceEnvName; const newEnvName = args.newEnvName ? args.newEnvName : context.exeInfo.localEnvInfo.envName; - const appId = args.appId ?? context.exeInfo.teamProviderInfo[sourceEnvName].awscloudformation.AmplifyAppId; - await AmplifyClientFactory.setClientInfo(context, sourceEnvName, appId); - const [existingComponents, existingComponentsNewEnv] = await Promise.all([ - listUiBuilderComponents(context, sourceEnvName), listUiBuilderComponents(context, newEnvName)]); + const existingComponents = await listUiBuilderComponents(context, sourceEnvName); if (existingComponents.entities.length === 0) { printer.debug(`${existingComponents.entities.length} components exist in source env. Skipping creation of local components.`); return; } + const existingComponentsNewEnv = await listUiBuilderComponents(context, newEnvName); if (existingComponentsNewEnv.entities.length > 0) { printer.debug( @@ -30,30 +24,35 @@ export const run = async (context: $TSContext): Promise => { return; } + const environmentName = args.environmentName ?? context.exeInfo.localEnvInfo.envName; + const appId = args.appId ?? context.exeInfo.teamProviderInfo[environmentName].awscloudformation.AmplifyAppId; + const amplifyUIBuilder = await getAmplifyUIBuilderService(context, environmentName, appId); const components = existingComponents.entities; if (!components.length) { printer.debug(`No UIBuilder components found in app ${appId} from env ${sourceEnvName}. Skipping component clone process.`); return; } - const promises = components.map((component: AmplifyUIBuilder.Component) => AmplifyClientFactory.amplifyUiBuilder - .createComponent({ - appId, - environmentName: newEnvName, - componentToCreate: { - bindingProperties: component.bindingProperties, - children: component.children, - componentType: component.componentType, - name: component.name, - overrides: component.overrides, - properties: component.properties, - sourceId: component.sourceId, - variants: component.variants, - }, - }) - .promise()); + const promises = components.map(async (component: any) => { + return await amplifyUIBuilder + .createComponent({ + appId, + environmentName, + componentToCreate: { + bindingProperties: component.bindingProperties, + children: component.children, + componentType: component.componentType, + name: component.name, + overrides: component.overrides, + properties: component.properties, + sourceId: component.sourceId, + variants: component.variants, + }, + }) + .promise(); + }); await Promise.all(promises); printer.info( `Successfully cloned ${components.length} UIBuilder components in app ${appId} from env ${sourceEnvName} to env ${newEnvName}.`, ); -}; +} diff --git a/packages/amplify-util-uibuilder/src/commands/generateComponents.ts b/packages/amplify-util-uibuilder/src/commands/generateComponents.ts index 360da94a2c1..fb1aae7ea85 100644 --- a/packages/amplify-util-uibuilder/src/commands/generateComponents.ts +++ b/packages/amplify-util-uibuilder/src/commands/generateComponents.ts @@ -11,8 +11,6 @@ import { generateUiBuilderThemes, } from './utils/syncAmplifyUiBuilderComponents'; import { generateAmplifyUiBuilderIndexFile } from './utils/createUiBuilderComponent'; -import { getAmplifyDataSchema } from './utils/getAmplifyDataSchema'; -import { AmplifyClientFactory } from '../clients'; /** * Pulls ui components from Studio backend and generates the code in the user's file system @@ -24,20 +22,14 @@ export const run = async (context: $TSContext): Promise => { } const spinner = ora(''); try { - await AmplifyClientFactory.setClientInfo(context); - const [componentSchemas, themeSchemas, dataSchemaResponse] = await Promise.all([ - listUiBuilderComponents(context), - listUiBuilderThemes(context), - getAmplifyDataSchema(context), - ]); + const [componentSchemas, themeSchemas] = await Promise.all([listUiBuilderComponents(context), listUiBuilderThemes(context)]); if (componentSchemas.entities.length === 0 && themeSchemas.entities.length === 0) { printer.debug('Skipping UI component generation since none are found.'); return; } - if (dataSchemaResponse.error) printer.debug(dataSchemaResponse.error.toString()); spinner.start('Generating UI components...'); - const generatedComponentResults = generateUiBuilderComponents(context, componentSchemas.entities, dataSchemaResponse.dataSchema); + const generatedComponentResults = generateUiBuilderComponents(context, componentSchemas.entities); const generatedThemeResults = generateUiBuilderThemes(context, themeSchemas.entities); generateAmplifyUiBuilderIndexFile(context, [ @@ -58,11 +50,7 @@ export const run = async (context: $TSContext): Promise => { const invalidComponentNames = componentSchemas.entities.filter(component => !component.schemaVersion).map(component => component.name); if (invalidComponentNames.length) { - printer.warn( - `The components ${invalidComponentNames.join( - ', ', - )} were synced with an older version of Amplify Studio. Please re-sync your components with Figma to get latest features and changes.`, // eslint-disable-line spellcheck/spell-checker - ); + printer.warn(`The components ${invalidComponentNames.join(', ')} were synced with an older version of Amplify Studio. Please re-sync your components with Figma to get latest features and changes.`); } notifyMissingPackages(context); diff --git a/packages/amplify-util-uibuilder/src/commands/utils/amplifyUiBuilderService.ts b/packages/amplify-util-uibuilder/src/commands/utils/amplifyUiBuilderService.ts new file mode 100644 index 00000000000..28e065ad194 --- /dev/null +++ b/packages/amplify-util-uibuilder/src/commands/utils/amplifyUiBuilderService.ts @@ -0,0 +1,22 @@ +import { AmplifyUIBuilder } from 'aws-sdk'; +import { $TSContext, $TSAny } from 'amplify-cli-core'; + +export { Component, Theme } from 'aws-sdk/clients/amplifyuibuilder'; + +export const getAmplifyUIBuilderService = async (context: $TSContext, environmentName: string, appId: string): Promise => { + const awsConfigInfo = (await context.amplify.invokePluginMethod(context, 'awscloudformation', undefined, 'loadConfigurationForEnv', [ + context, + environmentName, + appId, + ])) as $TSAny; + + if (process.env.UI_BUILDER_ENDPOINT) { + awsConfigInfo.endpoint = process.env.UI_BUILDER_ENDPOINT; + } + + if (process.env.UI_BUILDER_REGION) { + awsConfigInfo.region = process.env.UI_BUILDER_REGION; + } + + return new AmplifyUIBuilder(awsConfigInfo); +}; diff --git a/packages/amplify-util-uibuilder/src/commands/utils/createUiBuilderComponent.ts b/packages/amplify-util-uibuilder/src/commands/utils/createUiBuilderComponent.ts index ae77a887189..5101842f7da 100644 --- a/packages/amplify-util-uibuilder/src/commands/utils/createUiBuilderComponent.ts +++ b/packages/amplify-util-uibuilder/src/commands/utils/createUiBuilderComponent.ts @@ -1,5 +1,3 @@ -/* eslint-disable spellcheck/spell-checker*/ -// You have a misspelled word: Renderer on Identifier import { StudioTemplateRendererManager, StudioComponent, @@ -8,7 +6,6 @@ import { StudioTemplateRenderer, FrameworkOutputManager, RenderTextComponentResponse, - GenericDataSchema, } from '@aws-amplify/codegen-ui'; import { AmplifyRenderer, @@ -33,10 +30,15 @@ const config = { /** * Writes component file to the work space */ -export const createUiBuilderComponent = (context: $TSContext, schema: StudioComponent, dataSchema?: GenericDataSchema): StudioComponent => { +export const createUiBuilderComponent = (context: $TSContext, schema: StudioComponent): StudioComponent => { const uiBuilderComponentsPath = getUiBuilderComponentsPath(context); const rendererFactory = new StudioTemplateRendererFactory( - (component: StudioComponent) => new AmplifyRenderer(component as StudioComponent, config, dataSchema), + (component: StudioComponent) => new AmplifyRenderer(component as StudioComponent, config) as unknown as StudioTemplateRenderer< + unknown, + StudioComponent, + FrameworkOutputManager, + RenderTextComponentResponse + >, ); const outputPathDir = uiBuilderComponentsPath; @@ -55,7 +57,7 @@ export const createUiBuilderComponent = (context: $TSContext, schema: StudioComp export const createUiBuilderTheme = (context: $TSContext, schema: StudioTheme): StudioTheme => { const uiBuilderComponentsPath = getUiBuilderComponentsPath(context); const rendererFactory = new StudioTemplateRendererFactory( - (component: StudioTheme) => (new ReactThemeStudioTemplateRenderer(component, config) as unknown) as StudioTemplateRenderer< + (component: StudioTheme) => new ReactThemeStudioTemplateRenderer(component, config) as unknown as StudioTemplateRenderer< unknown, StudioTheme, FrameworkOutputManager, @@ -86,7 +88,7 @@ export const createUiBuilderTheme = (context: $TSContext, schema: StudioTheme): export const generateAmplifyUiBuilderIndexFile = (context: $TSContext, schemas: StudioComponent[]): RenderTextComponentResponse => { const uiBuilderComponentsPath = getUiBuilderComponentsPath(context); const rendererFactory = new StudioTemplateRendererFactory( - (component: StudioComponent[]) => (new ReactIndexStudioTemplateRenderer(component, config) as unknown) as StudioTemplateRenderer< + (component: StudioComponent[]) => new ReactIndexStudioTemplateRenderer(component, config) as unknown as StudioTemplateRenderer< unknown, StudioComponent[], FrameworkOutputManager, diff --git a/packages/amplify-util-uibuilder/src/commands/utils/environmentHelpers.ts b/packages/amplify-util-uibuilder/src/commands/utils/environmentHelpers.ts deleted file mode 100644 index f36b1388fa1..00000000000 --- a/packages/amplify-util-uibuilder/src/commands/utils/environmentHelpers.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { $TSContext } from 'amplify-cli-core'; -import { extractArgs } from './extractArgs'; - -/** - * Get's the environment name from the given name or the context - */ -export const getEnvName = (context: $TSContext, envName?: string): string => { - const args = extractArgs(context); - return envName || args?.environmentName || context.exeInfo.localEnvInfo.envName; -}; - -/** - * Returns the appId from the context - */ -export const resolveAppId = async (context: $TSContext): Promise => { - const appId = await context.amplify.invokePluginMethod(context, 'awscloudformation', undefined, 'resolveAppId', [context]) as string; - return appId; -}; - -/** - * Returns the appId or throws an error if it's not found. - */ -export const getAppId = async (context: $TSContext, appId?: string): Promise => { - const resolvedAppId = appId || extractArgs(context).appId || (await resolveAppId(context)); - - if (!resolvedAppId) { - throw new Error( - 'Unable to sync Studio components since appId could not be determined. This can happen when you hit the soft limit of number of apps that you can have in Amplify console.', - ); - } - return resolvedAppId; -}; diff --git a/packages/amplify-util-uibuilder/src/commands/utils/getAmplifyDataSchema.ts b/packages/amplify-util-uibuilder/src/commands/utils/getAmplifyDataSchema.ts deleted file mode 100644 index 8850f1ec203..00000000000 --- a/packages/amplify-util-uibuilder/src/commands/utils/getAmplifyDataSchema.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { - $TSContext, stateManager, AmplifyCategories, AmplifySupportedService, -} from 'amplify-cli-core'; -import { GenericDataSchema, getGenericFromDataStore } from '@aws-amplify/codegen-ui'; -import { getAppId, getEnvName } from './environmentHelpers'; -import { AmplifyClientFactory } from '../../clients'; - -/** - * If models are available, they will be populated in the models field of the returned object. - * If they're not available, the error field on the returned object will be an Error and models field will be undefined - */ -export const getAmplifyDataSchema = async ( - context: $TSContext, - envName?: string, -): Promise<{ dataSchema?: ReturnType; error?: Error }> => { - const environmentName = getEnvName(context, envName); - const appId = await getAppId(context); - - try { - const meta = stateManager.getCurrentMeta(); - const resourceName = Object.entries(meta[AmplifyCategories.API]).filter( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ([, value]) => (value as any)?.service === AmplifySupportedService.APPSYNC, - )[0][0]; - - const { Models } = await AmplifyClientFactory.amplifyBackend - .getBackendAPIModels({ - AppId: appId, - BackendEnvironmentName: environmentName, - ResourceName: resourceName, - }) - .promise(); - if (!Models) { - return { error: new Error('Models not found in AmplifyBackend:GetBackendAPIModels response') }; - } - return { dataSchema: getSchema(Models) }; - } catch (error) { - return { error }; - } -}; - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const getSchema = (schemaString: string): GenericDataSchema => { - const source = schemaString.replace(schemaString.substring(0, schemaString.indexOf(`{`) - 1), ``).replace(/;/g, ``); - return getGenericFromDataStore(JSON.parse(source)); -}; diff --git a/packages/amplify-util-uibuilder/src/commands/utils/syncAmplifyUiBuilderComponents.ts b/packages/amplify-util-uibuilder/src/commands/utils/syncAmplifyUiBuilderComponents.ts index 498af2d9e00..3ccae234af4 100644 --- a/packages/amplify-util-uibuilder/src/commands/utils/syncAmplifyUiBuilderComponents.ts +++ b/packages/amplify-util-uibuilder/src/commands/utils/syncAmplifyUiBuilderComponents.ts @@ -1,30 +1,45 @@ +import { getAmplifyUIBuilderService, Component, Theme } from './amplifyUiBuilderService'; import { printer } from 'amplify-prompts'; -import { $TSContext } from 'amplify-cli-core'; -import { StudioComponent, StudioTheme, GenericDataSchema } from '@aws-amplify/codegen-ui'; -import { Component, Theme } from 'aws-sdk/clients/amplifyuibuilder'; import { createUiBuilderComponent, createUiBuilderTheme } from './createUiBuilderComponent'; import { getUiBuilderComponentsPath } from './getUiBuilderComponentsPath'; -import { AmplifyClientFactory } from '../../clients'; -import { getEnvName, getAppId } from './environmentHelpers'; +import { extractArgs } from './extractArgs'; +import { $TSContext } from 'amplify-cli-core'; +export const getEnvName = (context: $TSContext, envName?: string) => { + const args = extractArgs(context); + return envName ? envName : args.environmentName ? args.environmentName : context.exeInfo.localEnvInfo.envName; +}; -/** - * Returns all the UI Builder components from the app - */ -export const listUiBuilderComponents = async (context: $TSContext, envName?: string): Promise<{ entities: Component[] }> => { +export const resolveAppId = async (context: $TSContext) => { + return await context.amplify.invokePluginMethod(context, 'awscloudformation', undefined, 'resolveAppId', [context]); +}; + +export const getAppId = async (context: $TSContext) => { + const appId = extractArgs(context).appId || (await resolveAppId(context)); + + if (!appId) { + throw new Error( + 'Unable to sync Studio components since appId could not be determined. This can happen when you hit the soft limit of number of apps that you can have in Amplify console.', + ); + } + return appId; +}; + +export async function listUiBuilderComponents(context: $TSContext, envName?: string): Promise<{ entities: Component[] }> { const environmentName = getEnvName(context, envName); const appId = await getAppId(context); try { + const amplifyUIBuilder = await getAmplifyUIBuilderService(context, environmentName, appId); let nextToken: string | undefined; const uiBuilderComponents: Component[] = []; do { - const response = await AmplifyClientFactory.amplifyUiBuilder - .exportComponents({ - appId, - environmentName, - nextToken, - }) - .promise(); + const response = await amplifyUIBuilder + .exportComponents({ + appId, + environmentName, + nextToken + }) + .promise(); uiBuilderComponents.push(...response.entities); nextToken = response.nextToken; } while (nextToken); @@ -34,25 +49,23 @@ export const listUiBuilderComponents = async (context: $TSContext, envName?: str printer.debug(e); throw e; } -}; +} -/** - * Returns all the UI Builder themes from the app - */ -export const listUiBuilderThemes = async (context: $TSContext, envName?: string): Promise<{ entities: Theme[] }> => { +export async function listUiBuilderThemes(context: $TSContext, envName?: string): Promise<{ entities: Theme[] }> { const environmentName = getEnvName(context, envName); const appId = await getAppId(context); try { + const amplifyUIBuilder = await getAmplifyUIBuilderService(context, environmentName, appId); let nextToken: string | undefined; const uiBuilderThemes: Theme[] = []; do { - const response = await AmplifyClientFactory.amplifyUiBuilder - .exportThemes({ - appId, - environmentName, - }) - .promise(); + const response = await amplifyUIBuilder + .exportThemes({ + appId, + environmentName, + }) + .promise(); uiBuilderThemes.push(...response.entities); nextToken = response.nextToken; } while (nextToken); @@ -62,26 +75,12 @@ export const listUiBuilderThemes = async (context: $TSContext, envName?: string) printer.debug(e); throw e; } -}; +} -/** - * Returns instances of StudioComponent from the component schemas - */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export const generateUiBuilderComponents = (context: $TSContext, componentSchemas: any[], dataSchema?: GenericDataSchema): ({ - resultType: string; - component: StudioComponent; - schemaName?: undefined; - error?: undefined; -} | { - resultType: string; - schemaName: string; - error: Error; - component?: undefined; -})[] => { +export function generateUiBuilderComponents(context: $TSContext, componentSchemas: any[]) { const componentResults = componentSchemas.map(schema => { try { - const component = createUiBuilderComponent(context, schema, dataSchema); + const component = createUiBuilderComponent(context, schema); return { resultType: 'SUCCESS', component }; } catch (e) { printer.debug(`Failure caught processing ${schema.name}`); @@ -96,23 +95,9 @@ export const generateUiBuilderComponents = (context: $TSContext, componentSchema )}`, ); return componentResults; -}; +} -/** - * Returns instances of StudioTheme from theme schemas - */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export const generateUiBuilderThemes = (context: $TSContext, themeSchemas: any[]): ({ - resultType: string; - theme: StudioTheme; - schemaName?: undefined; - error?: undefined; -} | { - resultType: string; - schemaName: string; - error: Error; - theme?: undefined; -})[] => { +export function generateUiBuilderThemes(context: $TSContext, themeSchemas: any[]) { const themeResults = themeSchemas.map(schema => { try { const theme = createUiBuilderTheme(context, schema); @@ -128,4 +113,4 @@ export const generateUiBuilderThemes = (context: $TSContext, themeSchemas: any[] `Generated ${themeResults.filter(result => result.resultType === 'SUCCESS').length} themes in ${getUiBuilderComponentsPath(context)}`, ); return themeResults; -}; +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index c97058b0d4a..9d852990bb5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -216,21 +216,21 @@ dependencies: "@aws-amplify/core" "4.3.11" -"@aws-amplify/codegen-ui-react@2.3.0": - version "2.3.0" - resolved "https://registry.npmjs.org/@aws-amplify/codegen-ui-react/-/codegen-ui-react-2.3.0.tgz#73af267b37df6741675c8b4c66a484b5f347a390" - integrity sha512-182YEIBd16LuJCktEj+UiOPR/lxQVUVjK00bty8AV3bODw1KYUKR24EjajGPLV1V+vyB1pa2Izo9xXa/zGFWow== +"@aws-amplify/codegen-ui-react@^2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@aws-amplify/codegen-ui-react/-/codegen-ui-react-2.2.0.tgz#04f289715711bf7c9e31cdebec9532c536077515" + integrity sha512-TFiRa1rGZvVh66Wl7pPDoV5GVDbCh0toWoFuNqJluO0btItP1dyyF+244X1YCFnOlwp7qohGtmBMlxnStG4ZRw== dependencies: - "@aws-amplify/codegen-ui" "2.3.0" + "@aws-amplify/codegen-ui" "2.2.0" "@typescript/vfs" "~1.3.5" typescript "~4.4.4" optionalDependencies: prettier "2.3.2" -"@aws-amplify/codegen-ui@2.3.0": - version "2.3.0" - resolved "https://registry.npmjs.org/@aws-amplify/codegen-ui/-/codegen-ui-2.3.0.tgz#9dd225277c54c92ec43ec5878c175f5cdfb9861f" - integrity sha512-uI+SBlWNQ8mPVRBLcK6GPQfHUIO6cmFSbYJD4WjiD6j8V2x2fdSGSLJa7kiey5KC2Iem2s+Z2ImYKj/etspQfQ== +"@aws-amplify/codegen-ui@2.2.0", "@aws-amplify/codegen-ui@^2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@aws-amplify/codegen-ui/-/codegen-ui-2.2.0.tgz#4b0f1e21b61b16b93ff671b2b00c669cd5f5c3ee" + integrity sha512-pJnRBVV8Ahaw+rU/JYXHc5Id5R/RTrO9UdPqT0eHqd4WH7XN0qzByKsVQ6hQvqYugiBIWuJL0DgPgzhsLCb8pw== dependencies: yup "^0.32.11" @@ -9918,7 +9918,7 @@ astral-regex@^2.0.0: async@1.x, async@^2.6.2, async@^2.6.4, async@^3.2.3: version "2.6.4" - resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== dependencies: lodash "^4.17.14" @@ -12019,7 +12019,7 @@ cross-env@^7.0.3: cross-fetch@2.2.2, cross-fetch@^2.2.6, cross-fetch@^3.1.5: version "2.2.6" - resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-2.2.6.tgz#2ef0bb39a24ac034787965c457368a28730e220a" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.6.tgz#2ef0bb39a24ac034787965c457368a28730e220a" integrity sha512-9JZz+vXCmfKUZ68zAptS7k4Nu8e2qcibe7WVZYps7sAgk5R8GYTc+T1WR0v1rlP9HxgARmOX1UTIJZFytajpNA== dependencies: node-fetch "^2.6.7" @@ -23827,7 +23827,7 @@ whatwg-encoding@^1.0.5: whatwg-fetch@^2.0.4: version "2.0.4" - resolved "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== whatwg-fetch@^3.4.1, whatwg-fetch@^3.6.2: