From 8b5d433163af10de1f1464055d62f04676cb3daf Mon Sep 17 00:00:00 2001 From: Al Harris <91494052+alharris-at@users.noreply.github.com> Date: Fri, 15 Sep 2023 10:42:24 -0700 Subject: [PATCH] feat: ensure modelgen does not throw an error when running in an uninitialized directory (#13221) --- .../src/__tests__/execution-manager.test.ts | 17 ++++++++++++++++ packages/amplify-cli/src/execution-manager.ts | 20 ++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/packages/amplify-cli/src/__tests__/execution-manager.test.ts b/packages/amplify-cli/src/__tests__/execution-manager.test.ts index 6085b1611b0..2322ce248a5 100644 --- a/packages/amplify-cli/src/__tests__/execution-manager.test.ts +++ b/packages/amplify-cli/src/__tests__/execution-manager.test.ts @@ -5,6 +5,9 @@ import { CLIInput as CommandLineInput } from '../domain/command-input'; import { Context } from '../domain/context'; import { PluginInfo } from '@aws-amplify/amplify-cli-core'; import { executeCommand } from '../execution-manager'; +import { printer } from '@aws-amplify/amplify-prompts'; + +jest.mock('@aws-amplify/amplify-prompts'); const handleAmplifyEventMock = jest.fn(); jest.mock('../../__mocks__/faked-plugin', () => ({ @@ -66,6 +69,7 @@ describe('execution manager', () => { beforeEach(() => { jest.clearAllMocks(); + mockContext.parameters = { options: {} }; }); it.each([ @@ -93,4 +97,17 @@ describe('execution manager', () => { await executeCommand(mockContext); expect(handleAmplifyEventMock).toBeCalledWith(mockContext, args); }); + + it.each([[AmplifyEvent.PreCodegenModels], [AmplifyEvent.PostCodegenModels]])( + 'executeCommand skips %s when target and model-schema parameters are provided', + async (event) => { + mockFs.readdirSync.mockReturnValue([]); + mockFs.existsSync.mockReturnValue(true); + mockContext.input.command = 'models'; + mockContext.parameters.options = { target: 'javascript', 'model-schema': 'schema.graphql' }; + await executeCommand(mockContext); + expect(printer.info).toBeCalledWith(expect.stringContaining(`Skipping ${event}`)); + expect(handleAmplifyEventMock).not.toBeCalledWith(mockContext, { event, data: {} }); + }, + ); }); diff --git a/packages/amplify-cli/src/execution-manager.ts b/packages/amplify-cli/src/execution-manager.ts index 208a87670a7..ae844c7e77c 100644 --- a/packages/amplify-cli/src/execution-manager.ts +++ b/packages/amplify-cli/src/execution-manager.ts @@ -1,6 +1,6 @@ import * as fs from 'fs-extra'; import * as path from 'path'; -import { prompter } from '@aws-amplify/amplify-prompts'; +import { printer, prompter } from '@aws-amplify/amplify-prompts'; import { twoStringSetsAreEqual, twoStringSetsAreDisjoint } from './utils/set-ops'; import { Context } from './domain/context'; import { scan, getPluginsWithNameAndCommand, getPluginsWithEventHandler } from './plugin-manager'; @@ -269,6 +269,9 @@ const raisePreExportEvent = async (context: Context): Promise => { }; const raisePreCodegenModelsEvent = async (context: Context): Promise => { + if (shouldSkipCodegenModelsEvents(context, AmplifyEvent.PreCodegenModels)) { + return; + } await raiseEvent(context, { event: AmplifyEvent.PreCodegenModels, data: {} }); }; @@ -309,7 +312,22 @@ const raisePostPullEvent = async (context: Context): Promise => { await raiseEvent(context, { event: AmplifyEvent.PostPull, data: {} }); }; +const shouldSkipCodegenModelsEvents = (context: Context, event: AmplifyEvent): boolean => { + const optionsIndicatingUninitializedModelgen = ['target', 'model-schema']; + const cliOptions = context?.parameters?.options ? new Set(Object.keys(context.parameters.options)) : new Set(); + const skipEvents = optionsIndicatingUninitializedModelgen.every((option) => cliOptions.has(option)); + if (skipEvents) { + printer.info( + `Skipping ${event} lifecycle event, due to presence of ${JSON.stringify(optionsIndicatingUninitializedModelgen)} in context options`, + ); + } + return skipEvents; +}; + const raisePostCodegenModelsEvent = async (context: Context): Promise => { + if (shouldSkipCodegenModelsEvents(context, AmplifyEvent.PostCodegenModels)) { + return; + } await raiseEvent(context, { event: AmplifyEvent.PostCodegenModels, data: {} }); };