]>
git.immae.eu Git - github/fretlink/node-dhall-json-bin.git/blob - preinstall.js
3 const fs
= require ( "fs" );
4 const path
= require ( "path" );
6 const { https
} = require ( "follow-redirects" );
7 const semver
= require ( "semver" );
8 const tar
= require ( "tar" );
9 const unbz2
= require ( "unbzip2-stream" );
10 const unzipper
= require ( "unzipper" );
12 const pkg
= require ( "./package.json" );
13 const bindir
= path
. join ( __dirname
, "bin" );
15 const formatVersionKey
= name
=>
17 const toSnakeCase
= name
=>
18 name
. replace (/-/ g
, '_' );
19 const formatNpmCfgVar
= name
=>
20 toSnakeCase ( name
. toLowerCase ());
21 const formatEnvVar
= name
=>
22 toSnakeCase ( name
. toUpperCase ());
23 const prefixNpmCfgKey
= key
=>
26 const readVersionWith
= ( lookup
, discard
= () => {}) => name
=> {
27 const key
= formatVersionKey ( name
);
28 const version
= lookup ( key
);
30 get version () { return String ( version
). trim () },
31 discard () { discard ( key
, version
) },
32 orElse ( alt
) { alt
. discard (); return this }
35 throw new Error ( `Missing \` ${name}
\ ` version! You can provide it as a \` ${prefixNpmCfgKey(key)}
\ ` npm configuration parameter or as a \` ${formatEnvVar(key)}
\ ` environment variable.` );
38 orElse ( alt
) { return alt
}
42 const readPkgVersion
= readVersionWith ( key
=> pkg
[ key
]);
43 const readCfgVersion
= readVersionWith ( key
=> {
44 return process
. env
[ `npm_config_ ${formatNpmCfgVar(pkg.name)} _ ${formatNpmCfgVar(key)} ` ];
45 }, ( key
, version
) => {
46 console
. warn ( `Ignoring \` ${prefixNpmCfgKey(key)}
\ ` npm configuration parameter ( ${version} ).` );
48 const readEnvVersion
= readVersionWith ( key
=> {
49 return process
. env
[ formatEnvVar ( key
)];
50 }, ( key
, version
) => {
51 console
. warn ( `Ignoring \` ${formatEnvVar(key)}
\ ` environment variable ( ${version} ).` );
54 const readVersion
= name
=>
56 . orElse ( readEnvVersion ( name
))
57 . orElse ( readCfgVersion ( name
))
60 const dhallVersion
= readVersion ( "dhall" );
61 const dhallJsonVersion
= readVersion ( "dhall-json" );
63 const isLowerThan
= ( version
, upperBound
) =>
64 semver
. valid ( version
) && semver
. lt ( version
, upperBound
);
66 if ( isLowerThan ( dhallJsonVersion
, "1.2.8" )) {
67 throw new Error ( `This release of the \` ${pkg.name}
\ ` npm package installs \` json
- to
- dhall
\ `, which isn’t provided by \` dhall
- json
@< 1.2.8 \ `.` );
69 if ( isLowerThan ( dhallJsonVersion
, "1.3.0" )) {
70 throw new Error ( `This release of the \` ${pkg.name}
\ ` npm package installs \` yaml
- to
- dhall
\ `, which isn’t provided by \` dhall
- json
@< 1.3.0 \ `.` );
73 const release
= `https://github.com/dhall-lang/dhall-haskell/releases/download/ ${dhallVersion} /dhall-json- ${dhallJsonVersion} ` ;
75 const get = ( archive
, callback
) => {
76 const url
= ` ${release} - ${archive} ` ;
77 return https
. get ( url
, res
=> {
78 if ( res
. statusCode
>= 400 ) throw new Error ( `Error fetching ${url} : ${res.statusMessage} ` );
83 if ( process
. platform
=== "win32" ) {
84 get ( "x86_64-windows.zip" , res
=>
85 res
. pipe ( unzipper
. Extract ({ path : bindir
}))
88 get ( "x86_64-linux.tar.bz2" , res
=>
89 res
. pipe ( unbz2 ()). pipe ( tar
. x ({ C : __dirname
}). on ( "finish" , () => {
90 fs
. readdir ( bindir
, ( err
, names
) => {
92 for ( const name
of names
) {
93 fs
. rename ( path
. join ( bindir
, name
), path
. join ( bindir
, name
+ ".exe" ), err
=> {