UNPKG

@ewwmy/cv-builder

Version:

💻 A CLI utility to generate a well-formatted CV in PDF format 📕 based on JSON CV data and a Handlebars template

150 lines (149 loc) • 7.27 kB
"use strict"; 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 __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; 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()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.JsonTransformerService = void 0; const inversify_1 = require("inversify"); const node_path_1 = require("node:path"); const dependency_types_1 = require("../types/dependency.types"); const image_service_1 = require("../images/image.service"); const file_service_1 = require("../files/file.service"); let JsonTransformerService = class JsonTransformerService { constructor(logger, imageService, fileService) { this.logger = logger; this.imageService = imageService; this.fileService = fileService; } // process icons in json processIcons(data_1) { return __awaiter(this, arguments, void 0, function* (data, basePath = '.') { if (Array.isArray(data)) { yield Promise.all(data.map((item) => this.processIcons(item, basePath))); } else if (typeof data === 'object' && data !== null) { yield Promise.all(Object.keys(data).map((key) => __awaiter(this, void 0, void 0, function* () { if (key === 'icon' && typeof data[key] === 'string') { const path = (0, node_path_1.isAbsolute)(data[key]) ? data[key] : (0, node_path_1.resolve)((0, node_path_1.join)(basePath, data[key])); try { data[key] = String(yield this.fileService.readFileData(path)); } catch (error) { this.logger.warn(`Couldn't load the icon at "${path}". The icon will be ignored.`); data[key] = ''; } } else { yield this.processIcons(data[key], basePath); } }))); } return data; }); } // recursive function to re-map the data with the processed images and converted to base64 // { type: "image"; path: string; scale?: number } to { type: "image"; path: string; scale?: number; base64: string } processImages(data_1) { return __awaiter(this, arguments, void 0, function* (data, basePath = '.') { if (Array.isArray(data)) { yield Promise.all(data.map((item) => this.processImages(item, basePath))); } else if (typeof data === 'object' && data !== null) { if (data.hasOwnProperty('path') && data.hasOwnProperty('type') && typeof data.path === 'string' && typeof data.type === 'string' && data.type === 'image') { let { path: imagePath, scale } = data; imagePath = (0, node_path_1.isAbsolute)(imagePath) ? imagePath : (0, node_path_1.resolve)((0, node_path_1.join)(basePath, imagePath)); scale = typeof scale === 'number' ? scale : 1; try { data.base64 = yield this.imageService.imageToBase64(imagePath, scale); } catch (error) { if (error instanceof Error) { this.logger.warn(error.message); } else { this.logger.warn(error); } data.base64 = ''; } } else { yield Promise.all(Object.keys(data).map((key) => this.processImages(data[key], basePath))); } } return data; }); } // recursive function to re-map the data with the selected language processLocalizedData(data, language) { if (typeof data !== 'object' || data === null) { return data; } if (data.hasOwnProperty(language) && typeof data[language] === 'string') { return data[language]; } if (Array.isArray(data)) { return data.map((item) => this.processLocalizedData(item, language)); } return Object.keys(data).reduce((acc, key) => { acc[key] = this.processLocalizedData(data[key], language); return acc; }, {}); } processHiddenData(data) { if (typeof data !== 'object' || data === null) { return data; } if (data.hasOwnProperty('hidden') && typeof data['hidden'] === 'boolean') { if (data['hidden'] === true) { data = null; return data; } } if (Array.isArray(data)) { return data .map((item) => this.processHiddenData(item)) .filter((item) => item !== null); } return Object.keys(data).reduce((acc, key) => { acc[key] = this.processHiddenData(data[key]); return acc; }, {}); } }; exports.JsonTransformerService = JsonTransformerService; exports.JsonTransformerService = JsonTransformerService = __decorate([ (0, inversify_1.injectable)(), __param(0, (0, inversify_1.inject)(dependency_types_1.DependencyTypes.Logger)), __param(1, (0, inversify_1.inject)(dependency_types_1.DependencyTypes.Image)), __param(2, (0, inversify_1.inject)(dependency_types_1.DependencyTypes.File)), __metadata("design:paramtypes", [Object, image_service_1.ImageService, file_service_1.FileService]) ], JsonTransformerService);