use warnings;
use strict;
-use Text::ParseWords;
+use Encode qw(decode);
use Getopt::Long 2.39 qw(GetOptionsFromArray);
use GraphQL::Client;
-use JSON::MaybeXS qw(encode_json);
+use JSON::MaybeXS;
+use Text::ParseWords;
use namespace::clean;
our $VERSION = '999.999'; # VERSION
+my $JSON = JSON::MaybeXS->new(canonical => 1);
+
sub _croak { require Carp; goto &Carp::croak }
sub new {
if ($query eq '-') {
print STDERR "Interactive mode engaged! Waiting for a query on <STDIN>...\n"
if -t STDIN; ## no critic (InputOutput::ProhibitInteractiveTest)
+ binmode(STDIN, 'encoding(UTF-8)');
$query = do { local $/; <STDIN> };
}
*STDOUT = $out;
}
+ binmode(STDOUT, 'encoding(UTF-8)');
_print_data($data, $format);
exit($unpack && $err ? 1 : 0);
unshift @args, shellwords($ENV{GRAPHQL_CLIENT_OPTIONS} || '');
+ # assume UTF-8 args if non-ASCII
+ @args = map { decode('UTF-8', $_) } @args if grep { /\P{ASCII}/ } @args;
+
my %options = (
format => 'json:pretty',
unpack => 0,
die "Two or more --variable keys are incompatible.\n" if $@;
}
elsif ($options{variables}) {
- $options{variables} = eval { JSON::MaybeXS->new->decode($options{variables}) };
+ $options{variables} = eval { $JSON->decode($options{variables}) };
die "The --variables JSON does not parse.\n" if $@;
}
if (ref($item) eq 'ARRAY') {
my $first = @$item && $item->[0];
return join(',', @$item) if !ref($first);
- return join(',', map { encode_json($_) } @$item);
+ return join(',', map { $JSON->encode($_) } @$item);
}
- return encode_json($item) if ref($item) eq 'HASH';
+ return $JSON->encode($item) if ref($item) eq 'HASH';
return $item;
}
my ($data, $format) = @_;
$format = lc($format || 'json:pretty');
if ($format eq 'json' || $format eq 'json:pretty') {
- my %opts = (allow_nonref => 1, canonical => 1, utf8 => 1);
+ my %opts = (allow_nonref => 1, canonical => 1);
$opts{pretty} = 1 if $format eq 'json:pretty';
print JSON::MaybeXS->new(%opts)->encode($data);
}
is($req->[0], 'POST', 'method is POST');
is($req->[2]{content}, '{"query":"{hello}"}', 'encoded body as JSON');
- is($req->[2]{headers}{'content-type'}, 'application/json', 'set content-type to json');
+ is($req->[2]{headers}{'content-type'}, 'application/json;charset=UTF-8', 'set content-type to json');
};
subtest 'GET request' => sub {