File Coverage

blib/lib/Plack/Middleware/JSConcat.pm
Criterion Covered Total %
statement 12 12 100.0
branch n/a
condition n/a
subroutine 4 4 100.0
pod n/a
total 16 16 100.0


line stmt bran cond sub pod time code
1             package Plack::Middleware::JSConcat;
2 1     1   6 use strict;
  1         2  
  1         43  
3 1     1   7 use warnings;
  1         2  
  1         50  
4              
5             our $VERSION = '0.29';
6 1     1   28 use 5.008_001;
  1         3  
  1         55  
7              
8 1     1   930 use parent qw(Plack::Middleware);
  1         271  
  1         4  
9             __PACKAGE__->mk_accessors(qw(js_content files key mtime filter));
10              
11              
12             use IPC::Run3;
13             use Digest::MD5 'md5_hex';
14              
15             sub new {
16             my $class = shift;
17             my $self = $class->SUPER::new(@_);
18              
19             local $/;
20             $self->js_content(join("\n", map { open my $fh, '<', $_ or die "$_: $!";
21             "/* $_ */\n".<$fh>
22             } @{$self->files}));
23              
24             $self->minify_js if $self->filter;
25              
26             $self->key( md5_hex( $self->js_content ) );
27             # XXX: use the latest mtime from $self->files instead
28             $self->mtime( time() );
29              
30             return $self;
31             }
32              
33             sub minify_js {
34             my $self = shift;
35             my $output = '';
36             local $SIG{'CHLD'} = 'DEFAULT';
37             run3 [$self->filter], \$self->js_content, \$output, undef;
38              
39             $self->js_content($output);
40             }
41              
42             sub serve_js {
43             my $self = shift;
44             my $content_type =
45             return [ 200, [ 'Content-Type' => 'text/javascript',
46             'Content-Length' => length($self->js_content),
47             'Last-Modified' => HTTP::Date::time2str( $self->mtime ),
48             ],
49             [$self->js_content] ];
50             }
51              
52             sub call {
53             my $self = shift;
54             my $env = shift;
55             my $url = $env->{'psgix.jsconcat.url'} = '/_js/'.$self->key;
56             return $self->serve_js if $env->{PATH_INFO} eq $url;
57              
58             return $self->app->($env);
59             }
60              
61             1;
62              
63             __END__