File: Npm.pm

package info (click to toggle)
pkg-js-tools 0.17.3
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 2,036 kB
  • sloc: perl: 5,004; sh: 840; makefile: 36; javascript: 22
file content (81 lines) | stat: -rw-r--r-- 1,937 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package Debian::PkgJs::Npm;

use strict;
use warnings;
use JSON;
use LWP::UserAgent;
require Debian::PkgJs::Utils;

require Exporter;

our @ISA = qw(Exporter);

our @EXPORT = qw(
  &pjson &npmdata &npmrepo
);

our $VERSION = '0.8.14';

my %json;
my %reg;

sub pjson {
    my ($dir) = @_;
    my $res = Debian::PkgJs::Utils::pjson($dir);
    unless (%$res) {
        print STDERR
          "npm registry returned malformed JSON\nSkipping\n";
        return undef;
    }
    return $res;
}

sub npmdata {
    my ($name) = @_;
    return $reg{$name} if $reg{$name};
    my $ua = LWP::UserAgent->new( timeout => 10 );
    $ua->env_proxy;
    my $response = $ua->get("https://registry.npmjs.org/$name");
    if ( $response->is_success ) {
        my $reg;
        eval { $reg = JSON::from_json( $response->content ) };
        die "Malformed upstream registry: $@" if $@;
        return $reg{$name} = $reg;
    }
    else {
        print STDERR "Module $name unknown from npm registry\n";
        return undef;
    }
}

sub npmrepo {
    my ($name)   = @_;
    my $reg      = npmdata($name);
    my @versions = sort {
        Dpkg::Version->new( "$a-0", check => 0 )
          <=> Dpkg::Version->new( "$b-0", check => 0 )
    } keys %{ $reg->{versions} };
    my $latest = $reg->{'dist-tags'}->{latest};
    unless ($latest) {
        print STDERR "No latest version found in npm registry\n";
        return undef;
    }
    $reg = $reg->{versions}->{$latest}
      or die "Version $latest not found in npm registry";
    unless ( $reg->{repository} ) {
        unless ( $reg->{homepage} ) {
            print STDERR "No vcs repo found for $latest version\n";
            return ( $latest, undef );
        }
        return ( $latest, $reg->{homepage} );
    }
    $reg = $reg->{repository};
    if ( ref $reg ) {
        return ( $latest, $reg->{url}, \@versions );
    }
    else {
        return ( $latest, $reg, \@versions );
    }
}

1;