emilsoftware-utilities 1.3.6 → 1.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/autobind.ts DELETED
@@ -1,93 +0,0 @@
1
- // DECORATOR
2
- /**
3
- * Return a descriptor removing the value and returning a getter
4
- * The getter will return a .bind version of the function
5
- * and memoize the result against a symbol on the instance
6
- */
7
- export function boundMethod(target:any, key: any, descriptor: any) {
8
- let fn = descriptor?.value;
9
-
10
- if (typeof fn !== 'function') {
11
- throw new TypeError(`@boundMethod decorator can only be applied to methods not: ${typeof fn}`);
12
- }
13
-
14
- // In IE11 calling Object.defineProperty has a side effect of evaluating the
15
- // getter for the property which is being replaced. This causes infinite
16
- // recursion and an "Out of stack space" error.
17
- let definingProperty = false;
18
-
19
- return {
20
- configurable: true,
21
- get() {
22
- // eslint-disable-next-line no-prototype-builtins
23
- if (definingProperty || this === target.prototype || this.hasOwnProperty(key as string | number | symbol) ||
24
- typeof fn !== 'function') {
25
- return fn;
26
- }
27
-
28
- const boundFn = fn.bind(this);
29
- definingProperty = true;
30
- if (key) {
31
- Object.defineProperty(this, key, {
32
- configurable: true,
33
- get() {
34
- return boundFn;
35
- },
36
- set(value) {
37
- fn = value;
38
- // @ts-ignore
39
- delete this[key];
40
- }
41
- });
42
- }
43
- definingProperty = false;
44
- return boundFn;
45
- },
46
- set(value: any) {
47
- fn = value;
48
- }
49
- };
50
- }
51
-
52
- /**
53
- * Use boundMethod to bind all methods on the target.prototype
54
- */
55
- export function boundClass(target: any) {
56
- // (Using reflect to get all keys including symbols)
57
- let keys;
58
- // Use Reflect if exists
59
- if (typeof Reflect !== 'undefined' && typeof Reflect.ownKeys === 'function') {
60
- keys = Reflect.ownKeys(target.prototype);
61
- } else {
62
- keys = Object.getOwnPropertyNames(target.prototype);
63
- // Use symbols if support is provided
64
- if (typeof Object.getOwnPropertySymbols === 'function') {
65
- // @ts-ignore
66
- keys = keys.concat(Object.getOwnPropertySymbols(target.prototype));
67
- }
68
- }
69
-
70
- keys.forEach(key => {
71
- // Ignore special case target method
72
- if (key === 'constructor') {
73
- return;
74
- }
75
-
76
- const descriptor = Object.getOwnPropertyDescriptor(target.prototype, key);
77
-
78
- // Only methods need binding
79
- if (typeof descriptor?.value === 'function') {
80
- Object.defineProperty(target.prototype, key, boundMethod(target, key, descriptor));
81
- }
82
- });
83
- return target;
84
- }
85
-
86
- export default function autobind(...args: any[]) {
87
- if (args.length === 1) {
88
- // @ts-ignore
89
- return boundClass(...args);
90
- }
91
- // @ts-ignore
92
- return boundMethod(...args);
93
- }
package/src/index.ts DELETED
@@ -1,6 +0,0 @@
1
- import autobind from "./autobind"
2
- import logExecutionTime from "./log-execution-time"
3
- import {Logger, LogLevels} from "./logger";
4
- import {Orm} from "./orm";
5
- import {Utilities} from "./utilities";
6
- export {autobind, logExecutionTime, Logger, LogLevels, Orm, Utilities};
@@ -1,23 +0,0 @@
1
- // DECORATOR
2
- import {Logger} from "./logger";
3
-
4
- export default function logExecutionTime(fileName: string = "") {
5
- return (target: any, propertyKey: string, descriptor: PropertyDescriptor) => {
6
- const logger: Logger = new Logger(fileName);
7
- const originalMethod = descriptor.value;
8
- descriptor.value = async function (...args: any[]) {
9
- const start = process.hrtime();
10
- logger.info(` ${propertyKey} method execution started . . .`);
11
- try {
12
- const result = await originalMethod.apply(this, args);
13
- const end = process.hrtime(start);
14
- const durationInMilliseconds = end[0] * 1000 + end[1] / 1e6;
15
- logger.info(` ${propertyKey} method took ${durationInMilliseconds.toFixed(2)} ms to execute`)
16
- return result;
17
- } catch (error) {
18
- throw error;
19
- }
20
- };
21
- return descriptor;
22
- }
23
- }
package/src/logger.ts DELETED
@@ -1,144 +0,0 @@
1
- import winston from "winston";
2
- import * as path from "path";
3
- import * as fs from "fs";
4
-
5
-
6
- export enum LogLevels {
7
- INFO = "INFO", ERROR = "ERROR", DEBUG = "DEBUG", LOG = "LOG", DATABASE = "DATABASE"
8
- }
9
-
10
- export class Logger {
11
- private readonly winstonLogger: winston.Logger;
12
- private readonly tag: string = "[UNTAGGED]";
13
-
14
- private logFormat: winston.Logform.Format = winston.format.printf((tmp: winston.Logform.TransformableInfo): string => {
15
- const {time, file, level, message} = tmp;
16
- return `${JSON.stringify({time, file: this.replaceAll(file, "\\", "/"), level, message})},`;
17
- });
18
-
19
- private replaceAll(string: string, match: string, replacer: string) {
20
- // @ts-ignore
21
- return ("" + string)?.replaceAll(match, replacer);
22
- }
23
-
24
- constructor(tag: string) {
25
- const fileName: string = this.getFileName();
26
- const logsDirectory = "logs";
27
- const logFilePath = path.join(logsDirectory, fileName + ".json");
28
-
29
- if (!fs.existsSync(logsDirectory)) {
30
- fs.mkdirSync(logsDirectory);
31
- }
32
- this.tag = tag;
33
-
34
- winston.addColors({
35
- database: 'green',
36
- });
37
-
38
- this.winstonLogger = winston.createLogger({
39
- format: winston.format.json(),
40
- transports: [new winston.transports.File({filename: logFilePath, format: this.logFormat})],
41
- levels: {
42
- error: 1, warn: 2, info: 3, http: 4, verbose: 5, debug: 6, silly: 7, database: 8
43
- }
44
- });
45
-
46
- }
47
-
48
-
49
- private getFileName(): string {
50
- const now = new Date();
51
- let date = now.getDate();
52
- let dateString = "" + date;
53
- if (date < 10) dateString = "0" + dateString;
54
-
55
- let month = (now.getMonth() + 1);
56
- let monthString = "" + month;
57
- if (month < 10) monthString = "0" + monthString;
58
-
59
- let yearString = now.getFullYear() + "";
60
- return dateString + "-" + monthString + "-" + yearString;
61
- }
62
-
63
- public execStart(prefix: string = ""): number {
64
- this.print(LogLevels.INFO, `${prefix} - Execution started`);
65
- return performance.now();
66
- }
67
-
68
- public execStop(prefix: string = "", startTime: number, error: boolean = false): void {
69
- switch (error) {
70
- case true: {
71
- this.print(LogLevels.ERROR, `${prefix} - Execution ended due to an error. Execution time: ${performance.now() - startTime} ms`);
72
- break;
73
- }
74
- case false: {
75
- this.print(LogLevels.INFO, `${prefix} - Execution ended successfully. Execution time: ${performance.now() - startTime} ms`);
76
- break;
77
- }
78
- }
79
- }
80
-
81
- public info(...data: Object[]): void {
82
- this.print(LogLevels.INFO, ...data);
83
- }
84
-
85
- public dbLog(...data: Object[]): void {
86
- this.print(LogLevels.DATABASE, ...data);
87
- }
88
-
89
- public debug(...data: Object[]): void {
90
- this.print(LogLevels.DEBUG, ...data);
91
- }
92
-
93
- public log(...data: Object[]): void {
94
- this.print(LogLevels.LOG, ...data);
95
- }
96
-
97
- public error(...data: Object[]): void {
98
- this.print(LogLevels.ERROR, ...data);
99
- }
100
-
101
- private test() {
102
- let startTime = this.execStart("test");
103
- this.execStop("test", startTime);
104
- this.debug("test");
105
- this.log("test");
106
- this.error("test")
107
- this.dbLog("test");
108
- }
109
-
110
- private print(level: LogLevels = LogLevels.INFO, ...data: Object[]): void {
111
- const now: Date = new Date();
112
- let tag = this.tag.split("\\").pop();
113
-
114
- this.winstonLogger.defaultMeta = {
115
- file: tag, time: now, level
116
- };
117
-
118
- let logEntry: winston.LogEntry = {level: level.toLowerCase(), message: [...data].join(",")};
119
- //JSON.stringify([...data]);
120
- switch (level) {
121
- case LogLevels.INFO:
122
- this.winstonLogger.info(logEntry);
123
- console.info(`[INFO][${now}][${tag}]`, logEntry.message);
124
- break;
125
- case LogLevels.ERROR:
126
- this.winstonLogger.error(logEntry);
127
- console.error(`[ERROR][${now}][${tag}]`, logEntry.message);
128
- break;
129
- case LogLevels.DEBUG:
130
- this.winstonLogger.debug(logEntry);
131
- console.debug(`[DEBUG][${now}][${tag}]`, logEntry.message);
132
- break;
133
- case LogLevels.LOG: {
134
- this.winstonLogger.log(logEntry);
135
- console.log(`[LOG][${now}][${tag}]`, logEntry.message);
136
- }
137
- case LogLevels.DATABASE: {
138
- this.winstonLogger.info(logEntry);
139
- console.log(`[DATABASE][${now}][${tag}]`, logEntry.message);
140
- }
141
- }
142
-
143
- }
144
- }
@@ -1 +0,0 @@
1
- export * from "es-node-firebird";
package/src/orm.ts DELETED
@@ -1,221 +0,0 @@
1
- // @ts-ignore
2
- import * as Firebird from "es-node-firebird";
3
- import { Logger } from "./logger";
4
- import { Database, Options, Transaction } from "es-node-firebird";
5
- import { Utilities } from "./utilities";
6
-
7
- const logger: Logger = new Logger(__filename);
8
-
9
- const quote = (value: string): string => {
10
- return "\"" + value + "\"";
11
- };
12
- const testConnection = (options: Options): Promise<any> => {
13
- return new Promise((resolve): void => {
14
- Firebird.attach(options, (err: Error, db: Database): void => {
15
- if (err) {
16
- logger.error('La connessione con il DATABASE non è andata a buon fine.');
17
- return resolve(false);
18
- }
19
- logger.info("DATABASE connesso.");
20
- if (db) db.detach();
21
- return resolve(true);
22
- })
23
- })
24
- }
25
-
26
- const query = (options: Options, query: string, parameters: any[] = []): Promise<any> => {
27
- try {
28
- return new Promise((resolve, reject): void => {
29
- Firebird.attach(options, (err: any, db: Database) => {
30
- if (err) {
31
- logger.error(err);
32
- return reject(err);
33
- }
34
-
35
- logger.info(Utilities.printQueryWithParams(query, parameters));
36
- db.query(query, parameters, (error: any, result: any) => {
37
- if (error) {
38
- logger.error(error);
39
- db.detach();
40
- return reject(error);
41
- }
42
- db.detach();
43
- return resolve(result);
44
- });
45
- });
46
- });
47
- } catch (error) {
48
- logger.error(error);
49
- throw error;
50
- }
51
- }
52
- const execute = (options: Options, query: string, parameters: any = []): Promise<any> => {
53
- try {
54
- return new Promise((resolve, reject): void => {
55
- Firebird.attach(options, (err: any, db: Database) => {
56
- if (err) {
57
- logger.error(err);
58
- return reject(err);
59
- }
60
-
61
- logger.info(Utilities.printQueryWithParams(query, parameters));
62
- db.execute(query, parameters, (error, result: any): void => {
63
- if (error) {
64
- logger.error(error);
65
- db.detach();
66
- return reject(error);
67
- }
68
- db.detach();
69
- return resolve(result);
70
- });
71
- });
72
- });
73
- } catch (error) {
74
- logger.error(error);
75
- throw error;
76
- }
77
- }
78
-
79
- const trimParam = (param: any): string => {
80
- if (typeof param === "string" || param instanceof String) {
81
- return param.trim();
82
- }
83
- return param;
84
- }
85
-
86
- const connect = (options: Options): Promise<any> => {
87
- return new Promise((resolve, reject): void => {
88
- Firebird.attach(options, function (err: any, db: any): void {
89
- if (err) return reject(err); else return resolve(db);
90
- });
91
- });
92
- }
93
-
94
- const startTransaction = (db: Database): Promise<any> => {
95
- return new Promise((resolve, reject): void => {
96
- db.transaction(Firebird.ISOLATION_READ_COMMITTED, function (err: any, transaction: any) {
97
- if (err) return reject(err); else return resolve(transaction);
98
- });
99
- });
100
- }
101
-
102
- const commitTransaction = (transaction: Transaction): Promise<any> => {
103
- return new Promise((resolve, reject): void => {
104
- transaction.commit((err: any): void => {
105
- if (err) return reject(err); else return resolve('Transaction committed successfully.');
106
- });
107
- });
108
- }
109
-
110
- const rollbackTransaction = (transaction: Transaction): Promise<any> => {
111
- return new Promise((resolve, reject) => {
112
- transaction.rollback(err => {
113
- if (err) return reject(err);
114
- else return resolve('Transaction rolled back successfully.');
115
- });
116
- });
117
- }
118
-
119
- interface QueryWithParams {
120
- query: string,
121
- params: any[]
122
- }
123
-
124
- const executeMultiple = async (options: Options, queriesWithParams: QueryWithParams[]): Promise<any> => {
125
- let db: Database;
126
- let transaction: Transaction;
127
-
128
- try {
129
- // Connetti al database
130
- db = await connect(options);
131
-
132
- // Inizia la transazione
133
- transaction = await startTransaction(db);
134
-
135
- // Esegui le query in serie
136
- for (const qwp of queriesWithParams) {
137
- await new Promise((resolve, reject) => {
138
- transaction.query(qwp.query, qwp.params, (err: any, result: any): void => {
139
- if (err) return reject(err);
140
- else return resolve(result);
141
- });
142
- });
143
- }
144
-
145
- // Commit della transazione
146
- await commitTransaction(transaction);
147
-
148
- // Stacca il database
149
- db.detach();
150
-
151
- // Ritorna il messaggio di successo
152
- return 'OK';
153
-
154
- } catch (error) {
155
- // In caso di errore, fai rollback della transazione
156
- if (transaction) {
157
- await rollbackTransaction(transaction);
158
- }
159
- if (db) {
160
- db.detach();
161
- }
162
- throw error;
163
- }
164
- };
165
-
166
- const executeQueries = async (transaction: Transaction, queries: string[], params: any[]): Promise<any> => {
167
- try {
168
- try {
169
- return await queries.reduce((promiseChain: Promise<any>, currentQuery: string, index: number) => {
170
- return promiseChain.then(() => new Promise((resolve, reject) => {
171
- transaction.query(currentQuery, params[index], (err: any, result: any): void => {
172
- if (err) return reject(err);
173
- else return resolve(result);
174
- });
175
- }));
176
- }, Promise.resolve());
177
- } catch (error) {
178
- return await new Promise((resolve_1, reject_1) => {
179
- transaction.rollback((rollbackErr: any) => {
180
- if (rollbackErr) {
181
- return reject_1(rollbackErr);
182
- } else {
183
- return reject_1(error);
184
- }
185
- });
186
- });
187
- }
188
- } catch (error) {
189
- throw error;
190
- }
191
- };
192
-
193
- interface Orm {
194
- quote: (value: string) => string,
195
- testConnection: (options: Options) => Promise<any>,
196
- query: (options: Options, query: any, parameters?: any[]) => Promise<any>,
197
- execute: (options: Options, query: any, parameters?: any[]) => Promise<any>,
198
- trimParam: (param: any) => string,
199
- connect: (options: Options) => Promise<any>,
200
- startTransaction: (db: Database) => Promise<any>,
201
- executeMultiple: (options: Options, qwps: QueryWithParams[]) => any,
202
- executeQueries: (transaction: Transaction, queries: string[], params: any[]) => any,
203
- commitTransaction: (transaction: Transaction) => Promise<any>,
204
- rollbackTransaction: (transaction: Transaction) => Promise<any>,
205
- }
206
-
207
- export const Orm: Orm = {
208
- quote,
209
- testConnection,
210
- query,
211
- execute,
212
- trimParam,
213
- connect,
214
- startTransaction,
215
- executeQueries,
216
- executeMultiple,
217
- commitTransaction,
218
- rollbackTransaction
219
- }
220
-
221
-
@@ -1,16 +0,0 @@
1
- import {NextFunction, Request, Response} from "express";
2
- import {Logger} from "./logger";
3
-
4
- // Middleware per misurare il tempo di esecuzione
5
- export function routesLogger(req: Request, res: Response, next: NextFunction, logger: Logger) {
6
- const start: Date = new Date();
7
- // Funzione da eseguire dopo il completamento del controller
8
- res.on('finish', (): void => {
9
- const end: Date = new Date();
10
- const elapsed: number = end.getTime() - start.getTime();
11
-
12
- logger.info(`Tempo di esecuzione per ${req.method} ${req.originalUrl}: ${elapsed} ms`);
13
- });
14
- // Continua l'esecuzione della catena middleware
15
- return next();
16
- }