@russ-b/nestjs-common-tools 1.11.1 → 1.13.0

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 (168) hide show
  1. package/README.md +81 -2
  2. package/dist/common/filters/index.d.ts +1 -1
  3. package/dist/common/filters/index.js +1 -1
  4. package/dist/common/filters/index.js.map +1 -1
  5. package/dist/typeorm/errors/index.d.ts +1 -0
  6. package/dist/{grpc/proxies → typeorm/errors}/index.js +1 -1
  7. package/dist/typeorm/errors/index.js.map +1 -0
  8. package/dist/typeorm/errors/query-failed-error.util.d.ts +9 -0
  9. package/dist/typeorm/errors/query-failed-error.util.js +27 -0
  10. package/dist/typeorm/errors/query-failed-error.util.js.map +1 -0
  11. package/dist/typeorm/filters/entity-not-found.filter.d.ts +5 -0
  12. package/dist/{grpc/grpc.module.js → typeorm/filters/entity-not-found.filter.js} +14 -13
  13. package/dist/typeorm/filters/entity-not-found.filter.js.map +1 -0
  14. package/dist/{grpc → typeorm}/filters/index.d.ts +1 -0
  15. package/dist/{grpc → typeorm}/filters/index.js +1 -0
  16. package/dist/typeorm/filters/index.js.map +1 -0
  17. package/dist/typeorm/filters/typeorm-exception.filter.d.ts +13 -0
  18. package/dist/typeorm/filters/typeorm-exception.filter.js +53 -0
  19. package/dist/typeorm/filters/typeorm-exception.filter.js.map +1 -0
  20. package/dist/typeorm/index.d.ts +3 -0
  21. package/dist/typeorm/index.js +3 -0
  22. package/dist/typeorm/index.js.map +1 -1
  23. package/dist/typeorm/types/driver-error.type.d.ts +8 -0
  24. package/dist/{s3/s3.interface.js → typeorm/types/driver-error.type.js} +1 -1
  25. package/dist/typeorm/types/driver-error.type.js.map +1 -0
  26. package/dist/typeorm/types/index.d.ts +1 -0
  27. package/dist/{grpc/interceptors → typeorm/types}/index.js +1 -1
  28. package/dist/typeorm/types/index.js.map +1 -0
  29. package/package.json +41 -40
  30. package/dist/common/filters/typeorm-exception.filter.d.ts +0 -6
  31. package/dist/common/filters/typeorm-exception.filter.js +0 -36
  32. package/dist/common/filters/typeorm-exception.filter.js.map +0 -1
  33. package/dist/grpc/client-grpc.interface.d.ts +0 -34
  34. package/dist/grpc/client-grpc.interface.js +0 -3
  35. package/dist/grpc/client-grpc.interface.js.map +0 -1
  36. package/dist/grpc/filters/index.js.map +0 -1
  37. package/dist/grpc/filters/rpc-exception.filter.d.ts +0 -6
  38. package/dist/grpc/filters/rpc-exception.filter.js +0 -63
  39. package/dist/grpc/filters/rpc-exception.filter.js.map +0 -1
  40. package/dist/grpc/filters/typeorm-exception.filter.d.ts +0 -6
  41. package/dist/grpc/filters/typeorm-exception.filter.js +0 -52
  42. package/dist/grpc/filters/typeorm-exception.filter.js.map +0 -1
  43. package/dist/grpc/grpc.module.d.ts +0 -2
  44. package/dist/grpc/grpc.module.js.map +0 -1
  45. package/dist/grpc/index.d.ts +0 -4
  46. package/dist/grpc/index.js +0 -21
  47. package/dist/grpc/index.js.map +0 -1
  48. package/dist/grpc/interceptors/field-mask.interceptor.d.ts +0 -5
  49. package/dist/grpc/interceptors/field-mask.interceptor.js +0 -31
  50. package/dist/grpc/interceptors/field-mask.interceptor.js.map +0 -1
  51. package/dist/grpc/interceptors/index.d.ts +0 -1
  52. package/dist/grpc/interceptors/index.js.map +0 -1
  53. package/dist/grpc/interceptors/struct.interceptor.d.ts +0 -9
  54. package/dist/grpc/interceptors/struct.interceptor.js +0 -69
  55. package/dist/grpc/interceptors/struct.interceptor.js.map +0 -1
  56. package/dist/grpc/interfaces/index.d.ts +0 -1
  57. package/dist/grpc/interfaces/index.js +0 -18
  58. package/dist/grpc/interfaces/index.js.map +0 -1
  59. package/dist/grpc/interfaces/package-definition.interface.d.ts +0 -18
  60. package/dist/grpc/interfaces/package-definition.interface.js +0 -3
  61. package/dist/grpc/interfaces/package-definition.interface.js.map +0 -1
  62. package/dist/grpc/providers/grpc-options.provider.d.ts +0 -16
  63. package/dist/grpc/providers/grpc-options.provider.js +0 -68
  64. package/dist/grpc/providers/grpc-options.provider.js.map +0 -1
  65. package/dist/grpc/providers/index.d.ts +0 -1
  66. package/dist/grpc/providers/index.js +0 -18
  67. package/dist/grpc/providers/index.js.map +0 -1
  68. package/dist/grpc/proxies/base-client-grpc.proxy.d.ts +0 -7
  69. package/dist/grpc/proxies/base-client-grpc.proxy.js +0 -73
  70. package/dist/grpc/proxies/base-client-grpc.proxy.js.map +0 -1
  71. package/dist/grpc/proxies/index.d.ts +0 -1
  72. package/dist/grpc/proxies/index.js.map +0 -1
  73. package/dist/grpc/services/grpc-package-definition.service.d.ts +0 -16
  74. package/dist/grpc/services/grpc-package-definition.service.js +0 -82
  75. package/dist/grpc/services/grpc-package-definition.service.js.map +0 -1
  76. package/dist/grpc/services/index.d.ts +0 -1
  77. package/dist/grpc/services/index.js +0 -18
  78. package/dist/grpc/services/index.js.map +0 -1
  79. package/dist/grpc/services/package-definition/index.d.ts +0 -2
  80. package/dist/grpc/services/package-definition/index.js +0 -19
  81. package/dist/grpc/services/package-definition/index.js.map +0 -1
  82. package/dist/grpc/services/package-definition/package-definition-manager.d.ts +0 -15
  83. package/dist/grpc/services/package-definition/package-definition-manager.js +0 -62
  84. package/dist/grpc/services/package-definition/package-definition-manager.js.map +0 -1
  85. package/dist/grpc/services/package-definition/package-definition.constants.d.ts +0 -2
  86. package/dist/grpc/services/package-definition/package-definition.constants.js +0 -6
  87. package/dist/grpc/services/package-definition/package-definition.constants.js.map +0 -1
  88. package/dist/grpc/services/package-definition/package-definition.service.d.ts +0 -8
  89. package/dist/grpc/services/package-definition/package-definition.service.js +0 -27
  90. package/dist/grpc/services/package-definition/package-definition.service.js.map +0 -1
  91. package/dist/grpc/services/proto/constants/proto.constants.d.ts +0 -2
  92. package/dist/grpc/services/proto/constants/proto.constants.js +0 -6
  93. package/dist/grpc/services/proto/constants/proto.constants.js.map +0 -1
  94. package/dist/grpc/services/proto/field.selector.d.ts +0 -9
  95. package/dist/grpc/services/proto/field.selector.js +0 -34
  96. package/dist/grpc/services/proto/field.selector.js.map +0 -1
  97. package/dist/grpc/services/proto/interfaces/field-selector.interface.d.ts +0 -4
  98. package/dist/grpc/services/proto/interfaces/field-selector.interface.js +0 -3
  99. package/dist/grpc/services/proto/interfaces/field-selector.interface.js.map +0 -1
  100. package/dist/grpc/services/proto/interfaces/index.d.ts +0 -3
  101. package/dist/grpc/services/proto/interfaces/index.js +0 -20
  102. package/dist/grpc/services/proto/interfaces/index.js.map +0 -1
  103. package/dist/grpc/services/proto/interfaces/package-definition.interface.d.ts +0 -3
  104. package/dist/grpc/services/proto/interfaces/package-definition.interface.js +0 -3
  105. package/dist/grpc/services/proto/interfaces/package-definition.interface.js.map +0 -1
  106. package/dist/grpc/services/proto/interfaces/proto-descriptors.interface.d.ts +0 -49
  107. package/dist/grpc/services/proto/interfaces/proto-descriptors.interface.js +0 -31
  108. package/dist/grpc/services/proto/interfaces/proto-descriptors.interface.js.map +0 -1
  109. package/dist/grpc/services/proto/readers/client-definition.reader.d.ts +0 -23
  110. package/dist/grpc/services/proto/readers/client-definition.reader.js +0 -51
  111. package/dist/grpc/services/proto/readers/client-definition.reader.js.map +0 -1
  112. package/dist/grpc/services/proto/readers/field-definition.reader.d.ts +0 -3
  113. package/dist/grpc/services/proto/readers/field-definition.reader.js +0 -8
  114. package/dist/grpc/services/proto/readers/field-definition.reader.js.map +0 -1
  115. package/dist/grpc/services/proto/readers/field.selector.d.ts +0 -7
  116. package/dist/grpc/services/proto/readers/field.selector.js +0 -29
  117. package/dist/grpc/services/proto/readers/field.selector.js.map +0 -1
  118. package/dist/grpc/services/proto/readers/interfaces/client-definition.interface.d.ts +0 -24
  119. package/dist/grpc/services/proto/readers/interfaces/client-definition.interface.js +0 -3
  120. package/dist/grpc/services/proto/readers/interfaces/client-definition.interface.js.map +0 -1
  121. package/dist/grpc/services/proto/readers/interfaces/field.interface.d.ts +0 -16
  122. package/dist/grpc/services/proto/readers/interfaces/field.interface.js +0 -3
  123. package/dist/grpc/services/proto/readers/interfaces/field.interface.js.map +0 -1
  124. package/dist/grpc/services/proto/readers/interfaces/index.d.ts +0 -1
  125. package/dist/grpc/services/proto/readers/interfaces/index.js +0 -18
  126. package/dist/grpc/services/proto/readers/interfaces/index.js.map +0 -1
  127. package/dist/grpc/services/proto/readers/interfaces/package-definition.interface.d.ts +0 -9
  128. package/dist/grpc/services/proto/readers/interfaces/package-definition.interface.js +0 -3
  129. package/dist/grpc/services/proto/readers/interfaces/package-definition.interface.js.map +0 -1
  130. package/dist/grpc/services/proto/readers/package-definition.reader.d.ts +0 -17
  131. package/dist/grpc/services/proto/readers/package-definition.reader.js +0 -61
  132. package/dist/grpc/services/proto/readers/package-definition.reader.js.map +0 -1
  133. package/dist/grpc/transformers/field-transformer.d.ts +0 -7
  134. package/dist/grpc/transformers/field-transformer.js +0 -26
  135. package/dist/grpc/transformers/field-transformer.js.map +0 -1
  136. package/dist/grpc/transformers/index.d.ts +0 -2
  137. package/dist/grpc/transformers/index.js +0 -19
  138. package/dist/grpc/transformers/index.js.map +0 -1
  139. package/dist/grpc/transformers/struct/index.d.ts +0 -2
  140. package/dist/grpc/transformers/struct/index.js +0 -19
  141. package/dist/grpc/transformers/struct/index.js.map +0 -1
  142. package/dist/grpc/transformers/struct/struct.interface.d.ts +0 -17
  143. package/dist/grpc/transformers/struct/struct.interface.js +0 -3
  144. package/dist/grpc/transformers/struct/struct.interface.js.map +0 -1
  145. package/dist/grpc/transformers/struct/struct.transformer.d.ts +0 -8
  146. package/dist/grpc/transformers/struct/struct.transformer.js +0 -86
  147. package/dist/grpc/transformers/struct/struct.transformer.js.map +0 -1
  148. package/dist/logger/logger.interface.d.ts +0 -1
  149. package/dist/logger/logger.interface.js +0 -3
  150. package/dist/logger/logger.interface.js.map +0 -1
  151. package/dist/logger/transports/json-format.transport.d.ts +0 -4
  152. package/dist/logger/transports/json-format.transport.js +0 -14
  153. package/dist/logger/transports/json-format.transport.js.map +0 -1
  154. package/dist/logger/transports/nest-format.transport.d.ts +0 -4
  155. package/dist/logger/transports/nest-format.transport.js +0 -18
  156. package/dist/logger/transports/nest-format.transport.js.map +0 -1
  157. package/dist/s3/s3.constants.d.ts +0 -2
  158. package/dist/s3/s3.constants.js +0 -6
  159. package/dist/s3/s3.constants.js.map +0 -1
  160. package/dist/s3/s3.interface.d.ts +0 -13
  161. package/dist/s3/s3.interface.js.map +0 -1
  162. package/dist/s3/s3.module.d.ts +0 -5
  163. package/dist/s3/s3.module.js +0 -52
  164. package/dist/s3/s3.module.js.map +0 -1
  165. package/dist/s3/s3.service.d.ts +0 -12
  166. package/dist/s3/s3.service.js +0 -80
  167. package/dist/s3/s3.service.js.map +0 -1
  168. package/dist/tsconfig.tsbuildinfo +0 -1
package/README.md CHANGED
@@ -1,6 +1,20 @@
1
1
  # nestjs-common-tools
2
2
  NestJS Common Tools
3
3
 
4
+ A small toolbox for NestJS with helpers that often come up in day-to-day development.
5
+
6
+ This package grew out of the same recurring problem across multiple projects: there are many standard pieces that are useful in real NestJS applications, but are not available out of the box. Instead of copying those building blocks from project to project, this library collects them in one place to reduce boilerplate and help avoid repeating yourself.
7
+
8
+ ## Installation
9
+
10
+ Install the package:
11
+
12
+ ```bash
13
+ npm install @russ-b/nestjs-common-tools
14
+ ```
15
+
16
+ Depending on which features you use, make sure the relevant peer dependencies are also installed in your project.
17
+
4
18
  ## Entity Validator
5
19
 
6
20
  A custom validator for NestJS that validates if an entity exists in the database using TypeORM.
@@ -30,7 +44,7 @@ async function bootstrap() {
30
44
  // app.module.ts
31
45
  import { Module } from '@nestjs/common';
32
46
  import { TypeOrmModule } from '@nestjs/typeorm';
33
- import { EntityConstraint } from './common/validators/entity/entity.constraint';
47
+ import { EntityConstraint } from '@russ-b/nestjs-common-tools/validators';
34
48
 
35
49
  @Module({
36
50
  providers: [
@@ -44,7 +58,7 @@ export class AppModule {}
44
58
  ## Usage
45
59
 
46
60
  ```typescript
47
- import { IsEntity } from '@russ-b/nestjs-common-tools/common/validators/entity';
61
+ import { IsEntity } from '@russ-b/nestjs-common-tools/validators';
48
62
 
49
63
  export class UserDto {
50
64
  // Validate single entity
@@ -87,3 +101,68 @@ export class AssignRolesDto {
87
101
  roleIds: string[];
88
102
  }
89
103
  ```
104
+
105
+ ## TypeORM Exception Filter
106
+
107
+ When you want to convert low-level database errors into meaningful HTTP responses, a TypeORM exception filter helps keep that logic out of controllers and services. You can register it once and optionally override specific constraints with your own domain-friendly messages.
108
+
109
+ ```typescript
110
+ // app.module.ts
111
+ import { Module } from '@nestjs/common';
112
+ import { APP_FILTER } from '@nestjs/core';
113
+ import { ConflictException } from '@nestjs/common';
114
+ import { TypeOrmExceptionFilter } from '@russ-b/nestjs-common-tools/typeorm';
115
+
116
+ const USER_EMAIL_UNIQUE_INDEX = 'users_email_key';
117
+
118
+ @Module({
119
+ providers: [
120
+ {
121
+ provide: APP_FILTER,
122
+ useFactory: () =>
123
+ new TypeOrmExceptionFilter({
124
+ constraints: {
125
+ [USER_EMAIL_UNIQUE_INDEX]: () =>
126
+ new ConflictException('A user with this email already exists'),
127
+ },
128
+ }),
129
+ },
130
+ ],
131
+ })
132
+ export class AppModule {}
133
+ ```
134
+
135
+ By default, the filter already maps common TypeORM database errors such as unique constraint violations, foreign key violations, and invalid input format to NestJS HTTP exceptions. Custom constraint handlers let you keep those responses specific to your business rules.
136
+
137
+ ## isTypeOrmQueryFailedError
138
+
139
+ Sometimes a global filter is not enough and you want to react differently to one exact database error inside a service. `isTypeOrmQueryFailedError` is useful for that kind of targeted branching without scattering manual `instanceof QueryFailedError` checks and driver casts around the codebase.
140
+
141
+ ```typescript
142
+ import { ConflictException, Injectable } from '@nestjs/common';
143
+ import { isTypeOrmQueryFailedError } from '@russ-b/nestjs-common-tools/typeorm';
144
+
145
+ const OPEN_TICKET_PER_CAR_INDEX = 'open_ticket_per_car_index';
146
+
147
+ @Injectable()
148
+ export class TicketsService {
149
+ async createTicket(payload: CreateTicketDto) {
150
+ try {
151
+ return await this.ticketRepository.save(payload);
152
+ } catch (error) {
153
+ if (
154
+ isTypeOrmQueryFailedError(error, {
155
+ code: '23505',
156
+ constraint: OPEN_TICKET_PER_CAR_INDEX,
157
+ })
158
+ ) {
159
+ throw new ConflictException('This car already has an open ticket');
160
+ }
161
+
162
+ throw error;
163
+ }
164
+ }
165
+ }
166
+ ```
167
+
168
+ The helper can also be used as a plain type guard or with multiple matching fields such as `code`, `constraint`, `table`, or `column`. That makes it a good fit for small pieces of domain-specific error handling where a generic global mapping would be too broad.
@@ -1 +1 @@
1
- export * from './typeorm-exception.filter';
1
+ export * from '../../typeorm/filters';
@@ -14,5 +14,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./typeorm-exception.filter"), exports);
17
+ __exportStar(require("../../typeorm/filters"), exports);
18
18
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/filters/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6DAA2C"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/common/filters/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAsC"}
@@ -0,0 +1 @@
1
+ export * from './query-failed-error.util';
@@ -14,5 +14,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./base-client-grpc.proxy"), exports);
17
+ __exportStar(require("./query-failed-error.util"), exports);
18
18
  //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/typeorm/errors/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4DAA0C"}
@@ -0,0 +1,9 @@
1
+ import { QueryFailedError } from 'typeorm';
2
+ import { DriverError } from '../types';
3
+ type MatchValue<T> = T | readonly T[];
4
+ export type QueryFailedErrorCriteria = {
5
+ [K in keyof DriverError]?: MatchValue<NonNullable<DriverError[K]>>;
6
+ };
7
+ export type TypeOrmQueryFailedError = QueryFailedError<Error & DriverError> & Partial<DriverError>;
8
+ export declare function isTypeOrmQueryFailedError(error: unknown, criteria?: QueryFailedErrorCriteria): error is TypeOrmQueryFailedError;
9
+ export {};
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isTypeOrmQueryFailedError = isTypeOrmQueryFailedError;
4
+ const typeorm_1 = require("typeorm");
5
+ function isTypeOrmQueryFailedError(error, criteria) {
6
+ if (!(error instanceof typeorm_1.QueryFailedError)) {
7
+ return false;
8
+ }
9
+ if (!criteria) {
10
+ return true;
11
+ }
12
+ return Object.keys(criteria).every((key) => {
13
+ const expected = criteria[key];
14
+ if (expected === undefined) {
15
+ return true;
16
+ }
17
+ const actual = getDriverErrorValue(error, key);
18
+ const acceptedValues = Array.isArray(expected) ? expected : [expected];
19
+ return acceptedValues.some((value) => value === actual);
20
+ });
21
+ }
22
+ function getDriverErrorValue(error, key) {
23
+ const driverError = error.driverError;
24
+ const queryFailedError = error;
25
+ return driverError[key] ?? queryFailedError[key];
26
+ }
27
+ //# sourceMappingURL=query-failed-error.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-failed-error.util.js","sourceRoot":"","sources":["../../../src/typeorm/errors/query-failed-error.util.ts"],"names":[],"mappings":";;AAYA,8DAwBC;AApCD,qCAA2C;AAY3C,SAAgB,yBAAyB,CACvC,KAAc,EACd,QAAmC;IAEnC,IAAI,CAAC,CAAC,KAAK,YAAY,0BAAgB,CAAC,EAAE,CAAC;QACzC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAQ,MAAM,CAAC,IAAI,CAAC,QAAQ,CAA8B,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACvE,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;QAE/B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC/C,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAEvE,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAC1B,KAA8B,EAC9B,GAAM;IAEN,MAAM,WAAW,GAAG,KAAK,CAAC,WAAmC,CAAC;IAC9D,MAAM,gBAAgB,GAAG,KAA6B,CAAC;IAEvD,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { ArgumentsHost, ExceptionFilter } from '@nestjs/common';
2
+ import { EntityNotFoundError } from 'typeorm';
3
+ export declare class EntityNotFoundFilter implements ExceptionFilter {
4
+ catch(exception: EntityNotFoundError, host: ArgumentsHost): never;
5
+ }
@@ -6,18 +6,19 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
6
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
7
  };
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.GrpcModule = void 0;
9
+ exports.EntityNotFoundFilter = void 0;
10
10
  const common_1 = require("@nestjs/common");
11
- const package_definition_1 = require("./services/package-definition");
12
- const interceptors_1 = require("./interceptors");
13
- const providers_1 = require("./providers");
14
- let GrpcModule = class GrpcModule {
11
+ const typeorm_1 = require("typeorm");
12
+ let EntityNotFoundFilter = class EntityNotFoundFilter {
13
+ catch(exception, host) {
14
+ if (host.getType() !== 'http') {
15
+ throw exception;
16
+ }
17
+ throw new common_1.NotFoundException('Entity not found');
18
+ }
15
19
  };
16
- exports.GrpcModule = GrpcModule;
17
- exports.GrpcModule = GrpcModule = __decorate([
18
- (0, common_1.Module)({
19
- providers: [package_definition_1.PackageDefinitionService, interceptors_1.StructInterceptor, providers_1.GrpcOptionsProvider],
20
- exports: [package_definition_1.PackageDefinitionService, interceptors_1.StructInterceptor, providers_1.GrpcOptionsProvider],
21
- })
22
- ], GrpcModule);
23
- //# sourceMappingURL=grpc.module.js.map
20
+ exports.EntityNotFoundFilter = EntityNotFoundFilter;
21
+ exports.EntityNotFoundFilter = EntityNotFoundFilter = __decorate([
22
+ (0, common_1.Catch)(typeorm_1.EntityNotFoundError)
23
+ ], EntityNotFoundFilter);
24
+ //# sourceMappingURL=entity-not-found.filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entity-not-found.filter.js","sourceRoot":"","sources":["../../../src/typeorm/filters/entity-not-found.filter.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAKwB;AACxB,qCAA8C;AAGvC,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAC/B,KAAK,CAAC,SAA8B,EAAE,IAAmB;QACvD,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;YAC9B,MAAM,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,IAAI,0BAAiB,CAAC,kBAAkB,CAAC,CAAC;IAClD,CAAC;CACF,CAAA;AARY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,cAAK,EAAC,6BAAmB,CAAC;GACd,oBAAoB,CAQhC"}
@@ -1 +1,2 @@
1
+ export * from './entity-not-found.filter';
1
2
  export * from './typeorm-exception.filter';
@@ -14,5 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./entity-not-found.filter"), exports);
17
18
  __exportStar(require("./typeorm-exception.filter"), exports);
18
19
  //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/typeorm/filters/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4DAA0C;AAC1C,6DAA2C"}
@@ -0,0 +1,13 @@
1
+ import { ArgumentsHost, ExceptionFilter, HttpException } from '@nestjs/common';
2
+ import { QueryFailedError } from 'typeorm';
3
+ import { DriverError } from '../types';
4
+ type ConstraintHandler = (error: DriverError) => HttpException;
5
+ interface TypeOrmExceptionFilterOptions {
6
+ constraints?: Record<string, ConstraintHandler>;
7
+ }
8
+ export declare class TypeOrmExceptionFilter implements ExceptionFilter {
9
+ private readonly options;
10
+ constructor(options?: TypeOrmExceptionFilterOptions);
11
+ catch(exception: QueryFailedError, host: ArgumentsHost): never;
12
+ }
13
+ export {};
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.TypeOrmExceptionFilter = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const typeorm_1 = require("typeorm");
15
+ let TypeOrmExceptionFilter = class TypeOrmExceptionFilter {
16
+ constructor(options = {}) {
17
+ this.options = options;
18
+ }
19
+ catch(exception, host) {
20
+ if (host.getType() !== 'http') {
21
+ throw exception;
22
+ }
23
+ const error = exception.driverError;
24
+ const constraint = error.constraint;
25
+ if (constraint && this.options.constraints?.[constraint]) {
26
+ throw this.options.constraints[constraint](error);
27
+ }
28
+ const code = String(error.code ?? error.errno ?? '');
29
+ switch (code) {
30
+ case '1062':
31
+ case '23505':
32
+ throw new common_1.ConflictException('Unique constraint violation');
33
+ case '1451':
34
+ case '1452':
35
+ case '23503':
36
+ throw new common_1.BadRequestException('Foreign key constraint violation');
37
+ case '23502':
38
+ throw new common_1.BadRequestException('Required field is missing');
39
+ case '23514':
40
+ throw new common_1.BadRequestException('Check constraint violation');
41
+ case '22P02':
42
+ throw new common_1.BadRequestException('Invalid input format');
43
+ default:
44
+ throw exception;
45
+ }
46
+ }
47
+ };
48
+ exports.TypeOrmExceptionFilter = TypeOrmExceptionFilter;
49
+ exports.TypeOrmExceptionFilter = TypeOrmExceptionFilter = __decorate([
50
+ (0, common_1.Catch)(typeorm_1.QueryFailedError),
51
+ __metadata("design:paramtypes", [Object])
52
+ ], TypeOrmExceptionFilter);
53
+ //# sourceMappingURL=typeorm-exception.filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeorm-exception.filter.js","sourceRoot":"","sources":["../../../src/typeorm/filters/typeorm-exception.filter.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAOwB;AACxB,qCAA2C;AAUpC,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IACjC,YAA6B,UAAyC,EAAE;QAA3C,YAAO,GAAP,OAAO,CAAoC;IAAG,CAAC;IAE5E,KAAK,CAAC,SAA2B,EAAE,IAAmB;QACpD,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;YAC9B,MAAM,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,KAAK,GAAG,SAAS,CAAC,WAA0B,CAAC;QACnD,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;QAEpC,IAAI,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAErD,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,MAAM,CAAC;YACZ,KAAK,OAAO;gBACV,MAAM,IAAI,0BAAiB,CAAC,6BAA6B,CAAC,CAAC;YAC7D,KAAK,MAAM,CAAC;YACZ,KAAK,MAAM,CAAC;YACZ,KAAK,OAAO;gBACV,MAAM,IAAI,4BAAmB,CAAC,kCAAkC,CAAC,CAAC;YACpE,KAAK,OAAO;gBACV,MAAM,IAAI,4BAAmB,CAAC,2BAA2B,CAAC,CAAC;YAC7D,KAAK,OAAO;gBACV,MAAM,IAAI,4BAAmB,CAAC,4BAA4B,CAAC,CAAC;YAC9D,KAAK,OAAO;gBACV,MAAM,IAAI,4BAAmB,CAAC,sBAAsB,CAAC,CAAC;YACxD;gBACE,MAAM,SAAS,CAAC;QACpB,CAAC;IACH,CAAC;CACF,CAAA;AAnCY,wDAAsB;iCAAtB,sBAAsB;IADlC,IAAA,cAAK,EAAC,0BAAgB,CAAC;;GACX,sBAAsB,CAmClC"}
@@ -1 +1,4 @@
1
+ export * from './filters';
2
+ export * from './errors';
1
3
  export * from './transformers';
4
+ export * from './types';
@@ -14,5 +14,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./filters"), exports);
18
+ __exportStar(require("./errors"), exports);
17
19
  __exportStar(require("./transformers"), exports);
20
+ __exportStar(require("./types"), exports);
18
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/typeorm/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/typeorm/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAA0B;AAC1B,2CAAyB;AACzB,iDAA+B;AAC/B,0CAAwB"}
@@ -0,0 +1,8 @@
1
+ export type DriverError = {
2
+ code?: string | number;
3
+ errno?: number;
4
+ constraint?: string;
5
+ detail?: string;
6
+ table?: string;
7
+ column?: string;
8
+ };
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=s3.interface.js.map
3
+ //# sourceMappingURL=driver-error.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"driver-error.type.js","sourceRoot":"","sources":["../../../src/typeorm/types/driver-error.type.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ export * from './driver-error.type';
@@ -14,5 +14,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./struct.interceptor"), exports);
17
+ __exportStar(require("./driver-error.type"), exports);
18
18
  //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/typeorm/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC"}
package/package.json CHANGED
@@ -1,19 +1,19 @@
1
1
  {
2
2
  "name": "@russ-b/nestjs-common-tools",
3
- "version": "1.11.1",
3
+ "version": "1.13.0",
4
4
  "description": "NestJS utility tools",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "files": [
8
- "dist"
8
+ "dist",
9
+ "README.md"
9
10
  ],
10
11
  "scripts": {
11
- "build": "npx tsc",
12
+ "build": "node -e \"const fs = require('fs'); fs.rmSync('dist', { recursive: true, force: true }); fs.rmSync('tsconfig.tsbuildinfo', { force: true });\" && tsc",
12
13
  "test": "jest",
13
14
  "prepare": "npm run build",
14
15
  "lint": "eslint \"{src,apps,libs,test}/**/*.ts\"",
15
- "format": "prettier --write \"src/**/*.ts\"",
16
- "publish": "npm publish --access public"
16
+ "format": "prettier --write \"src/**/*.ts\""
17
17
  },
18
18
  "keywords": [
19
19
  "nestjs",
@@ -27,40 +27,43 @@
27
27
  "type": "git",
28
28
  "url": "git+https://github.com/RuSS-B/nestjs-common-tools.git"
29
29
  },
30
- "exports": {
31
- ".": "./dist/index.js",
32
- "./common/util": "./dist/common/util/index.js",
33
- "./common/pagination": "./dist/common/pagination/index.js",
34
- "./common/filters": "./dist/common/filters/index.js",
35
- "./validators": "./dist/validators/index.js",
36
- "./typeorm": "./dist/typeorm/index.js",
37
- "./modules": "./dist/modules/index.js",
38
- "./logger": "./dist/logger/index.js"
30
+ "publishConfig": {
31
+ "access": "public"
39
32
  },
40
- "typesVersions": {
41
- "*": {
42
- "validators": [
43
- "dist/validators/index.d.ts"
44
- ],
45
- "typeorm": [
46
- "dist/typeorm/index.d.ts"
47
- ],
48
- "common/util": [
49
- "dist/common/util/index.d.ts"
50
- ],
51
- "common/pagination": [
52
- "dist/common/pagination/index.d.ts"
53
- ],
54
- "common/filters": [
55
- "dist/common/filters/index.d.ts"
56
- ],
57
- "modules": [
58
- "dist/modules/index.d.ts"
59
- ],
60
- "logger": [
61
- "dist/logger/index.d.ts"
62
- ]
63
- }
33
+ "exports": {
34
+ ".": {
35
+ "types": "./dist/index.d.ts",
36
+ "default": "./dist/index.js"
37
+ },
38
+ "./common/util": {
39
+ "types": "./dist/common/util/index.d.ts",
40
+ "default": "./dist/common/util/index.js"
41
+ },
42
+ "./common/pagination": {
43
+ "types": "./dist/common/pagination/index.d.ts",
44
+ "default": "./dist/common/pagination/index.js"
45
+ },
46
+ "./common/filters": {
47
+ "types": "./dist/common/filters/index.d.ts",
48
+ "default": "./dist/common/filters/index.js"
49
+ },
50
+ "./validators": {
51
+ "types": "./dist/validators/index.d.ts",
52
+ "default": "./dist/validators/index.js"
53
+ },
54
+ "./typeorm": {
55
+ "types": "./dist/typeorm/index.d.ts",
56
+ "default": "./dist/typeorm/index.js"
57
+ },
58
+ "./modules": {
59
+ "types": "./dist/modules/index.d.ts",
60
+ "default": "./dist/modules/index.js"
61
+ },
62
+ "./logger": {
63
+ "types": "./dist/logger/index.d.ts",
64
+ "default": "./dist/logger/index.js"
65
+ },
66
+ "./package.json": "./package.json"
64
67
  },
65
68
  "dependencies": {
66
69
  "class-transformer": "^0.5.1",
@@ -74,7 +77,6 @@
74
77
  "@nestjs/common": "^10.0.0 || ^11.0.0",
75
78
  "@nestjs/config": "^3.0.0 || ^4.0.0",
76
79
  "nest-winston": "^1.10.2",
77
- "protobufjs": "^7.4.0",
78
80
  "typeorm": "^0.3.20",
79
81
  "winston": "^3.17.0",
80
82
  "winston-transport": "^4.9.0"
@@ -91,7 +93,6 @@
91
93
  "jest": "^29.7.0",
92
94
  "prettier": "^3.4.2",
93
95
  "ts-jest": "^29.2.5",
94
- "ts-proto": "^2.6.1",
95
96
  "tsconfig-paths": "^4.2.0",
96
97
  "typescript": "^5.7.3",
97
98
  "typescript-eslint": "^8.20.0"
@@ -1,6 +0,0 @@
1
- import { ExceptionFilter, ArgumentsHost } from '@nestjs/common';
2
- import { QueryFailedError } from 'typeorm';
3
- export declare class TypeOrmExceptionFilter implements ExceptionFilter {
4
- catch(exception: QueryFailedError, host: ArgumentsHost): void;
5
- private throwHttpError;
6
- }
@@ -1,36 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- 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;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- Object.defineProperty(exports, "__esModule", { value: true });
9
- exports.TypeOrmExceptionFilter = void 0;
10
- const common_1 = require("@nestjs/common");
11
- const typeorm_1 = require("typeorm");
12
- let TypeOrmExceptionFilter = class TypeOrmExceptionFilter {
13
- catch(exception, host) {
14
- if (host.getType() !== 'http') {
15
- return;
16
- }
17
- const errno = exception.errno || +exception.code;
18
- this.throwHttpError(errno);
19
- }
20
- throwHttpError(code) {
21
- switch (code) {
22
- case 1062:
23
- case 23505:
24
- throw new common_1.ConflictException('A record with these unique constraint(s) already exists');
25
- case 1451:
26
- throw new common_1.BadRequestException('Cannot delete or update a parent row: a foreign key constraint fails');
27
- case 1452:
28
- throw new common_1.BadRequestException('Cannot add or update a child row: a foreign key constraint fails');
29
- }
30
- }
31
- };
32
- exports.TypeOrmExceptionFilter = TypeOrmExceptionFilter;
33
- exports.TypeOrmExceptionFilter = TypeOrmExceptionFilter = __decorate([
34
- (0, common_1.Catch)(typeorm_1.QueryFailedError)
35
- ], TypeOrmExceptionFilter);
36
- //# sourceMappingURL=typeorm-exception.filter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"typeorm-exception.filter.js","sourceRoot":"","sources":["../../../src/common/filters/typeorm-exception.filter.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAMwB;AACxB,qCAA2C;AAGpC,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IACjC,KAAK,CAAC,SAA2B,EAAE,IAAmB;QACpD,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAY,SAAiB,CAAC,KAAK,IAAI,CAAE,SAAiB,CAAC,IAAI,CAAC;QAE3E,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAEO,cAAc,CAAC,IAAY;QACjC,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,IAAI,CAAC;YACV,KAAK,KAAK;gBACR,MAAM,IAAI,0BAAiB,CACzB,yDAAyD,CAC1D,CAAC;YACJ,KAAK,IAAI;gBACP,MAAM,IAAI,4BAAmB,CAC3B,sEAAsE,CACvE,CAAC;YACJ,KAAK,IAAI;gBACP,MAAM,IAAI,4BAAmB,CAC3B,kEAAkE,CACnE,CAAC;QACN,CAAC;IACH,CAAC;CACF,CAAA;AA5BY,wDAAsB;iCAAtB,sBAAsB;IADlC,IAAA,cAAK,EAAC,0BAAgB,CAAC;GACX,sBAAsB,CA4BlC"}
@@ -1,34 +0,0 @@
1
- import { DescriptorProto, FieldDescriptorProto } from 'ts-proto/build/protos';
2
- export interface IGrpcMethod {
3
- requestType: {
4
- type: DescriptorProto;
5
- };
6
- responseType: {
7
- type: DescriptorProto;
8
- };
9
- }
10
- export interface IMethodDescriptor {
11
- request: FieldDescriptorProto[];
12
- response: FieldDescriptorProto[];
13
- }
14
- interface IStruct {
15
- fields?: {
16
- [k: string]: IValue;
17
- };
18
- }
19
- interface IListValue {
20
- values?: IValue[];
21
- }
22
- export interface IValue {
23
- kind?: string;
24
- nullValue?: 0;
25
- numberValue?: number;
26
- stringValue?: string;
27
- boolValue?: boolean;
28
- structValue?: IStruct;
29
- listValue?: IListValue;
30
- }
31
- export interface StructObject {
32
- [key: string]: any;
33
- }
34
- export {};
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=client-grpc.interface.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"client-grpc.interface.js","sourceRoot":"","sources":["../../src/grpc/client-grpc.interface.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/grpc/filters/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6DAA2C"}
@@ -1,6 +0,0 @@
1
- import { ArgumentsHost, ExceptionFilter } from '@nestjs/common';
2
- import { RpcException } from '@nestjs/microservices';
3
- export declare class RpcExceptionFilter implements ExceptionFilter {
4
- private logger;
5
- catch(exception: RpcException, host: ArgumentsHost): void;
6
- }