Skip to content

Commit 037c2bc

Browse files
committed
Merge pull request #1324 from Icenium/kerezov/sb-0.0.12
Upgrade Screen Builder to latest version
2 parents d1897f3 + 2f7034d commit 037c2bc

14 files changed

+181
-229
lines changed

config/dependency-config.json

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
{
22
"appScaffolding": {
3-
"version": "0.0.10"
3+
"version": "0.0.12"
44
},
55
"generators": [{
66
"name": "generator-kendo-ui-mobile",
7-
"version": "0.0.10",
8-
"alias": "H"
7+
"version": "0.0.12"
98
}]
109
}

lib/bootstrap.ts

-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ $injector.require("platformMigrator", "./services/platform-migration");
1717
$injector.require("templatesService", "./templates-service");
1818
$injector.require("serverExtensionsService", "./services/server-extensions");
1919
$injector.require("appScaffoldingExtensionsService", "./services/app-scaffolding-extensions-service");
20-
$injector.require("generatorExtensionsService", "./services/generator-extensions-service");
2120
$injector.require("screenBuilderService", "./services/screen-builder-service");
2221

2322
$injector.require("cordovaPluginsService", "./services/cordova-plugins");

lib/commands/project/create-project.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@ export class CreateProjectCommand extends ProjectCommandBaseLib.ProjectCommandBa
66
constructor($errors: IErrors,
77
private frameworkIdentifier: string,
88
private $nameCommandParameter: ICommandParameter,
9+
private $options: IOptions,
910
$project: Project.IProject) {
1011
super($errors, $project);
1112
}
1213

1314
public execute(args: string[]): IFuture<void> {
1415
this.validateProjectData();
15-
return this.$project.createNewProject(args[0], this.frameworkIdentifier);
16+
return this.$project.createNewProject(args[0], this.frameworkIdentifier, this.$options.template);
1617
}
1718

1819
allowedParameters = [this.$nameCommandParameter];

lib/commands/project/create.ts

+7-6
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import * as path from "path";
55
import ProjectCommandBaseLib = require("./project-command-base");
66

77
export class CreateCommand extends ProjectCommandBaseLib.ProjectCommandBase {
8-
constructor(private $fs: IFileSystem,
8+
constructor(private $config: IConfiguration,
9+
private $fs: IFileSystem,
910
private $logger: ILogger,
1011
private $nameCommandParameter: ICommandParameter,
1112
private $options: IOptions,
@@ -23,9 +24,11 @@ export class CreateCommand extends ProjectCommandBaseLib.ProjectCommandBase {
2324
this.validateProjectData();
2425

2526
let projectName = args[0];
26-
let projectPath = path.resolve(this.$options.path ? this.$project.getNewProjectDir() : path.join(this.$project.getNewProjectDir(), projectName));
27+
let newProjectDir = this.$project.getNewProjectDir();
28+
let projectPath = path.resolve(this.$options.path ? newProjectDir : path.join(newProjectDir, projectName));
2729

28-
this.$project.createTemplateFolder(projectPath).wait();
30+
this.$project.createNewProject(projectName, this.$projectConstants.TARGET_FRAMEWORK_IDENTIFIERS.Cordova, this.$config.DEFAULT_CORDOVA_PROJECT_TEMPLATE).wait();
31+
_.each(this.$screenBuilderService.screenBuilderSpecificFiles, fileName => this.$fs.deleteFile(path.join(projectPath, fileName)).wait());
2932

3033
let screenBuilderOptions = this.$screenBuilderService.composeScreenBuilderOptions(this.$options.answers, {
3134
projectPath: projectPath,
@@ -35,10 +38,8 @@ export class CreateCommand extends ProjectCommandBaseLib.ProjectCommandBase {
3538
}).wait();
3639

3740
try {
38-
this.$screenBuilderService.prepareAndGeneratePrompt(this.$screenBuilderService.generatorName, this.$options.path, screenBuilderOptions).wait();
39-
this.$screenBuilderService.installAppDependencies(screenBuilderOptions, this.$options.path).wait();
4041

41-
this.$project.initializeProjectFromExistingFiles(this.$projectConstants.TARGET_FRAMEWORK_IDENTIFIERS.Cordova, projectPath, projectName).wait();
42+
this.$screenBuilderService.prepareAndGeneratePrompt(projectPath, this.$screenBuilderService.generatorFullName, screenBuilderOptions).wait();
4243
} catch(err) {
4344
this.$logger.trace(err);
4445
this.$fs.deleteDirectory(projectPath).wait();

lib/declarations.d.ts

+27-14
Original file line numberDiff line numberDiff line change
@@ -368,36 +368,49 @@ interface IServerExtensionsService extends IExtensionsServiceBase {
368368
prepareExtension(packageName: string, beforeDownloadPackageAction: () => void): IFuture<void>;
369369
}
370370

371-
interface IDependencyExtensionsServiceBase extends IExtensionsServiceBase {
372-
prepareDependencyExtension(dependencyExtensionName: string, dependencyConfig: IDependencyConfig, afterPrepareAction: () => IFuture<void>): IFuture<void>;
373-
}
374-
375-
interface IGeneratorExtensionsService {
376-
prepareGenerator(generatorName: string): IFuture<void>;
377-
}
378-
379371
interface IAppScaffoldingExtensionsService {
380372
appScaffoldingPath: string;
381373
prepareAppScaffolding(afterPrepareAction?: () => void): IFuture<void>;
382374
}
383375

384376
interface IScreenBuilderService {
385-
generatorName: string;
377+
generatorFullName: string;
386378
commandsPrefix: string;
387-
prepareAndGeneratePrompt(generatorName: string, projectPath: string, screenBuilderOptions?: IScreenBuilderOptions): IFuture<boolean>;
388-
allSupportedCommands(generatorName?: string): IFuture<string[]>;
389-
generateAllCommands(generatorName: string): IFuture<void>;
390-
installAppDependencies(screenBuilderOptions: IScreenBuilderOptions, projectPath: string): IFuture<void>;
379+
screenBuilderSpecificFiles: string[];
380+
prepareAndGeneratePrompt(projectPath: string, generatorName?: string, screenBuilderOptions?: IScreenBuilderOptions): IFuture<boolean>;
381+
allSupportedCommands(projectPath: string, generatorName?: string): IFuture<string[]>;
382+
generateAllCommands(projectPath: string, generatorName?: string): IFuture<void>;
391383
composeScreenBuilderOptions(answers: string, bacisSceenBuilderOptions?: IScreenBuilderOptions): IFuture<IScreenBuilderOptions>;
392-
ensureScreenBuilderProject(projectDir: string): IFuture<void>;
384+
ensureScreenBuilderProject(projectPath: string): IFuture<void>;
393385
shouldUpgrade(projectPath: string): IFuture<boolean>;
394386
upgrade(projectPath: string): IFuture<void>;
395387
}
396388

389+
/**
390+
* Defines a DTO for migrating from older versions of Screen Builder to the newest one.
391+
*/
392+
interface IScreenBuilderMigrationData {
393+
/**
394+
* States whether the app is already at the latest Screen Builder version.
395+
* @type {boolean}
396+
*/
397+
wasMigrated: boolean;
398+
/**
399+
* States whether the user chose to upgrade the app to the latest Screen Builder version.
400+
* @type {boolean}
401+
*/
402+
didMigrate: boolean;
403+
}
404+
397405
interface IScreenBuilderOptions {
398406
type?: string;
399407
answers?: IScreenBuilderAnswer;
400408
projectPath?: string;
409+
/**
410+
* States whether the ScreenBuilder command is synchronous. If it is then no callback will be passed to the app-scaffolder package.
411+
* @type {boolean}
412+
*/
413+
isSync?: boolean;
401414
}
402415

403416
interface IScreenBuilderAnswer {

lib/project.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -227,14 +227,14 @@ export class Project implements Project.IProject {
227227
}).future<void>()();
228228
}
229229

230-
public createNewProject(projectName: string, framework: string): IFuture<void> {
230+
public createNewProject(projectName: string, framework: string, template?: string): IFuture<void> {
231231
if(!projectName) {
232232
this.$errors.fail("No project name specified.");
233233
}
234234

235235
let projectDir = this.getNewProjectDir();
236236
this.frameworkProject = this.$frameworkProjectResolver.resolve(framework);
237-
return this.createFromTemplate(projectName, projectDir);
237+
return this.createFromTemplate(projectName, projectDir, template);
238238
}
239239

240240
public initializeProjectFromExistingFiles(framework: string, projectDir?: string, appName?: string): IFuture<void> {
@@ -744,11 +744,11 @@ export class Project implements Project.IProject {
744744
}).future<void>()();
745745
}
746746

747-
private createFromTemplate(appname: string, projectDir: string): IFuture<void> {
747+
private createFromTemplate(appname: string, projectDir: string, template?: string): IFuture<void> {
748748
return (() => {
749749
let templatesDir = this.$templatesService.projectTemplatesDir;
750-
let selectedTemplate = this.$options.template || this.frameworkProject.defaultProjectTemplate;
751-
let template = Project.UI_TEMPLATE_NAMES[selectedTemplate.toLowerCase()] || selectedTemplate;
750+
let selectedTemplate = template || this.frameworkProject.defaultProjectTemplate;
751+
template = Project.UI_TEMPLATE_NAMES[selectedTemplate.toLowerCase()] || selectedTemplate;
752752
let templateFileName = path.join(templatesDir, this.frameworkProject.getTemplateFilename(template));
753753

754754
this.$logger.trace("Using template '%s'", templateFileName);

lib/project/project.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ declare module Project {
88
projectConfigFiles: Project.IConfigurationFile[];
99
startPackageActivity: string;
1010

11-
createNewProject(projectName: string, framework: string): IFuture<void>;
11+
createNewProject(projectName: string, framework: string, template?: string): IFuture<void>;
1212
initializeProjectFromExistingFiles(framework: string, projectDir?: string, appName?: string): IFuture<void>;
1313
createProjectFile(projectDir: string, properties: any): IFuture<void>;
1414
createTemplateFolder(projectDir: string): IFuture<void>;

lib/providers/commands-service-provider.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,11 @@ class CommandsServiceProvider implements ICommandsServiceProvider {
4242
}
4343

4444
public getDynamicCommands(): IFuture<string[]> {
45-
return this.$screenBuilderService.allSupportedCommands(this.$screenBuilderService.generatorName);
45+
return this.$screenBuilderService.allSupportedCommands(this.$injector.resolve("project").getProjectDir().wait(), this.$screenBuilderService.generatorFullName);
4646
}
4747

4848
public generateDynamicCommands(): IFuture<void> {
49-
return this.$screenBuilderService.generateAllCommands(this.$screenBuilderService.generatorName);
49+
return this.$screenBuilderService.generateAllCommands(this.$injector.resolve("project").getProjectDir().wait(), this.$screenBuilderService.generatorFullName);
5050
}
5151

5252
public registerDynamicSubCommands(): void {

lib/services/app-scaffolding-extensions-service.ts

+42-12
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,24 @@
11
///<reference path="../.d.ts"/>
22
"use strict";
33

4-
import * as dependencyExtensionsServiceLib from "./dependency-extensions-service-base";
4+
import {ExtensionsServiceBase} from "./extensions-service-base";
55
import * as path from "path";
66
import Future = require("fibers/future");
77

8-
export class AppScaffoldingExtensionsService extends dependencyExtensionsServiceLib.DependencyExtensionsServiceBase implements IAppScaffoldingExtensionsService {
8+
export class AppScaffoldingExtensionsService extends ExtensionsServiceBase implements IAppScaffoldingExtensionsService {
99
private static APP_SCAFFOLDING_NAME = "app-scaffolding";
10+
private static SCREEN_BUILDER_BUCKET_NAME = "http://s3.amazonaws.com/screenbuilder-cli";
11+
private static DEFAULT_CACHED_VERSION = "0.0.0";
1012

11-
constructor($fs: IFileSystem,
12-
$httpClient: Server.IHttpClient,
13-
$logger: ILogger,
14-
$progressIndicator: IProgressIndicator,
15-
$config: IConfiguration,
16-
protected $childProcess: IChildProcess,
17-
protected $dependencyConfigService: IDependencyConfigService,
18-
$options: IOptions) {
19-
super($options.screenBuilderCacheDir, $fs, $httpClient, $logger, $options, $progressIndicator, $config); // We should pass here the correct profileDir
13+
constructor(private $childProcess: IChildProcess,
14+
private $config: IConfiguration,
15+
private $dependencyConfigService: IDependencyConfigService,
16+
private $progressIndicator: IProgressIndicator,
17+
protected $fs: IFileSystem,
18+
protected $httpClient: Server.IHttpClient,
19+
protected $logger: ILogger,
20+
protected $options: IOptions) {
21+
super($options.screenBuilderCacheDir, $fs, $httpClient, $logger, $options);
2022
}
2123

2224
public get appScaffoldingPath(): string {
@@ -29,7 +31,11 @@ export class AppScaffoldingExtensionsService extends dependencyExtensionsService
2931
appScaffoldingConfig.pathToSave = this.$options.screenBuilderCacheDir;
3032
let afterPrepareAction = () => {
3133
return (() => {
32-
this.npmInstall("[email protected]").wait(); // HACK: With this we are able to make paths shorter with 20 symbols.
34+
// HACK: Some of screen builder's dependencies generate paths which are too long for Windows OS to handle
35+
// this is why we pre-install them so that they're at the highest point in the dependency depth.
36+
// This leads to shortening the paths just enough to be safe about it.
37+
// Note that if one of these modules' versions is changed this needs to be reflected in the code too!
38+
["[email protected]", "[email protected]"].forEach(dependency => { this.npmInstall(dependency).wait(); });
3339

3440
let generatorBaseDependencies = require(path.join(this.appScaffoldingPath, "node_modules", "screen-builder-base-generator", "package.json")).dependencies;
3541
Future.wait(_.map(generatorBaseDependencies, (value, key) => this.npmInstall(`${key}@${value}`)));
@@ -41,6 +47,30 @@ export class AppScaffoldingExtensionsService extends dependencyExtensionsService
4147
}).future<void>()();
4248
}
4349

50+
public prepareDependencyExtension(dependencyExtensionName: string, dependencyConfig: IDependencyConfig, afterPrepareAction?: () => IFuture<void>): IFuture<void> {
51+
return (() => {
52+
let extensionVersion = this.getExtensionVersion(dependencyExtensionName);
53+
let cachedVersion = extensionVersion || AppScaffoldingExtensionsService.DEFAULT_CACHED_VERSION;
54+
let downloadUrl = this.$config.ON_PREM ? `${this.$config.AB_SERVER}/downloads/sb/generators/${dependencyExtensionName}/${dependencyConfig.version}` : `${AppScaffoldingExtensionsService.SCREEN_BUILDER_BUCKET_NAME}/v${dependencyConfig.version}/${dependencyExtensionName}.zip`;
55+
56+
this.$logger.trace("prepareDependencyExtension: Download url: %s, cached version: %s", downloadUrl, cachedVersion);
57+
58+
if (this.shouldUpdatePackage(cachedVersion, dependencyConfig.version)) {
59+
this.$logger.out("Please, wait while Screen Builder and its dependencies are being configured.");
60+
this.$logger.out("Preparing %s", dependencyExtensionName);
61+
62+
let dependencyExtensionData = {
63+
packageName: dependencyExtensionName,
64+
version: dependencyConfig.version,
65+
downloadUri: downloadUrl,
66+
pathToSave: dependencyConfig.pathToSave
67+
};
68+
69+
this.$progressIndicator.showProgressIndicator(this.prepareExtensionBase(dependencyExtensionData, cachedVersion, {afterDownloadAction: () => this.$progressIndicator.showProgressIndicator(afterPrepareAction(), 100)}), 5000).wait();
70+
}
71+
}).future<void>()();
72+
}
73+
4474
protected npmInstall(packageToInstall?: string): IFuture<void> {
4575
packageToInstall = packageToInstall || "";
4676
let command = `npm install ${packageToInstall} --production`;

lib/services/dependency-extensions-service-base.ts

-41
This file was deleted.

lib/services/generator-extensions-service.ts

-43
This file was deleted.

0 commit comments

Comments
 (0)