Skip to content
This repository was archived by the owner on Oct 2, 2024. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# CHANGELOG

## 7.0.0-beta.16

- lazy canonical visitors

## 7.0.0-beta.15

- Update build_runner version in examples
Expand Down
20 changes: 11 additions & 9 deletions lib/generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -179,14 +179,14 @@ Iterable<QueryDefinition> generateDefinitions(

final rootTypeName =
(schemaVisitor.schemaDefinitionNode?.operationTypes ?? [])
.firstWhereOrNull((e) => e.operation == operation.type)
?.type
.name
.value ??
.firstWhereOrNull((e) => e.operation == operation.type)
?.type
.name
.value ??
suffix;

final TypeDefinitionNode parentType =
objectVisitor.getByName(rootTypeName)!;
objectVisitor.getByName(rootTypeName)!;

final name = QueryName.fromPath(
path: createPathName([
Expand Down Expand Up @@ -222,11 +222,13 @@ Iterable<QueryDefinition> generateDefinitions(
operationName: operationName,
document: documentDefinitions,
classes: [
...canonicalVisitor.enums
.where((e) => context.usedEnums.contains(e.name)),
...context.usedEnums
.map((e) => canonicalVisitor.enums[e.name]?.call())
.whereType<Definition>(),
...visitor.context.generatedClasses,
...canonicalVisitor.inputObjects
.where((i) => context.usedInputObjects.contains(i.name)),
...context.usedInputObjects
.map((e) => canonicalVisitor.inputObjects[e.name]?.call())
.whereType<Definition>(),
],
inputs: visitor.context.inputsClasses,
generateHelpers: options.generateHelpers,
Expand Down
112 changes: 61 additions & 51 deletions lib/visitor/canonical_visitor.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@ import 'package:artemis/generator/helpers.dart';
import 'package:artemis/generator/graphql_helpers.dart' as gql;
import 'package:gql/ast.dart';

/// class definition lazy generator
typedef ClassDefinitionGenerator = ClassDefinition Function();

/// class definition lazy generator
typedef EnumDefinitionGenerator = EnumDefinition Function();

/// Visits canonical types Enums and InputObjects
class CanonicalVisitor extends RecursiveVisitor {
/// Constructor
Expand All @@ -18,72 +24,76 @@ class CanonicalVisitor extends RecursiveVisitor {
final Context context;

/// List of visited input objects
final List<ClassDefinition> inputObjects = [];
final Map<String, ClassDefinitionGenerator> inputObjects = {};

/// List of visited enums
final List<EnumDefinition> enums = [];
final Map<String, EnumDefinitionGenerator> enums = {};

@override
void visitEnumTypeDefinitionNode(EnumTypeDefinitionNode node) {
final enumName = EnumName(name: node.name.value);
enums[node.name.value] = () {
final enumName = EnumName(name: node.name.value);

final nextContext = context.sameTypeWithNoPath(
alias: enumName,
ofUnion: Nullable<TypeDefinitionNode?>(null),
);
final nextContext = context.sameTypeWithNoPath(
alias: enumName,
ofUnion: Nullable<TypeDefinitionNode?>(null),
);

logFn(context, nextContext.align, '-> Enum');
logFn(context, nextContext.align,
'<- Generated enum ${enumName.namePrintable}.');
logFn(context, nextContext.align, '-> Enum');
logFn(context, nextContext.align,
'<- Generated enum ${enumName.namePrintable}.');

enums.add(EnumDefinition(
name: enumName,
values: node.values
.map((ev) => EnumValueDefinition(
name: EnumValueName(name: ev.name.value),
annotations: proceedDeprecated(ev.directives),
))
.toList()
..add(ARTEMIS_UNKNOWN),
));
return EnumDefinition(
name: enumName,
values: node.values
.map((ev) => EnumValueDefinition(
name: EnumValueName(name: ev.name.value),
annotations: proceedDeprecated(ev.directives),
))
.toList()
..add(ARTEMIS_UNKNOWN),
);
};
}

@override
void visitInputObjectTypeDefinitionNode(InputObjectTypeDefinitionNode node) {
final name = ClassName(name: node.name.value);
final nextContext = context.sameTypeWithNoPath(
alias: name,
ofUnion: Nullable<TypeDefinitionNode?>(null),
);
inputObjects[node.name.value] = () {
final name = ClassName(name: node.name.value);
final nextContext = context.sameTypeWithNoPath(
alias: name,
ofUnion: Nullable<TypeDefinitionNode?>(null),
);

logFn(context, nextContext.align, '-> Input class');
logFn(context, nextContext.align,
'┌ ${nextContext.path}[${node.name.value}]');
final properties = <ClassProperty>[];
logFn(context, nextContext.align, '-> Input class');
logFn(context, nextContext.align,
'┌ ${nextContext.path}[${node.name.value}]');
final properties = <ClassProperty>[];

properties.addAll(node.fields.map((i) {
final nextType = gql.getTypeByName(nextContext.schema, i.type);
return createClassProperty(
fieldName: ClassPropertyName(name: i.name.value),
context: nextContext.nextTypeWithNoPath(
nextType: node,
nextClassName: ClassName(name: nextType.name.value),
nextFieldName: ClassName(name: i.name.value),
ofUnion: Nullable<TypeDefinitionNode?>(null),
),
markAsUsed: false,
);
}));
properties.addAll(node.fields.map((i) {
final nextType = gql.getTypeByName(nextContext.schema, i.type);
return createClassProperty(
fieldName: ClassPropertyName(name: i.name.value),
context: nextContext.nextTypeWithNoPath(
nextType: node,
nextClassName: ClassName(name: nextType.name.value),
nextFieldName: ClassName(name: i.name.value),
ofUnion: Nullable<TypeDefinitionNode?>(null),
),
markAsUsed: false,
);
}));

logFn(context, nextContext.align,
'└ ${nextContext.path}[${node.name.value}]');
logFn(context, nextContext.align,
'<- Generated input class ${name.namePrintable}.');
logFn(context, nextContext.align,
'└ ${nextContext.path}[${node.name.value}]');
logFn(context, nextContext.align,
'<- Generated input class ${name.namePrintable}.');

inputObjects.add(ClassDefinition(
isInput: true,
name: name,
properties: properties,
));
return ClassDefinition(
isInput: true,
name: name,
properties: properties,
);
};
}
}
10 changes: 5 additions & 5 deletions pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
name: artemis
version: 7.0.0-beta.15
version: 7.0.0-beta.16

description: Build dart types from GraphQL schemas and queries (using Introspection Query).
homepage: https://github.com/comigor/artemis
Expand All @@ -13,7 +13,7 @@ dependencies:
build: ^2.0.2
collection: ^1.15.0
dart_style: ^2.0.1
equatable: ^2.0.2
equatable: ^2.0.3
glob: ^2.0.1
gql_code_builder: ^0.2.0
gql_dedupe_link: ^2.0.0
Expand All @@ -25,7 +25,7 @@ dependencies:
json_annotation: ^4.0.1
path: ^1.8.0
recase: ^4.0.0
source_gen: ^1.0.1
source_gen: ^1.0.2
yaml: ^3.1.0

dev_dependencies:
Expand All @@ -34,7 +34,7 @@ dev_dependencies:
build_test: ^2.1.0
json_serializable: ^4.1.3
build_resolvers: ^2.0.3
pedantic: ^1.11.0
test: ^1.17.5
pedantic: ^1.11.1
test: ^1.17.8
logging: ^1.0.1

52 changes: 26 additions & 26 deletions test/query_generator/ast_schema/input_types_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -103,17 +103,6 @@ final LibraryDefinition libraryDefinition =
factoryPossibilities: {},
typeNameField: ClassPropertyName(name: r'__typename'),
isInput: false),
ClassDefinition(
name: ClassName(name: r'OtherObjectInput'),
properties: [
ClassProperty(
type: TypeName(name: r'String', isNonNull: true),
name: ClassPropertyName(name: r'id'),
isResolveType: false)
],
factoryPossibilities: {},
typeNameField: ClassPropertyName(name: r'__typename'),
isInput: true),
ClassDefinition(
name: ClassName(name: r'CreateThingInput'),
properties: [
Expand All @@ -135,6 +124,17 @@ final LibraryDefinition libraryDefinition =
],
factoryPossibilities: {},
typeNameField: ClassPropertyName(name: r'__typename'),
isInput: true),
ClassDefinition(
name: ClassName(name: r'OtherObjectInput'),
properties: [
ClassProperty(
type: TypeName(name: r'String', isNonNull: true),
name: ClassPropertyName(name: r'id'),
isResolveType: false)
],
factoryPossibilities: {},
typeNameField: ClassPropertyName(name: r'__typename'),
isInput: true)
],
inputs: [
Expand Down Expand Up @@ -207,21 +207,6 @@ class CreateThing$MutationRoot extends JsonSerializable with EquatableMixin {
Map<String, dynamic> toJson() => _$CreateThing$MutationRootToJson(this);
}

@JsonSerializable(explicitToJson: true)
class OtherObjectInput extends JsonSerializable with EquatableMixin {
OtherObjectInput({required this.id});

factory OtherObjectInput.fromJson(Map<String, dynamic> json) =>
_$OtherObjectInputFromJson(json);

late String id;

@override
List<Object?> get props => [id];
@override
Map<String, dynamic> toJson() => _$OtherObjectInputToJson(this);
}

@JsonSerializable(explicitToJson: true)
class CreateThingInput extends JsonSerializable with EquatableMixin {
CreateThingInput({required this.clientId, this.message, this.shares});
Expand All @@ -240,4 +225,19 @@ class CreateThingInput extends JsonSerializable with EquatableMixin {
@override
Map<String, dynamic> toJson() => _$CreateThingInputToJson(this);
}

@JsonSerializable(explicitToJson: true)
class OtherObjectInput extends JsonSerializable with EquatableMixin {
OtherObjectInput({required this.id});

factory OtherObjectInput.fromJson(Map<String, dynamic> json) =>
_$OtherObjectInputFromJson(json);

late String id;

@override
List<Object?> get props => [id];
@override
Map<String, dynamic> toJson() => _$OtherObjectInputToJson(this);
}
''';