@lakutata/cli
Version:
Lakutata CLI tool
170 lines (169 loc) • 7.51 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TemplateManager = void 0;
const lakutata_1 = require("lakutata");
const ListTemplatesOptions_1 = require("../../options/ListTemplatesOptions");
const dto_1 = require("lakutata/decorator/dto");
const cli_table3_1 = __importDefault(require("cli-table3"));
const ansis_1 = __importDefault(require("ansis"));
const console = __importStar(require("node:console"));
const node_path_1 = __importDefault(require("node:path"));
const di_1 = require("lakutata/decorator/di");
const node_fetch_native_1 = __importDefault(require("node-fetch-native"));
const logger_1 = require("lakutata/com/logger");
const helper_1 = require("lakutata/helper");
const Spinner_1 = require("../components/Spinner");
const promises_1 = require("node:fs/promises");
class TemplateManager extends lakutata_1.Provider {
constructor() {
super(...arguments);
this.localDataFilename = node_path_1.default.resolve('@data', 'templates.db');
}
/**
* Initializer
* @protected
*/
async init() {
}
/**
* Fetch template repository list from remote
* @protected
*/
async fetchTemplateRepos() {
this.spinner.start('Fetching');
const url = new URL(this.apiHost);
url.pathname = '/users/lakutata/repos';
const fetchResponse = await (0, node_fetch_native_1.default)(url.toString(), { method: 'get' });
if (fetchResponse.status >= 400) {
this.spinner.stop();
this.log.error('Failed to obtain template repository list: (%s) %s', fetchResponse.status, fetchResponse.statusText);
this.app.exit(1);
}
const rawRepos = (0, helper_1.As)(await fetchResponse.json());
const templateRepos = rawRepos.filter((rawRepo) => {
const repoName = rawRepo.name;
return repoName.startsWith(this.repoPrefix) && repoName !== this.repoPrefix;
});
this.spinner.stop();
return templateRepos.map((templateRepo) => {
const repoName = templateRepo.name;
return {
name: repoName.replace(`${this.repoPrefix}-`, ''),
description: templateRepo.description,
repository: templateRepo.full_name
};
}).sort((a, b) => b.name === 'default' ? 1 : 0);
}
/**
* List templates
* @param options
*/
async list(options) {
const { version } = JSON.parse(await (0, promises_1.readFile)(node_path_1.default.resolve('@packageJson'), { encoding: 'utf-8' }));
const isLocalDataExists = await (0, helper_1.IsExists)(this.localDataFilename);
let isLocalDataVersionMatched = false;
let cache = {
templates: [],
version: version,
updatedAt: lakutata_1.Time.now()
};
if (isLocalDataExists) {
cache = JSON.parse(await (0, promises_1.readFile)(this.localDataFilename, { encoding: 'utf-8' }));
isLocalDataVersionMatched = cache.version === version;
}
if (!isLocalDataExists || !isLocalDataVersionMatched || options.refresh) {
const templates = await this.fetchTemplateRepos();
cache = {
templates: templates,
version: version,
updatedAt: lakutata_1.Time.now()
};
await (0, promises_1.writeFile)(this.localDataFilename, JSON.stringify(cache), { flag: 'w' });
}
this.printTemplates(cache.templates, cache.updatedAt);
}
/**
* Print template information to console
* @param templateInfos
* @param updatedAt
* @protected
*/
printTemplates(templateInfos, updatedAt) {
const table = new cli_table3_1.default();
table.push([
{ content: ansis_1.default.bold.cyan('Name'), hAlign: 'center' },
{ content: ansis_1.default.bold.cyan('Description'), hAlign: 'center' },
{ content: ansis_1.default.bold.cyan('Repository'), hAlign: 'center' }
], ...templateInfos.map((templateInfo) => {
return [
templateInfo.name,
templateInfo.description,
templateInfo.repository
];
}));
console.log(table.toString());
console.log(`Template list last updated on: ${ansis_1.default.bold(new lakutata_1.Time(updatedAt).format('YYYY-MM-DD HH:mm:ss'))}`);
}
}
exports.TemplateManager = TemplateManager;
__decorate([
(0, di_1.Inject)(lakutata_1.Application),
__metadata("design:type", lakutata_1.Application)
], TemplateManager.prototype, "app", void 0);
__decorate([
(0, di_1.Inject)('log'),
__metadata("design:type", logger_1.Logger)
], TemplateManager.prototype, "log", void 0);
__decorate([
(0, di_1.Inject)('spinner'),
__metadata("design:type", Spinner_1.Spinner)
], TemplateManager.prototype, "spinner", void 0);
__decorate([
(0, di_1.Configurable)(lakutata_1.DTO.String().required()),
__metadata("design:type", String)
], TemplateManager.prototype, "apiHost", void 0);
__decorate([
(0, di_1.Configurable)(lakutata_1.DTO.String().required()),
__metadata("design:type", String)
], TemplateManager.prototype, "repoPrefix", void 0);
__decorate([
(0, dto_1.Accept)(ListTemplatesOptions_1.ListTemplatesOptions.required()),
__metadata("design:type", Function),
__metadata("design:paramtypes", [ListTemplatesOptions_1.ListTemplatesOptions]),
__metadata("design:returntype", Promise)
], TemplateManager.prototype, "list", null);