Skip to content

Commit e39b49c

Browse files
committed
Merge pull request #6 from NativeScript/fatme/platform-command
Android releated commands - platform add, prepare, build and platform list
2 parents 0646ab3 + c35e02c commit e39b49c

21 files changed

+659
-27
lines changed

lib/bootstrap.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,17 @@ require("./common/bootstrap");
33
$injector.require("nativescript-cli", "./nativescript-cli");
44

55
$injector.require("projectService", "./services/project-service");
6+
$injector.require("androidProjectService", "./services/project-service");
7+
$injector.require("iOSProjectService", "./services/project-service");
68
$injector.require("projectTemplatesService", "./services/project-templates-service");
9+
$injector.require("platformService", "./services/platform-service");
710

8-
$injector.requireCommand("create", "./commands/create-project-command");
11+
$injector.requireCommand("create", "./commands/create-project");
12+
$injector.requireCommand("platform|*list", "./commands/list-platforms");
13+
$injector.requireCommand("platform|add", "./commands/add-platform");
14+
$injector.requireCommand("run", "./commands/run");
15+
$injector.requireCommand("prepare", "./commands/prepare");
16+
$injector.requireCommand("build", "./commands/build");
917

1018
$injector.require("npm", "./node-package-manager");
19+
$injector.require("propertiesParser", "./properties-parser");

lib/commands/add-platform.ts

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
///<reference path="../.d.ts"/>
2+
3+
export class AddPlatformCommand implements ICommand {
4+
constructor(private $platformService: IPlatformService) { }
5+
6+
execute(args: string[]): IFuture<void> {
7+
return (() => {
8+
this.$platformService.addPlatforms(args).wait();
9+
}).future<void>()();
10+
}
11+
}
12+
$injector.registerCommand("platform|add", AddPlatformCommand);

lib/commands/build.ts

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
///<reference path="../.d.ts"/>
2+
3+
export class BuildCommand implements ICommand {
4+
constructor(private $platformService: IPlatformService) { }
5+
6+
execute(args: string[]): IFuture<void> {
7+
return (() => {
8+
this.$platformService.buildPlatform(args[0]).wait();
9+
}).future<void>()();
10+
}
11+
}
12+
$injector.registerCommand("build", BuildCommand);

lib/commands/list-platforms.ts

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
///<reference path="../.d.ts"/>
2+
import helpers = require("./../common/helpers");
3+
4+
export class ListPlatformsCommand implements ICommand {
5+
constructor(private $platformService: IPlatformService,
6+
private $logger: ILogger) { }
7+
8+
execute(args: string[]): IFuture<void> {
9+
return (() => {
10+
var availablePlatforms = this.$platformService.getAvailablePlatforms().wait();
11+
this.$logger.out("Available platforms: %s", helpers.formatListOfNames(availablePlatforms));
12+
13+
var installedPlatforms = this.$platformService.getInstalledPlatforms().wait();
14+
this.$logger.out("Installed platforms %s", helpers.formatListOfNames(installedPlatforms));
15+
}).future<void>()();
16+
}
17+
}
18+
$injector.registerCommand("platform|*list", ListPlatformsCommand);
19+
20+

lib/commands/prepare.ts

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
///<reference path="../.d.ts"/>
2+
3+
export class PrepareCommand implements ICommand {
4+
constructor(private $platformService: IPlatformService) { }
5+
6+
execute(args: string[]): IFuture<void> {
7+
return (() => {
8+
this.$platformService.preparePlatform(args[0]).wait();
9+
}).future<void>()();
10+
}
11+
}
12+
$injector.registerCommand("prepare", PrepareCommand);

lib/commands/run.ts

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
///<reference path="../.d.ts"/>
2+
3+
export class RunCommand implements ICommand {
4+
constructor(private $platformService: IPlatformService) { }
5+
6+
execute(args: string[]): IFuture<void> {
7+
return (() => {
8+
this.$platformService.runPlatform(args[0]).wait();
9+
}).future<void>()();
10+
}
11+
}
12+
$injector.registerCommand("run", RunCommand);

lib/declarations.ts

+7-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
interface INodePackageManager {
2-
cache: string;
3-
load(config?: any): IFuture<void>;
4-
install(where: string, what: string): IFuture<any>;
2+
cache: string;
3+
load(config?: any): IFuture<void>;
4+
install(where: string, what: string): IFuture<any>;
5+
}
6+
7+
interface IPropertiesParser {
8+
createEditor(filePath: string): IFuture<any>;
59
}

lib/definitions/platform.d.ts

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
interface IPlatformService {
2+
addPlatforms(platforms: string[]): IFuture<void>;
3+
getInstalledPlatforms(): IFuture<string[]>;
4+
getAvailablePlatforms(): IFuture<string[]>;
5+
runPlatform(platform: string): IFuture<void>;
6+
preparePlatform(platform: string): IFuture<void>;
7+
buildPlatform(platform: string): IFuture<void>;
8+
}
9+
10+
interface IPlatformCapabilities {
11+
targetedOS?: string[];
12+
}

lib/definitions/project.d.ts

+19
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,26 @@
11
interface IProjectService {
22
createProject(projectName: string, projectId: string): IFuture<void>;
3+
createPlatformSpecificProject(platform: string): IFuture<void>;
4+
prepareProject(normalizedPlatformName: string, platforms: string[]): IFuture<void>;
5+
buildProject(platform: string): IFuture<void>;
6+
ensureProject(): void;
7+
projectData: IProjectData;
8+
}
9+
10+
interface IPlatformProjectService {
11+
createProject(projectData: IProjectData): IFuture<void>;
12+
buildProject(projectData: IProjectData): IFuture<void>;
13+
}
14+
15+
interface IProjectData {
16+
projectDir: string;
17+
platformsDir: string;
18+
projectFilePath: string;
19+
projectId?: string;
20+
projectName?: string;
321
}
422

523
interface IProjectTemplatesService {
624
defaultTemplatePath: IFuture<string>;
25+
installAndroidFramework(whereToInstall: string): IFuture<string>
726
}
+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
declare module "properties-parser" {
2+
function createEditor(path: string, callback: (err: IErrors, data: any) => void);
3+
}

lib/definitions/shelljs.d.ts

+1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ declare module "shelljs" {
22
function cp(arg: string, sourcePath: string, destinationPath: string): void;
33
function sed(arg: string, oldValue: any, newValue: string, filePath: string): void;
44
function mv(source: string[], destination: string);
5+
function grep(what: any, where: string): any;
56
}

lib/nativescript-cli.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
///<reference path=".d.ts"/>
2+
"use strict";
23

3-
import Fiber = require("fibers");
4-
import Future = require("fibers/future");
54
import path = require("path");
65

6+
require("./common/extensions");
77
require("./bootstrap");
88
require("./options");
99

1010
import errors = require("./common/errors");
1111
errors.installUncaughtExceptionListener();
1212

13-
$injector.register("config", {"CI_LOGGER": false});
13+
$injector.register("config", {"CI_LOGGER": false, PROJECT_FILE_NAME: ".tnsproject", "DEBUG": process.env.NATIVESCRIPT_DEBUG});
1414

1515
var dispatcher = $injector.resolve("dispatcher");
16-
dispatcher.runMainFiber();
16+
dispatcher.runMainFiber();

lib/node-package-manager.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,4 @@ export class NodePackageManager implements INodePackageManager {
3333
return future;
3434
}
3535
}
36-
$injector.register("npm", NodePackageManager);
36+
$injector.register("npm", NodePackageManager);

lib/options.ts

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ var knownOpts:any = {
1010
"path" : String,
1111
"copy-from": String,
1212
"link-to": String,
13+
"release": String,
1314
"version": Boolean,
1415
"help": Boolean
1516
},

lib/properties-parser.ts

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
///<reference path=".d.ts"/>
2+
3+
import propertiesParser = require("properties-parser");
4+
import Future = require("fibers/future");
5+
6+
export class PropertiesParser implements IPropertiesParser {
7+
public createEditor(filePath: string) {
8+
var future = new Future<any>();
9+
propertiesParser.createEditor(filePath, (err, data) => {
10+
if(err) {
11+
future.throw(err);
12+
} else {
13+
future.return(data);
14+
}
15+
});
16+
17+
return future;
18+
}
19+
}
20+
$injector.register("propertiesParser", PropertiesParser);

lib/services/platform-service.ts

+147
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
///<reference path="../.d.ts"/>
2+
3+
import path = require("path");
4+
import util = require("util");
5+
import helpers = require("./../common/helpers");
6+
7+
export class PlatformService implements IPlatformService {
8+
private platformCapabilities: { [key: string]: IPlatformCapabilities } = {
9+
ios: {
10+
targetedOS: ['darwin']
11+
},
12+
android: {
13+
}
14+
};
15+
16+
private platformNames = [];
17+
18+
constructor(private $errors: IErrors,
19+
private $fs: IFileSystem,
20+
private $projectService: IProjectService) {
21+
this.platformNames = Object.keys(this.platformCapabilities);
22+
}
23+
24+
public getCapabilities(platform: string): IPlatformCapabilities {
25+
return this.platformCapabilities[platform];
26+
}
27+
28+
public addPlatforms(platforms: string[]): IFuture<void> {
29+
return (() => {
30+
if(!platforms || platforms.length === 0) {
31+
this.$errors.fail("No platform specified. Please specify a platform to add");
32+
}
33+
34+
this.$projectService.ensureProject();
35+
36+
var platformsDir = this.$projectService.projectData.platformsDir;
37+
this.$fs.ensureDirectoryExists(platformsDir).wait();
38+
39+
_.each(platforms, platform => {
40+
this.addPlatform(platform.toLowerCase()).wait();
41+
});
42+
43+
}).future<void>()();
44+
}
45+
46+
private addPlatform(platform: string): IFuture<void> {
47+
return(() => {
48+
platform = platform.split("@")[0];
49+
50+
this.validatePlatform(platform);
51+
52+
var platformPath = path.join(this.$projectService.projectData.platformsDir, platform);
53+
54+
// TODO: Check for version compatability if the platform is in format platform@version. This should be done in PR for semanting versioning
55+
56+
if (this.$fs.exists(platformPath).wait()) {
57+
this.$errors.fail("Platform %s already added", platform);
58+
}
59+
60+
// Copy platform specific files in platforms dir
61+
this.$projectService.createPlatformSpecificProject(platform).wait();
62+
63+
}).future<void>()();
64+
}
65+
66+
public getInstalledPlatforms(): IFuture<string[]> {
67+
return(() => {
68+
if(!this.$fs.exists(this.$projectService.projectData.platformsDir).wait()) {
69+
return [];
70+
}
71+
72+
var subDirs = this.$fs.readDirectory(this.$projectService.projectData.platformsDir).wait();
73+
return _.filter(subDirs, p => { return this.platformNames.indexOf(p) > -1; });
74+
}).future<string[]>()();
75+
}
76+
77+
public getAvailablePlatforms(): IFuture<string[]> {
78+
return (() => {
79+
var installedPlatforms = this.getInstalledPlatforms().wait();
80+
return _.filter(this.platformNames, p => {
81+
return installedPlatforms.indexOf(p) < 0 && this.isPlatformSupportedForOS(p); // Only those not already installed
82+
});
83+
}).future<string[]>()();
84+
}
85+
86+
public runPlatform(platform: string): IFuture<void> {
87+
return (() => {
88+
89+
}).future<void>()();
90+
}
91+
92+
public preparePlatform(platform: string): IFuture<void> {
93+
return (() => {
94+
platform = platform.toLowerCase();
95+
this.validatePlatform(platform);
96+
var normalizedPlatformName = this.normalizePlatformName(platform);
97+
98+
this.$projectService.prepareProject(normalizedPlatformName, this.platformNames).wait();
99+
}).future<void>()();
100+
}
101+
102+
public buildPlatform(platform: string): IFuture<void> {
103+
return (() => {
104+
platform = platform.toLocaleLowerCase();
105+
this.validatePlatform(platform);
106+
107+
this.$projectService.buildProject(platform).wait();
108+
}).future<void>()();
109+
}
110+
111+
private validatePlatform(platform: string): void {
112+
if (!this.isValidPlatform(platform)) {
113+
this.$errors.fail("Invalid platform %s. Valid platforms are %s.", platform, helpers.formatListOfNames(this.platformNames));
114+
}
115+
116+
if (!this.isPlatformSupportedForOS(platform)) {
117+
this.$errors.fail("Applications for platform %s can not be built on this OS - %s", platform, process.platform);
118+
}
119+
}
120+
121+
private isValidPlatform(platform: string) {
122+
return this.platformCapabilities[platform];
123+
}
124+
125+
private isPlatformSupportedForOS(platform: string): boolean {
126+
var platformCapabilities = this.getCapabilities(platform);
127+
var targetedOS = platformCapabilities.targetedOS;
128+
129+
if(!targetedOS || targetedOS.indexOf("*") >= 0 || targetedOS.indexOf(process.platform) >= 0) {
130+
return true;
131+
}
132+
133+
return false;
134+
}
135+
136+
private normalizePlatformName(platform: string): string {
137+
switch(platform) {
138+
case "android":
139+
return "Android";
140+
case "ios":
141+
return "iOS";
142+
}
143+
144+
return undefined;
145+
}
146+
}
147+
$injector.register("platformService", PlatformService);

0 commit comments

Comments
 (0)