emilsoftware-utilities 2.0.0-dev.23 → 2.0.0-dev.25

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.
Files changed (261) hide show
  1. package/README.MD +147 -0
  2. package/dist/ContractGenerator.d.ts +4 -3
  3. package/dist/ContractGenerator.js +15 -5
  4. package/dist/ContractGenerator.js.map +1 -1
  5. package/dist/DailyFileTransport.d.ts +8 -2
  6. package/dist/DailyFileTransport.js +9 -2
  7. package/dist/DailyFileTransport.js.map +1 -1
  8. package/dist/DatabaseUpdater.js +8 -3
  9. package/dist/DatabaseUpdater.js.map +1 -1
  10. package/dist/ExecutionTimeLogger.d.ts +2 -2
  11. package/dist/ExecutionTimeLogger.js +3 -2
  12. package/dist/ExecutionTimeLogger.js.map +1 -1
  13. package/dist/Logger.d.ts +22 -9
  14. package/dist/Logger.js +131 -54
  15. package/dist/Logger.js.map +1 -1
  16. package/dist/Orm.d.ts +26 -6
  17. package/dist/Orm.js +144 -40
  18. package/dist/Orm.js.map +1 -1
  19. package/dist/Utilities.d.ts +12 -7
  20. package/dist/Utilities.js +57 -22
  21. package/dist/Utilities.js.map +1 -1
  22. package/dist/accessi-module/AccessiModule.d.ts +9 -0
  23. package/dist/accessi-module/AccessiModule.js +12 -4
  24. package/dist/accessi-module/AccessiModule.js.map +1 -1
  25. package/dist/accessi-module/Console/console.css +529 -281
  26. package/dist/accessi-module/Console/console.js +2081 -85
  27. package/dist/accessi-module/Console/console.js.map +1 -1
  28. package/dist/accessi-module/Console/generated/accessiApi.d.ts +167 -1
  29. package/dist/accessi-module/Console/generated/accessiApi.js +156 -2
  30. package/dist/accessi-module/Console/generated/accessiApi.js.map +1 -1
  31. package/dist/accessi-module/Console/generated/model/abilitazioneMenu.d.ts +20 -8
  32. package/dist/accessi-module/Console/generated/model/abilitazioneMenu.js.map +1 -1
  33. package/dist/accessi-module/Console/generated/model/createFilterTypeRequest.d.ts +23 -0
  34. package/dist/accessi-module/Console/generated/model/createFilterTypeRequest.js +3 -0
  35. package/dist/accessi-module/Console/generated/model/createFilterTypeRequest.js.map +1 -0
  36. package/dist/accessi-module/Console/generated/model/createFilterTypeRequestFlgEnabled.d.ts +14 -0
  37. package/dist/accessi-module/Console/generated/model/createFilterTypeRequestFlgEnabled.js +15 -0
  38. package/dist/accessi-module/Console/generated/model/createFilterTypeRequestFlgEnabled.js.map +1 -0
  39. package/dist/accessi-module/Console/generated/model/createMenuGroupRequest.d.ts +27 -0
  40. package/dist/accessi-module/Console/generated/model/createMenuGroupRequest.js +9 -0
  41. package/dist/accessi-module/Console/generated/model/createMenuGroupRequest.js.map +1 -0
  42. package/dist/accessi-module/Console/generated/model/createMenuRequest.d.ts +52 -0
  43. package/dist/accessi-module/Console/generated/model/createMenuRequest.js +9 -0
  44. package/dist/accessi-module/Console/generated/model/createMenuRequest.js.map +1 -0
  45. package/dist/accessi-module/Console/generated/model/createMenuTypeRequest.d.ts +18 -0
  46. package/dist/accessi-module/Console/generated/model/createMenuTypeRequest.js +9 -0
  47. package/dist/accessi-module/Console/generated/model/createMenuTypeRequest.js.map +1 -0
  48. package/dist/accessi-module/Console/generated/model/createServiceTokenRequest.d.ts +16 -0
  49. package/dist/accessi-module/Console/generated/model/createServiceTokenRequest.js +9 -0
  50. package/dist/accessi-module/Console/generated/model/createServiceTokenRequest.js.map +1 -0
  51. package/dist/accessi-module/Console/generated/model/createServiceTokenResponse.d.ts +14 -0
  52. package/dist/accessi-module/Console/generated/model/createServiceTokenResponse.js +3 -0
  53. package/dist/accessi-module/Console/generated/model/createServiceTokenResponse.js.map +1 -0
  54. package/dist/accessi-module/Console/generated/model/getMenuTypesResponse.d.ts +14 -0
  55. package/dist/accessi-module/Console/generated/model/getMenuTypesResponse.js +3 -0
  56. package/dist/accessi-module/Console/generated/model/getMenuTypesResponse.js.map +1 -0
  57. package/dist/accessi-module/Console/generated/model/getServiceTokensParams.d.ts +12 -0
  58. package/dist/accessi-module/Console/generated/model/getServiceTokensParams.js +9 -0
  59. package/dist/accessi-module/Console/generated/model/getServiceTokensParams.js.map +1 -0
  60. package/dist/accessi-module/Console/generated/model/getServiceTokensResponse.d.ts +14 -0
  61. package/dist/accessi-module/Console/generated/model/getServiceTokensResponse.js +3 -0
  62. package/dist/accessi-module/Console/generated/model/getServiceTokensResponse.js.map +1 -0
  63. package/dist/accessi-module/Console/generated/model/getUsersParams.d.ts +8 -0
  64. package/dist/accessi-module/Console/generated/model/getUsersParams.js.map +1 -1
  65. package/dist/accessi-module/Console/generated/model/index.d.ts +18 -0
  66. package/dist/accessi-module/Console/generated/model/index.js +18 -0
  67. package/dist/accessi-module/Console/generated/model/index.js.map +1 -1
  68. package/dist/accessi-module/Console/generated/model/issuedServiceTokenDto.d.ts +30 -0
  69. package/dist/accessi-module/Console/generated/model/issuedServiceTokenDto.js +9 -0
  70. package/dist/accessi-module/Console/generated/model/issuedServiceTokenDto.js.map +1 -0
  71. package/dist/accessi-module/Console/generated/model/menuTypeEntity.d.ts +12 -0
  72. package/dist/accessi-module/Console/generated/model/menuTypeEntity.js +9 -0
  73. package/dist/accessi-module/Console/generated/model/menuTypeEntity.js.map +1 -0
  74. package/dist/accessi-module/Console/generated/model/serviceTokenDto.d.ts +28 -0
  75. package/dist/accessi-module/Console/generated/model/serviceTokenDto.js +9 -0
  76. package/dist/accessi-module/Console/generated/model/serviceTokenDto.js.map +1 -0
  77. package/dist/accessi-module/Console/generated/model/updateFilterTypeRequest.d.ts +21 -0
  78. package/dist/accessi-module/Console/generated/model/updateFilterTypeRequest.js +3 -0
  79. package/dist/accessi-module/Console/generated/model/updateFilterTypeRequest.js.map +1 -0
  80. package/dist/accessi-module/Console/generated/model/updateFilterTypeRequestFlgEnabled.d.ts +14 -0
  81. package/dist/accessi-module/Console/generated/model/updateFilterTypeRequestFlgEnabled.js +15 -0
  82. package/dist/accessi-module/Console/generated/model/updateFilterTypeRequestFlgEnabled.js.map +1 -0
  83. package/dist/accessi-module/Console/generated/model/updateMenuGroupRequest.d.ts +22 -0
  84. package/dist/accessi-module/Console/generated/model/updateMenuGroupRequest.js +9 -0
  85. package/dist/accessi-module/Console/generated/model/updateMenuGroupRequest.js.map +1 -0
  86. package/dist/accessi-module/Console/generated/model/updateMenuRequest.d.ts +47 -0
  87. package/dist/accessi-module/Console/generated/model/updateMenuRequest.js +9 -0
  88. package/dist/accessi-module/Console/generated/model/updateMenuRequest.js.map +1 -0
  89. package/dist/accessi-module/Console/generated/model/updateMenuTypeRequest.d.ts +13 -0
  90. package/dist/accessi-module/Console/generated/model/updateMenuTypeRequest.js +9 -0
  91. package/dist/accessi-module/Console/generated/model/updateMenuTypeRequest.js.map +1 -0
  92. package/dist/accessi-module/Console/help.d.ts +13 -0
  93. package/dist/accessi-module/Console/help.js +348 -0
  94. package/dist/accessi-module/Console/help.js.map +1 -0
  95. package/dist/accessi-module/Console/index.html +89 -21
  96. package/dist/accessi-module/Console/wiki.d.ts +52 -0
  97. package/dist/accessi-module/Console/wiki.js +689 -0
  98. package/dist/accessi-module/Console/wiki.js.map +1 -0
  99. package/dist/accessi-module/Controllers/AccessiConsoleController.d.ts +8 -1
  100. package/dist/accessi-module/Controllers/AccessiConsoleController.js +52 -15
  101. package/dist/accessi-module/Controllers/AccessiConsoleController.js.map +1 -1
  102. package/dist/accessi-module/Controllers/ConfiguratorController.d.ts +1 -3
  103. package/dist/accessi-module/Controllers/ConfiguratorController.js +6 -8
  104. package/dist/accessi-module/Controllers/ConfiguratorController.js.map +1 -1
  105. package/dist/accessi-module/Controllers/EmailController.d.ts +1 -1
  106. package/dist/accessi-module/Controllers/EmailController.js +1 -1
  107. package/dist/accessi-module/Controllers/EmailController.js.map +1 -1
  108. package/dist/accessi-module/Controllers/FiltriController.d.ts +5 -4
  109. package/dist/accessi-module/Controllers/FiltriController.js +92 -4
  110. package/dist/accessi-module/Controllers/FiltriController.js.map +1 -1
  111. package/dist/accessi-module/Controllers/PermissionController.d.ts +11 -0
  112. package/dist/accessi-module/Controllers/PermissionController.js +273 -8
  113. package/dist/accessi-module/Controllers/PermissionController.js.map +1 -1
  114. package/dist/accessi-module/Controllers/ServiceTokenController.d.ts +23 -0
  115. package/dist/accessi-module/Controllers/ServiceTokenController.js +176 -0
  116. package/dist/accessi-module/Controllers/ServiceTokenController.js.map +1 -0
  117. package/dist/accessi-module/Controllers/UserController.d.ts +2 -2
  118. package/dist/accessi-module/Controllers/UserController.js +25 -9
  119. package/dist/accessi-module/Controllers/UserController.js.map +1 -1
  120. package/dist/accessi-module/Dtos/Abilitazione.js.map +1 -1
  121. package/dist/accessi-module/Dtos/AbilitazioneMenu.js +16 -8
  122. package/dist/accessi-module/Dtos/AbilitazioneMenu.js.map +1 -1
  123. package/dist/accessi-module/Dtos/AssignPermissionsToUserRequest.js.map +1 -1
  124. package/dist/accessi-module/Dtos/AssignRolesToUserRequest.js.map +1 -1
  125. package/dist/accessi-module/Dtos/AuthenticatedUserPayloadDto.js.map +1 -1
  126. package/dist/accessi-module/Dtos/BaseResponse.js.map +1 -1
  127. package/dist/accessi-module/Dtos/CatalogDtos.d.ts +66 -0
  128. package/dist/accessi-module/Dtos/CatalogDtos.js +336 -0
  129. package/dist/accessi-module/Dtos/CatalogDtos.js.map +1 -0
  130. package/dist/accessi-module/Dtos/ConfirmResetPasswordRequest.js.map +1 -1
  131. package/dist/accessi-module/Dtos/FiltriUtente.js.map +1 -1
  132. package/dist/accessi-module/Dtos/GetGroupsWithMenusResponse.js.map +1 -1
  133. package/dist/accessi-module/Dtos/GetMenusResponse.js +1 -1
  134. package/dist/accessi-module/Dtos/GetMenusResponse.js.map +1 -1
  135. package/dist/accessi-module/Dtos/GetRolesResponse.js.map +1 -1
  136. package/dist/accessi-module/Dtos/GetUserByTokenRequest.js.map +1 -1
  137. package/dist/accessi-module/Dtos/GetUserByTokenResponse.js.map +1 -1
  138. package/dist/accessi-module/Dtos/GetUsersResponse.d.ts +1 -1
  139. package/dist/accessi-module/Dtos/GetUsersResponse.js.map +1 -1
  140. package/dist/accessi-module/Dtos/LoginRequest.js.map +1 -1
  141. package/dist/accessi-module/Dtos/LoginResponse.d.ts +1 -1
  142. package/dist/accessi-module/Dtos/LoginResponse.js +1 -1
  143. package/dist/accessi-module/Dtos/LoginResponse.js.map +1 -1
  144. package/dist/accessi-module/Dtos/MenuItem.js +1 -0
  145. package/dist/accessi-module/Dtos/Permission.js.map +1 -1
  146. package/dist/accessi-module/Dtos/RegisterRequest.js +2 -1
  147. package/dist/accessi-module/Dtos/RegisterRequest.js.map +1 -1
  148. package/dist/accessi-module/Dtos/RegisterResponse.js.map +1 -1
  149. package/dist/accessi-module/Dtos/Role.js.map +1 -1
  150. package/dist/accessi-module/Dtos/RuoliMenu.js.map +1 -1
  151. package/dist/accessi-module/Dtos/SendResetPasswordEmailRequest.js.map +1 -1
  152. package/dist/accessi-module/Dtos/ServiceToken.d.ts +34 -0
  153. package/dist/accessi-module/Dtos/ServiceToken.js +128 -0
  154. package/dist/accessi-module/Dtos/ServiceToken.js.map +1 -0
  155. package/dist/accessi-module/Dtos/SetStatoRegistrazione.js.map +1 -1
  156. package/dist/accessi-module/Dtos/TipoFiltro.js.map +1 -1
  157. package/dist/accessi-module/Dtos/TokenResult.js.map +1 -1
  158. package/dist/accessi-module/Dtos/TwoFactorDtos.js.map +1 -1
  159. package/dist/accessi-module/Dtos/UpdateEnabledStatusRequest.js.map +1 -1
  160. package/dist/accessi-module/Dtos/UserDto.js +4 -2
  161. package/dist/accessi-module/Dtos/UserDto.js.map +1 -1
  162. package/dist/accessi-module/Dtos/UserGrantsDto.js.map +1 -1
  163. package/dist/accessi-module/Dtos/UserGrantsResponse.js.map +1 -1
  164. package/dist/accessi-module/Dtos/index.d.ts +2 -0
  165. package/dist/accessi-module/Dtos/index.js +2 -0
  166. package/dist/accessi-module/Dtos/index.js.map +1 -1
  167. package/dist/accessi-module/Services/AuthService/AuthService.d.ts +2 -2
  168. package/dist/accessi-module/Services/AuthService/AuthService.js +36 -36
  169. package/dist/accessi-module/Services/AuthService/AuthService.js.map +1 -1
  170. package/dist/accessi-module/Services/EmailService/EmailService.d.ts +2 -1
  171. package/dist/accessi-module/Services/EmailService/EmailService.js +9 -6
  172. package/dist/accessi-module/Services/EmailService/EmailService.js.map +1 -1
  173. package/dist/accessi-module/Services/FiltriService/FiltriService.d.ts +10 -3
  174. package/dist/accessi-module/Services/FiltriService/FiltriService.js +64 -6
  175. package/dist/accessi-module/Services/FiltriService/FiltriService.js.map +1 -1
  176. package/dist/accessi-module/Services/PermissionService/PermissionService.d.ts +44 -1
  177. package/dist/accessi-module/Services/PermissionService/PermissionService.js +418 -110
  178. package/dist/accessi-module/Services/PermissionService/PermissionService.js.map +1 -1
  179. package/dist/accessi-module/Services/ServiceTokenService/ServiceTokenService.d.ts +75 -0
  180. package/dist/accessi-module/Services/ServiceTokenService/ServiceTokenService.js +265 -0
  181. package/dist/accessi-module/Services/ServiceTokenService/ServiceTokenService.js.map +1 -0
  182. package/dist/accessi-module/Services/TwoFactorService/TwoFactorService.js +23 -27
  183. package/dist/accessi-module/Services/TwoFactorService/TwoFactorService.js.map +1 -1
  184. package/dist/accessi-module/Services/UserService/UserService.d.ts +10 -3
  185. package/dist/accessi-module/Services/UserService/UserService.js +170 -84
  186. package/dist/accessi-module/Services/UserService/UserService.js.map +1 -1
  187. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.d.ts +9 -0
  188. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js +76 -28
  189. package/dist/accessi-module/database-updates/AccessiDatabaseUpdater.js.map +1 -1
  190. package/dist/accessi-module/database-updates/accessiSchema.d.ts +1 -1
  191. package/dist/accessi-module/database-updates/accessiSchema.js +9 -1
  192. package/dist/accessi-module/database-updates/accessiSchema.js.map +1 -1
  193. package/dist/accessi-module/database-updates/optionalColumns.d.ts +2 -0
  194. package/dist/accessi-module/database-updates/optionalColumns.js +33 -1
  195. package/dist/accessi-module/database-updates/optionalColumns.js.map +1 -1
  196. package/dist/accessi-module/database-updates/runAccessiDbUpdate.js +7 -2
  197. package/dist/accessi-module/database-updates/runAccessiDbUpdate.js.map +1 -1
  198. package/dist/accessi-module/federated-auth/FederatedAuthController.d.ts +1 -0
  199. package/dist/accessi-module/federated-auth/FederatedAuthController.js +26 -0
  200. package/dist/accessi-module/federated-auth/FederatedAuthController.js.map +1 -1
  201. package/dist/accessi-module/federated-auth/FederatedAuthService.d.ts +6 -0
  202. package/dist/accessi-module/federated-auth/FederatedAuthService.js +28 -1
  203. package/dist/accessi-module/federated-auth/FederatedAuthService.js.map +1 -1
  204. package/dist/accessi-module/index.d.ts +4 -1
  205. package/dist/accessi-module/index.js +8 -2
  206. package/dist/accessi-module/index.js.map +1 -1
  207. package/dist/accessi-module/jwt/jwt.strategy.js +8 -5
  208. package/dist/accessi-module/jwt/jwt.strategy.js.map +1 -1
  209. package/dist/accessi-module/middleware/accessiRequirements.d.ts +1 -1
  210. package/dist/accessi-module/middleware/accessiRequirements.js.map +1 -1
  211. package/dist/accessi-module/middleware/authenticateGen.js +11 -7
  212. package/dist/accessi-module/middleware/authenticateGen.js.map +1 -1
  213. package/dist/accessi-module/security/accessControl.js +8 -3
  214. package/dist/accessi-module/security/accessControl.js.map +1 -1
  215. package/dist/accessi-module/security/authenticatedToken.d.ts +1 -1
  216. package/dist/accessi-module/security/authenticatedToken.js +2 -1
  217. package/dist/accessi-module/security/authenticatedToken.js.map +1 -1
  218. package/dist/accessi-module/security/passwordResetToken.d.ts +9 -3
  219. package/dist/accessi-module/security/passwordResetToken.js +9 -5
  220. package/dist/accessi-module/security/passwordResetToken.js.map +1 -1
  221. package/dist/accessi-module/security/publicAuthRateLimit.d.ts +1 -1
  222. package/dist/accessi-module/security/publicAuthRateLimit.js +28 -8
  223. package/dist/accessi-module/security/publicAuthRateLimit.js.map +1 -1
  224. package/dist/accessi-module/security/serviceTokenGuard.d.ts +25 -0
  225. package/dist/accessi-module/security/serviceTokenGuard.js +85 -0
  226. package/dist/accessi-module/security/serviceTokenGuard.js.map +1 -0
  227. package/dist/accessi-module/security/serviceTokenRateLimit.d.ts +8 -0
  228. package/dist/accessi-module/security/serviceTokenRateLimit.js +49 -0
  229. package/dist/accessi-module/security/serviceTokenRateLimit.js.map +1 -0
  230. package/dist/allegati-module/AllegatiModule.d.ts +11 -0
  231. package/dist/allegati-module/AllegatiModule.js +11 -1
  232. package/dist/allegati-module/AllegatiModule.js.map +1 -1
  233. package/dist/allegati-module/Controllers/AllegatiController.d.ts +2 -1
  234. package/dist/allegati-module/Controllers/AllegatiController.js +23 -15
  235. package/dist/allegati-module/Controllers/AllegatiController.js.map +1 -1
  236. package/dist/allegati-module/Dtos/AllegatoDto.js.map +1 -1
  237. package/dist/allegati-module/Dtos/BaseResponse.js.map +1 -1
  238. package/dist/allegati-module/Dtos/UploadSingleFileRequest.js.map +1 -1
  239. package/dist/allegati-module/Dtos/responses/DownloadAllegatoResponseDto.js.map +1 -1
  240. package/dist/allegati-module/Dtos/responses/GetListResponse.js.map +1 -1
  241. package/dist/allegati-module/Dtos/responses/UploadAllegatoResponseDto.js.map +1 -1
  242. package/dist/allegati-module/Services/AllegatiService/AllegatiService.d.ts +10 -3
  243. package/dist/allegati-module/Services/AllegatiService/AllegatiService.js +101 -52
  244. package/dist/allegati-module/Services/AllegatiService/AllegatiService.js.map +1 -1
  245. package/dist/allegati-module/security/allegatiAuthorizationGuard.d.ts +14 -0
  246. package/dist/allegati-module/security/allegatiAuthorizationGuard.js +70 -0
  247. package/dist/allegati-module/security/allegatiAuthorizationGuard.js.map +1 -0
  248. package/dist/autobind.d.ts +10 -3
  249. package/dist/autobind.js +24 -9
  250. package/dist/autobind.js.map +1 -1
  251. package/dist/emilsoftware-utilities-2.0.0-dev.25.tgz +0 -0
  252. package/dist/firebird-compat.d.ts +13 -0
  253. package/dist/firebird-compat.js +3 -2
  254. package/dist/firebird-compat.js.map +1 -1
  255. package/dist/scripts/generateAccessiWiki.d.ts +1 -0
  256. package/dist/scripts/generateAccessiWiki.js +131 -0
  257. package/dist/scripts/generateAccessiWiki.js.map +1 -0
  258. package/dist/swagger/SwaggerConfig.js +6 -3
  259. package/dist/swagger/SwaggerConfig.js.map +1 -1
  260. package/package.json +19 -8
  261. package/dist/emilsoftware-utilities-2.0.0-dev.23.tgz +0 -0
package/dist/Logger.d.ts CHANGED
@@ -7,25 +7,38 @@ export declare enum LogLevels {
7
7
  LOG = "LOG",
8
8
  DATABASE = "DATABASE"
9
9
  }
10
+ /**
11
+ * Logger strutturato dell'applicazione.
12
+ *
13
+ * - I log finiscono su console (colorati) e su file JSON giornaliero.
14
+ * - Le istanze con la stessa `logDirectory` condividono un unico logger winston
15
+ * (un solo transport/timer), evitando di crearne uno per classe.
16
+ * - I campi sensibili (password, token, secret, ...) sono redatti automaticamente.
17
+ */
10
18
  export declare class Logger {
11
19
  private readonly winstonLogger;
12
20
  private readonly tag;
13
21
  private readonly logDirectory;
14
- private logFormat;
22
+ private readonly maxLevel;
23
+ /** Logger winston condivisi per directory, così da non moltiplicare transport e timer. */
24
+ private static readonly sharedLoggers;
25
+ private static colorsRegistered;
15
26
  constructor(tag: string, config?: {
16
27
  logDirectory?: string;
17
28
  customFormat?: winston.Logform.Format;
18
29
  transports?: winston.transport[];
30
+ /** Livello minimo loggato: `error`..`database` (default `database`, ovvero tutto). Override con `LOG_LEVEL`. */
31
+ level?: string;
19
32
  });
20
- private replaceAll;
33
+ private static resolveSharedLogger;
21
34
  execStart(prefix?: string): number;
22
- execStop(prefix: string, startTime: number, error?: boolean): void;
23
- info(...data: Object[]): void;
24
- dbLog(...data: Object[]): void;
25
- debug(...data: Object[]): void;
26
- warning(...data: Object[]): void;
27
- log(...data: Object[]): void;
28
- error(...data: Object[]): void;
35
+ execStop(prefix: string | undefined, startTime: number, error?: boolean): void;
36
+ info(...data: unknown[]): void;
37
+ dbLog(...data: unknown[]): void;
38
+ debug(...data: unknown[]): void;
39
+ warning(...data: unknown[]): void;
40
+ log(...data: unknown[]): void;
41
+ error(...data: unknown[]): void;
29
42
  private print;
30
43
  static createLogger(tag: string, config?: {
31
44
  logDirectory?: string;
package/dist/Logger.js CHANGED
@@ -27,48 +27,120 @@ var LogLevels;
27
27
  LogLevels["LOG"] = "LOG";
28
28
  LogLevels["DATABASE"] = "DATABASE";
29
29
  })(LogLevels || (exports.LogLevels = LogLevels = {}));
30
+ /** Livelli winston usati dal logger (comprende `database` e `general`). */
31
+ const WIN_LEVELS = {
32
+ error: 1,
33
+ warning: 2,
34
+ info: 3,
35
+ general: 3,
36
+ http: 4,
37
+ verbose: 5,
38
+ debug: 6,
39
+ silly: 7,
40
+ database: 8,
41
+ };
42
+ /** Chiavi i cui valori non devono mai finire nei log. */
43
+ const SENSITIVE_KEY_PATTERN = /(password|passwd|pwd|secret|token|authorization|apikey|api_key|cookie)/i;
44
+ const REDACTED = '[REDACTED]';
45
+ /**
46
+ * Serializza un valore per il log, redigendo i campi sensibili e risolvendo
47
+ * `Error` e riferimenti circolari (che altrimenti diventano `[object Object]`).
48
+ */
49
+ function serializeLogValue(value, seen) {
50
+ if (value instanceof Error) {
51
+ return { name: value.name, message: value.message, stack: value.stack };
52
+ }
53
+ if (Array.isArray(value)) {
54
+ return value.map((item) => serializeLogValue(item, seen));
55
+ }
56
+ if (value && typeof value === 'object') {
57
+ if (seen.has(value)) {
58
+ return '[Circular]';
59
+ }
60
+ seen.add(value);
61
+ const result = {};
62
+ for (const [key, nested] of Object.entries(value)) {
63
+ result[key] = SENSITIVE_KEY_PATTERN.test(key) ? REDACTED : serializeLogValue(nested, seen);
64
+ }
65
+ return result;
66
+ }
67
+ return value;
68
+ }
69
+ /** Costruisce il messaggio testuale del log a partire dagli argomenti. */
70
+ function stringifyLogData(data) {
71
+ return data.map((value) => {
72
+ var _a;
73
+ if (typeof value === 'string') {
74
+ return value;
75
+ }
76
+ if (value instanceof Error) {
77
+ return (_a = value.stack) !== null && _a !== void 0 ? _a : `${value.name}: ${value.message}`;
78
+ }
79
+ if (value === undefined) {
80
+ return 'undefined';
81
+ }
82
+ if (value === null) {
83
+ return 'null';
84
+ }
85
+ try {
86
+ return JSON.stringify(serializeLogValue(value, new WeakSet()));
87
+ }
88
+ catch (_b) {
89
+ return String(value);
90
+ }
91
+ }).join(', ');
92
+ }
93
+ /** Formato condiviso: JSON a una riga, con tag/file/level/messaggio. */
94
+ function defaultFormat() {
95
+ return winston_1.default.format.printf((_a) => {
96
+ var { timestamp, tag, file, level, message } = _a, meta = __rest(_a, ["timestamp", "tag", "file", "level", "message"]);
97
+ return JSON.stringify(Object.assign({ timestamp: timestamp || new Date().toISOString(), tag, file: String(file !== null && file !== void 0 ? file : '').split('\\').join('/'), level: level === 'general' ? 'log' : level, message }, meta));
98
+ });
99
+ }
100
+ /**
101
+ * Logger strutturato dell'applicazione.
102
+ *
103
+ * - I log finiscono su console (colorati) e su file JSON giornaliero.
104
+ * - Le istanze con la stessa `logDirectory` condividono un unico logger winston
105
+ * (un solo transport/timer), evitando di crearne uno per classe.
106
+ * - I campi sensibili (password, token, secret, ...) sono redatti automaticamente.
107
+ */
30
108
  class Logger {
31
109
  constructor(tag, config) {
110
+ var _a, _b, _c;
32
111
  this.tag = tag || "[UNTAGGED]";
33
112
  this.logDirectory = (config === null || config === void 0 ? void 0 : config.logDirectory) || "logs";
34
- // Default log format
35
- this.logFormat =
36
- (config === null || config === void 0 ? void 0 : config.customFormat) ||
37
- winston_1.default.format.printf((_a) => {
38
- var { timestamp, file, level, message } = _a, meta = __rest(_a, ["timestamp", "file", "level", "message"]);
39
- return JSON.stringify(Object.assign({ timestamp: timestamp || new Date().toISOString(), tag: this.tag, file: this.replaceAll(file + "", "\\", "/"), level: level === 'general' ? 'log' : level, message }, meta));
40
- });
41
- // Configure logger
42
- this.winstonLogger = winston_1.default.createLogger({
113
+ const configuredLevel = ((_b = (_a = config === null || config === void 0 ? void 0 : config.level) !== null && _a !== void 0 ? _a : process.env.LOG_LEVEL) !== null && _b !== void 0 ? _b : 'database').toLowerCase();
114
+ this.maxLevel = (_c = WIN_LEVELS[configuredLevel]) !== null && _c !== void 0 ? _c : WIN_LEVELS.database;
115
+ const format = winston_1.default.format.combine(winston_1.default.format.timestamp(), (config === null || config === void 0 ? void 0 : config.customFormat) || defaultFormat());
116
+ this.winstonLogger = (config === null || config === void 0 ? void 0 : config.transports)
117
+ ? winston_1.default.createLogger({ level: 'database', format, transports: config.transports, levels: WIN_LEVELS })
118
+ : Logger.resolveSharedLogger(this.logDirectory, format);
119
+ if (!Logger.colorsRegistered) {
120
+ winston_1.default.addColors({
121
+ database: "green",
122
+ error: "red",
123
+ warning: "yellow",
124
+ info: "blue",
125
+ debug: "magenta",
126
+ log: "cyan",
127
+ });
128
+ Logger.colorsRegistered = true;
129
+ }
130
+ }
131
+ static resolveSharedLogger(logDirectory, format) {
132
+ const existing = Logger.sharedLoggers.get(logDirectory);
133
+ if (existing) {
134
+ return existing;
135
+ }
136
+ const logger = winston_1.default.createLogger({
43
137
  level: 'database',
44
- format: winston_1.default.format.combine(winston_1.default.format.timestamp(), this.logFormat),
45
- transports: (config === null || config === void 0 ? void 0 : config.transports) || [
46
- new DailyFileTransport_1.DailyFileTransport(this.logDirectory),
47
- ],
48
- levels: {
49
- error: 1,
50
- warning: 2,
51
- info: 3,
52
- general: 3,
53
- http: 4,
54
- verbose: 5,
55
- debug: 6,
56
- silly: 7,
57
- database: 8,
58
- },
138
+ format,
139
+ transports: [new DailyFileTransport_1.DailyFileTransport(logDirectory)],
140
+ levels: WIN_LEVELS,
59
141
  });
60
- // Add colors for console logging
61
- winston_1.default.addColors({
62
- database: "green",
63
- error: "red",
64
- warning: "yellow",
65
- info: "blue",
66
- debug: "magenta",
67
- log: "cyan",
68
- });
69
- }
70
- replaceAll(string, match, replacer) {
71
- return string.split(match).join(replacer);
142
+ Logger.sharedLoggers.set(logDirectory, logger);
143
+ return logger;
72
144
  }
73
145
  execStart(prefix = "") {
74
146
  this.print(LogLevels.INFO, `${prefix} - Execution started`);
@@ -98,44 +170,49 @@ class Logger {
98
170
  this.print(LogLevels.ERROR, ...data);
99
171
  }
100
172
  print(level, ...data) {
173
+ var _a;
174
+ const rank = level === LogLevels.LOG ? WIN_LEVELS.general : ((_a = WIN_LEVELS[level.toLowerCase()]) !== null && _a !== void 0 ? _a : WIN_LEVELS.database);
175
+ if (rank > this.maxLevel) {
176
+ return;
177
+ }
101
178
  const now = new Date();
102
179
  const fileName = this.tag.split("\\").pop() || this.tag;
103
- // Attach metadata to Winston logger
104
- this.winstonLogger.defaultMeta = {
105
- file: fileName,
106
- time: now,
107
- };
108
- const logEntry = {
109
- level: level === LogLevels.LOG ? 'general' : level.toLowerCase(),
110
- message: [...data].join(","),
111
- };
112
- // Log to console with colors
180
+ const message = stringifyLogData(data);
181
+ // Console colorata (il livello file resta strutturato).
113
182
  switch (level) {
114
183
  case LogLevels.INFO:
115
- console.info((0, colorette_1.blue)(`[INFO][${now}][${fileName}]`), logEntry.message);
184
+ console.info((0, colorette_1.blue)(`[INFO][${now}][${fileName}]`), message);
116
185
  break;
117
186
  case LogLevels.ERROR:
118
- console.error((0, colorette_1.red)(`[ERROR][${now}][${fileName}]`), logEntry.message);
187
+ console.error((0, colorette_1.red)(`[ERROR][${now}][${fileName}]`), message);
119
188
  break;
120
189
  case LogLevels.DEBUG:
121
- console.debug((0, colorette_1.magenta)(`[DEBUG][${now}][${fileName}]`), logEntry.message);
190
+ console.debug((0, colorette_1.magenta)(`[DEBUG][${now}][${fileName}]`), message);
122
191
  break;
123
192
  case LogLevels.WARNING:
124
- console.debug((0, colorette_1.yellow)(`[WARNING][${now}][${fileName}]`), logEntry.message);
193
+ console.debug((0, colorette_1.yellow)(`[WARNING][${now}][${fileName}]`), message);
125
194
  break;
126
195
  case LogLevels.LOG:
127
- console.log((0, colorette_1.cyan)(`[LOG][${now}][${fileName}]`), logEntry.message);
196
+ console.log((0, colorette_1.cyan)(`[LOG][${now}][${fileName}]`), message);
128
197
  break;
129
198
  case LogLevels.DATABASE:
130
- console.log((0, colorette_1.green)(`[DATABASE][${now}][${fileName}]`), logEntry.message);
199
+ console.log((0, colorette_1.green)(`[DATABASE][${now}][${fileName}]`), message);
131
200
  break;
132
201
  }
133
- // Log to file
134
- this.winstonLogger.log(logEntry);
202
+ this.winstonLogger.log({
203
+ level: level === LogLevels.LOG ? 'general' : level.toLowerCase(),
204
+ message,
205
+ tag: this.tag,
206
+ file: fileName,
207
+ time: now,
208
+ });
135
209
  }
136
210
  static createLogger(tag, config) {
137
211
  return new Logger(tag, config);
138
212
  }
139
213
  }
140
214
  exports.Logger = Logger;
215
+ /** Logger winston condivisi per directory, così da non moltiplicare transport e timer. */
216
+ Logger.sharedLoggers = new Map();
217
+ Logger.colorsRegistered = false;
141
218
  //# sourceMappingURL=Logger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Logger.js","sourceRoot":"","sources":["../src/Logger.ts"],"names":[],"mappings":"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","sourcesContent":["import winston from \"winston\";\nimport { DailyFileTransport } from './DailyFileTransport';\nimport { blue, red, magenta, green, cyan, yellow } from 'colorette';\n\nexport enum LogLevels {\n INFO = \"INFO\",\n ERROR = \"ERROR\",\n WARNING = \"WARNING\",\n DEBUG = \"DEBUG\",\n LOG = \"LOG\",\n DATABASE = \"DATABASE\",\n}\n\nexport class Logger {\n private readonly winstonLogger: winston.Logger;\n private readonly tag: string;\n private readonly logDirectory: string;\n private logFormat: winston.Logform.Format;\n\n constructor(\n tag: string,\n config?: {\n logDirectory?: string;\n customFormat?: winston.Logform.Format;\n transports?: winston.transport[];\n }\n ) {\n this.tag = tag || \"[UNTAGGED]\";\n this.logDirectory = config?.logDirectory || \"logs\";\n\n // Default log format\n this.logFormat =\n config?.customFormat ||\n winston.format.printf(({ timestamp, file, level, message, ...meta }) => {\n return JSON.stringify({\n timestamp: timestamp || new Date().toISOString(),\n tag: this.tag,\n file: this.replaceAll(file + \"\", \"\\\\\", \"/\"),\n level: level === 'general' ? 'log' : level,\n message,\n ...meta,\n });\n });\n\n // Configure logger\n this.winstonLogger = winston.createLogger({\n level: 'database',\n format: winston.format.combine(winston.format.timestamp(), this.logFormat),\n transports: config?.transports || [\n new DailyFileTransport(this.logDirectory),\n ],\n levels: {\n error: 1,\n warning: 2,\n info: 3,\n general: 3,\n http: 4,\n verbose: 5,\n debug: 6,\n silly: 7,\n database: 8,\n },\n });\n\n // Add colors for console logging\n winston.addColors({\n database: \"green\",\n error: \"red\",\n warning: \"yellow\",\n info: \"blue\",\n debug: \"magenta\",\n log: \"cyan\",\n });\n }\n\n private replaceAll(string: string, match: string, replacer: string) {\n return string.split(match).join(replacer);\n }\n\n public execStart(prefix: string = \"\"): number {\n this.print(LogLevels.INFO, `${prefix} - Execution started`);\n return performance.now();\n }\n\n public execStop(prefix: string = \"\", startTime: number, error: boolean = false): void {\n const executionTime = performance.now() - startTime;\n const message = `${prefix} - Execution ended ${error ? \"due to an error\" : \"successfully\"\n }. Execution time: ${executionTime.toFixed(2)} ms`;\n this.print(error ? LogLevels.ERROR : LogLevels.INFO, message);\n }\n\n public info(...data: Object[]): void {\n this.print(LogLevels.INFO, ...data);\n }\n\n public dbLog(...data: Object[]): void {\n this.print(LogLevels.DATABASE, ...data);\n }\n\n public debug(...data: Object[]): void {\n this.print(LogLevels.DEBUG, ...data);\n }\n\n public warning(...data: Object[]): void {\n this.print(LogLevels.WARNING, ...data);\n }\n\n public log(...data: Object[]): void {\n this.print(LogLevels.LOG, ...data);\n }\n\n public error(...data: Object[]): void {\n this.print(LogLevels.ERROR, ...data);\n }\n\n private print(level: LogLevels, ...data: Object[]): void {\n const now: Date = new Date();\n const fileName = this.tag.split(\"\\\\\").pop() || this.tag;\n\n // Attach metadata to Winston logger\n this.winstonLogger.defaultMeta = {\n file: fileName,\n time: now,\n };\n\n const logEntry: winston.LogEntry = {\n level: level === LogLevels.LOG ? 'general' : level.toLowerCase(),\n message: [...data].join(\",\"),\n };\n\n // Log to console with colors\n switch (level) {\n case LogLevels.INFO:\n console.info(blue(`[INFO][${now}][${fileName}]`), logEntry.message);\n break;\n case LogLevels.ERROR:\n console.error(red(`[ERROR][${now}][${fileName}]`), logEntry.message);\n break;\n case LogLevels.DEBUG:\n console.debug(magenta(`[DEBUG][${now}][${fileName}]`), logEntry.message);\n break;\n case LogLevels.WARNING:\n console.debug(yellow(`[WARNING][${now}][${fileName}]`), logEntry.message);\n break;\n case LogLevels.LOG:\n console.log(cyan(`[LOG][${now}][${fileName}]`), logEntry.message);\n break;\n case LogLevels.DATABASE:\n console.log(green(`[DATABASE][${now}][${fileName}]`), logEntry.message);\n break;\n }\n\n // Log to file\n this.winstonLogger.log(logEntry);\n }\n\n public static createLogger(tag: string, config?: { logDirectory?: string }): Logger {\n return new Logger(tag, config);\n }\n}\n"]}
1
+ {"version":3,"file":"Logger.js","sourceRoot":"","sources":["../src/Logger.ts"],"names":[],"mappings":"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","sourcesContent":["import winston from \"winston\";\nimport { DailyFileTransport } from './DailyFileTransport';\nimport { blue, red, magenta, green, cyan, yellow } from 'colorette';\n\nexport enum LogLevels {\n INFO = \"INFO\",\n ERROR = \"ERROR\",\n WARNING = \"WARNING\",\n DEBUG = \"DEBUG\",\n LOG = \"LOG\",\n DATABASE = \"DATABASE\",\n}\n\n/** Livelli winston usati dal logger (comprende `database` e `general`). */\nconst WIN_LEVELS = {\n error: 1,\n warning: 2,\n info: 3,\n general: 3,\n http: 4,\n verbose: 5,\n debug: 6,\n silly: 7,\n database: 8,\n};\n\n/** Chiavi i cui valori non devono mai finire nei log. */\nconst SENSITIVE_KEY_PATTERN = /(password|passwd|pwd|secret|token|authorization|apikey|api_key|cookie)/i;\nconst REDACTED = '[REDACTED]';\n\n/**\n * Serializza un valore per il log, redigendo i campi sensibili e risolvendo\n * `Error` e riferimenti circolari (che altrimenti diventano `[object Object]`).\n */\nfunction serializeLogValue(value: unknown, seen: WeakSet<object>): unknown {\n if (value instanceof Error) {\n return { name: value.name, message: value.message, stack: value.stack };\n }\n\n if (Array.isArray(value)) {\n return value.map((item) => serializeLogValue(item, seen));\n }\n\n if (value && typeof value === 'object') {\n if (seen.has(value)) {\n return '[Circular]';\n }\n seen.add(value);\n\n const result: Record<string, unknown> = {};\n for (const [key, nested] of Object.entries(value as Record<string, unknown>)) {\n result[key] = SENSITIVE_KEY_PATTERN.test(key) ? REDACTED : serializeLogValue(nested, seen);\n }\n return result;\n }\n\n return value;\n}\n\n/** Costruisce il messaggio testuale del log a partire dagli argomenti. */\nfunction stringifyLogData(data: unknown[]): string {\n return data.map((value) => {\n if (typeof value === 'string') {\n return value;\n }\n if (value instanceof Error) {\n return value.stack ?? `${value.name}: ${value.message}`;\n }\n if (value === undefined) {\n return 'undefined';\n }\n if (value === null) {\n return 'null';\n }\n try {\n return JSON.stringify(serializeLogValue(value, new WeakSet()));\n } catch {\n return String(value);\n }\n }).join(', ');\n}\n\n/** Formato condiviso: JSON a una riga, con tag/file/level/messaggio. */\nfunction defaultFormat(): winston.Logform.Format {\n return winston.format.printf(({ timestamp, tag, file, level, message, ...meta }) => JSON.stringify({\n timestamp: timestamp || new Date().toISOString(),\n tag,\n file: String(file ?? '').split('\\\\').join('/'),\n level: level === 'general' ? 'log' : level,\n message,\n ...meta,\n }));\n}\n\n/**\n * Logger strutturato dell'applicazione.\n *\n * - I log finiscono su console (colorati) e su file JSON giornaliero.\n * - Le istanze con la stessa `logDirectory` condividono un unico logger winston\n * (un solo transport/timer), evitando di crearne uno per classe.\n * - I campi sensibili (password, token, secret, ...) sono redatti automaticamente.\n */\nexport class Logger {\n private readonly winstonLogger: winston.Logger;\n private readonly tag: string;\n private readonly logDirectory: string;\n private readonly maxLevel: number;\n\n /** Logger winston condivisi per directory, così da non moltiplicare transport e timer. */\n private static readonly sharedLoggers = new Map<string, winston.Logger>();\n private static colorsRegistered = false;\n\n constructor(\n tag: string,\n config?: {\n logDirectory?: string;\n customFormat?: winston.Logform.Format;\n transports?: winston.transport[];\n /** Livello minimo loggato: `error`..`database` (default `database`, ovvero tutto). Override con `LOG_LEVEL`. */\n level?: string;\n }\n ) {\n this.tag = tag || \"[UNTAGGED]\";\n this.logDirectory = config?.logDirectory || \"logs\";\n\n const configuredLevel = (config?.level ?? process.env.LOG_LEVEL ?? 'database').toLowerCase();\n this.maxLevel = WIN_LEVELS[configuredLevel as keyof typeof WIN_LEVELS] ?? WIN_LEVELS.database;\n\n const format = winston.format.combine(\n winston.format.timestamp(),\n config?.customFormat || defaultFormat(),\n );\n\n this.winstonLogger = config?.transports\n ? winston.createLogger({ level: 'database', format, transports: config.transports, levels: WIN_LEVELS })\n : Logger.resolveSharedLogger(this.logDirectory, format);\n\n if (!Logger.colorsRegistered) {\n winston.addColors({\n database: \"green\",\n error: \"red\",\n warning: \"yellow\",\n info: \"blue\",\n debug: \"magenta\",\n log: \"cyan\",\n });\n Logger.colorsRegistered = true;\n }\n }\n\n private static resolveSharedLogger(logDirectory: string, format: winston.Logform.Format): winston.Logger {\n const existing = Logger.sharedLoggers.get(logDirectory);\n if (existing) {\n return existing;\n }\n\n const logger = winston.createLogger({\n level: 'database',\n format,\n transports: [new DailyFileTransport(logDirectory)],\n levels: WIN_LEVELS,\n });\n Logger.sharedLoggers.set(logDirectory, logger);\n return logger;\n }\n\n public execStart(prefix: string = \"\"): number {\n this.print(LogLevels.INFO, `${prefix} - Execution started`);\n return performance.now();\n }\n\n public execStop(prefix: string = \"\", startTime: number, error: boolean = false): void {\n const executionTime = performance.now() - startTime;\n const message = `${prefix} - Execution ended ${error ? \"due to an error\" : \"successfully\"\n }. Execution time: ${executionTime.toFixed(2)} ms`;\n this.print(error ? LogLevels.ERROR : LogLevels.INFO, message);\n }\n\n public info(...data: unknown[]): void {\n this.print(LogLevels.INFO, ...data);\n }\n\n public dbLog(...data: unknown[]): void {\n this.print(LogLevels.DATABASE, ...data);\n }\n\n public debug(...data: unknown[]): void {\n this.print(LogLevels.DEBUG, ...data);\n }\n\n public warning(...data: unknown[]): void {\n this.print(LogLevels.WARNING, ...data);\n }\n\n public log(...data: unknown[]): void {\n this.print(LogLevels.LOG, ...data);\n }\n\n public error(...data: unknown[]): void {\n this.print(LogLevels.ERROR, ...data);\n }\n\n private print(level: LogLevels, ...data: unknown[]): void {\n const rank = level === LogLevels.LOG ? WIN_LEVELS.general : (WIN_LEVELS[level.toLowerCase() as keyof typeof WIN_LEVELS] ?? WIN_LEVELS.database);\n if (rank > this.maxLevel) {\n return;\n }\n\n const now: Date = new Date();\n const fileName = this.tag.split(\"\\\\\").pop() || this.tag;\n const message = stringifyLogData(data);\n\n // Console colorata (il livello file resta strutturato).\n switch (level) {\n case LogLevels.INFO:\n console.info(blue(`[INFO][${now}][${fileName}]`), message);\n break;\n case LogLevels.ERROR:\n console.error(red(`[ERROR][${now}][${fileName}]`), message);\n break;\n case LogLevels.DEBUG:\n console.debug(magenta(`[DEBUG][${now}][${fileName}]`), message);\n break;\n case LogLevels.WARNING:\n console.debug(yellow(`[WARNING][${now}][${fileName}]`), message);\n break;\n case LogLevels.LOG:\n console.log(cyan(`[LOG][${now}][${fileName}]`), message);\n break;\n case LogLevels.DATABASE:\n console.log(green(`[DATABASE][${now}][${fileName}]`), message);\n break;\n }\n\n this.winstonLogger.log({\n level: level === LogLevels.LOG ? 'general' : level.toLowerCase(),\n message,\n tag: this.tag,\n file: fileName,\n time: now,\n });\n }\n\n public static createLogger(tag: string, config?: { logDirectory?: string }): Logger {\n return new Logger(tag, config);\n }\n}\n"]}
package/dist/Orm.d.ts CHANGED
@@ -1,7 +1,19 @@
1
- import { Database, Options, Transaction } from "node-firebird";
1
+ import { Database, Options, QueryParams, Transaction } from "node-firebird";
2
2
  export declare class Orm {
3
3
  private static logger;
4
+ private static pools;
4
5
  static quote(value: string): string;
6
+ /** Dimensione pool: default 5 (pool attivo); `poolSize: 0` disabilita e torna all'attach per query. */
7
+ private static getPoolSize;
8
+ private static shouldLogQueryParameters;
9
+ private static formatQueryForLog;
10
+ private static buildPoolKey;
11
+ /**
12
+ * Chiude tutti i pool creati (opt-in `poolSize`). Utile a fine processo o nei test,
13
+ * perché i pool mantengono connessioni e timer attivi.
14
+ */
15
+ static closePools(): Promise<void>;
16
+ private static getPool;
5
17
  private static getTimeoutMs;
6
18
  private static createTimeoutError;
7
19
  private static detachQuietly;
@@ -9,16 +21,24 @@ export declare class Orm {
9
21
  private static normalizeResultValue;
10
22
  private static attachWithTimeout;
11
23
  static testConnection(options: Options): Promise<boolean>;
12
- static query(options: Options, query: string, parameters?: any[], logQuery?: boolean): Promise<any>;
13
- static execute(options: Options, query: string, parameters?: any, logQuery?: boolean): Promise<any>;
14
- static trimParam(param: any): string;
24
+ static query<T = Record<string, unknown>>(options: Options, query: string, parameters?: QueryParams, logQuery?: boolean): Promise<T[]>;
25
+ static execute<T = Record<string, unknown>>(options: Options, query: string, parameters?: QueryParams, logQuery?: boolean): Promise<T[]>;
26
+ static trimParam<T>(param: T): string | T;
15
27
  static connect(options: Options): Promise<Database>;
28
+ /**
29
+ * Runs `operation` inside a single Firebird transaction: commit on success,
30
+ * rollback on failure, detach in every case. Use it to make multi-statement
31
+ * writes atomic instead of relying on auto-commit per statement.
32
+ */
33
+ static withTransaction<T>(options: Options, operation: (transaction: Transaction) => Promise<T>): Promise<T>;
34
+ /** Esegue una query su una transazione esistente e ne restituisce il risultato. */
35
+ static transactionQuery<T = unknown>(transaction: Transaction, query: string, parameters?: QueryParams): Promise<T>;
16
36
  static startTransaction(db: Database): Promise<Transaction>;
17
37
  static commitTransaction(transaction: Transaction): Promise<string>;
18
38
  static rollbackTransaction(transaction: Transaction): Promise<string>;
19
39
  static executeMultiple(options: Options, queriesWithParams: {
20
40
  query: string;
21
- params: any[];
41
+ params: QueryParams;
22
42
  }[]): Promise<string>;
23
- static executeQueries(transaction: Transaction, queries: string[], params: any[]): Promise<any>;
43
+ static executeQueries(transaction: Transaction, queries: string[], params: QueryParams[]): Promise<unknown>;
24
44
  }