The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
use strict;
use IPC::Run3 'run3';
use Jifty;
Jifty->new;

=head1 NAME

js_size - summarize the size of javascript used in your jifty app

=head1 SYNOPSIS

  % perl js_size.pl

  % perl js_size.pl /path/to/jsmin

=head1 DESCRIPTION



=cut

my $jsmin = shift ;

my $static_handler = Jifty->handler->view('Jifty::View::Static::Handler');
my $js = "";



my $total = 0;
my $total_minified = 0;
my $size = {};
my $size_minified = {};
for my $file ( @{ Jifty::Web->javascript_libs } ) {
    my $include = $static_handler->file_path( File::Spec->catdir( 'js', $file ) );
    $total += $size->{$file} = -s $include;

    if ($jsmin) {
        my $output = '';
        open my $input, '<', $include;
        run3 [$jsmin], $input, \$output, undef;
        $total_minified += $size_minified->{$file} = length $output;
    }
}

my $min_format = "%6.2f%% (%5.2f%%) %7d (%7d) %s\n";
my $format = "%6.2f%% %7d %s\n";

for my $file ( @{ Jifty::Web->javascript_libs } ) {
    if ($jsmin) {
        printf($min_format,
           ($size->{$file} / $total * 100),
           ($size_minified->{$file} / $total_minified * 100),
           $size->{$file}, $size_minified->{$file}, $file );
    }
    else {
        printf($format,
           ($size->{$file} / $total * 100),
           $size->{$file}, $file );
    }
}

if ($jsmin) {
    printf($min_format,
        100,
        ($total_minified / $total * 100),
        $total, $total_minified, 'total');
}
else {
    printf($format,
        100,
        $total, 'total');
}