@elsikora/nestjs-crud-automator 1.18.0-dev.1 → 1.19.0-dev.1
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/dist/cjs/class/index.d.ts +1 -0
- package/dist/cjs/class/utility/dto/exception/details/foreign-key-violation.class.d.ts +11 -0
- package/dist/cjs/class/utility/dto/exception/details/foreign-key-violation.class.js +142 -0
- package/dist/cjs/class/utility/dto/exception/details/foreign-key-violation.class.js.map +1 -0
- package/dist/cjs/class/utility/dto/exception/details/index.d.ts +2 -0
- package/dist/cjs/class/utility/dto/exception/details/unique-violation.class.d.ts +9 -0
- package/dist/cjs/class/utility/dto/exception/details/unique-violation.class.js +114 -0
- package/dist/cjs/class/utility/dto/exception/details/unique-violation.class.js.map +1 -0
- package/dist/cjs/class/utility/dto/exception/index.d.ts +1 -0
- package/dist/cjs/decorator/api/function/create.decorator.js +28 -2
- package/dist/cjs/decorator/api/function/create.decorator.js.map +1 -1
- package/dist/cjs/decorator/api/function/delete.decorator.js +20 -2
- package/dist/cjs/decorator/api/function/delete.decorator.js.map +1 -1
- package/dist/cjs/decorator/api/function/get-list.decorator.js +11 -2
- package/dist/cjs/decorator/api/function/get-list.decorator.js.map +1 -1
- package/dist/cjs/decorator/api/function/get-many.decorator.js +11 -2
- package/dist/cjs/decorator/api/function/get-many.decorator.js.map +1 -1
- package/dist/cjs/decorator/api/function/get.decorator.js +11 -2
- package/dist/cjs/decorator/api/function/get.decorator.js.map +1 -1
- package/dist/cjs/decorator/api/function/update.decorator.js +28 -2
- package/dist/cjs/decorator/api/function/update.decorator.js.map +1 -1
- package/dist/cjs/decorator/api/method.decorator.js +6 -0
- package/dist/cjs/decorator/api/method.decorator.js.map +1 -1
- package/dist/cjs/decorator/api/service.decorator.js +2 -0
- package/dist/cjs/decorator/api/service.decorator.js.map +1 -1
- package/dist/cjs/enum/utility/exception-details/index.d.ts +1 -0
- package/dist/cjs/enum/utility/exception-details/type.enum.d.ts +4 -0
- package/dist/cjs/enum/utility/exception-details/type.enum.js +8 -0
- package/dist/cjs/enum/utility/exception-details/type.enum.js.map +1 -0
- package/dist/cjs/factory/api/controller.factory.js +4 -8
- package/dist/cjs/factory/api/controller.factory.js.map +1 -1
- package/dist/cjs/index.js +18 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/interceptor/correlation-id-response-body.interceptor.js +42 -10
- package/dist/cjs/interceptor/correlation-id-response-body.interceptor.js.map +1 -1
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/utility/api/controller/apply-decorators.utility.js +3 -3
- package/dist/cjs/utility/api/controller/apply-decorators.utility.js.map +1 -1
- package/dist/cjs/utility/api/controller/apply-metadata.utility.js +4 -1
- package/dist/cjs/utility/api/controller/apply-metadata.utility.js.map +1 -1
- package/dist/cjs/utility/api/controller/get-list/transform-filter.utility.js +1 -1
- package/dist/cjs/utility/api/controller/get-list/transform-filter.utility.js.map +1 -1
- package/dist/cjs/utility/api/controller/write-dto-swagger.utility.js +4 -1
- package/dist/cjs/utility/api/controller/write-dto-swagger.utility.js.map +1 -1
- package/dist/cjs/utility/api/filter-order-by-from-entity.utility.js +1 -1
- package/dist/cjs/utility/api/filter-order-by-from-entity.utility.js.map +1 -1
- package/dist/cjs/utility/database/index.d.ts +1 -0
- package/dist/cjs/utility/database/typeorm/get/foreign-key-violation-details.utility.d.ts +16 -0
- package/dist/cjs/utility/database/typeorm/get/foreign-key-violation-details.utility.js +105 -0
- package/dist/cjs/utility/database/typeorm/get/foreign-key-violation-details.utility.js.map +1 -0
- package/dist/cjs/utility/database/typeorm/get/index.d.ts +2 -0
- package/dist/cjs/utility/database/typeorm/get/unique-violation-details.utility.d.ts +14 -0
- package/dist/cjs/utility/database/typeorm/get/unique-violation-details.utility.js +90 -0
- package/dist/cjs/utility/database/typeorm/get/unique-violation-details.utility.js.map +1 -0
- package/dist/cjs/utility/database/typeorm/index.d.ts +6 -0
- package/dist/cjs/utility/database/typeorm/is/entity/index.d.ts +2 -0
- package/dist/cjs/utility/database/typeorm/is/entity/metadata-not-found.utility.d.ts +7 -0
- package/dist/cjs/utility/database/typeorm/is/entity/metadata-not-found.utility.js +27 -0
- package/dist/cjs/utility/database/typeorm/is/entity/metadata-not-found.utility.js.map +1 -0
- package/dist/cjs/utility/database/typeorm/is/entity/not-found.utility.d.ts +6 -0
- package/dist/cjs/utility/database/typeorm/is/entity/not-found.utility.js +26 -0
- package/dist/cjs/utility/database/typeorm/is/entity/not-found.utility.js.map +1 -0
- package/dist/cjs/utility/database/typeorm/is/foreign-key-violation.utility.d.ts +7 -0
- package/dist/cjs/utility/database/typeorm/is/foreign-key-violation.utility.js +91 -0
- package/dist/cjs/utility/database/typeorm/is/foreign-key-violation.utility.js.map +1 -0
- package/dist/cjs/utility/database/typeorm/is/index.d.ts +3 -0
- package/dist/cjs/utility/database/typeorm/is/unique-violation.utility.d.ts +7 -0
- package/dist/cjs/utility/database/typeorm/is/unique-violation.utility.js +81 -0
- package/dist/cjs/utility/database/typeorm/is/unique-violation.utility.js.map +1 -0
- package/dist/cjs/utility/dto/generate-exception.utility.js +33 -10
- package/dist/cjs/utility/dto/generate-exception.utility.js.map +1 -1
- package/dist/cjs/utility/format-unknown-for-log.utility.d.ts +6 -0
- package/dist/cjs/utility/format-unknown-for-log.utility.js +31 -0
- package/dist/cjs/utility/format-unknown-for-log.utility.js.map +1 -0
- package/dist/cjs/utility/index.d.ts +2 -0
- package/dist/cjs/utility/logger.utility.js +1 -1
- package/dist/cjs/utility/logger.utility.js.map +1 -1
- package/dist/esm/class/index.d.ts +1 -0
- package/dist/esm/class/utility/dto/exception/details/foreign-key-violation.class.d.ts +11 -0
- package/dist/esm/class/utility/dto/exception/details/foreign-key-violation.class.js +140 -0
- package/dist/esm/class/utility/dto/exception/details/foreign-key-violation.class.js.map +1 -0
- package/dist/esm/class/utility/dto/exception/details/index.d.ts +2 -0
- package/dist/esm/class/utility/dto/exception/details/unique-violation.class.d.ts +9 -0
- package/dist/esm/class/utility/dto/exception/details/unique-violation.class.js +112 -0
- package/dist/esm/class/utility/dto/exception/details/unique-violation.class.js.map +1 -0
- package/dist/esm/class/utility/dto/exception/index.d.ts +1 -0
- package/dist/esm/decorator/api/function/create.decorator.js +29 -3
- package/dist/esm/decorator/api/function/create.decorator.js.map +1 -1
- package/dist/esm/decorator/api/function/delete.decorator.js +21 -3
- package/dist/esm/decorator/api/function/delete.decorator.js.map +1 -1
- package/dist/esm/decorator/api/function/get-list.decorator.js +12 -3
- package/dist/esm/decorator/api/function/get-list.decorator.js.map +1 -1
- package/dist/esm/decorator/api/function/get-many.decorator.js +12 -3
- package/dist/esm/decorator/api/function/get-many.decorator.js.map +1 -1
- package/dist/esm/decorator/api/function/get.decorator.js +12 -3
- package/dist/esm/decorator/api/function/get.decorator.js.map +1 -1
- package/dist/esm/decorator/api/function/update.decorator.js +29 -3
- package/dist/esm/decorator/api/function/update.decorator.js.map +1 -1
- package/dist/esm/decorator/api/method.decorator.js +7 -1
- package/dist/esm/decorator/api/method.decorator.js.map +1 -1
- package/dist/esm/decorator/api/property/boolean.decorator.js +1 -1
- package/dist/esm/decorator/api/property/date.decorator.js +1 -1
- package/dist/esm/decorator/api/property/number.decorator.js +2 -2
- package/dist/esm/decorator/api/property/object.decorator.js +1 -1
- package/dist/esm/decorator/api/property/uuid.decorator.js +1 -1
- package/dist/esm/decorator/api/service.decorator.js +2 -0
- package/dist/esm/decorator/api/service.decorator.js.map +1 -1
- package/dist/esm/enum/utility/exception-details/index.d.ts +1 -0
- package/dist/esm/enum/utility/exception-details/type.enum.d.ts +4 -0
- package/dist/esm/enum/utility/exception-details/type.enum.js +8 -0
- package/dist/esm/enum/utility/exception-details/type.enum.js.map +1 -0
- package/dist/esm/factory/api/controller.factory.js +4 -8
- package/dist/esm/factory/api/controller.factory.js.map +1 -1
- package/dist/esm/index.js +9 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/interceptor/correlation-id-response-body.interceptor.js +42 -10
- package/dist/esm/interceptor/correlation-id-response-body.interceptor.js.map +1 -1
- package/dist/esm/package.json +1 -1
- package/dist/esm/utility/api/controller/apply-decorators.utility.js +3 -3
- package/dist/esm/utility/api/controller/apply-decorators.utility.js.map +1 -1
- package/dist/esm/utility/api/controller/apply-metadata.utility.js +4 -1
- package/dist/esm/utility/api/controller/apply-metadata.utility.js.map +1 -1
- package/dist/esm/utility/api/controller/get-list/transform-filter.utility.js +1 -1
- package/dist/esm/utility/api/controller/get-list/transform-filter.utility.js.map +1 -1
- package/dist/esm/utility/api/controller/write-dto-swagger.utility.js +4 -1
- package/dist/esm/utility/api/controller/write-dto-swagger.utility.js.map +1 -1
- package/dist/esm/utility/api/filter-order-by-from-entity.utility.js +1 -1
- package/dist/esm/utility/api/filter-order-by-from-entity.utility.js.map +1 -1
- package/dist/esm/utility/database/index.d.ts +1 -0
- package/dist/esm/utility/database/typeorm/get/foreign-key-violation-details.utility.d.ts +16 -0
- package/dist/esm/utility/database/typeorm/get/foreign-key-violation-details.utility.js +103 -0
- package/dist/esm/utility/database/typeorm/get/foreign-key-violation-details.utility.js.map +1 -0
- package/dist/esm/utility/database/typeorm/get/index.d.ts +2 -0
- package/dist/esm/utility/database/typeorm/get/unique-violation-details.utility.d.ts +14 -0
- package/dist/esm/utility/database/typeorm/get/unique-violation-details.utility.js +88 -0
- package/dist/esm/utility/database/typeorm/get/unique-violation-details.utility.js.map +1 -0
- package/dist/esm/utility/database/typeorm/index.d.ts +6 -0
- package/dist/esm/utility/database/typeorm/is/entity/index.d.ts +2 -0
- package/dist/esm/utility/database/typeorm/is/entity/metadata-not-found.utility.d.ts +7 -0
- package/dist/esm/utility/database/typeorm/is/entity/metadata-not-found.utility.js +25 -0
- package/dist/esm/utility/database/typeorm/is/entity/metadata-not-found.utility.js.map +1 -0
- package/dist/esm/utility/database/typeorm/is/entity/not-found.utility.d.ts +6 -0
- package/dist/esm/utility/database/typeorm/is/entity/not-found.utility.js +24 -0
- package/dist/esm/utility/database/typeorm/is/entity/not-found.utility.js.map +1 -0
- package/dist/esm/utility/database/typeorm/is/foreign-key-violation.utility.d.ts +7 -0
- package/dist/esm/utility/database/typeorm/is/foreign-key-violation.utility.js +89 -0
- package/dist/esm/utility/database/typeorm/is/foreign-key-violation.utility.js.map +1 -0
- package/dist/esm/utility/database/typeorm/is/index.d.ts +3 -0
- package/dist/esm/utility/database/typeorm/is/unique-violation.utility.d.ts +7 -0
- package/dist/esm/utility/database/typeorm/is/unique-violation.utility.js +79 -0
- package/dist/esm/utility/database/typeorm/is/unique-violation.utility.js.map +1 -0
- package/dist/esm/utility/dto/generate-exception.utility.js +33 -10
- package/dist/esm/utility/dto/generate-exception.utility.js.map +1 -1
- package/dist/esm/utility/format-unknown-for-log.utility.d.ts +6 -0
- package/dist/esm/utility/format-unknown-for-log.utility.js +29 -0
- package/dist/esm/utility/format-unknown-for-log.utility.js.map +1 -0
- package/dist/esm/utility/index.d.ts +2 -0
- package/dist/esm/utility/logger.utility.js +1 -1
- package/dist/esm/utility/logger.utility.js.map +1 -1
- package/package.json +24 -24
|
@@ -20,15 +20,18 @@ import { CamelCaseString } from '../../camel-case-string.utility.js';
|
|
|
20
20
|
import '../../../constant/utility/dto/constant.js';
|
|
21
21
|
import '@nestjs/swagger';
|
|
22
22
|
import '../../../external/tslib/tslib.es6.js';
|
|
23
|
+
import '../../../class/utility/dto/exception/details/foreign-key-violation.class.js';
|
|
24
|
+
import '../../../class/utility/dto/exception/details/unique-violation.class.js';
|
|
23
25
|
import '@nestjs/common';
|
|
24
26
|
import 'class-transformer';
|
|
25
27
|
import 'class-validator';
|
|
26
28
|
import 'lodash/random';
|
|
29
|
+
import '../../../validator/must-match-one-of-schemas.validator.js';
|
|
27
30
|
import '../../../constant/interface/api/property/default-string-format.constant.js';
|
|
28
31
|
import '../../../validator/is-regular-expression.validator.js';
|
|
29
32
|
import 'node:crypto';
|
|
33
|
+
import '../../../enum/utility/exception-details/type.enum.js';
|
|
30
34
|
import '../../../enum/filter-operation.enum.js';
|
|
31
|
-
import '../../../validator/must-match-one-of-schemas.validator.js';
|
|
32
35
|
import { DtoGenerate } from '../../dto/generate.utility.js';
|
|
33
36
|
import '../../../enum/filter-order-direction.enum.js';
|
|
34
37
|
import 'typeorm';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-dto-swagger.utility.js","sources":["../../../../../../src/utility/api/controller/write-dto-swagger.utility.ts"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"write-dto-swagger.utility.js","sources":["../../../../../../src/utility/api/controller/write-dto-swagger.utility.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA;;;;;;;;;;;;AAYG;AACG,SAAU,4BAA4B,CAAI,MAAc,EAAE,MAAqB,EAAE,UAAuC,EAAE,MAAqB,EAAE,WAA4D,EAAE,cAA6B,EAAA;AACjP,IAAA,MAAM,aAAa,IAAoB,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,gBAAgB,EAAE,MAAM,CAAC,IAAI,EAAE,CAAmB;AAExH,IAAA,MAAM,UAAU,GAA8B,WAAW,CAAC,GAAG,EAAE,OAAO,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC;AAC5N,IAAA,MAAM,QAAQ,GAA8B,WAAW,CAAC,GAAG,EAAE,KAAK,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC;AACpN,IAAA,MAAM,OAAO,GAA8B,WAAW,CAAC,GAAG,EAAE,IAAI,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC;AAChN,IAAA,MAAM,WAAW,GAA8B,WAAW,CAAC,GAAG,EAAE,QAAQ,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC;IAEhO,MAAM,OAAO,GAAqC,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC;AAE9F,IAAA,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE;QAC1B,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AACxC,YAAA,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;AAEvB,YAAA,MAAM,OAAO,GAAoB,eAAe,CAAC,WAAW,EAAE;AAE9D,YAAA,MAAM,QAAQ,GAA0B,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,IAAI,iBAAiB,CAAC;AAErG,YAAA,IAAI,QAAQ;gBACX,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;AACxC,oBAAA,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,wCAAwC,CAAC,YAAY,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,wCAAwC,CAAC,YAAY,CAAC,EAAE,IAAI,KAAK,wBAAwB,CAAC,QAAQ,EAAE;wBACjM,MAAM,aAAa,GAA4C,MAAM,YAAY,CAAA;AAChF,4BAAA,WAAA,GAAA;AACC,gCAAA,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE;;AAEjC,oCAAA,YAAY,EAAE,IAAI;;AAElB,oCAAA,UAAU,EAAE,IAAI;AAChB,oCAAA,KAAK,EAAE,SAAS;;AAEhB,oCAAA,QAAQ,EAAE,IAAI;AACd,iCAAA,CAAC;4BACH;yBACA;AAED,wBAAA,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE;4BAC5C,KAAK,EAAE,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA,EAAG,eAAe,CAAC,MAAM,CAAC,CAAA,EAAG,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA,EAAG,GAAG,CAAA,GAAA,CAAK;AAC9G,yBAAA,CAAC;AAEF,wBAAA,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC;oBAClC;gBACD;YAED,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,gBAAgB,EAAE,aAAa,EAAE,MAAM,CAAC;QAC3E;IACD;AACD;;;;"}
|
|
@@ -32,7 +32,7 @@ function FilterOrderByFromEntity(entity, entityMetadata, method, dtoType, fieldS
|
|
|
32
32
|
const accumulator = {};
|
|
33
33
|
for (const column of columns) {
|
|
34
34
|
const columnType = column.options?.type || Reflect.getMetadata("design:type", entity.prototype, column.propertyName);
|
|
35
|
-
const isAllowedType = (typeof columnType === "function" && (columnType === String || columnType === Number || columnType === Date)) || (FILTER_API_INTERFACE_CONSTANT.ALLOWED_ENTITY_TO_FILTER_COLUMNS.includes(columnType) &&
|
|
35
|
+
const isAllowedType = (typeof columnType === "function" && (columnType === String || columnType === Number || columnType === Date)) || (FILTER_API_INTERFACE_CONSTANT.ALLOWED_ENTITY_TO_FILTER_COLUMNS.includes(columnType) && fieldSelector?.[column.propertyName] !== false);
|
|
36
36
|
if (isAllowedType) {
|
|
37
37
|
for (const metadataColumn of entityMetadata.columns) {
|
|
38
38
|
const metadata = metadataColumn.metadata?.[PROPERTY_DESCRIBE_DECORATOR_API_CONSTANT.METADATA_KEY];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-order-by-from-entity.utility.js","sources":["../../../../../src/utility/api/filter-order-by-from-entity.utility.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;AAeA;;;;;;;;;;;;AAYG;AACG,SAAU,uBAAuB,CAAI,MAAqB,EAAE,cAA6B,EAAE,MAAqB,EAAE,OAAoB,EAAE,aAAmD,EAAA;AAChM,IAAA,MAAM,QAAQ,GAAwB,sBAAsB,EAAE;AAC9D,IAAA,MAAM,OAAO,GAA8B,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAA0B,KAAK,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC;IAE3H,IAAI,aAAa,EAAE;AAClB,QAAA,MAAM,YAAY,GAAgB,IAAI,GAAG,CAAS,OAAO,CAAC,GAAG,CAAC,CAAC,GAAuB,KAAK,GAAG,CAAC,YAAY,CAAC,CAAC;AAE7G,QAAA,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE;YAClC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AAC7B,gBAAA,MAAM,IAAI,KAAK,CAAC,UAAU,KAAK,CAAA,+BAAA,CAAiC,CAAC;YAClE;QACD;IACD;IAEA,MAAM,WAAW,GAAqC,EAAE;AAExD,IAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;QAC7B,MAAM,UAAU,GAAmB,MAAM,CAAC,OAAO,EAAE,IAAsB,IAAK,OAAO,CAAC,WAAW,CAAC,aAAa,EAAE,MAAM,CAAC,SAAmB,EAAE,MAAM,CAAC,YAAY,CAAmB;
|
|
1
|
+
{"version":3,"file":"filter-order-by-from-entity.utility.js","sources":["../../../../../src/utility/api/filter-order-by-from-entity.utility.ts"],"sourcesContent":[null],"names":[],"mappings":";;;;;;;AAeA;;;;;;;;;;;;AAYG;AACG,SAAU,uBAAuB,CAAI,MAAqB,EAAE,cAA6B,EAAE,MAAqB,EAAE,OAAoB,EAAE,aAAmD,EAAA;AAChM,IAAA,MAAM,QAAQ,GAAwB,sBAAsB,EAAE;AAC9D,IAAA,MAAM,OAAO,GAA8B,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAA0B,KAAK,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC;IAE3H,IAAI,aAAa,EAAE;AAClB,QAAA,MAAM,YAAY,GAAgB,IAAI,GAAG,CAAS,OAAO,CAAC,GAAG,CAAC,CAAC,GAAuB,KAAK,GAAG,CAAC,YAAY,CAAC,CAAC;AAE7G,QAAA,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE;YAClC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;AAC7B,gBAAA,MAAM,IAAI,KAAK,CAAC,UAAU,KAAK,CAAA,+BAAA,CAAiC,CAAC;YAClE;QACD;IACD;IAEA,MAAM,WAAW,GAAqC,EAAE;AAExD,IAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;QAC7B,MAAM,UAAU,GAAmB,MAAM,CAAC,OAAO,EAAE,IAAsB,IAAK,OAAO,CAAC,WAAW,CAAC,aAAa,EAAE,MAAM,CAAC,SAAmB,EAAE,MAAM,CAAC,YAAY,CAAmB;AAEnL,QAAA,MAAM,aAAa,GAAY,CAAC,OAAO,UAAU,KAAK,UAAU,KAAK,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,MAAM,IAAI,UAAU,KAAK,IAAI,CAAC,MAAM,6BAA6B,CAAC,gCAAgC,CAAC,QAAQ,CAAC,UAAoB,CAAC,IAAI,aAAa,GAAG,MAAM,CAAC,YAAmC,CAAC,KAAK,KAAK,CAAC;QAExT,IAAI,aAAa,EAAE;AAClB,YAAA,KAAK,MAAM,cAAc,IAAI,cAAc,CAAC,OAAO,EAAE;gBACpD,MAAM,QAAQ,GAA0H,cAAc,CAAC,QAAQ,GAAG,wCAAwC,CAAC,YAAY,CAA0H;AAEjV,gBAAA,MAAM,WAAW,GAAY,QAAQ,EAAE,UAAU,GAAG,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,kBAAkB,KAAK,KAAK;AAEpG,gBAAA,IAAI,cAAc,CAAC,IAAI,IAAI,MAAM,CAAC,YAAY,IAAI,QAAQ,IAAI,WAAW,EAAE;AAC1E,oBAAA,MAAM,cAAc,GAAW,MAAM,CAAC;;yBAEpC,KAAK,CAAC,EAAE;AACR,yBAAA,GAAG,CAAC,CAAC,IAAY,EAAE,KAAa,KAAY;AAC5C,wBAAA,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE,EAAE;4BAC5E,OAAO,GAAG,GAAG,IAAI;wBAClB;AAEA,wBAAA,OAAO,IAAI;AACZ,oBAAA,CAAC;yBACA,IAAI,CAAC,EAAE;AACP,yBAAA,WAAW,EAAE;AAEf,oBAAA,WAAW,CAAC,cAAwD,CAAC,GAAG,MAAM,CAAC,YAAY;gBAC5F;YACD;QACD;IACD;AAEA,IAAA,OAAO,WAAW;AACnB;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './typeorm/index';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts best-effort details from a TypeORM FOREIGN KEY violation (QueryFailedError).
|
|
3
|
+
* Works best with PostgreSQL (driverError.detail / driverError.constraint).
|
|
4
|
+
* @param {unknown} error - Error thrown by TypeORM
|
|
5
|
+
* @returns {{ constraint?: string; detail?: string; field?: string; referencedField?: string; referencedTable?: string; table?: string; value?: string } | undefined}
|
|
6
|
+
* Foreign key violation details, when available.
|
|
7
|
+
*/
|
|
8
|
+
export declare function DatabaseTypeOrmGetForeignKeyViolationDetails(error: unknown): {
|
|
9
|
+
constraint?: string;
|
|
10
|
+
detail?: string;
|
|
11
|
+
field?: string;
|
|
12
|
+
referencedField?: string;
|
|
13
|
+
referencedTable?: string;
|
|
14
|
+
table?: string;
|
|
15
|
+
value?: string;
|
|
16
|
+
} | undefined;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { QueryFailedError } from 'typeorm';
|
|
2
|
+
|
|
3
|
+
const REGEX_GROUP_1_INDEX = 1;
|
|
4
|
+
const REGEX_GROUP_2_INDEX = 2;
|
|
5
|
+
const REGEX_GROUP_3_INDEX = 3;
|
|
6
|
+
const MYSQL_CONSTRAINT_REGEX = /CONSTRAINT `([^`]+)`/;
|
|
7
|
+
const MYSQL_FOREIGN_KEY_REGEX = /FOREIGN KEY \(`([^`]+)`\) REFERENCES `([^`]+)` \(`([^`]+)`\)/;
|
|
8
|
+
const POSTGRES_FOREIGN_KEY_CONSTRAINT_REGEX = /foreign key constraint "([^"]+)"/;
|
|
9
|
+
const POSTGRES_ON_TABLE_REGEX = /on table "([^"]+)"/;
|
|
10
|
+
const POSTGRES_REFERENCED_REGEX = /Key \(([^)]+)\)=\(([^)]+)\) is still referenced from table "([^"]+)"/;
|
|
11
|
+
const POSTGRES_REFERENCED_ROW_MISSING_REGEX = /Key \(([^)]+)\)=\(([^)]+)\) is not present in table "([^"]+)"/;
|
|
12
|
+
/**
|
|
13
|
+
* Extracts best-effort details from a TypeORM FOREIGN KEY violation (QueryFailedError).
|
|
14
|
+
* Works best with PostgreSQL (driverError.detail / driverError.constraint).
|
|
15
|
+
* @param {unknown} error - Error thrown by TypeORM
|
|
16
|
+
* @returns {{ constraint?: string; detail?: string; field?: string; referencedField?: string; referencedTable?: string; table?: string; value?: string } | undefined}
|
|
17
|
+
* Foreign key violation details, when available.
|
|
18
|
+
*/
|
|
19
|
+
function DatabaseTypeOrmGetForeignKeyViolationDetails(error) {
|
|
20
|
+
const isQueryFailedError = error instanceof QueryFailedError || (error != null && typeof error === "object" && error.name === "QueryFailedError");
|
|
21
|
+
if (!isQueryFailedError) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
let driverError;
|
|
25
|
+
if (error != null && typeof error === "object") {
|
|
26
|
+
const driverErrorUnknown = error.driverError;
|
|
27
|
+
if (driverErrorUnknown != null && typeof driverErrorUnknown === "object") {
|
|
28
|
+
driverError = driverErrorUnknown;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const constraintFromDriver = typeof driverError?.constraint === "string" ? driverError.constraint : undefined;
|
|
32
|
+
const detail = typeof driverError?.detail === "string" ? driverError.detail : undefined;
|
|
33
|
+
const tableFromDriver = typeof driverError?.table === "string" ? driverError.table : undefined;
|
|
34
|
+
const driverMessage = driverError?.message;
|
|
35
|
+
let message = "";
|
|
36
|
+
if (typeof driverMessage === "string") {
|
|
37
|
+
message = driverMessage;
|
|
38
|
+
}
|
|
39
|
+
else if (error instanceof Error) {
|
|
40
|
+
message = error.message;
|
|
41
|
+
}
|
|
42
|
+
else if (error != null && typeof error === "object" && "message" in error) {
|
|
43
|
+
const objectMessage = error.message;
|
|
44
|
+
if (typeof objectMessage === "string") {
|
|
45
|
+
message = objectMessage;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
let field;
|
|
49
|
+
let referencedField;
|
|
50
|
+
let referencedTable;
|
|
51
|
+
let value;
|
|
52
|
+
const detailOrMessage = detail ?? message;
|
|
53
|
+
const postgresMissingMatch = POSTGRES_REFERENCED_ROW_MISSING_REGEX.exec(detailOrMessage);
|
|
54
|
+
if (postgresMissingMatch) {
|
|
55
|
+
field = postgresMissingMatch[REGEX_GROUP_1_INDEX];
|
|
56
|
+
value = postgresMissingMatch[REGEX_GROUP_2_INDEX];
|
|
57
|
+
referencedTable = postgresMissingMatch[REGEX_GROUP_3_INDEX];
|
|
58
|
+
}
|
|
59
|
+
const postgresReferencedMatch = POSTGRES_REFERENCED_REGEX.exec(detailOrMessage);
|
|
60
|
+
if (postgresReferencedMatch) {
|
|
61
|
+
field ??= postgresReferencedMatch[REGEX_GROUP_1_INDEX];
|
|
62
|
+
value ??= postgresReferencedMatch[REGEX_GROUP_2_INDEX];
|
|
63
|
+
referencedTable ??= postgresReferencedMatch[REGEX_GROUP_3_INDEX];
|
|
64
|
+
}
|
|
65
|
+
const mysqlForeignKeyMatch = MYSQL_FOREIGN_KEY_REGEX.exec(detailOrMessage);
|
|
66
|
+
if (mysqlForeignKeyMatch) {
|
|
67
|
+
field ??= mysqlForeignKeyMatch[REGEX_GROUP_1_INDEX];
|
|
68
|
+
referencedTable ??= mysqlForeignKeyMatch[REGEX_GROUP_2_INDEX];
|
|
69
|
+
referencedField ??= mysqlForeignKeyMatch[REGEX_GROUP_3_INDEX];
|
|
70
|
+
}
|
|
71
|
+
let constraint = constraintFromDriver;
|
|
72
|
+
if (!constraint) {
|
|
73
|
+
const postgresConstraintMatch = POSTGRES_FOREIGN_KEY_CONSTRAINT_REGEX.exec(message);
|
|
74
|
+
if (postgresConstraintMatch) {
|
|
75
|
+
constraint = postgresConstraintMatch[REGEX_GROUP_1_INDEX];
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
const mysqlConstraintMatch = MYSQL_CONSTRAINT_REGEX.exec(detailOrMessage);
|
|
79
|
+
if (mysqlConstraintMatch) {
|
|
80
|
+
constraint = mysqlConstraintMatch[REGEX_GROUP_1_INDEX];
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
let table = tableFromDriver;
|
|
85
|
+
if (!table) {
|
|
86
|
+
const postgresTableMatch = POSTGRES_ON_TABLE_REGEX.exec(message);
|
|
87
|
+
if (postgresTableMatch) {
|
|
88
|
+
table = postgresTableMatch[REGEX_GROUP_1_INDEX];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
constraint,
|
|
93
|
+
detail,
|
|
94
|
+
field,
|
|
95
|
+
referencedField,
|
|
96
|
+
referencedTable,
|
|
97
|
+
table,
|
|
98
|
+
value,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export { DatabaseTypeOrmGetForeignKeyViolationDetails };
|
|
103
|
+
//# sourceMappingURL=foreign-key-violation-details.utility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"foreign-key-violation-details.utility.js","sources":["../../../../../../../src/utility/database/typeorm/get/foreign-key-violation-details.utility.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts best-effort details from a TypeORM UNIQUE constraint violation (QueryFailedError).
|
|
3
|
+
* Works best with PostgreSQL (driverError.detail / driverError.constraint).
|
|
4
|
+
* @param {unknown} error - Error thrown by TypeORM
|
|
5
|
+
* @returns {{ constraint?: string; detail?: string; field?: string; table?: string; value?: string } | undefined}
|
|
6
|
+
* Unique violation details, when available.
|
|
7
|
+
*/
|
|
8
|
+
export declare function DatabaseTypeOrmGetUniqueViolationDetails(error: unknown): {
|
|
9
|
+
constraint?: string;
|
|
10
|
+
detail?: string;
|
|
11
|
+
field?: string;
|
|
12
|
+
table?: string;
|
|
13
|
+
value?: string;
|
|
14
|
+
} | undefined;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { QueryFailedError } from 'typeorm';
|
|
2
|
+
|
|
3
|
+
const REGEX_GROUP_1_INDEX = 1;
|
|
4
|
+
const REGEX_GROUP_2_INDEX = 2;
|
|
5
|
+
const POSTGRES_UNIQUE_CONSTRAINT_REGEX = /unique constraint "([^"]+)"/;
|
|
6
|
+
const POSTGRES_ON_TABLE_REGEX = /on table "([^"]+)"/;
|
|
7
|
+
const POSTGRES_UNIQUE_DETAIL_REGEX = /Key \(([^)]+)\)=\(([^)]+)\) already exists\./;
|
|
8
|
+
const MYSQL_DUPLICATE_ENTRY_REGEX = /Duplicate entry '([^']+)' for key '([^']+)'/;
|
|
9
|
+
/**
|
|
10
|
+
* Extracts best-effort details from a TypeORM UNIQUE constraint violation (QueryFailedError).
|
|
11
|
+
* Works best with PostgreSQL (driverError.detail / driverError.constraint).
|
|
12
|
+
* @param {unknown} error - Error thrown by TypeORM
|
|
13
|
+
* @returns {{ constraint?: string; detail?: string; field?: string; table?: string; value?: string } | undefined}
|
|
14
|
+
* Unique violation details, when available.
|
|
15
|
+
*/
|
|
16
|
+
function DatabaseTypeOrmGetUniqueViolationDetails(error) {
|
|
17
|
+
const isQueryFailedError = error instanceof QueryFailedError || (error != null && typeof error === "object" && error.name === "QueryFailedError");
|
|
18
|
+
if (!isQueryFailedError) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
let driverError;
|
|
22
|
+
if (error != null && typeof error === "object") {
|
|
23
|
+
const driverErrorUnknown = error.driverError;
|
|
24
|
+
if (driverErrorUnknown != null && typeof driverErrorUnknown === "object") {
|
|
25
|
+
driverError = driverErrorUnknown;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const constraintFromDriver = typeof driverError?.constraint === "string" ? driverError.constraint : undefined;
|
|
29
|
+
const detail = typeof driverError?.detail === "string" ? driverError.detail : undefined;
|
|
30
|
+
const tableFromDriver = typeof driverError?.table === "string" ? driverError.table : undefined;
|
|
31
|
+
const driverMessage = driverError?.message;
|
|
32
|
+
let message = "";
|
|
33
|
+
if (typeof driverMessage === "string") {
|
|
34
|
+
message = driverMessage;
|
|
35
|
+
}
|
|
36
|
+
else if (error instanceof Error) {
|
|
37
|
+
message = error.message;
|
|
38
|
+
}
|
|
39
|
+
else if (error != null && typeof error === "object" && "message" in error) {
|
|
40
|
+
const objectMessage = error.message;
|
|
41
|
+
if (typeof objectMessage === "string") {
|
|
42
|
+
message = objectMessage;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const detailOrMessage = detail ?? message;
|
|
46
|
+
let field;
|
|
47
|
+
let value;
|
|
48
|
+
const postgresDetailMatch = POSTGRES_UNIQUE_DETAIL_REGEX.exec(detailOrMessage);
|
|
49
|
+
if (postgresDetailMatch) {
|
|
50
|
+
field = postgresDetailMatch[REGEX_GROUP_1_INDEX];
|
|
51
|
+
value = postgresDetailMatch[REGEX_GROUP_2_INDEX];
|
|
52
|
+
}
|
|
53
|
+
const mysqlDuplicateMatch = MYSQL_DUPLICATE_ENTRY_REGEX.exec(detailOrMessage);
|
|
54
|
+
if (mysqlDuplicateMatch) {
|
|
55
|
+
value ??= mysqlDuplicateMatch[REGEX_GROUP_1_INDEX];
|
|
56
|
+
const key = mysqlDuplicateMatch[REGEX_GROUP_2_INDEX];
|
|
57
|
+
if (key) {
|
|
58
|
+
// Key can be "table.column" or an index name. Best-effort: split by '.' and take the last segment.
|
|
59
|
+
const segments = key.split(".");
|
|
60
|
+
const last = segments.at(-1);
|
|
61
|
+
field ??= last;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
let constraint = constraintFromDriver;
|
|
65
|
+
if (!constraint) {
|
|
66
|
+
const postgresConstraintMatch = POSTGRES_UNIQUE_CONSTRAINT_REGEX.exec(message);
|
|
67
|
+
if (postgresConstraintMatch) {
|
|
68
|
+
constraint = postgresConstraintMatch[REGEX_GROUP_1_INDEX];
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
let table = tableFromDriver;
|
|
72
|
+
if (!table) {
|
|
73
|
+
const postgresTableMatch = POSTGRES_ON_TABLE_REGEX.exec(message);
|
|
74
|
+
if (postgresTableMatch) {
|
|
75
|
+
table = postgresTableMatch[REGEX_GROUP_1_INDEX];
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
constraint,
|
|
80
|
+
detail,
|
|
81
|
+
field,
|
|
82
|
+
table,
|
|
83
|
+
value,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export { DatabaseTypeOrmGetUniqueViolationDetails };
|
|
88
|
+
//# sourceMappingURL=unique-violation-details.utility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unique-violation-details.utility.js","sources":["../../../../../../../src/utility/database/typeorm/get/unique-violation-details.utility.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAEA,MAAM,mBAAmB,GAAW,CAAC;AACrC,MAAM,mBAAmB,GAAW,CAAC;AAErC,MAAM,gCAAgC,GAAW,6BAA6B;AAC9E,MAAM,uBAAuB,GAAW,oBAAoB;AAC5D,MAAM,4BAA4B,GAAW,8CAA8C;AAE3F,MAAM,2BAA2B,GAAW,6CAA6C;AAEzF;;;;;;AAMG;AACG,SAAU,wCAAwC,CAAC,KAAc,EAAA;IACtE,MAAM,kBAAkB,GAAY,KAAK,YAAY,gBAAgB,KAAK,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAK,KAA4B,CAAC,IAAI,KAAK,kBAAkB,CAAC;IAElL,IAAI,CAAC,kBAAkB,EAAE;AACxB,QAAA,OAAO,SAAS;IACjB;AAEA,IAAA,IAAI,WAAgD;IAEpD,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC/C,QAAA,MAAM,kBAAkB,GAAa,KAAmC,CAAC,WAAW;QAEpF,IAAI,kBAAkB,IAAI,IAAI,IAAI,OAAO,kBAAkB,KAAK,QAAQ,EAAE;YACzE,WAAW,GAAG,kBAA6C;QAC5D;IACD;AAEA,IAAA,MAAM,oBAAoB,GAAuB,OAAO,WAAW,EAAE,UAAU,KAAK,QAAQ,GAAG,WAAW,CAAC,UAAU,GAAG,SAAS;AACjI,IAAA,MAAM,MAAM,GAAuB,OAAO,WAAW,EAAE,MAAM,KAAK,QAAQ,GAAG,WAAW,CAAC,MAAM,GAAG,SAAS;AAC3G,IAAA,MAAM,eAAe,GAAuB,OAAO,WAAW,EAAE,KAAK,KAAK,QAAQ,GAAG,WAAW,CAAC,KAAK,GAAG,SAAS;AAElH,IAAA,MAAM,aAAa,GAAY,WAAW,EAAE,OAAO;IACnD,IAAI,OAAO,GAAW,EAAE;AAExB,IAAA,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE;QACtC,OAAO,GAAG,aAAa;IACxB;AAAO,SAAA,IAAI,KAAK,YAAY,KAAK,EAAE;AAClC,QAAA,OAAO,GAAG,KAAK,CAAC,OAAO;IACxB;AAAO,SAAA,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,IAAI,KAAK,EAAE;AAC5E,QAAA,MAAM,aAAa,GAAa,KAA+B,CAAC,OAAO;AAEvE,QAAA,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE;YACtC,OAAO,GAAG,aAAa;QACxB;IACD;AAEA,IAAA,MAAM,eAAe,GAAW,MAAM,IAAI,OAAO;AAEjD,IAAA,IAAI,KAAyB;AAC7B,IAAA,IAAI,KAAyB;IAE7B,MAAM,mBAAmB,GAA2B,4BAA4B,CAAC,IAAI,CAAC,eAAe,CAAC;IAEtG,IAAI,mBAAmB,EAAE;AACxB,QAAA,KAAK,GAAG,mBAAmB,CAAC,mBAAmB,CAAC;AAChD,QAAA,KAAK,GAAG,mBAAmB,CAAC,mBAAmB,CAAC;IACjD;IAEA,MAAM,mBAAmB,GAA2B,2BAA2B,CAAC,IAAI,CAAC,eAAe,CAAC;IAErG,IAAI,mBAAmB,EAAE;AACxB,QAAA,KAAK,KAAK,mBAAmB,CAAC,mBAAmB,CAAC;AAClD,QAAA,MAAM,GAAG,GAAuB,mBAAmB,CAAC,mBAAmB,CAAC;QAExE,IAAI,GAAG,EAAE;;YAER,MAAM,QAAQ,GAAkB,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;YAC9C,MAAM,IAAI,GAAuB,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YAChD,KAAK,KAAK,IAAI;QACf;IACD;IAEA,IAAI,UAAU,GAAuB,oBAAoB;IAEzD,IAAI,CAAC,UAAU,EAAE;QAChB,MAAM,uBAAuB,GAA2B,gCAAgC,CAAC,IAAI,CAAC,OAAO,CAAC;QAEtG,IAAI,uBAAuB,EAAE;AAC5B,YAAA,UAAU,GAAG,uBAAuB,CAAC,mBAAmB,CAAC;QAC1D;IACD;IAEA,IAAI,KAAK,GAAuB,eAAe;IAE/C,IAAI,CAAC,KAAK,EAAE;QACX,MAAM,kBAAkB,GAA2B,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC;QAExF,IAAI,kBAAkB,EAAE;AACvB,YAAA,KAAK,GAAG,kBAAkB,CAAC,mBAAmB,CAAC;QAChD;IACD;IAEA,OAAO;QACN,UAAU;QACV,MAAM;QACN,KAAK;QACL,KAAK;QACL,KAAK;KACL;AACF;;;;"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { DatabaseTypeOrmGetForeignKeyViolationDetails } from './get/foreign-key-violation-details.utility';
|
|
2
|
+
export { DatabaseTypeOrmGetUniqueViolationDetails } from './get/unique-violation-details.utility';
|
|
3
|
+
export { DatabaseTypeOrmIsEntityMetadataNotFound } from './is/entity/metadata-not-found.utility';
|
|
4
|
+
export { DatabaseTypeOrmIsEntityNotFound } from './is/entity/not-found.utility';
|
|
5
|
+
export { DatabaseTypeOrmIsForeignKeyViolation } from './is/foreign-key-violation.utility';
|
|
6
|
+
export { DatabaseTypeOrmIsUniqueViolation } from './is/unique-violation.utility';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detects whether an error is a TypeORM EntityMetadataNotFoundError.
|
|
3
|
+
* This usually indicates that an entity was not registered in the current DataSource.
|
|
4
|
+
* @param {unknown} error - Error thrown by TypeORM
|
|
5
|
+
* @returns {boolean} True if it looks like EntityMetadataNotFoundError
|
|
6
|
+
*/
|
|
7
|
+
export declare function DatabaseTypeOrmIsEntityMetadataNotFound(error: unknown): boolean;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { EntityMetadataNotFoundError } from 'typeorm';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Detects whether an error is a TypeORM EntityMetadataNotFoundError.
|
|
5
|
+
* This usually indicates that an entity was not registered in the current DataSource.
|
|
6
|
+
* @param {unknown} error - Error thrown by TypeORM
|
|
7
|
+
* @returns {boolean} True if it looks like EntityMetadataNotFoundError
|
|
8
|
+
*/
|
|
9
|
+
function DatabaseTypeOrmIsEntityMetadataNotFound(error) {
|
|
10
|
+
if (error instanceof EntityMetadataNotFoundError) {
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
if (!error || typeof error !== "object") {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
const name = error.name;
|
|
17
|
+
if (name === "EntityMetadataNotFoundError") {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
const message = error.message;
|
|
21
|
+
return typeof message === "string" && message.includes("No metadata for");
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export { DatabaseTypeOrmIsEntityMetadataNotFound };
|
|
25
|
+
//# sourceMappingURL=metadata-not-found.utility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata-not-found.utility.js","sources":["../../../../../../../../src/utility/database/typeorm/is/entity/metadata-not-found.utility.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAEA;;;;;AAKG;AACG,SAAU,uCAAuC,CAAC,KAAc,EAAA;AACrE,IAAA,IAAI,KAAK,YAAY,2BAA2B,EAAE;AACjD,QAAA,OAAO,IAAI;IACZ;IAEA,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACxC,QAAA,OAAO,KAAK;IACb;AAEA,IAAA,MAAM,IAAI,GAAa,KAA4B,CAAC,IAAI;AAExD,IAAA,IAAI,IAAI,KAAK,6BAA6B,EAAE;AAC3C,QAAA,OAAO,IAAI;IACZ;AAEA,IAAA,MAAM,OAAO,GAAa,KAA+B,CAAC,OAAO;IAEjE,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;AAC1E;;;;"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detects whether an error is a TypeORM EntityNotFoundError.
|
|
3
|
+
* @param {unknown} error - Error thrown by TypeORM
|
|
4
|
+
* @returns {boolean} True if it looks like EntityNotFoundError
|
|
5
|
+
*/
|
|
6
|
+
export declare function DatabaseTypeOrmIsEntityNotFound(error: unknown): boolean;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { EntityNotFoundError } from 'typeorm';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Detects whether an error is a TypeORM EntityNotFoundError.
|
|
5
|
+
* @param {unknown} error - Error thrown by TypeORM
|
|
6
|
+
* @returns {boolean} True if it looks like EntityNotFoundError
|
|
7
|
+
*/
|
|
8
|
+
function DatabaseTypeOrmIsEntityNotFound(error) {
|
|
9
|
+
if (error instanceof EntityNotFoundError) {
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
if (!error || typeof error !== "object") {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
const name = error.name;
|
|
16
|
+
if (name === "EntityNotFoundError") {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
const message = error.message;
|
|
20
|
+
return typeof message === "string" && message.includes("Could not find any entity of type");
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export { DatabaseTypeOrmIsEntityNotFound };
|
|
24
|
+
//# sourceMappingURL=not-found.utility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"not-found.utility.js","sources":["../../../../../../../../src/utility/database/typeorm/is/entity/not-found.utility.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAEA;;;;AAIG;AACG,SAAU,+BAA+B,CAAC,KAAc,EAAA;AAC7D,IAAA,IAAI,KAAK,YAAY,mBAAmB,EAAE;AACzC,QAAA,OAAO,IAAI;IACZ;IAEA,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACxC,QAAA,OAAO,KAAK;IACb;AAEA,IAAA,MAAM,IAAI,GAAa,KAA4B,CAAC,IAAI;AAExD,IAAA,IAAI,IAAI,KAAK,qBAAqB,EAAE;AACnC,QAAA,OAAO,IAAI;IACZ;AAEA,IAAA,MAAM,OAAO,GAAa,KAA+B,CAAC,OAAO;IAEjE,OAAO,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,mCAAmC,CAAC;AAC5F;;;;"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detects whether a TypeORM QueryFailedError is caused by a FOREIGN KEY constraint violation.
|
|
3
|
+
* Best-effort across major drivers (Postgres/MySQL/MariaDB/SQLite/MSSQL) + message fallback.
|
|
4
|
+
* @param {unknown} error - Error thrown by TypeORM
|
|
5
|
+
* @returns {boolean} True if it looks like a FOREIGN KEY constraint violation
|
|
6
|
+
*/
|
|
7
|
+
export declare function DatabaseTypeOrmIsForeignKeyViolation(error: unknown): boolean;
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { QueryFailedError } from 'typeorm';
|
|
2
|
+
|
|
3
|
+
const POSTGRES_FOREIGN_KEY_VIOLATION_CODE = "23503";
|
|
4
|
+
const MYSQL_CANNOT_ADD_OR_UPDATE_CHILD_ROW_ERRNO = 1452;
|
|
5
|
+
const MYSQL_CANNOT_DELETE_OR_UPDATE_PARENT_ROW_ERRNO = 1451;
|
|
6
|
+
const MSSQL_FOREIGN_KEY_CONSTRAINT_ERROR_NUMBER = 547;
|
|
7
|
+
/**
|
|
8
|
+
* Detects whether a TypeORM QueryFailedError is caused by a FOREIGN KEY constraint violation.
|
|
9
|
+
* Best-effort across major drivers (Postgres/MySQL/MariaDB/SQLite/MSSQL) + message fallback.
|
|
10
|
+
* @param {unknown} error - Error thrown by TypeORM
|
|
11
|
+
* @returns {boolean} True if it looks like a FOREIGN KEY constraint violation
|
|
12
|
+
*/
|
|
13
|
+
function DatabaseTypeOrmIsForeignKeyViolation(error) {
|
|
14
|
+
const isQueryFailedError = error instanceof QueryFailedError || (error != null && typeof error === "object" && error.name === "QueryFailedError");
|
|
15
|
+
if (!isQueryFailedError) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
const driverErrorUnknown = error != null && typeof error === "object" ? error.driverError : undefined;
|
|
19
|
+
const driverError = driverErrorUnknown != null && typeof driverErrorUnknown === "object" ? driverErrorUnknown : undefined;
|
|
20
|
+
const code = driverError?.code;
|
|
21
|
+
const errno = driverError?.errno;
|
|
22
|
+
const number = driverError?.number;
|
|
23
|
+
// PostgreSQL (SQLSTATE): foreign_key_violation
|
|
24
|
+
if (code === POSTGRES_FOREIGN_KEY_VIOLATION_CODE) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
// MySQL / MariaDB
|
|
28
|
+
if (code === "ER_NO_REFERENCED_ROW_2" || code === "ER_ROW_IS_REFERENCED_2") {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
if (errno === MYSQL_CANNOT_ADD_OR_UPDATE_CHILD_ROW_ERRNO || errno === String(MYSQL_CANNOT_ADD_OR_UPDATE_CHILD_ROW_ERRNO)) {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
if (errno === MYSQL_CANNOT_DELETE_OR_UPDATE_PARENT_ROW_ERRNO || errno === String(MYSQL_CANNOT_DELETE_OR_UPDATE_PARENT_ROW_ERRNO)) {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
// SQLite
|
|
38
|
+
if (typeof code === "string" && code.startsWith("SQLITE_CONSTRAINT_FOREIGNKEY")) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
// MSSQL
|
|
42
|
+
if (number === MSSQL_FOREIGN_KEY_CONSTRAINT_ERROR_NUMBER) {
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
const driverMessage = driverError?.message;
|
|
46
|
+
let message = "";
|
|
47
|
+
if (typeof driverMessage === "string") {
|
|
48
|
+
message = driverMessage;
|
|
49
|
+
}
|
|
50
|
+
else if (error instanceof Error) {
|
|
51
|
+
message = error.message;
|
|
52
|
+
}
|
|
53
|
+
else if (error != null && typeof error === "object" && "message" in error) {
|
|
54
|
+
const objectMessage = error.message;
|
|
55
|
+
if (typeof objectMessage === "string") {
|
|
56
|
+
message = objectMessage;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const messageLower = message.toLowerCase();
|
|
60
|
+
if (!messageLower) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
// Postgres
|
|
64
|
+
if (messageLower.includes("violates foreign key constraint")) {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
// MySQL
|
|
68
|
+
if (messageLower.includes("a foreign key constraint fails")) {
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
if (messageLower.includes("cannot add or update a child row")) {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
if (messageLower.includes("cannot delete or update a parent row")) {
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
// SQLite
|
|
78
|
+
if (messageLower.includes("foreign key constraint failed")) {
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
// MSSQL
|
|
82
|
+
if (messageLower.includes("conflicted with the foreign key constraint")) {
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export { DatabaseTypeOrmIsForeignKeyViolation };
|
|
89
|
+
//# sourceMappingURL=foreign-key-violation.utility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"foreign-key-violation.utility.js","sources":["../../../../../../../src/utility/database/typeorm/is/foreign-key-violation.utility.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detects whether a TypeORM QueryFailedError is caused by a UNIQUE constraint violation.
|
|
3
|
+
* Best-effort across major drivers (Postgres/MySQL/MariaDB/SQLite/MSSQL) + message fallback.
|
|
4
|
+
* @param {unknown} error - Error thrown by TypeORM
|
|
5
|
+
* @returns {boolean} True if it looks like a UNIQUE constraint violation
|
|
6
|
+
*/
|
|
7
|
+
export declare function DatabaseTypeOrmIsUniqueViolation(error: unknown): boolean;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { QueryFailedError } from 'typeorm';
|
|
2
|
+
|
|
3
|
+
const MYSQL_MARIADB_DUPLICATE_ENTRY_ERRNO = 1062;
|
|
4
|
+
const MSSQL_DUPLICATE_KEY_ERROR_NUMBER_1 = 2601;
|
|
5
|
+
const MSSQL_DUPLICATE_KEY_ERROR_NUMBER_2 = 2627;
|
|
6
|
+
/**
|
|
7
|
+
* Detects whether a TypeORM QueryFailedError is caused by a UNIQUE constraint violation.
|
|
8
|
+
* Best-effort across major drivers (Postgres/MySQL/MariaDB/SQLite/MSSQL) + message fallback.
|
|
9
|
+
* @param {unknown} error - Error thrown by TypeORM
|
|
10
|
+
* @returns {boolean} True if it looks like a UNIQUE constraint violation
|
|
11
|
+
*/
|
|
12
|
+
function DatabaseTypeOrmIsUniqueViolation(error) {
|
|
13
|
+
const isQueryFailedError = error instanceof QueryFailedError || (error != null && typeof error === "object" && error.name === "QueryFailedError");
|
|
14
|
+
if (!isQueryFailedError) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
const driverErrorUnknown = error != null && typeof error === "object" ? error.driverError : undefined;
|
|
18
|
+
const driverError = driverErrorUnknown != null && typeof driverErrorUnknown === "object" ? driverErrorUnknown : undefined;
|
|
19
|
+
const code = driverError?.code;
|
|
20
|
+
const errno = driverError?.errno;
|
|
21
|
+
const number = driverError?.number;
|
|
22
|
+
// PostgreSQL (SQLSTATE): unique_violation
|
|
23
|
+
if (code === "23505") {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
// MySQL / MariaDB
|
|
27
|
+
if (code === "ER_DUP_ENTRY") {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
if (errno === MYSQL_MARIADB_DUPLICATE_ENTRY_ERRNO || errno === String(MYSQL_MARIADB_DUPLICATE_ENTRY_ERRNO)) {
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
// SQLite
|
|
34
|
+
if (typeof code === "string" && code.startsWith("SQLITE_CONSTRAINT")) {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
// MSSQL
|
|
38
|
+
if (number === MSSQL_DUPLICATE_KEY_ERROR_NUMBER_1 || number === MSSQL_DUPLICATE_KEY_ERROR_NUMBER_2) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
const driverMessage = driverError?.message;
|
|
42
|
+
let message = "";
|
|
43
|
+
if (typeof driverMessage === "string") {
|
|
44
|
+
message = driverMessage;
|
|
45
|
+
}
|
|
46
|
+
else if (error instanceof Error) {
|
|
47
|
+
message = error.message;
|
|
48
|
+
}
|
|
49
|
+
else if (error != null && typeof error === "object" && "message" in error) {
|
|
50
|
+
const objectMessage = error.message;
|
|
51
|
+
if (typeof objectMessage === "string") {
|
|
52
|
+
message = objectMessage;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const messageLower = message.toLowerCase();
|
|
56
|
+
if (!messageLower) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
// Postgres
|
|
60
|
+
if (messageLower.includes("duplicate key value violates unique constraint")) {
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
// MySQL
|
|
64
|
+
if (messageLower.includes("duplicate entry")) {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
// SQLite
|
|
68
|
+
if (messageLower.includes("unique constraint failed")) {
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
// MSSQL
|
|
72
|
+
if (messageLower.includes("cannot insert duplicate key")) {
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export { DatabaseTypeOrmIsUniqueViolation };
|
|
79
|
+
//# sourceMappingURL=unique-violation.utility.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unique-violation.utility.js","sources":["../../../../../../../src/utility/database/typeorm/is/unique-violation.utility.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAEA,MAAM,mCAAmC,GAAW,IAAI;AACxD,MAAM,kCAAkC,GAAW,IAAI;AACvD,MAAM,kCAAkC,GAAW,IAAI;AAEvD;;;;;AAKG;AACG,SAAU,gCAAgC,CAAC,KAAc,EAAA;IAC9D,MAAM,kBAAkB,GAAY,KAAK,YAAY,gBAAgB,KAAK,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAK,KAA4B,CAAC,IAAI,KAAK,kBAAkB,CAAC;IAElL,IAAI,CAAC,kBAAkB,EAAE;AACxB,QAAA,OAAO,KAAK;IACb;IAEA,MAAM,kBAAkB,GAAY,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,GAAI,KAAmC,CAAC,WAAW,GAAG,SAAS;AAC7I,IAAA,MAAM,WAAW,GAAwC,kBAAkB,IAAI,IAAI,IAAI,OAAO,kBAAkB,KAAK,QAAQ,GAAI,kBAA8C,GAAG,SAAS;AAE3L,IAAA,MAAM,IAAI,GAAY,WAAW,EAAE,IAAI;AACvC,IAAA,MAAM,KAAK,GAAY,WAAW,EAAE,KAAK;AACzC,IAAA,MAAM,MAAM,GAAY,WAAW,EAAE,MAAM;;AAG3C,IAAA,IAAI,IAAI,KAAK,OAAO,EAAE;AACrB,QAAA,OAAO,IAAI;IACZ;;AAGA,IAAA,IAAI,IAAI,KAAK,cAAc,EAAE;AAC5B,QAAA,OAAO,IAAI;IACZ;IAEA,IAAI,KAAK,KAAK,mCAAmC,IAAI,KAAK,KAAK,MAAM,CAAC,mCAAmC,CAAC,EAAE;AAC3G,QAAA,OAAO,IAAI;IACZ;;AAGA,IAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE;AACrE,QAAA,OAAO,IAAI;IACZ;;IAGA,IAAI,MAAM,KAAK,kCAAkC,IAAI,MAAM,KAAK,kCAAkC,EAAE;AACnG,QAAA,OAAO,IAAI;IACZ;AAEA,IAAA,MAAM,aAAa,GAAY,WAAW,EAAE,OAAO;IACnD,IAAI,OAAO,GAAW,EAAE;AAExB,IAAA,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE;QACtC,OAAO,GAAG,aAAa;IACxB;AAAO,SAAA,IAAI,KAAK,YAAY,KAAK,EAAE;AAClC,QAAA,OAAO,GAAG,KAAK,CAAC,OAAO;IACxB;AAAO,SAAA,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,IAAI,KAAK,EAAE;AAC5E,QAAA,MAAM,aAAa,GAAa,KAA+B,CAAC,OAAO;AAEvE,QAAA,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE;YACtC,OAAO,GAAG,aAAa;QACxB;IACD;AAEA,IAAA,MAAM,YAAY,GAAW,OAAO,CAAC,WAAW,EAAE;IAElD,IAAI,CAAC,YAAY,EAAE;AAClB,QAAA,OAAO,KAAK;IACb;;AAGA,IAAA,IAAI,YAAY,CAAC,QAAQ,CAAC,gDAAgD,CAAC,EAAE;AAC5E,QAAA,OAAO,IAAI;IACZ;;AAGA,IAAA,IAAI,YAAY,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE;AAC7C,QAAA,OAAO,IAAI;IACZ;;AAGA,IAAA,IAAI,YAAY,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE;AACtD,QAAA,OAAO,IAAI;IACZ;;AAGA,IAAA,IAAI,YAAY,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAAE;AACzD,QAAA,OAAO,IAAI;IACZ;AAEA,IAAA,OAAO,KAAK;AACb;;;;"}
|