///
///
import metadata = require('MetadataClasses');
import lodash = require('lodash');
import fs = require("fs");
import path = require('path');
const stripBom = require("strip-bom");
const Promise = require('ember-cli/lib/ext/promise');
const Blueprint = require('ember-cli/lib/models/blueprint');
module.exports = {
description: 'Generates an group of entities for flexberry.',
availableOptions: [
{ name: 'metadata-dir', type: String },
{ name: 'skip-confirmation', type: Boolean }
],
supportsAddon: function () {
return false;
},
install: function (options) {
let groupBlueprint = new GroupBlueprint(this, options);
return groupBlueprint.promise;
}
};
class GroupBlueprint {
static mainBlueprint;
static groupOptions=[];
public promise;
private metadataDir: string;
private options;
private blueprint;
blueprintName;
static funCallback(arg) {
let opt = GroupBlueprint.groupOptions.pop();
return GroupBlueprint.mainBlueprint["install"](opt);
}
constructor(blueprint, options) {
let projectTypeName = "app";
if( options.project.pkg.keywords && options.project.pkg.keywords["0"] === "ember-addon" ) {
projectTypeName = "addon";
}
this.metadataDir = options.metadataDir;
this.options = options;
this.blueprint = blueprint;
this.blueprintName = options.entity.name;
this.promise = Promise.resolve();
this.setMainBlueprint(this.blueprintName);
switch (this.blueprintName) {
case 'transform':
this.emberGenerate("objects");
break;
case 'transform-test':
this.emberGenerate("objects");
break;
case 'controller-test':
this.emberGenerate("list-forms");
this.emberGenerate("edit-forms");
break;
case 'route-test':
this.emberGenerate("list-forms");
this.emberGenerate("edit-forms");
break;
case 'flexberry-acceptance-test':
this.emberGenerate("list-forms");
break;
case 'flexberry-enum':
this.emberGenerate("enums");
break;
case 'flexberry-list-form':
this.emberGenerate("list-forms");
break;
case 'flexberry-edit-form':
this.emberGenerate("edit-forms");
break;
case 'flexberry-model':
this.emberGenerate("models");
break;
case 'flexberry-model-init':
this.emberGenerate("models", true, projectTypeName + "/models");
break;
case 'flexberry-object':
this.emberGenerate("objects");
break;
case 'flexberry-object-init':
this.emberGenerate("objects", true, projectTypeName + "/objects");
break;
case 'flexberry-serializer-init':
this.emberGenerate("models", true, projectTypeName + "/serializers");
break;
case 'flexberry-model-offline':
this.emberGenerate("models");
break;
default:
throw new Error(`Unknown blueprint: ${this.blueprintName}`);
}
}
setMainBlueprint(blueprintName) {
GroupBlueprint.mainBlueprint = Blueprint.lookup(blueprintName, {
ui: undefined,
analytics: undefined,
project: undefined,
paths: ["node_modules/ember-flexberry/blueprints"]
});
}
emberGenerate(metadataSubDir: string, notOverwrite = false, folderJsFiles=undefined) {
metadataSubDir = path.join(this.metadataDir, metadataSubDir);
if (!fs.existsSync(metadataSubDir))
return;
let list = fs.readdirSync(metadataSubDir);
for (let file of list) {
let pp: path.ParsedPath = path.parse(file);
if (pp.ext != ".json")
continue;
let entityName = pp.name;
if (notOverwrite && fs.existsSync(`${folderJsFiles}/${entityName}.js`))
continue;
let entity = JSON.parse(stripBom(fs.readFileSync(path.join(metadataSubDir, file), "utf8")));
if (entity.external)
continue;
let groupOptions = lodash.merge({}, this.options, { entity: { name: entityName } });
GroupBlueprint.groupOptions.push(groupOptions);
this.promise = this.promise.then(GroupBlueprint.funCallback);
}
}
}