import isCI = require ( 'is-ci' ) ; import path = require ( 'path' ) ; import exists = require ( 'path-exists' ) ; import readPkg = require ( 'read-pkg' ) ; import sinon = require ( 'sinon' ) ; import { install , installPkgs , RootLog , } from 'supi' ; import tape = require ( 'tape' ) ; import promisifyTape from 'tape-promise' ; import { prepare , testDefaults , } from '../utils' ; const test = promisifyTape ( tape ) ; test ( 'from a github repo' , async ( t ) => { const project = prepare ( t ) ; await installPkgs ( [ 'kevva/is-negative' ] , await testDefaults ( ) ) ; const m = project . requireModule ( 'is-negative' ) ; t . ok ( m , 'isNegative() is available' ) ; const pkgJson = await readPkg ( ) ; t . deepEqual ( pkgJson . dependencies , { 'is-negative' : 'github:kevva/is-negative' } , 'has been added to dependencies in package.json' ) ; } ) ; test ( 'from a github repo with different name via named installation' , async ( t ) => { const project = prepare ( t ) ; const reporter = sinon . spy ( ) ; await installPkgs ( [ 'say-hi@github:zkochan/hi#4cdebec76b7b9d1f6e219e06c42d92a6b8ea60cd' ] , await testDefaults ( { reporter } ) ) ; const m = project . requireModule ( 'say-hi' ) ; t . ok ( reporter . calledWithMatch ( { added : { dependencyType : 'prod' , name : 'say-hi' , realName : 'hi' , version : '1.0.0' , } , level : 'info' , name : 'pnpm:root' , } as RootLog ) , 'adding to root logged with real name and alias name' ) ; t . equal ( m , 'Hi' , 'dep is available' ) ; const pkgJson = await readPkg ( ) ; t . deepEqual ( pkgJson . dependencies , { 'say-hi' : 'github:zkochan/hi#4cdebec76b7b9d1f6e219e06c42d92a6b8ea60cd' } , 'has been added to dependencies in package.json' ) ; const shr = await project . loadShrinkwrap ( ) ; t . deepEqual ( shr . dependencies , { 'say-hi' : 'github.com/zkochan/hi/4cdebec76b7b9d1f6e219e06c42d92a6b8ea60cd' , } , 'the aliased name added to shrinkwrap.yaml' ) ; await project . isExecutable ( '.bin/hi' ) ; await project . isExecutable ( '.bin/szia' ) ; } ) ; test ( 'from a github repo with different name' , async ( t ) => { const project = prepare ( t , { dependencies : { 'say-hi' : 'github:zkochan/hi#4cdebec76b7b9d1f6e219e06c42d92a6b8ea60cd' , } , } ) ; const reporter = sinon . spy ( ) ; await install ( await testDefaults ( { reporter } ) ) ; const m = project . requireModule ( 'say-hi' ) ; t . ok ( reporter . calledWithMatch ( { added : { dependencyType : 'prod' , name : 'say-hi' , realName : 'hi' , version : '1.0.0' , } , level : 'info' , name : 'pnpm:root' , } as RootLog ) , 'adding to root logged with real name and alias name' ) ; t . equal ( m , 'Hi' , 'dep is available' ) ; const pkgJson = await readPkg ( ) ; t . deepEqual ( pkgJson . dependencies , { 'say-hi' : 'github:zkochan/hi#4cdebec76b7b9d1f6e219e06c42d92a6b8ea60cd' } , 'has been added to dependencies in package.json' ) ; const shr = await project . loadShrinkwrap ( ) ; t . deepEqual ( shr . dependencies , { 'say-hi' : 'github.com/zkochan/hi/4cdebec76b7b9d1f6e219e06c42d92a6b8ea60cd' , } , 'the aliased name added to shrinkwrap.yaml' ) ; await project . isExecutable ( '.bin/hi' ) ; await project . isExecutable ( '.bin/szia' ) ; } ) ; test ( 'a subdependency is from a github repo with different name' , async ( t ) => { const project = prepare ( t ) ; await installPkgs ( [ 'has-aliased-git-dependency' ] , await testDefaults ( ) ) ; const m = project . requireModule ( 'has-aliased-git-dependency' ) ; t . equal ( m , 'Hi' , 'subdep is accessible' ) ; const shr = await project . loadShrinkwrap ( ) ; t . deepEqual ( shr . packages [ '/has-aliased-git-dependency/1.0.0' ] . dependencies , { 'has-say-hi-peer' : '/has-say-hi-peer/1.0.0/say-hi@1.0.0' , 'say-hi' : 'github.com/zkochan/hi/4cdebec76b7b9d1f6e219e06c42d92a6b8ea60cd' , } , 'the aliased name added to shrinkwrap.yaml' ) ; await project . isExecutable ( 'has-aliased-git-dependency/node_modules/.bin/hi' ) ; await project . isExecutable ( 'has-aliased-git-dependency/node_modules/.bin/szia' ) ; t . ok ( await exists ( path . join ( 'node_modules' , '.localhost+4873' , 'has-say-hi-peer' , '1.0.0' , 'say-hi@1.0.0' , 'node_modules' , 'has-say-hi-peer' ) ) , 'aliased name used to resolve a peer dependency' ) ; } ) ; test ( 'from a git repo' , async ( t ) => { if ( isCI ) { t . skip ( 'not testing the SSH GIT access via CI' ) ; return t . end ( ) ; } const project = prepare ( t ) ; await installPkgs ( [ 'git+ssh://git@github.com/kevva/is-negative.git' ] , await testDefaults ( ) ) ; const m = project . requireModule ( 'is-negative' ) ; t . ok ( m , 'isNegative() is available' ) ; } ) ; test ( 'from a non-github git repo' , async ( t ) => { const project = prepare ( t ) ; await installPkgs ( [ 'git+http://ikt.pm2.io/ikt.git#3325a3e39a502418dc2e2e4bf21529cbbde96228' ] , await testDefaults ( ) ) ; const m = project . requireModule ( 'ikt' ) ; t . ok ( m , 'ikt is available' ) ; const shr = await project . loadShrinkwrap ( ) ; const pkgId = 'ikt.pm2.io/ikt/3325a3e39a502418dc2e2e4bf21529cbbde96228' ; t . ok ( shr . packages [ pkgId ] ) ; t . deepEqual ( shr . packages [ pkgId ] . resolution , { commit : '3325a3e39a502418dc2e2e4bf21529cbbde96228' , repo : 'http://ikt.pm2.io/ikt.git' , type : 'git' , } ) ; } ) ;