maestro-cli-roku
Version:
command line tools for maestro-roku projects
142 lines (141 loc) • 9.96 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
var fs = require("fs-extra");
var path = require("path");
var makeDir = require('make-dir');
var CreateViewCommand = /** @class */ (function () {
function CreateViewCommand() {
}
CreateViewCommand.prototype.execute = function (sourcePath, name, hasVM, hasTest, baseView, baseVM, subfolder) {
if (hasVM === void 0) { hasVM = true; }
if (hasTest === void 0) { hasTest = true; }
if (baseView === void 0) { baseView = 'BaseScreen'; }
if (baseVM === void 0) { baseVM = 'BaseViewModel'; }
if (subfolder === void 0) { subfolder = 'screens'; }
return __awaiter(this, void 0, void 0, function () {
var e_1;
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
_a.trys.push([0, 5, , 6]);
//create all folders
return [4 /*yield*/, makeDir(path.join(sourcePath, "components/" + subfolder))];
case 1:
//create all folders
_a.sent();
if (!hasVM) return [3 /*break*/, 4];
return [4 /*yield*/, makeDir(path.join(sourcePath, "source/viewModels/" + subfolder))];
case 2:
_a.sent();
if (!hasTest) return [3 /*break*/, 4];
return [4 /*yield*/, makeDir(path.join(sourcePath, "source/tests/viewModels/" + subfolder))];
case 3:
_a.sent();
_a.label = 4;
case 4:
this.createXMLFile(name, sourcePath, subfolder, baseView);
this.createCodeBehindFile(name, sourcePath, subfolder, hasVM);
if (hasVM) {
this.createViewModel(name, sourcePath, subfolder, baseVM);
if (hasTest) {
this.createTest(name, sourcePath, subfolder);
}
}
return [3 /*break*/, 6];
case 5:
e_1 = _a.sent();
console.error("Could not create view!\n targetPath: " + sourcePath + "\n error " + e_1.message);
return [2 /*return*/, false];
case 6: return [2 /*return*/, true];
}
});
});
};
CreateViewCommand.prototype.createXMLFile = function (name, sourcePath, subfolder, baseView) {
var xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<component\n name=\"" + name + "\"\n extends=\"" + baseView + "\">\n <interface>\n\n </interface>\n\n <children>\n\n </children>\n\n</component>\n";
fs.writeFileSync(path.join(sourcePath, "components/" + subfolder + "/" + name + ".xml"), xml, 'utf8');
};
CreateViewCommand.prototype.createCodeBehindFile = function (name, sourcePath, subfolder, hasVM) {
var bs = "\nimport \"pkg:/source/rLog/rLogMixin.bs\"\nimport \"pkg:/source/maestro/observable/ObservableMixin.bs\"\nimport \"pkg:/source/maestro/view/viewModel/ViewModelMixin.bs\"\n";
if (hasVM) {
bs += "import \"pkg:/source/viewModels/" + subfolder + "/" + name + "VM.bs\"\n";
}
bs += "\nfunction Init()\n registerLogger(\"" + name + "\")\nend function\n\n'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n'++ binding callbacks\n'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\n\n'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n'++ Lifecycle methods\n'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\nfunction _initialize(args)\n";
if (hasVM) {
bs += "\n m.vm = " + name + "VM()\n m.vm.initialize()\n MVMM.initializeBindings(true)\n ";
}
bs += "\nend function\n";
if (hasVM) {
bs += "\nfunction onGainedFocus(isSelfFocused)\n if isSelfFocused\n MVMM.onFocusIdChange(m.vm.focusId)\n end if\nend function\n";
}
fs.writeFileSync(path.join(sourcePath, "components/" + subfolder + "/" + name + ".bs"), bs, 'utf8');
};
CreateViewCommand.prototype.createViewModel = function (name, sourcePath, subfolder, baseVM) {
var namespace = name.replace(/[a-z]/g, '');
var vm = "import \"pkg:/source/maestro/view/viewModel/BaseViewModel.bs\"\n\nnamespace " + namespace + "VM\nclass " + name + "VM extends " + baseVM + "\n\npublic focusId = \"\"\npublic focusedIndex = -1\n\npublic function new()\n m.super(\"" + name + "VM\")\n m.focusIds = [\n ]\nend function\n\n'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n'++ Public api\n'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\n'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n'++ Private impl\n'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\n'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n'++ Key Handling\n'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\n'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n'++ Lifecycle methods\n'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\nend class\nend namespace";
fs.writeFileSync(path.join(sourcePath, "source/viewModels/" + subfolder + "/" + name + "VM.bs"), vm, 'utf8');
};
CreateViewCommand.prototype.createTest = function (name, sourcePath, subfolder) {
var namespace = name.replace(/[a-z]/g, '');
var vm = "'@TestSuite " + name + "VMTests\nimport \"pkg:/source/maestro/view/viewModel/BaseViewModel.bs\"\n\nnamespace " + namespace + "VMT\n\n'@BeforeEach\nfunction beforeEach()\nend function\n\n'@AfterEach\nfunction afterEach()\nend function\n\nend namespace";
fs.writeFileSync(path.join(sourcePath, "source/tests/viewModels/" + subfolder + "/" + name + "VMTests.bs"), vm, 'utf8');
};
return CreateViewCommand;
}());
exports.CreateViewCommand = CreateViewCommand;
function addCreateViewCommand(program) {
program
.command('createView <sourcePath> <name>')
.alias('cv')
.option('-b, --baseView [type]', "type of view component to extend - default BaseScreen")
.option('-v, --hasVM [true|false]', "if true, adds a viewModel for this view")
.option('-t, --hasTest [true|false]', "if true, adds a test for the view model")
.option('-B, --baseVM [type]', "type of viewModel to extend - default BaseViewModel")
.option('-s, --subfolder [path]', "view subfolder to use - default xxxx/view/screen, i.e. sourcePath/components/view/screen, or sourcePath/source/tests/view/screen")
.description("\n Creates a view, and associated files, relative to the default folders in your project, which are: source/components/view/screen\n")
.action(function (sourcePath, name, options) {
var hasVM = options.hasVM || true;
var hasTest = options.hasTest || true;
var baseView = options.baseView || 'BaseScreen';
var baseVM = options.baseVM || 'BaseViewModel';
var subfolder = options.subfolder || 'screens';
new CreateViewCommand().execute(sourcePath, name, hasVM, hasTest, baseView, baseVM, subfolder);
});
}
exports.addCreateViewCommand = addCreateViewCommand;