UNPKG

@lakutata/cli

Version:
165 lines (164 loc) 7.5 kB
"use strict"; 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"); const GetLocalDataFilename_1 = require("../GetLocalDataFilename"); class TemplateManager extends lakutata_1.Provider { constructor() { super(...arguments); this.localDataFilename = (0, GetLocalDataFilename_1.GetLocalDataFilename)(); } /** * 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);