@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
JavaScript
;
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);