@@ -3,16 +3,15 @@ const fs = require('fs-extra');
33const { parse } = require ( 'graphql' ) ;
44const glob = require ( 'glob-all' ) ;
55const { FeatureFlags, pathManager } = require ( '@aws-amplify/amplify-cli-core' ) ;
6- const gqlCodeGen = require ( '@graphql-codegen/core' ) ;
7- const appSyncDataStoreCodeGen = require ( '@aws-amplify/appsync-modelgen-plugin' ) ;
8- const { version : packageVersion } = require ( '../../package.json' ) ;
6+ const { generateModels : generateModelsHelper } = require ( '@aws-amplify/graphql-generator' ) ;
97const { validateAmplifyFlutterMinSupportedVersion } = require ( '../utils/validateAmplifyFlutterMinSupportedVersion' ) ;
108
119const platformToLanguageMap = {
1210 android : 'java' ,
1311 ios : 'swift' ,
1412 flutter : 'dart' ,
1513 javascript : 'javascript' ,
14+ typescript : 'typescript' ,
1615} ;
1716
1817/**
@@ -91,9 +90,7 @@ async function generateModels(context, generateOptions = null) {
9190 } ) ;
9291
9392 const schemaContent = loadSchema ( apiResourcePath ) ;
94-
95- const baseOutputDir = path . join ( projectRoot , getModelOutputPath ( context ) ) ;
96- const schema = parse ( schemaContent ) ;
93+ const baseOutputDir = overrideOutputDir || path . join ( projectRoot , getModelOutputPath ( context ) ) ;
9794 const projectConfig = context . amplify . getProjectConfig ( ) ;
9895
9996 if ( ! isIntrospection && projectConfig . frontend === 'flutter' && ! validateAmplifyFlutterMinSupportedVersion ( projectRoot ) ) {
@@ -104,64 +101,42 @@ Amplify Flutter versions prior to 0.6.0 are no longer supported by codegen. Plea
104101
105102 const generateIndexRules = readFeatureFlag ( 'codegen.generateIndexRules' ) ;
106103 const emitAuthProvider = readFeatureFlag ( 'codegen.emitAuthProvider' ) ;
107- const usePipelinedTransformer = readFeatureFlag ( 'graphQLTransformer.useExperimentalPipelinedTransformer' ) ;
104+ const useExperimentalPipelinedTransformer = readFeatureFlag ( 'graphQLTransformer.useExperimentalPipelinedTransformer' ) ;
108105 const transformerVersion = readNumericFeatureFlag ( 'graphQLTransformer.transformerVersion' ) ;
109106 const respectPrimaryKeyAttributesOnConnectionField = readFeatureFlag ( 'graphQLTransformer.respectPrimaryKeyAttributesOnConnectionField' ) ;
110107 const generateModelsForLazyLoadAndCustomSelectionSet = readFeatureFlag ( 'codegen.generateModelsForLazyLoadAndCustomSelectionSet' ) ;
111108 const improvePluralization = readFeatureFlag ( 'graphQLTransformer.improvePluralization' ) ;
112-
113- let isTimestampFieldsAdded = readFeatureFlag ( 'codegen.addTimestampFields' ) ;
109+ const addTimestampFields = readFeatureFlag ( 'codegen.addTimestampFields' ) ;
114110
115111 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- } ) ;
135112
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- } ) ;
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,
148126 } ) ;
149127
150- const generatedCode = await Promise . all ( codeGenPromises ) ;
151-
152128 if ( writeToDisk ) {
153- appsyncLocalConfig . forEach ( ( cfg , idx ) => {
154- const outPutPath = cfg . filename ;
155- fs . ensureFileSync ( outPutPath ) ;
156- fs . writeFileSync ( outPutPath , generatedCode [ idx ] ) ;
129+ Object . entries ( generatedCode ) . forEach ( ( [ filepath , contents ] ) => {
130+ fs . outputFileSync ( path . resolve ( path . join ( baseOutputDir , filepath ) ) , contents ) ;
157131 } ) ;
158132
133+ // TODO: move to @aws -amplify/graphql-generator
159134 generateEslintIgnore ( context ) ;
160135
161- context . print . info ( `Successfully generated models. Generated models can be found in ${ overrideOutputDir ?? baseOutputDir } ` ) ;
136+ context . print . info ( `Successfully generated models. Generated models can be found in ${ baseOutputDir } ` ) ;
162137 }
163138
164- return generatedCode ;
139+ return Object . values ( generatedCode ) ;
165140}
166141
167142async function validateSchema ( context ) {
@@ -196,9 +171,12 @@ function getModelOutputPath(context) {
196171 const projectConfig = context . amplify . getProjectConfig ( ) ;
197172 switch ( projectConfig . frontend ) {
198173 case 'javascript' :
199- return projectConfig . javascript && projectConfig . javascript . config && projectConfig . javascript . config . SourceDir
200- ? path . normalize ( projectConfig . javascript . config . SourceDir )
201- : 'src' ;
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+ ) ;
202180 case 'android' :
203181 return projectConfig . android && projectConfig . android . config && projectConfig . android . config . ResDir
204182 ? path . normalize ( path . join ( projectConfig . android . config . ResDir , '..' , 'java' ) )
0 commit comments