Skip to content

Commit 8b5d433

Browse files
authored
feat: ensure modelgen does not throw an error when running in an uninitialized directory (#13221)
1 parent 52aea18 commit 8b5d433

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

packages/amplify-cli/src/__tests__/execution-manager.test.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ import { CLIInput as CommandLineInput } from '../domain/command-input';
55
import { Context } from '../domain/context';
66
import { PluginInfo } from '@aws-amplify/amplify-cli-core';
77
import { executeCommand } from '../execution-manager';
8+
import { printer } from '@aws-amplify/amplify-prompts';
9+
10+
jest.mock('@aws-amplify/amplify-prompts');
811

912
const handleAmplifyEventMock = jest.fn();
1013
jest.mock('../../__mocks__/faked-plugin', () => ({
@@ -66,6 +69,7 @@ describe('execution manager', () => {
6669

6770
beforeEach(() => {
6871
jest.clearAllMocks();
72+
mockContext.parameters = { options: {} };
6973
});
7074

7175
it.each([
@@ -93,4 +97,17 @@ describe('execution manager', () => {
9397
await executeCommand(mockContext);
9498
expect(handleAmplifyEventMock).toBeCalledWith(mockContext, args);
9599
});
100+
101+
it.each([[AmplifyEvent.PreCodegenModels], [AmplifyEvent.PostCodegenModels]])(
102+
'executeCommand skips %s when target and model-schema parameters are provided',
103+
async (event) => {
104+
mockFs.readdirSync.mockReturnValue([]);
105+
mockFs.existsSync.mockReturnValue(true);
106+
mockContext.input.command = 'models';
107+
mockContext.parameters.options = { target: 'javascript', 'model-schema': 'schema.graphql' };
108+
await executeCommand(mockContext);
109+
expect(printer.info).toBeCalledWith(expect.stringContaining(`Skipping ${event}`));
110+
expect(handleAmplifyEventMock).not.toBeCalledWith(mockContext, { event, data: {} });
111+
},
112+
);
96113
});

packages/amplify-cli/src/execution-manager.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as fs from 'fs-extra';
22
import * as path from 'path';
3-
import { prompter } from '@aws-amplify/amplify-prompts';
3+
import { printer, prompter } from '@aws-amplify/amplify-prompts';
44
import { twoStringSetsAreEqual, twoStringSetsAreDisjoint } from './utils/set-ops';
55
import { Context } from './domain/context';
66
import { scan, getPluginsWithNameAndCommand, getPluginsWithEventHandler } from './plugin-manager';
@@ -269,6 +269,9 @@ const raisePreExportEvent = async (context: Context): Promise<void> => {
269269
};
270270

271271
const raisePreCodegenModelsEvent = async (context: Context): Promise<void> => {
272+
if (shouldSkipCodegenModelsEvents(context, AmplifyEvent.PreCodegenModels)) {
273+
return;
274+
}
272275
await raiseEvent(context, { event: AmplifyEvent.PreCodegenModels, data: {} });
273276
};
274277

@@ -309,7 +312,22 @@ const raisePostPullEvent = async (context: Context): Promise<void> => {
309312
await raiseEvent(context, { event: AmplifyEvent.PostPull, data: {} });
310313
};
311314

315+
const shouldSkipCodegenModelsEvents = (context: Context, event: AmplifyEvent): boolean => {
316+
const optionsIndicatingUninitializedModelgen = ['target', 'model-schema'];
317+
const cliOptions = context?.parameters?.options ? new Set(Object.keys(context.parameters.options)) : new Set();
318+
const skipEvents = optionsIndicatingUninitializedModelgen.every((option) => cliOptions.has(option));
319+
if (skipEvents) {
320+
printer.info(
321+
`Skipping ${event} lifecycle event, due to presence of ${JSON.stringify(optionsIndicatingUninitializedModelgen)} in context options`,
322+
);
323+
}
324+
return skipEvents;
325+
};
326+
312327
const raisePostCodegenModelsEvent = async (context: Context): Promise<void> => {
328+
if (shouldSkipCodegenModelsEvents(context, AmplifyEvent.PostCodegenModels)) {
329+
return;
330+
}
313331
await raiseEvent(context, { event: AmplifyEvent.PostCodegenModels, data: {} });
314332
};
315333

0 commit comments

Comments
 (0)