Skip to content

Commit 584e430

Browse files
committed
add matrix options
1 parent eac2699 commit 584e430

File tree

6 files changed

+142
-49
lines changed

6 files changed

+142
-49
lines changed

packages/amplify-codegen-e2e-core/src/categories/codegen.ts

Lines changed: 42 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -76,42 +76,66 @@ export function generateTypes(cwd: string) : Promise<void> {
7676

7777
// CLI workflow to add codegen to Amplify project
7878
export function addCodegen(cwd: string, settings: any = {}): Promise<void> {
79+
const defaultSettings = {
80+
params: [],
81+
isAPINotAdded: false,
82+
isCodegenAdded: false,
83+
frontendType: AmplifyFrontend.javascript,
84+
framework: 'none',
85+
codegenTarget: 'typescript',
86+
isStatementGenerated: true,
87+
statementNamePattern: '\r', // default value
88+
maxDepth: '\r', // default value
89+
isTypeGenerated: true,
90+
typeFileName: '\r', // default value
91+
}
92+
const mergedSettings = { ...defaultSettings, ...settings };
7993
return new Promise((resolve, reject) => {
80-
const params = settings.params
81-
? ['codegen', 'add', ...settings.params]
94+
const params = mergedSettings.params
95+
? ['codegen', 'add', ...mergedSettings.params]
8296
: ['codegen', 'add'];
8397
const chain = spawn(getCLIPath(), params, { cwd, stripColors: true });
84-
if (settings.isAPINotAdded) {
98+
if (mergedSettings.isAPINotAdded) {
8599
chain.wait("There are no GraphQL APIs available.");
86100
chain.wait("Add by running $amplify api add");
87101
}
88-
else if (settings.isCodegenAdded) {
102+
else if (mergedSettings.isCodegenAdded) {
89103
chain.wait("Codegen support only one GraphQL API per project");
90104
}
91105
else {
92-
if (settings.frontendType === AmplifyFrontend.javascript) {
106+
if (mergedSettings.frontendType === AmplifyFrontend.javascript) {
93107
chain.wait('Choose the code generation language target');
94-
if (settings.framework === 'angular' || settings.framework === 'ionic') {
95-
singleSelect(chain, settings.codegenTarget, ['angular', 'typescript']);
108+
if (mergedSettings.framework === 'angular' || mergedSettings.framework === 'ionic') {
109+
singleSelect(chain, mergedSettings.codegenTarget, ['angular', 'typescript']);
96110
} else {
97-
singleSelect(chain, settings.codegenTarget, ['javascript', 'typescript', 'flow']);
111+
singleSelect(chain, mergedSettings.codegenTarget, ['javascript', 'typescript', 'flow']);
98112
}
99113
}
100114
chain
101115
.wait('Enter the file name pattern of graphql queries, mutations and subscriptions')
102-
.sendCarriageReturn()
103-
.wait('Do you want to generate/update all possible GraphQL operations')
104-
.sendLine('y')
105-
.wait('Enter maximum statement depth [increase from default if your schema is deeply')
106-
.sendCarriageReturn();
107-
const isTypeGenIncluded = settings.frontendType === AmplifyFrontend.ios
108-
|| (settings.frontendType === AmplifyFrontend.javascript && settings.codegenTarget !== 'javascript');
116+
.sendLine(mergedSettings.statementNamePattern)
117+
.wait('Do you want to generate/update all possible GraphQL operations');
118+
if (mergedSettings.isStatementGenerated) {
119+
chain
120+
.sendLine('y')
121+
.wait('Enter maximum statement depth [increase from default if your schema is deeply')
122+
.sendLine(mergedSettings.maxDepth);
123+
} else {
124+
chain.sendLine('n');
125+
}
126+
127+
const isTypeGenIncluded = mergedSettings.frontendType === AmplifyFrontend.ios
128+
|| (mergedSettings.frontendType === AmplifyFrontend.javascript && mergedSettings.codegenTarget !== 'javascript');
109129
if (isTypeGenIncluded) {
110130
chain
111131
.wait('Enter the file name for the generated code')
112-
.sendCarriageReturn()
113-
.wait('Do you want to generate code for your newly created GraphQL API')
114-
.sendCarriageReturn();
132+
.sendLine(mergedSettings.typeFileName)
133+
.wait('Do you want to generate code for your newly created GraphQL API');
134+
if (mergedSettings.isTypeGenerated) {
135+
chain.sendLine('y');
136+
} else {
137+
chain.sendLine('n');
138+
}
115139
}
116140
}
117141

packages/amplify-codegen-e2e-core/src/configure/index.ts

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ const defaultProjectSettings = {
1717
name: '\r',
1818
envName: 'integtest',
1919
editor: '\r',
20-
appType: 'javascript',
20+
frontendType: 'javascript',
2121
framework: 'none',
2222
srcDir: '\r',
2323
distDir: '\r',
@@ -152,6 +152,7 @@ export function amplifyConfigureProject(settings: {
152152

153153
export function amplifyConfigureProjectInfo(settings: {
154154
cwd: string,
155+
frontendType: string,
155156
}): Promise<void> {
156157
const {
157158
cwd,
@@ -166,9 +167,9 @@ export function amplifyConfigureProjectInfo(settings: {
166167
.wait('Choose your default editor:')
167168
.sendLine(s.editor)
168169
.wait("Choose the type of app that you're building")
169-
.sendLine(s.appType);
170+
.sendLine(s.frontendType);
170171

171-
switch (s.appType) {
172+
switch (s.frontendType) {
172173
case 'javascript':
173174
chain.wait('What javascript framework are you using');
174175
singleSelect(chain, s.framework, javaScriptFrameworkList);
@@ -192,11 +193,20 @@ export function amplifyConfigureProjectInfo(settings: {
192193
case 'flutter':
193194
chain
194195
.wait('Where do you want to store your configuration file?')
195-
.sendLine(s.srcDir)
196+
.sendLine(s.srcDir);
197+
break;
196198
default:
197-
throw new Error(`Frontend type ${s.appType} is not supported.`);
199+
throw new Error(`Frontend type ${s.frontendType} is not supported.`);
198200
}
199201

200-
chain.wait('Successfully made configuration changes to your project.');
202+
chain
203+
.wait('Successfully made configuration changes to your project.')
204+
.run((err: Error) => {
205+
if (!err) {
206+
resolve();
207+
} else {
208+
reject(err);
209+
}
210+
});
201211
})
202212
}

packages/amplify-codegen-e2e-core/src/init/initProjectHelper.ts

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ export function initJSProjectWithProfile(cwd: string, settings: Object = {}): Pr
7878
}
7979

8080
chain
81-
.wait('Help improve Amplify CLI by sharing non sensitive configurations on failures')
81+
.wait('Help improve Amplify CLI by sharing non-sensitive project configurations on failures')
8282
.sendConfirmYes()
8383
.wait('Try "amplify add api" to create a backend API and then "amplify push" to deploy everything')
8484
.run((err: Error) => {
@@ -120,7 +120,7 @@ export function initAndroidProjectWithProfile(cwd: string, settings: Object): Pr
120120
.sendCarriageReturn()
121121
.wait('Please choose the profile you want to use')
122122
.sendLine(s.profileName)
123-
.wait('Help improve Amplify CLI by sharing non sensitive configurations on failures')
123+
.wait('Help improve Amplify CLI by sharing non-sensitive project configurations on failures')
124124
.sendConfirmYes()
125125
.wait('Try "amplify add api" to create a backend API and then "amplify push" to deploy everything')
126126
.run((err: Error) => {
@@ -163,17 +163,11 @@ export function initIosProjectWithProfile(cwd: string, settings: Object): Promis
163163
.sendCarriageReturn()
164164
.wait('Please choose the profile you want to use')
165165
.sendLine(s.profileName)
166-
.wait('Help improve Amplify CLI by sharing non sensitive configurations on failures')
166+
.wait('Help improve Amplify CLI by sharing non-sensitive project configurations on failures')
167167
.sendConfirmYes()
168168
.wait('Try "amplify add api" to create a backend API and then "amplify push" to deploy everything')
169-
.run((err: Error) => {
170-
if (!err) {
171-
addCITags(cwd);
172-
173-
resolve();
174-
} else {
175-
reject(err);
176-
}
169+
.run(() => {
170+
resolve();
177171
});
178172
});
179173
}
@@ -206,7 +200,7 @@ export function initFlutterProjectWithProfile(cwd: string, settings: Object): Pr
206200
singleSelect(chain, s.region, amplifyRegions);
207201

208202
chain
209-
.wait('Help improve Amplify CLI by sharing non sensitive configurations on failures')
203+
.wait('Help improve Amplify CLI by sharing non-sensitive project configurations on failures')
210204
.sendConfirmYes()
211205
.wait('Try "amplify add api" to create a backend API and then "amplify push" to deploy everything')
212206
.run((err: Error) => {

packages/amplify-codegen-e2e-tests/src/__tests__/add-codegen-js.test.ts

Lines changed: 50 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import {
77
addApiWithoutSchema,
88
updateApiSchema,
99
AmplifyFrontend,
10+
apiGqlCompile,
11+
removeCodegen,
12+
amplifyConfigureProjectInfo,
1013
} from "@aws-amplify/amplify-codegen-e2e-core";
1114
import { existsSync } from "fs";
1215
import path from 'path';
@@ -17,6 +20,7 @@ import {
1720
testSetupBeforeAddCodegen,
1821
getGraphQLConfigFilePath,
1922
testValidGraphQLConfig,
23+
testAddCodegenMatrix,
2024
} from '../codegen-tests-base';
2125

2226
const schema = 'simple_model.graphql';
@@ -82,17 +86,51 @@ describe('codegen add tests - JS', () => {
8286
it(`supports add codegen with redundant region parameter`, async () => {
8387
await testAddCodegen(config, projectRoot, schema, ['--region', 'us-fake-1']);
8488
});
89+
});
8590

86-
describe.only('JS codegen matrix test', async () => {
87-
it('Adding codegen works as expected', async () => {
88-
config = {
89-
frontendType: AmplifyFrontend.javascript,
90-
framework: 'angular',
91-
codegenTarget: 'angluar',
92-
srcDir: 'src',
93-
graphqlCodegenDir : 'src/graphql'
94-
}
95-
await testAddCodegen(config, projectRoot, schema);
96-
});
97-
});
91+
describe.only('JS codegen matrix test', () => {
92+
let projectRoot: string;
93+
let config = DEFAULT_JS_CONFIG;
94+
95+
beforeAll(async () => {
96+
projectRoot = await createNewProjectDir('addCodegenMatrixJS');
97+
// init project and add API category
98+
await initProjectWithProfile(projectRoot, { ...config });
99+
const projectName = createRandomName();
100+
await addApiWithoutSchema(projectRoot, { apiName: projectName });
101+
await updateApiSchema(projectRoot, projectName, schema);
102+
await apiGqlCompile(projectRoot);
103+
104+
});
105+
beforeEach(async () => {
106+
107+
});
108+
afterEach(async () => {
109+
await removeCodegen(projectRoot);
110+
await amplifyConfigureProjectInfo({ cwd: projectRoot, frontendType: 'flutter'} )
111+
});
112+
afterAll(async () => {
113+
await deleteAmplifyProject(projectRoot);
114+
});
115+
116+
it('Adding codegen works as expected 1', async () => {
117+
config = {
118+
frontendType: AmplifyFrontend.javascript,
119+
framework: 'ionic',
120+
codegenTarget: 'angluar',
121+
srcDir: 'src',
122+
graphqlCodegenDir : 'src/graphql'
123+
}
124+
await testAddCodegenMatrix(config, projectRoot);
125+
});
126+
it('Adding codegen works as expected 2', async () => {
127+
config = {
128+
frontendType: AmplifyFrontend.javascript,
129+
framework: 'react',
130+
codegenTarget: 'typescript',
131+
srcDir: 'src',
132+
graphqlCodegenDir : 'src/graphql'
133+
}
134+
await testAddCodegenMatrix(config, projectRoot);
135+
});
98136
});

packages/amplify-codegen-e2e-tests/src/codegen-tests-base/add-codegen.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,39 @@ import {
1111
generateStatementsAndTypes,
1212
generateStatements,
1313
generateTypes,
14+
amplifyConfigureProjectInfo,
15+
deleteProjectDir,
1416
} from "@aws-amplify/amplify-codegen-e2e-core";
1517
import { existsSync, readFileSync, writeFileSync, readdirSync, rmSync } from "fs";
1618
import path from 'path';
1719
import { isNotEmptyDir } from '../utils';
1820
import { getGraphQLConfigFilePath, testSetupBeforeAddCodegen, testValidGraphQLConfig } from "./test-setup";
1921

22+
type CodegenMatrixTestProps = AmplifyFrontendConfig & {
23+
params?: string[];
24+
isAPINotAdded?: boolean;
25+
isCodegenAdded?: boolean;
26+
frontendType?: AmplifyFrontend;
27+
framework?: string;
28+
codegenTarget?: string;
29+
isStatementGenerated?: boolean;
30+
statementNamePattern?: string;
31+
maxDepth?: number;
32+
isTypeGenerated?: boolean;
33+
typeFileName?: string;
34+
}
35+
36+
export async function testAddCodegenMatrix(config: CodegenMatrixTestProps, projectRoot: string) {
37+
await amplifyConfigureProjectInfo({ cwd: projectRoot, ...config });
38+
deleteProjectDir(path.join(projectRoot, config.graphqlCodegenDir));
39+
// Setup the non-amplify project with schema and pre-existing files
40+
const userSourceCodePath = testSetupBeforeAddCodegen(projectRoot, config);
41+
await expect(addCodegen(projectRoot, { ...config })).resolves.not.toThrow();
42+
expect(isNotEmptyDir(path.join(projectRoot, config.graphqlCodegenDir))).toBe(true);
43+
// pre-existing file should still exist
44+
expect(existsSync(userSourceCodePath)).toBe(true);
45+
}
46+
2047
export async function testAddCodegen(config: AmplifyFrontendConfig, projectRoot: string, schema: string, additionalParams?: Array<string>) {
2148
// init project and add API category
2249
await initProjectWithProfile(projectRoot, { ...config });

shared-scripts.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ function _installCLIFromLocalRegistry {
225225
fi
226226
setNpmRegistryUrlToLocal
227227
changeNpmGlobalPath
228-
npm install -g @aws-amplify/cli-internal@cdk228withdata3
228+
npm install -g @aws-amplify/cli-internal
229229
echo "using Amplify CLI version: "$(amplify --version)
230230
npm list -g --depth=1 | grep -e '@aws-amplify/amplify-category-api' -e 'amplify-codegen'
231231
unsetNpmRegistryUrl

0 commit comments

Comments
 (0)