diff --git a/docs/book/content/quickstart.md b/docs/book/content/quickstart.md index 8537cc60f..0e56df38c 100644 --- a/docs/book/content/quickstart.md +++ b/docs/book/content/quickstart.md @@ -8,7 +8,7 @@ This page will give you a short introduction to the concepts in Juniper. ```toml [dependencies] -juniper = "0.11" +juniper = "0.14.2" ``` ## Schema example diff --git a/docs/book/content/types/objects/complex_fields.md b/docs/book/content/types/objects/complex_fields.md index 7ffd16944..e0832059e 100644 --- a/docs/book/content/types/objects/complex_fields.md +++ b/docs/book/content/types/objects/complex_fields.md @@ -25,6 +25,14 @@ impl Person { } } +// Note that this syntax generates an implementation of the GraphQLType trait, +// the base impl of your struct can still be written like usual: +impl Person { + pub fn hidden_from_graphql(&self) { + // [...] + } +} + # fn main() { } ``` diff --git a/juniper/CHANGELOG.md b/juniper/CHANGELOG.md index 55e494186..5c17a8ccf 100644 --- a/juniper/CHANGELOG.md +++ b/juniper/CHANGELOG.md @@ -20,6 +20,11 @@ The previous `Value` return type was just an internal artifact of error handling. +# [[0.14.2] 2019-12-16](https://github.com/graphql-rust/juniper/releases/tag/juniper-0.14.2) + +- Fix incorrect validation with non-executed operations [#455](https://github.com/graphql-rust/juniper/issues/455) +- Correctly handle raw identifiers in field and argument names. + # [[0.14.1] 2019-10-24](https://github.com/graphql-rust/juniper/releases/tag/juniper-0.14.1) - Fix panic when an invalid scalar is used by a client [#434](https://github.com/graphql-rust/juniper/pull/434) diff --git a/juniper/Cargo.toml b/juniper/Cargo.toml index 3be36030f..895fa2950 100644 --- a/juniper/Cargo.toml +++ b/juniper/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "juniper" -version = "0.14.1" +version = "0.14.2" authors = [ "Magnus Hallin ", "Christoph Herzog ", @@ -33,7 +33,7 @@ default = [ ] [dependencies] -juniper_codegen = { version = "0.14.1", path = "../juniper_codegen" } +juniper_codegen = { version = "0.14.2", path = "../juniper_codegen" } chrono = { version = "0.4.0", optional = true } fnv = "1.0.3" @@ -43,7 +43,7 @@ serde = { version = "1.0.8" } serde_derive = { version = "1.0.2" } serde_json = { version="1.0.2", optional = true } url = { version = "2", optional = true } -uuid = { version = "0.7", optional = true } +uuid = { version = ">= 0.7, < 0.8", optional = true } [dev-dependencies] bencher = "0.1.2" diff --git a/juniper/release.toml b/juniper/release.toml index a0cb42378..53f497bd2 100644 --- a/juniper/release.toml +++ b/juniper/release.toml @@ -7,6 +7,8 @@ pre-release-replacements = [ # Juniper's changelog {file="CHANGELOG.md", search="# master", replace="# master\n\n- No changes yet\n\n# [[{{version}}] {{date}}](https://github.com/graphql-rust/juniper/releases/tag/{{crate_name}}-{{version}})"}, {file="src/lib.rs", search="docs.rs/juniper/[a-z0-9\\.-]+", replace="docs.rs/juniper/{{version}}"}, + # docs + {file="../docs/book/content/quickstart.md", search="juniper = \"[^\"]+\"", replace="juniper = \"{{version}}\""}, # codegen {file="../juniper_codegen/Cargo.toml", search="juniper = \\{ version = \"[^\"]+\"", replace="juniper = { version = \"{{version}}\""}, # Tests. diff --git a/juniper/src/executor/mod.rs b/juniper/src/executor/mod.rs index 8af6ab870..7a7f42ea6 100644 --- a/juniper/src/executor/mod.rs +++ b/juniper/src/executor/mod.rs @@ -4,8 +4,8 @@ use fnv::FnvHashMap; use crate::{ ast::{ - Definition, Document, Fragment, FromInputValue, InputValue, OperationType, Selection, - ToInputValue, Type, + Definition, Document, Fragment, FromInputValue, InputValue, Operation, OperationType, + Selection, ToInputValue, Type, }, parser::SourcePosition, value::Value, @@ -31,6 +31,7 @@ pub use self::look_ahead::{ Applies, ChildSelection, ConcreteLookAheadSelection, LookAheadArgument, LookAheadMethods, LookAheadSelection, LookAheadValue, }; +use crate::parser::Spanning; /// A type registry used to build schemas /// @@ -652,9 +653,9 @@ impl ExecutionError { } } -pub fn execute_validated_query<'a, QueryT, MutationT, CtxT, S>( - document: Document, - operation_name: Option<&str>, +pub fn execute_validated_query<'a, 'b, QueryT, MutationT, CtxT, S>( + document: &'b Document, + operation: &'b Spanning>, root_node: &RootNode, variables: &Variables, context: &CtxT, @@ -665,36 +666,14 @@ where MutationT: GraphQLType, { let mut fragments = vec![]; - let mut operation = None; - - for def in document { + for def in document.iter() { match def { - Definition::Operation(op) => { - if operation_name.is_none() && operation.is_some() { - return Err(GraphQLError::MultipleOperationsProvided); - } - - let move_op = operation_name.is_none() - || op.item.name.as_ref().map(|s| s.item) == operation_name; - - if move_op { - operation = Some(op); - } - } Definition::Fragment(f) => fragments.push(f), + _ => (), }; } - let op = match operation { - Some(op) => op, - None => return Err(GraphQLError::UnknownOperationName), - }; - - if op.item.operation_type == OperationType::Subscription { - return Err(GraphQLError::IsSubscription); - } - - let default_variable_values = op.item.variable_definitions.map(|defs| { + let default_variable_values = operation.item.variable_definitions.as_ref().map(|defs| { defs.item .items .iter() @@ -723,7 +702,7 @@ where final_vars = &all_vars; } - let root_type = match op.item.operation_type { + let root_type = match operation.item.operation_type { OperationType::Query => root_node.schema.query_type(), OperationType::Mutation => root_node .schema @@ -738,16 +717,16 @@ where .map(|f| (f.item.name.item, &f.item)) .collect(), variables: final_vars, - current_selection_set: Some(&op.item.selection_set[..]), + current_selection_set: Some(&operation.item.selection_set[..]), parent_selection_set: None, current_type: root_type, schema: &root_node.schema, context, errors: &errors, - field_path: FieldPath::Root(op.start), + field_path: FieldPath::Root(operation.start), }; - value = match op.item.operation_type { + value = match operation.item.operation_type { OperationType::Query => executor.resolve_into_value(&root_node.query_info, &root_node), OperationType::Mutation => { executor.resolve_into_value(&root_node.mutation_info, &root_node.mutation_type) @@ -882,6 +861,41 @@ where Ok((value, errors)) } +pub fn get_operation<'a, 'b, S>( + document: &'b Document<'b, S>, + operation_name: Option<&str>, +) -> Result<&'b Spanning>, GraphQLError<'a>> +where + S: ScalarValue, +{ + let mut operation = None; + for def in document { + match def { + Definition::Operation(op) => { + if operation_name.is_none() && operation.is_some() { + return Err(GraphQLError::MultipleOperationsProvided); + } + + let move_op = operation_name.is_none() + || op.item.name.as_ref().map(|s| s.item) == operation_name; + + if move_op { + operation = Some(op); + } + } + _ => (), + }; + } + let op = match operation { + Some(op) => op, + None => return Err(GraphQLError::UnknownOperationName), + }; + if op.item.operation_type == OperationType::Subscription { + return Err(GraphQLError::IsSubscription); + } + Ok(op) +} + impl<'r, S> Registry<'r, S> where S: ScalarValue + 'r, diff --git a/juniper/src/executor_tests/executor.rs b/juniper/src/executor_tests/executor.rs index 5dd443a09..f53108563 100644 --- a/juniper/src/executor_tests/executor.rs +++ b/juniper/src/executor_tests/executor.rs @@ -1067,7 +1067,7 @@ mod named_operations { #[crate::graphql_object_internal] impl Schema { - fn a() -> &str { + fn a(p: Option) -> &str { "b" } } @@ -1112,7 +1112,8 @@ mod named_operations { #[test] fn uses_named_operation_if_name_provided() { let schema = RootNode::new(Schema, EmptyMutation::<()>::new()); - let doc = r"query Example { first: a } query OtherExample { second: a }"; + let doc = + r"query Example($p: String!) { first: a(p: $p) } query OtherExample { second: a }"; let vars = vec![].into_iter().collect(); diff --git a/juniper/src/executor_tests/variables.rs b/juniper/src/executor_tests/variables.rs index 6fbbc6b59..2dbb03fbf 100644 --- a/juniper/src/executor_tests/variables.rs +++ b/juniper/src/executor_tests/variables.rs @@ -830,52 +830,6 @@ fn allow_non_null_lists_of_non_null_to_contain_values() { ); } -#[test] -fn does_not_allow_invalid_types_to_be_used_as_values() { - let schema = RootNode::new(TestType, EmptyMutation::<()>::new()); - - let query = r#"query q($input: TestType!) { fieldWithObjectInput(input: $input) }"#; - let vars = vec![( - "value".to_owned(), - InputValue::list(vec![InputValue::scalar("A"), InputValue::scalar("B")]), - )] - .into_iter() - .collect(); - - let error = crate::execute(query, None, &schema, &vars, &()).unwrap_err(); - - assert_eq!( - error, - ValidationError(vec![RuleError::new( - r#"Variable "$input" expected value of type "TestType!" which cannot be used as an input type."#, - &[SourcePosition::new(8, 0, 8)], - ),]) - ); -} - -#[test] -fn does_not_allow_unknown_types_to_be_used_as_values() { - let schema = RootNode::new(TestType, EmptyMutation::<()>::new()); - - let query = r#"query q($input: UnknownType!) { fieldWithObjectInput(input: $input) }"#; - let vars = vec![( - "value".to_owned(), - InputValue::list(vec![InputValue::scalar("A"), InputValue::scalar("B")]), - )] - .into_iter() - .collect(); - - let error = crate::execute(query, None, &schema, &vars, &()).unwrap_err(); - - assert_eq!( - error, - ValidationError(vec![RuleError::new( - r#"Variable "$input" expected value of type "UnknownType!" which cannot be used as an input type."#, - &[SourcePosition::new(8, 0, 8)], - ),]) - ); -} - #[test] fn default_argument_when_not_provided() { run_query(r#"{ fieldWithDefaultArgumentValue }"#, |result| { diff --git a/juniper/src/http/graphiql.rs b/juniper/src/http/graphiql.rs index 7b9e1ebe3..01f476cc9 100644 --- a/juniper/src/http/graphiql.rs +++ b/juniper/src/http/graphiql.rs @@ -48,14 +48,14 @@ pub fn graphiql_source(graphql_endpoint_url: &str) -> String { GraphQL {stylesheet_source} - +
- - - + + + {fetcher_source} diff --git a/juniper/src/http/playground.rs b/juniper/src/http/playground.rs index 579656860..08e674183 100644 --- a/juniper/src/http/playground.rs +++ b/juniper/src/http/playground.rs @@ -12,9 +12,9 @@ pub fn playground_source(graphql_endpoint_url: &str) -> String { GraphQL Playground - - - + + + diff --git a/juniper/src/lib.rs b/juniper/src/lib.rs index be21a8094..0cd382069 100644 --- a/juniper/src/lib.rs +++ b/juniper/src/lib.rs @@ -88,7 +88,7 @@ Juniper has not reached 1.0 yet, thus some API instability should be expected. [chrono]: https://crates.io/crates/chrono */ -#![doc(html_root_url = "https://docs.rs/juniper/0.14.1")] +#![doc(html_root_url = "https://docs.rs/juniper/0.14.2")] #![warn(missing_docs)] #[doc(hidden)] @@ -152,6 +152,7 @@ mod executor_tests; pub use crate::util::to_camel_case; use crate::{ + executor::{execute_validated_query, get_operation}, introspection::{INTROSPECTION_QUERY, INTROSPECTION_QUERY_WITHOUT_DESCRIPTIONS}, parser::{parse_document_source, ParseError, Spanning}, validation::{validate_input_values, visit_all_rules, ValidatorContext}, @@ -206,25 +207,28 @@ where MutationT: GraphQLType, { let document = parse_document_source(document_source, &root_node.schema)?; + { - let errors = validate_input_values(variables, &document, &root_node.schema); + let mut ctx = ValidatorContext::new(&root_node.schema, &document); + visit_all_rules(&mut ctx, &document); + let errors = ctx.into_errors(); if !errors.is_empty() { return Err(GraphQLError::ValidationError(errors)); } } + let operation = get_operation(&document, operation_name)?; + { - let mut ctx = ValidatorContext::new(&root_node.schema, &document); - visit_all_rules(&mut ctx, &document); + let errors = validate_input_values(variables, operation, &root_node.schema); - let errors = ctx.into_errors(); if !errors.is_empty() { return Err(GraphQLError::ValidationError(errors)); } } - executor::execute_validated_query(document, operation_name, root_node, variables, context) + execute_validated_query(&document, operation, root_node, variables, context) } /// Execute a query in a provided schema @@ -245,19 +249,22 @@ where CtxT: Send + Sync, { let document = parse_document_source(document_source, &root_node.schema)?; + { - let errors = validate_input_values(variables, &document, &root_node.schema); + let mut ctx = ValidatorContext::new(&root_node.schema, &document); + visit_all_rules(&mut ctx, &document); + let errors = ctx.into_errors(); if !errors.is_empty() { return Err(GraphQLError::ValidationError(errors)); } } + let operation = get_operation(&document, operation_name)?; + { - let mut ctx = ValidatorContext::new(&root_node.schema, &document); - visit_all_rules(&mut ctx, &document); + let errors = validate_input_values(variables, operation, &root_node.schema); - let errors = ctx.into_errors(); if !errors.is_empty() { return Err(GraphQLError::ValidationError(errors)); } diff --git a/juniper/src/validation/input_value.rs b/juniper/src/validation/input_value.rs index 02da737a6..ab0ae2062 100644 --- a/juniper/src/validation/input_value.rs +++ b/juniper/src/validation/input_value.rs @@ -1,9 +1,9 @@ use std::{collections::HashSet, fmt}; use crate::{ - ast::{Definition, Document, InputValue, VariableDefinitions}, + ast::{InputValue, Operation, VariableDefinitions}, executor::Variables, - parser::SourcePosition, + parser::{SourcePosition, Spanning}, schema::{ meta::{EnumMeta, InputObjectMeta, MetaType, ScalarMeta}, model::{SchemaType, TypeType}, @@ -21,7 +21,7 @@ enum Path<'a> { pub fn validate_input_values( values: &Variables, - document: &Document, + operation: &Spanning>, schema: &SchemaType, ) -> Vec where @@ -29,12 +29,8 @@ where { let mut errs = vec![]; - for def in document { - if let Definition::Operation(ref op) = *def { - if let Some(ref vars) = op.item.variable_definitions { - validate_var_defs(values, &vars.item, schema, &mut errs); - } - } + if let Some(ref vars) = operation.item.variable_definitions { + validate_var_defs(values, &vars.item, schema, &mut errs); } errs.sort(); @@ -59,22 +55,25 @@ fn validate_var_defs( errors.push(RuleError::new( &format!( r#"Variable "${}" of required type "{}" was not provided."#, - name.item, - def.var_type.item, + name.item, def.var_type.item, ), &[name.start], )); } else if let Some(v) = values.get(name.item) { - errors.append(&mut unify_value(name.item, &name.start, v, &ct, schema, Path::Root)); + errors.append(&mut unify_value( + name.item, + &name.start, + v, + &ct, + schema, + Path::Root, + )); } } - _ => errors.push(RuleError::new( - &format!( - r#"Variable "${}" expected value of type "{}" which cannot be used as an input type."#, - name.item, def.var_type.item, - ), - &[ name.start ], - )), + _ => unreachable!( + r#"Variable "${}" has invalid input type "{}" after document validation."#, + name.item, def.var_type.item, + ), } } } diff --git a/juniper/src/validation/rules/no_unused_variables.rs b/juniper/src/validation/rules/no_unused_variables.rs index 20c437a2c..35e5f933d 100644 --- a/juniper/src/validation/rules/no_unused_variables.rs +++ b/juniper/src/validation/rules/no_unused_variables.rs @@ -143,11 +143,11 @@ where fn error_message(var_name: &str, op_name: Option<&str>) -> String { if let Some(op_name) = op_name { format!( - r#"Variable "${}" is not defined by operation "{}""#, + r#"Variable "${}" is not used by operation "{}""#, var_name, op_name ) } else { - format!(r#"Variable "${}" is not defined"#, var_name) + format!(r#"Variable "${}" is not used"#, var_name) } } diff --git a/juniper/src/value/mod.rs b/juniper/src/value/mod.rs index 4258ec5e5..ab7015abe 100644 --- a/juniper/src/value/mod.rs +++ b/juniper/src/value/mod.rs @@ -257,6 +257,8 @@ where /// /// # fn main() { /// # let _: V = +/// graphql_value!(None); +/// # let _: V = /// graphql_value!(1234); /// # let _: V = /// graphql_value!("test"); diff --git a/juniper_codegen/Cargo.toml b/juniper_codegen/Cargo.toml index e22c76006..9dbe25905 100644 --- a/juniper_codegen/Cargo.toml +++ b/juniper_codegen/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "juniper_codegen" -version = "0.14.1" +version = "0.14.2" authors = [ "Magnus Hallin ", "Christoph Herzog ", @@ -24,7 +24,7 @@ quote = "1.0.2" proc-macro-error = "0.3.4" [dev-dependencies] -juniper = { version = "0.14.1", path = "../juniper" } +juniper = { version = "0.14.2", path = "../juniper" } [badges] travis-ci = { repository = "graphql-rust/juniper" } diff --git a/juniper_codegen/src/lib.rs b/juniper_codegen/src/lib.rs index 4d230436f..a3c259526 100644 --- a/juniper_codegen/src/lib.rs +++ b/juniper_codegen/src/lib.rs @@ -4,7 +4,7 @@ //! You should not depend on juniper_codegen directly. //! You only need the `juniper` crate. -#![doc(html_root_url = "https://docs.rs/juniper_codegen/0.14.0")] +#![doc(html_root_url = "https://docs.rs/juniper_codegen/0.14.2")] #![recursion_limit = "1024"] extern crate proc_macro; diff --git a/juniper_hyper/CHANGELOG.md b/juniper_hyper/CHANGELOG.md index 3735fcd69..9e1392971 100644 --- a/juniper_hyper/CHANGELOG.md +++ b/juniper_hyper/CHANGELOG.md @@ -2,6 +2,10 @@ - Compatibility with the latest `juniper`. +# [[0.5.2] 2019-12-16](https://github.com/graphql-rust/juniper/releases/tag/juniper_hyper-0.5.2) + +- Compatibility with the latest `juniper`. + # [[0.5.1] 2019-10-24](https://github.com/graphql-rust/juniper/releases/tag/juniper_hyper-0.5.1) - Compatibility with the latest `juniper`. diff --git a/juniper_hyper/Cargo.toml b/juniper_hyper/Cargo.toml index 2ac41d246..27b0ce13c 100644 --- a/juniper_hyper/Cargo.toml +++ b/juniper_hyper/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "juniper_hyper" -version = "0.5.1" +version = "0.5.2" authors = ["Damir Vandic "] description = "Juniper GraphQL integration with Hyper" license = "BSD-2-Clause" @@ -13,7 +13,7 @@ serde = "1.0" serde_json = "1.0" serde_derive = "1.0" url = "2" -juniper = { version = "0.14.1", default-features = false, path = "../juniper"} +juniper = { version = "0.14.2", default-features = false, path = "../juniper"} futures = "0.1" tokio = "0.1.8" @@ -25,6 +25,6 @@ pretty_env_logger = "0.2" reqwest = "0.9" [dev-dependencies.juniper] -version = "0.14.1" +version = "0.14.2" features = ["expose-test-schema", "serde_json"] path = "../juniper" diff --git a/juniper_iron/CHANGELOG.md b/juniper_iron/CHANGELOG.md index 00de0024e..db3eb30d7 100644 --- a/juniper_iron/CHANGELOG.md +++ b/juniper_iron/CHANGELOG.md @@ -2,6 +2,10 @@ - Compatibility with the latest `juniper`. +# [[0.6.2] 2019-12-16](https://github.com/graphql-rust/juniper/releases/tag/juniper_iron-0.6.2) + +- Compatibility with the latest `juniper`. + # [[0.6.1] 2019-10-24](https://github.com/graphql-rust/juniper/releases/tag/juniper_iron-0.6.1) - Compatibility with the latest `juniper`. diff --git a/juniper_iron/Cargo.toml b/juniper_iron/Cargo.toml index 1a53bc49a..3641ea95c 100644 --- a/juniper_iron/Cargo.toml +++ b/juniper_iron/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "juniper_iron" -version = "0.6.1" +version = "0.6.2" authors = [ "Magnus Hallin ", "Christoph Herzog ", @@ -15,7 +15,7 @@ edition = "2018" serde = { version = "1.0.2" } serde_json = { version = "1.0.2" } serde_derive = { version = "1.0.2" } -juniper = { version = "0.14.1", path = "../juniper" } +juniper = { version = "0.14.2", path = "../juniper" } urlencoded = { version = ">= 0.5, < 0.7" } iron = ">= 0.5, < 0.7" @@ -29,6 +29,6 @@ url = "2" percent-encoding = "2" [dev-dependencies.juniper] -version = "0.14.1" +version = "0.14.2" features = ["expose-test-schema", "serde_json"] path = "../juniper" diff --git a/juniper_rocket/CHANGELOG.md b/juniper_rocket/CHANGELOG.md index 01432d4be..acaf7a65c 100644 --- a/juniper_rocket/CHANGELOG.md +++ b/juniper_rocket/CHANGELOG.md @@ -2,6 +2,10 @@ - Compatibility with the latest `juniper`. +# [[0.5.2] 2019-12-16](https://github.com/graphql-rust/juniper/releases/tag/juniper_rocket-0.5.2) + +- Compatibility with the latest `juniper`. + # [[0.5.1] 2019-10-24](https://github.com/graphql-rust/juniper/releases/tag/juniper_rocket-0.5.1) - Compatibility with the latest `juniper`. diff --git a/juniper_rocket/Cargo.toml b/juniper_rocket/Cargo.toml index cd77aad61..289217c61 100644 --- a/juniper_rocket/Cargo.toml +++ b/juniper_rocket/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "juniper_rocket" -version = "0.5.1" +version = "0.5.2" authors = [ "Magnus Hallin ", "Christoph Herzog ", @@ -15,11 +15,11 @@ edition = "2018" serde = { version = "1.0.2" } serde_json = { version = "1.0.2" } serde_derive = { version = "1.0.2" } -juniper = { version = "0.14.1", default-features = false, path = "../juniper"} +juniper = { version = "0.14.2", default-features = false, path = "../juniper"} rocket = { version = "0.4.0" } [dev-dependencies.juniper] -version = "0.14.1" +version = "0.14.2" features = ["expose-test-schema", "serde_json"] path = "../juniper" diff --git a/juniper_warp/CHANGELOG.md b/juniper_warp/CHANGELOG.md index be3a836a0..dca5b7183 100644 --- a/juniper_warp/CHANGELOG.md +++ b/juniper_warp/CHANGELOG.md @@ -2,6 +2,10 @@ - Compatibility with the latest `juniper`. +# [[0.5.2] 2019-12-16](https://github.com/graphql-rust/juniper/releases/tag/juniper_warp-0.5.2) + +- Compatibility with the latest `juniper`. + # [[0.5.1] 2019-10-24](https://github.com/graphql-rust/juniper/releases/tag/juniper_warp-0.5.1) - Compatibility with the latest `juniper`. diff --git a/juniper_warp/Cargo.toml b/juniper_warp/Cargo.toml index 102c4e9ee..e948b71a4 100644 --- a/juniper_warp/Cargo.toml +++ b/juniper_warp/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "juniper_warp" -version = "0.5.1" +version = "0.5.2" authors = ["Tom Houlé "] description = "Juniper GraphQL integration with Warp" license = "BSD-2-Clause" @@ -13,7 +13,7 @@ async = [ "juniper/async", "futures03" ] [dependencies] warp = "0.1.8" -juniper = { version = "0.14.1", path = "../juniper", default-features = false } +juniper = { version = "0.14.2", path = "../juniper", default-features = false } serde_json = "1.0.24" serde_derive = "1.0.75" failure = "0.1.2" @@ -25,7 +25,7 @@ tokio-threadpool = "0.1.7" futures03 = { version = "=0.3.1", optional = true, package = "futures", features = ["compat"] } [dev-dependencies] -juniper = { version = "0.14.1", path = "../juniper", features = ["expose-test-schema", "serde_json"] } +juniper = { version = "0.14.2", path = "../juniper", features = ["expose-test-schema", "serde_json"] } env_logger = "0.5.11" log = "0.4.3" percent-encoding = "1.0"