private boolean isNoNullArgWithoutDefaultValue(InputValueDefinition definitionArgument) { return definitionArgument.getType() instanceof NonNullType && definitionArgument.getDefaultValue() == null; } }
private void checkForInputValueRedefinition(List<GraphQLError> errors, InputObjectTypeExtensionDefinition typeDefinition, List<InputValueDefinition> inputValueDefinitions, List<InputValueDefinition> referenceInputValues) { Map<String, InputValueDefinition> referenceMap = FpKit.getByName(referenceInputValues, InputValueDefinition::getName, mergeFirst()); inputValueDefinitions.forEach(fld -> { InputValueDefinition reference = referenceMap.get(fld.getName()); if (referenceMap.containsKey(fld.getName())) { // ok they have the same field but is it the same type if (!isSameType(fld.getType(), reference.getType())) { errors.add(new TypeExtensionFieldRedefinitionError(typeDefinition, fld)); } } }); }
private void checkArgInputObjectValueFieldMatchesAllowedDefinition(List<GraphQLError> errors, ObjectField objectField, InputValueDefinition allowedValueDef) { if (objectField != null) { checkArgValueMatchesAllowedType(errors, objectField.getValue(), allowedValueDef.getType()); return; } // check if field definition is required and has no default value if (allowedValueDef.getType() instanceof NonNullType && allowedValueDef.getDefaultValue() == null) { addValidationError(errors, MISSING_REQUIRED_FIELD_MESSAGE, allowedValueDef.getName()); } // other cases are // - field definition is marked as non-null but has a default value, so the default value can be used // - field definition is nullable hence null can be used }
private NodePrinter<InputValueDefinition> inputValueDefinition() { String nameTypeSep = compactMode ? ":" : ": "; String defaultValueEquals = compactMode ? "=" : "= "; return (out, node) -> { Value defaultValue = node.getDefaultValue(); out.printf("%s", comments(node)); out.printf("%s", spaced( node.getName() + nameTypeSep + type(node.getType()), wrap(defaultValueEquals, defaultValue, ""), directives(node.getDirectives()) ) ); }; }
private Builder(InputValueDefinition existing) { this.sourceLocation = existing.getSourceLocation(); this.comments = existing.getComments(); this.name = existing.getName(); this.type = existing.getType(); this.defaultValue = existing.getDefaultValue(); this.description = existing.getDescription(); this.directives = existing.getDirectives(); }
private void checkDirectiveArguments(List<GraphQLError> errors, TypeDefinitionRegistry typeRegistry, Node element, String elementName, Directive directive, DirectiveDefinition directiveDefinition) { Map<String, InputValueDefinition> allowedArgs = getByName(directiveDefinition.getInputValueDefinitions(), (InputValueDefinition::getName), mergeFirst()); Map<String, Argument> providedArgs = getByName(directive.getArguments(), (Argument::getName), mergeFirst()); directive.getArguments().forEach(argument -> { InputValueDefinition allowedArg = allowedArgs.get(argument.getName()); if (allowedArg == null) { errors.add(new DirectiveUnknownArgumentError(element, elementName, directive.getName(), argument.getName())); } else { ArgValueOfAllowedTypeChecker argValueOfAllowedTypeChecker = new ArgValueOfAllowedTypeChecker(directive, element, elementName, argument, typeRegistry, runtimeWiring); argValueOfAllowedTypeChecker.checkArgValueMatchesAllowedType(errors, argument.getValue(), allowedArg.getType()); } }); allowedArgs.forEach((argName, definitionArgument) -> { if (isNoNullArgWithoutDefaultValue(definitionArgument)) { if (!providedArgs.containsKey(argName)) { errors.add(new DirectiveMissingNonNullArgumentError(element, elementName, directive.getName(), argName)); } } }); }
private GraphQLArgument buildDirectiveArgumentFromDefinition(InputValueDefinition arg, Function<Type, GraphQLInputType> inputTypeFactory) { GraphQLArgument.Builder builder = GraphQLArgument.newArgument() .name(arg.getName()) .definition(arg); GraphQLInputType inputType = inputTypeFactory.apply(arg.getType()); builder.type(inputType); builder.value(buildValue(arg.getDefaultValue(), inputType)); builder.defaultValue(buildValue(arg.getDefaultValue(), inputType)); return builder.build(); }
.build()); } else { DiffCategory category = checkTypeWithNonNullAndList(oldField.getType(), newField.get().getType()); if (category != null) { ctx.report(DiffEvent.apiBreakage() .typeKind(getTypeKind(old)) .fieldName(oldField.getName()) .components(getAstDesc(oldField.getType()), getAstDesc(newField.get().getType())) .reasonMsg("The new API has changed input field '%s' from type '%s' to '%s'", oldField.getName(), getAstDesc(oldField.getType()), getAstDesc(newField.get().getType())) .build()); if (typeInfo(newField.getType()).isNonNull()) { ctx.report(DiffEvent.apiBreakage() .category(DiffCategory.STRICTER)
private GraphQLArgument buildArgument(BuildContext buildCtx, InputValueDefinition valueDefinition) { buildCtx.enterNode(valueDefinition); GraphQLArgument.Builder builder = GraphQLArgument.newArgument(); builder.definition(valueDefinition); builder.name(valueDefinition.getName()); builder.description(schemaGeneratorHelper.buildDescription(valueDefinition, valueDefinition.getDescription())); GraphQLInputType inputType = buildInputType(buildCtx, valueDefinition.getType()); builder.type(inputType); Value defaultValue = valueDefinition.getDefaultValue(); if (defaultValue != null) { builder.defaultValue(schemaGeneratorHelper.buildValue(defaultValue, inputType)); } builder.withDirectives( buildDirectives(valueDefinition.getDirectives(), emptyList(), ARGUMENT_DEFINITION, buildCtx.getDirectiveDefinitions()) ); GraphQLArgument argument = builder.build(); argument = directiveBehaviour.onArgument(argument, buildCtx.mkBehaviourParams()); return buildCtx.exitNode(argument); }
private GraphQLInputObjectField buildInputField(BuildContext buildCtx, InputValueDefinition fieldDef) { buildCtx.enterNode(fieldDef); GraphQLInputObjectField.Builder fieldBuilder = GraphQLInputObjectField.newInputObjectField(); fieldBuilder.definition(fieldDef); fieldBuilder.name(fieldDef.getName()); fieldBuilder.description(schemaGeneratorHelper.buildDescription(fieldDef, fieldDef.getDescription())); // currently the spec doesnt allow deprecations on InputValueDefinitions but it should! //fieldBuilder.deprecate(buildDeprecationReason(fieldDef.getDirectives())); GraphQLInputType inputType = buildInputType(buildCtx, fieldDef.getType()); fieldBuilder.type(inputType); Value defaultValue = fieldDef.getDefaultValue(); if (defaultValue != null) { fieldBuilder.defaultValue(schemaGeneratorHelper.buildValue(defaultValue, inputType)); } fieldBuilder.withDirectives( buildDirectives(fieldDef.getDirectives(), emptyList(), INPUT_FIELD_DEFINITION, buildCtx.getDirectiveDefinitions()) ); GraphQLInputObjectField inputObjectField = fieldBuilder.build(); inputObjectField = directiveBehaviour.onInputObjectField(inputObjectField, buildCtx.mkBehaviourParams()); return buildCtx.exitNode(inputObjectField); }
if (typeInfo(newArg.getType()).isNonNull()) { ctx.report(DiffEvent.apiBreakage() .category(DiffCategory.STRICTER)
private boolean isNoNullArgWithoutDefaultValue(InputValueDefinition definitionArgument) { return definitionArgument.getType() instanceof NonNullType && definitionArgument.getDefaultValue() == null; } }
private void addImports(Collection<String> imports, InputObjectTypeDefinition def) { for ( InputValueDefinition fieldDef : def.getInputValueDefinitions() ) { addImports(imports, fieldDef.getType()); } }
private void checkForInputValueRedefinition(List<GraphQLError> errors, InputObjectTypeExtensionDefinition typeDefinition, List<InputValueDefinition> inputValueDefinitions, List<InputValueDefinition> referenceInputValues) { Map<String, InputValueDefinition> referenceMap = FpKit.getByName(referenceInputValues, InputValueDefinition::getName, mergeFirst()); inputValueDefinitions.forEach(fld -> { InputValueDefinition reference = referenceMap.get(fld.getName()); if (referenceMap.containsKey(fld.getName())) { // ok they have the same field but is it the same type if (!isSameType(fld.getType(), reference.getType())) { errors.add(new TypeExtensionFieldRedefinitionError(typeDefinition, fld)); } } }); }
private List<Arg> toArgs(List<InputValueDefinition> defs) { List<Arg> result = new ArrayList<>(); for ( InputValueDefinition def : defs ) { Arg arg = new Arg(def.getName(), toJavaTypeName(def.getType())); arg.graphQLType = toGraphQLType(def.getType()); arg.defaultValue = toJavaValue(def.getDefaultValue()); result.add(arg); } return result; }
private void checkArgInputObjectValueFieldMatchesAllowedDefinition(List<GraphQLError> errors, ObjectField objectField, InputValueDefinition allowedValueDef) { if (objectField != null) { checkArgValueMatchesAllowedType(errors, objectField.getValue(), allowedValueDef.getType()); return; } // check if field definition is required and has no default value if (allowedValueDef.getType() instanceof NonNullType && allowedValueDef.getDefaultValue() == null) { addValidationError(errors, MISSING_REQUIRED_FIELD_MESSAGE, allowedValueDef.getName()); } // other cases are // - field definition is marked as non-null but has a default value, so the default value can be used // - field definition is nullable hence null can be used }
private List<Field> getFields(InputObjectTypeDefinition def) { List<Field> fields = new ArrayList<Field>(); for ( InputValueDefinition fieldDef : def.getInputValueDefinitions() ) { Field field = new Field(fieldDef.getName(), toJavaTypeName(fieldDef.getType())); field.graphQLType = toGraphQLType(fieldDef.getType()); field.defaultValue = toJavaValue(fieldDef.getDefaultValue()); fields.add(field); } return fields; }
private Builder(InputValueDefinition existing) { this.sourceLocation = existing.getSourceLocation(); this.comments = existing.getComments(); this.name = existing.getName(); this.type = existing.getType(); this.defaultValue = existing.getDefaultValue(); this.description = existing.getDescription(); this.directives = existing.getDirectives(); }
private GraphQLArgument buildDirectiveArgumentFromDefinition(InputValueDefinition arg, Function<Type, GraphQLInputType> inputTypeFactory) { GraphQLArgument.Builder builder = GraphQLArgument.newArgument() .name(arg.getName()) .definition(arg); GraphQLInputType inputType = inputTypeFactory.apply(arg.getType()); builder.type(inputType); builder.value(buildValue(arg.getDefaultValue(), inputType)); builder.defaultValue(buildValue(arg.getDefaultValue(), inputType)); return builder.build(); }