60 lines
1.3 KiB
Perl
60 lines
1.3 KiB
Perl
|
#!/usr/bin/env perl
|
||
|
|
||
|
=pod
|
||
|
|
||
|
I'm slightly fed up with `package.json`, because:
|
||
|
|
||
|
* the keys are ordering alphabetically, not logically.
|
||
|
* no comments.
|
||
|
* friggin' no trailing comma. And the quotes, my lord, the bloody
|
||
|
quotes...
|
||
|
|
||
|
Hence this script, which takes a `package.yaml`, and convert it
|
||
|
to `package.json`.
|
||
|
Sections, like `dependencies`, `devDependencies' and 'version' that we want to preserve can be given `_merge`. All data structures under the keys
|
||
|
given in `_merge` will have their `yaml` and `json` values merged,
|
||
|
with the `json` having priority.
|
||
|
|
||
|
By default `package.json` will be updated (like, that's the point isn't?).
|
||
|
For a dry run pass in a `-n` argument.
|
||
|
|
||
|
=cut
|
||
|
|
||
|
use 5.24.0;
|
||
|
use strict;
|
||
|
use warnings;
|
||
|
|
||
|
use File::Serialize;
|
||
|
use Hash::Merge qw/ merge /;
|
||
|
|
||
|
use feature qw/ postderef /;
|
||
|
use YAML::XS;
|
||
|
use Path::Tiny;
|
||
|
use JSON::PP qw//;
|
||
|
use JSON qw/ to_json /;
|
||
|
|
||
|
{
|
||
|
no warnings;
|
||
|
$YAML::XS::Boolean = 'JSON::PP';
|
||
|
}
|
||
|
|
||
|
my $yaml = deserialize_file 'package.yml';
|
||
|
my $json = deserialize_file 'package.json';
|
||
|
|
||
|
my $mergers = delete $yaml->{_merge};
|
||
|
|
||
|
my $result = merge( { $json->%{@$mergers} }, $yaml );
|
||
|
|
||
|
my $encoder = JSON->new->pretty->canonical->space_before(0);
|
||
|
|
||
|
$json = $encoder->encode($result);
|
||
|
|
||
|
$json =~ s/(^|\G) / /g;
|
||
|
|
||
|
if( grep { $_ eq '-n' } @ARGV ) {
|
||
|
print $json;
|
||
|
} else {
|
||
|
path('package.json')->spew($json);
|
||
|
say "regenerated package.json"
|
||
|
}
|