1+ ///<reference path="../.d.ts"/>
2+ "use strict" ;
3+
4+ import path = require( "path" ) ;
5+
6+ export class InstallCommand implements ICommand {
7+ private _projectData : any ;
8+
9+ constructor ( private $fs : IFileSystem ,
10+ private $errors : IErrors ,
11+ private $logger : ILogger ,
12+ private $options : IOptions ,
13+ private $injector : IInjector ,
14+ private $staticConfig : IStaticConfig ) { }
15+
16+ public enableHooks = false ;
17+
18+ public allowedParameters : ICommandParameter [ ] = [ ] ;
19+
20+ public execute ( args : string [ ] ) : IFuture < void > {
21+ return ( ( ) => {
22+ let projectFilePath = this . getProjectFilePath ( args [ 0 ] ) ;
23+ let projectData = this . getProjectData ( projectFilePath ) . wait ( ) ;
24+ let projectName = projectData . id . split ( "." ) [ 2 ] ;
25+
26+ this . $injector . resolve ( "projectService" ) . createProject ( projectName ) . wait ( ) ;
27+
28+ this . $options . path = path . join ( this . $options . path || path . resolve ( "." ) , projectName ) ;
29+
30+ this . $logger . info ( "Adding platforms..." ) ;
31+
32+ let $platformsData = this . $injector . resolve ( "platformsData" ) ;
33+ let $platformService = this . $injector . resolve ( "platformService" ) ;
34+ _ . each ( $platformsData . platformsNames , platform => {
35+ let platformData = $platformsData . getPlatformData ( platform ) ;
36+ let frameworkPackageData = projectData [ platformData . frameworkPackageName ] ;
37+ if ( frameworkPackageData && frameworkPackageData . version ) {
38+ $platformService . addPlatforms ( [ `${ platform } @${ frameworkPackageData . version } ` ] ) . wait ( ) ;
39+ }
40+ } ) ;
41+
42+ } ) . future < void > ( ) ( ) ;
43+ }
44+
45+ public canExecute ( args : string [ ] ) : IFuture < boolean > {
46+ return ( ( ) => {
47+ let projectFilePath = this . getProjectFilePath ( args [ 0 ] ) ;
48+ let errorMessage = args [ 0 ] ? "The provided path doesn't contain package.json." :
49+ "The current directory doesn't contain package.json file. Execute the command in directory which contains package.json file or specify the path to package.json file." ;
50+
51+ if ( ! this . $fs . exists ( projectFilePath ) . wait ( ) ) {
52+ this . $errors . failWithoutHelp ( errorMessage ) ;
53+ }
54+
55+ let projectData = this . getProjectData ( projectFilePath ) . wait ( ) ;
56+ if ( ! projectData ) {
57+ this . $errors . failWithoutHelp ( "Invalid project file. Verify that the specified package.json file contains a nativescript key and try again." ) ;
58+ }
59+
60+ if ( ! projectData . id ) {
61+ this . $errors . failWithoutHelp ( "Invalid project file. Verify that the specified package.json file contains an id and try again." ) ;
62+ }
63+
64+ return true ;
65+ } ) . future < boolean > ( ) ( ) ;
66+ }
67+
68+ private getProjectFilePath ( providedPath : string ) : string {
69+ let resolvedPath = path . resolve ( providedPath || "." ) ;
70+ return path . basename ( resolvedPath ) === "package.json" ? resolvedPath : path . join ( resolvedPath , "package.json" ) ;
71+ }
72+
73+ private getProjectData ( projectFilePath : string ) : IFuture < any > {
74+ return ( ( ) => {
75+ if ( ! this . _projectData ) {
76+ let fileContent = this . $fs . readJson ( projectFilePath ) . wait ( ) ;
77+ this . _projectData = fileContent [ this . $staticConfig . CLIENT_NAME_KEY_IN_PROJECT_FILE ] ;
78+ }
79+
80+ return this . _projectData ;
81+ } ) . future < any > ( ) ( ) ;
82+ }
83+ }
84+ $injector . registerCommand ( "install" , InstallCommand ) ;
0 commit comments