Skip to content

Commit d7a84d6

Browse files
author
Dane Pilcher
authored
Revert "feat: graphql-generator package (#677)" (#687)
This reverts commit 6348627.
1 parent 6348627 commit d7a84d6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+317
-14296
lines changed

.eslintrc.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,6 @@ module.exports = {
5656
"utils",
5757
"aws",
5858
"sdk",
59-
"javascript",
60-
"graphql",
61-
"scala",
6259
],
6360
"skipIfMatch": [
6461
"http://[^s]*",

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ package-lock.json
1010
.vscode/*
1111
!.vscode/settings.json
1212
!.vscode/extensions.json
13-
packages/graphql-generator/lib
1413
packages/appsync-modelgen-plugin/lib
1514
packages/graphql-docs-generator/lib
1615
packages/graphql-types-generator/lib

packages/amplify-codegen/package.json

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
"extract-api": "ts-node ../../scripts/extract-api.ts"
2222
},
2323
"dependencies": {
24-
"@aws-amplify/graphql-generator": "^0.0.1",
24+
"@aws-amplify/appsync-modelgen-plugin": "2.6.0",
25+
"@aws-amplify/graphql-docs-generator": "4.1.0",
26+
"@aws-amplify/graphql-types-generator": "3.3.0",
2527
"@graphql-codegen/core": "2.6.6",
2628
"chalk": "^3.0.0",
2729
"fs-extra": "^8.1.0",
@@ -44,9 +46,9 @@
4446
"collectCoverage": true,
4547
"coverageThreshold": {
4648
"global": {
47-
"branches": 54,
48-
"functions": 65,
49-
"lines": 72
49+
"branches": 56,
50+
"functions": 68,
51+
"lines": 73
5052
}
5153
},
5254
"testURL": "http://localhost",

packages/amplify-codegen/src/commands/models.js

Lines changed: 51 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@ const fs = require('fs-extra');
33
const { parse } = require('graphql');
44
const glob = require('glob-all');
55
const { FeatureFlags, pathManager } = require('@aws-amplify/amplify-cli-core');
6-
const { generateModels: generateModelsHelper } = require('@aws-amplify/graphql-generator');
6+
const gqlCodeGen = require('@graphql-codegen/core');
7+
const appSyncDataStoreCodeGen = require('@aws-amplify/appsync-modelgen-plugin');
8+
const { version: packageVersion } = require('../../package.json');
79
const { validateAmplifyFlutterMinSupportedVersion } = require('../utils/validateAmplifyFlutterMinSupportedVersion');
810

911
const platformToLanguageMap = {
1012
android: 'java',
1113
ios: 'swift',
1214
flutter: 'dart',
1315
javascript: 'javascript',
14-
typescript: 'typescript',
1516
};
1617

1718
/**
@@ -90,7 +91,9 @@ async function generateModels(context, generateOptions = null) {
9091
});
9192

9293
const schemaContent = loadSchema(apiResourcePath);
93-
const baseOutputDir = overrideOutputDir || path.join(projectRoot, getModelOutputPath(context));
94+
95+
const baseOutputDir = path.join(projectRoot, getModelOutputPath(context));
96+
const schema = parse(schemaContent);
9497
const projectConfig = context.amplify.getProjectConfig();
9598

9699
if (!isIntrospection && projectConfig.frontend === 'flutter' && !validateAmplifyFlutterMinSupportedVersion(projectRoot)) {
@@ -101,42 +104,64 @@ Amplify Flutter versions prior to 0.6.0 are no longer supported by codegen. Plea
101104

102105
const generateIndexRules = readFeatureFlag('codegen.generateIndexRules');
103106
const emitAuthProvider = readFeatureFlag('codegen.emitAuthProvider');
104-
const useExperimentalPipelinedTransformer = readFeatureFlag('graphQLTransformer.useExperimentalPipelinedTransformer');
107+
const usePipelinedTransformer = readFeatureFlag('graphQLTransformer.useExperimentalPipelinedTransformer');
105108
const transformerVersion = readNumericFeatureFlag('graphQLTransformer.transformerVersion');
106109
const respectPrimaryKeyAttributesOnConnectionField = readFeatureFlag('graphQLTransformer.respectPrimaryKeyAttributesOnConnectionField');
107110
const generateModelsForLazyLoadAndCustomSelectionSet = readFeatureFlag('codegen.generateModelsForLazyLoadAndCustomSelectionSet');
108111
const improvePluralization = readFeatureFlag('graphQLTransformer.improvePluralization');
109-
const addTimestampFields = readFeatureFlag('codegen.addTimestampFields');
112+
113+
let isTimestampFieldsAdded = readFeatureFlag('codegen.addTimestampFields');
110114

111115
const handleListNullabilityTransparently = readFeatureFlag('codegen.handleListNullabilityTransparently');
116+
const appsyncLocalConfig = await appSyncDataStoreCodeGen.preset.buildGeneratesSection({
117+
baseOutputDir,
118+
schema,
119+
config: {
120+
target: isIntrospection ? 'introspection' : platformToLanguageMap[projectConfig.frontend] || projectConfig.frontend,
121+
directives: directiveDefinitions,
122+
isTimestampFieldsAdded,
123+
emitAuthProvider,
124+
generateIndexRules,
125+
handleListNullabilityTransparently,
126+
usePipelinedTransformer,
127+
transformerVersion,
128+
respectPrimaryKeyAttributesOnConnectionField,
129+
improvePluralization,
130+
generateModelsForLazyLoadAndCustomSelectionSet,
131+
codegenVersion: packageVersion,
132+
overrideOutputDir, // This needs to live under `config` in order for the GraphQL types to work out.
133+
},
134+
});
112135

113-
const generatedCode = await generateModelsHelper({
114-
schema: schemaContent,
115-
directives: directiveDefinitions,
116-
target: isIntrospection ? 'introspection' : platformToLanguageMap[projectConfig.frontend],
117-
generateIndexRules,
118-
emitAuthProvider,
119-
useExperimentalPipelinedTransformer,
120-
transformerVersion,
121-
respectPrimaryKeyAttributesOnConnectionField,
122-
improvePluralization,
123-
generateModelsForLazyLoadAndCustomSelectionSet,
124-
addTimestampFields,
125-
handleListNullabilityTransparently,
136+
const codeGenPromises = appsyncLocalConfig.map(cfg => {
137+
return gqlCodeGen.codegen({
138+
...cfg,
139+
plugins: [
140+
{
141+
appSyncLocalCodeGen: {},
142+
},
143+
],
144+
pluginMap: {
145+
appSyncLocalCodeGen: appSyncDataStoreCodeGen,
146+
},
147+
});
126148
});
127149

150+
const generatedCode = await Promise.all(codeGenPromises);
151+
128152
if (writeToDisk) {
129-
Object.entries(generatedCode).forEach(([filepath, contents]) => {
130-
fs.outputFileSync(path.resolve(path.join(baseOutputDir, filepath)), contents);
153+
appsyncLocalConfig.forEach((cfg, idx) => {
154+
const outPutPath = cfg.filename;
155+
fs.ensureFileSync(outPutPath);
156+
fs.writeFileSync(outPutPath, generatedCode[idx]);
131157
});
132158

133-
// TODO: move to @aws-amplify/graphql-generator
134159
generateEslintIgnore(context);
135160

136-
context.print.info(`Successfully generated models. Generated models can be found in ${baseOutputDir}`);
161+
context.print.info(`Successfully generated models. Generated models can be found in ${overrideOutputDir ?? baseOutputDir}`);
137162
}
138163

139-
return Object.values(generatedCode);
164+
return generatedCode;
140165
}
141166

142167
async function validateSchema(context) {
@@ -171,12 +196,9 @@ function getModelOutputPath(context) {
171196
const projectConfig = context.amplify.getProjectConfig();
172197
switch (projectConfig.frontend) {
173198
case 'javascript':
174-
return path.join(
175-
projectConfig.javascript && projectConfig.javascript.config && projectConfig.javascript.config.SourceDir
176-
? path.normalize(projectConfig.javascript.config.SourceDir)
177-
: 'src',
178-
'models',
179-
);
199+
return projectConfig.javascript && projectConfig.javascript.config && projectConfig.javascript.config.SourceDir
200+
? path.normalize(projectConfig.javascript.config.SourceDir)
201+
: 'src';
180202
case 'android':
181203
return projectConfig.android && projectConfig.android.config && projectConfig.android.config.ResDir
182204
? path.normalize(path.join(projectConfig.android.config.ResDir, '..', 'java'))

packages/amplify-codegen/src/commands/statements.js

Lines changed: 45 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,14 @@ const Ora = require('ora');
44

55
const { loadConfig } = require('../codegen-config');
66
const constants = require('../constants');
7-
const { ensureIntrospectionSchema, getFrontEndHandler, getAppSyncAPIDetails, readSchemaFromFile } = require('../utils');
7+
const {
8+
ensureIntrospectionSchema,
9+
getFrontEndHandler,
10+
getAppSyncAPIDetails,
11+
readSchemaFromFile,
12+
GraphQLStatementsFormatter,
13+
} = require('../utils');
814
const { generateGraphQLDocuments } = require('@aws-amplify/graphql-docs-generator');
9-
const { generateStatements: generateStatementsHelper } = require('@aws-amplify/graphql-generator');
1015

1116
async function generateStatements(context, forceDownloadSchema, maxDepth, withoutInit = false, decoupleFrontend = '') {
1217
try {
@@ -51,29 +56,31 @@ async function generateStatements(context, forceDownloadSchema, maxDepth, withou
5156
frontend = decoupleFrontend;
5257
}
5358
const language = frontend === 'javascript' ? cfg.amplifyExtension.codeGenTarget : 'graphql';
59+
if (!Object.keys(FILE_EXTENSION_MAP).includes(language)) {
60+
throw new Error(`Language ${language} not supported`);
61+
}
5462

5563
const opsGenSpinner = new Ora(constants.INFO_MESSAGE_OPS_GEN);
5664
opsGenSpinner.start();
5765

5866
try {
67+
fs.ensureDirSync(opsGenDirectory);
5968
const schemaData = readSchemaFromFile(schemaPath);
60-
const relativeTypesPath = cfg.amplifyExtension.generatedFileName
61-
? path.relative(opsGenDirectory, cfg.amplifyExtension.generatedFileName)
62-
: null;
63-
const generatedOps = generateStatementsHelper({
64-
schema: schemaData,
65-
target: language,
69+
const generatedOps = generateGraphQLDocuments(schemaData, {
6670
maxDepth: maxDepth || cfg.amplifyExtension.maxDepth,
6771
useExternalFragmentForS3Object: language === 'graphql',
6872
// default typenameIntrospection to true when not set
6973
typenameIntrospection:
7074
cfg.amplifyExtension.typenameIntrospection === undefined ? true : !!cfg.amplifyExtension.typenameIntrospection,
71-
relativeTypesPath,
75+
includeMetaData: true,
7276
});
7377
if (!generatedOps) {
7478
context.print.warning('No GraphQL statements are generated. Check if the introspection schema has GraphQL operations defined.');
7579
} else {
76-
await writeGeneratedDocuments(language, generatedOps, opsGenDirectory);
80+
const relativeTypesPath = cfg.amplifyExtension.generatedFileName
81+
? path.relative(opsGenDirectory, cfg.amplifyExtension.generatedFileName)
82+
: null;
83+
await writeGeneratedDocuments(language, generatedOps, opsGenDirectory, relativeTypesPath);
7784
opsGenSpinner.succeed(constants.INFO_MESSAGE_OPS_GEN_SUCCESS + path.relative(path.resolve('.'), opsGenDirectory));
7885
}
7986
} finally {
@@ -82,10 +89,35 @@ async function generateStatements(context, forceDownloadSchema, maxDepth, withou
8289
}
8390
}
8491

85-
function writeGeneratedDocuments(language, generatedStatements, outputPath) {
86-
Object.entries(generatedStatements).forEach(([filepath, contents]) => {
87-
fs.outputFileSync(path.resolve(path.join(outputPath, filepath)), contents);
92+
async function writeGeneratedDocuments(language, generatedStatements, outputPath, relativeTypesPath) {
93+
const fileExtension = FILE_EXTENSION_MAP[language];
94+
95+
['queries', 'mutations', 'subscriptions'].forEach(op => {
96+
const ops = generatedStatements[op];
97+
if (ops && ops.size) {
98+
const formattedStatements = new GraphQLStatementsFormatter(language, op, relativeTypesPath).format(ops);
99+
const outputFile = path.resolve(path.join(outputPath, `${op}.${fileExtension}`));
100+
fs.writeFileSync(outputFile, formattedStatements);
101+
}
88102
});
103+
104+
if (fileExtension === 'graphql') {
105+
// External Fragments are rendered only for GraphQL targets
106+
const fragments = generatedStatements['fragments'];
107+
if (fragments.size) {
108+
const formattedStatements = new GraphQLStatementsFormatter(language).format(fragments);
109+
const outputFile = path.resolve(path.join(outputPath, `fragments.${fileExtension}`));
110+
fs.writeFileSync(outputFile, formattedStatements);
111+
}
112+
}
89113
}
90114

115+
const FILE_EXTENSION_MAP = {
116+
javascript: 'js',
117+
graphql: 'graphql',
118+
flow: 'js',
119+
typescript: 'ts',
120+
angular: 'graphql',
121+
};
122+
91123
module.exports = generateStatements;

packages/amplify-codegen/src/commands/types.js

Lines changed: 10 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
const glob = require('glob-all');
22
const path = require('path');
33
const Ora = require('ora');
4-
const fs = require('fs-extra');
54

65
const constants = require('../constants');
76
const { loadConfig } = require('../codegen-config');
87
const { ensureIntrospectionSchema, getFrontEndHandler, getAppSyncAPIDetails } = require('../utils');
9-
const { generateTypes: generateTypesHelper } = require('@aws-amplify/graphql-generator');
10-
const { extractDocumentFromJavascript } = require('@aws-amplify/graphql-types-generator');
8+
const { generate } = require('@aws-amplify/graphql-types-generator');
119

1210
async function generateTypes(context, forceDownloadSchema, withoutInit = false, decoupleFrontend = '') {
1311
let frontend = decoupleFrontend;
@@ -45,29 +43,14 @@ async function generateTypes(context, forceDownloadSchema, withoutInit = false,
4543
if (!generatedFileName || generatedFileName === '' || includeFiles.length === 0) {
4644
return;
4745
}
48-
const target = cfg.amplifyExtension.codeGenTarget;
4946

5047
const excludes = cfg.excludes.map(pattern => `!${pattern}`);
51-
const queries = glob
52-
.sync([...includeFiles, ...excludes], {
53-
cwd: projectPath,
54-
absolute: true,
55-
})
56-
.map(queryFilePath => {
57-
const fileContents = fs.readFileSync(queryFilePath, 'utf8');
58-
if (
59-
queryFilePath.endsWith('.jsx') ||
60-
queryFilePath.endsWith('.js') ||
61-
queryFilePath.endsWith('.tsx') ||
62-
queryFilePath.endsWith('.ts')
63-
) {
64-
return extractDocumentFromJavascript(fileContents, '');
65-
}
66-
return fileContents;
67-
})
68-
.join('\n');
69-
48+
const queries = glob.sync([...includeFiles, ...excludes], {
49+
cwd: projectPath,
50+
absolute: true,
51+
});
7052
const schemaPath = path.join(projectPath, cfg.schema);
53+
const target = cfg.amplifyExtension.codeGenTarget;
7154

7255
const outputPath = path.join(projectPath, generatedFileName);
7356
let region;
@@ -77,32 +60,12 @@ async function generateTypes(context, forceDownloadSchema, withoutInit = false,
7760
}
7861
const codeGenSpinner = new Ora(constants.INFO_MESSAGE_CODEGEN_GENERATE_STARTED);
7962
codeGenSpinner.start();
80-
const schema = fs.readFileSync(schemaPath, 'utf8');
81-
const introspection = path.extname(schemaPath) === '.json';
82-
8363
try {
84-
const output = await generateTypesHelper({
85-
schema,
86-
queries,
87-
target,
88-
introspection,
64+
generate(queries, schemaPath, path.join(projectPath, generatedFileName), '', target, '', {
65+
addTypename: true,
66+
complexObjectSupport: 'auto',
8967
});
90-
const outputs = Object.entries(output);
91-
92-
if (outputs.length === 1) {
93-
const [[, contents]] = outputs;
94-
fs.outputFileSync(path.resolve(path.join(projectPath, outputPath)), contents);
95-
} else {
96-
outputs.forEach(([filepath, contents]) => {
97-
fs.outputFileSync(path.resolve(path.join(projectPath, outputPath, filepath)), contents);
98-
});
99-
}
100-
codeGenSpinner.succeed(
101-
`${constants.INFO_MESSAGE_CODEGEN_GENERATE_SUCCESS} ${path.relative(
102-
path.resolve('.'),
103-
path.join(projectPath, generatedFileName),
104-
)}`,
105-
);
68+
codeGenSpinner.succeed(`${constants.INFO_MESSAGE_CODEGEN_GENERATE_SUCCESS} ${path.relative(path.resolve('.'), outputPath)}`);
10669
} catch (err) {
10770
codeGenSpinner.fail(err.message);
10871
}

0 commit comments

Comments
 (0)