in packages/appsync-modelgen-plugin/src/visitors/appsync-dart-visitor.ts [801:880]
protected generateAddFields(model: CodeGenModel): string {
if (model.fields.length) {
const fieldsToAdd: string[] = [];
model.fields.forEach(field => {
const fieldName = this.getFieldName(field);
const modelName = this.getModelName(model);
const queryFieldName = this.getQueryFieldName(field);
let fieldParam: string = '';
//field id
if (fieldName === 'id') {
fieldsToAdd.push('ModelFieldDefinition.id()');
}
//field with @connection
else if (field.connectionInfo) {
const connectedModelName = this.getNativeType({ ...field, isList: false });
switch (field.connectionInfo.kind) {
case CodeGenConnectionType.HAS_ONE:
fieldParam = [
`key: ${modelName}.${queryFieldName}`,
`isRequired: ${!field.isNullable}`,
`ofModelName: (${connectedModelName}).toString()`,
`associatedKey: ${connectedModelName}.${this.getQueryFieldName(field.connectionInfo.associatedWith)}`,
].join(',\n');
fieldsToAdd.push(['ModelFieldDefinition.hasOne(', indentMultiline(fieldParam), ')'].join('\n'));
break;
case CodeGenConnectionType.HAS_MANY:
fieldParam = [
`key: ${modelName}.${queryFieldName}`,
`isRequired: ${!field.isNullable}`,
`ofModelName: (${connectedModelName}).toString()`,
`associatedKey: ${connectedModelName}.${this.getQueryFieldName(field.connectionInfo.associatedWith)}`,
].join(',\n');
fieldsToAdd.push(['ModelFieldDefinition.hasMany(', indentMultiline(fieldParam), ')'].join('\n'));
break;
case CodeGenConnectionType.BELONGS_TO:
fieldParam = [
`key: ${modelName}.${queryFieldName}`,
`isRequired: ${!field.isNullable}`,
`targetName: "${field.connectionInfo.targetName}"`,
`ofModelName: (${connectedModelName}).toString()`,
].join(',\n');
fieldsToAdd.push(['ModelFieldDefinition.belongsTo(', indentMultiline(fieldParam), ')'].join('\n'));
break;
}
}
//field with regular types
else {
const ofType = this.getOfType(field);
let ofTypeStr: string;
if (field.isList) {
if (ofType === '.embedded') {
ofTypeStr = `ofType: ModelFieldType(ModelFieldTypeEnum.embeddedCollection, ofCustomTypeName: '${field.type}')`;
} else {
ofTypeStr = `ofType: ModelFieldType(ModelFieldTypeEnum.collection, ofModelName: describeEnum(ModelFieldTypeEnum${ofType}))`;
}
} else if (ofType === '.embedded') {
ofTypeStr = `ofType: ModelFieldType(ModelFieldTypeEnum${ofType}, ofCustomTypeName: '${field.type}')`;
} else {
ofTypeStr = `ofType: ModelFieldType(ModelFieldTypeEnum${ofType})`;
}
fieldParam = [
...(ofType === '.embedded' || field.isReadOnly ? [`fieldName: '${fieldName}'`] : [`key: ${modelName}.${queryFieldName}`]),
`isRequired: ${this.isFieldRequired(field)}`,
field.isList ? 'isArray: true' : '',
field.isReadOnly ? 'isReadOnly: true' : '',
ofTypeStr,
]
.filter(f => f)
.join(',\n');
fieldsToAdd.push(
[`ModelFieldDefinition.${ofType === '.embedded' ? 'embedded' : (field.isReadOnly ? 'nonQueryField' : 'field')}(`, indentMultiline(fieldParam), ')'].join('\n'),
); }
});
return fieldsToAdd.map(field => `modelSchemaDefinition.addField(${field});`).join('\n\n');
}
return '';
}