@nest-omni/core 4.1.3-12 → 4.1.3-13
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/LICENSE +17 -0
- package/README.md +444 -0
- package/build.sh +45 -0
- package/dist/cache/dependencies/db.dependency.d.ts +109 -0
- package/{cache → dist/cache}/dependencies/db.dependency.js +64 -13
- package/{common → dist/common}/boilerplate.polyfill.js +1 -1
- package/dist/file-upload/decorators/column.decorator.d.ts +151 -0
- package/dist/file-upload/decorators/column.decorator.js +273 -0
- package/dist/file-upload/decorators/csv-data.decorator.d.ts +30 -0
- package/dist/file-upload/decorators/csv-data.decorator.js +85 -0
- package/dist/file-upload/decorators/csv-import.decorator.d.ts +34 -0
- package/dist/file-upload/decorators/csv-import.decorator.js +24 -0
- package/dist/file-upload/decorators/examples/column-mapping.example.d.ts +76 -0
- package/dist/file-upload/decorators/examples/column-mapping.example.js +122 -0
- package/dist/file-upload/decorators/excel-data.decorator.d.ts +30 -0
- package/dist/file-upload/decorators/excel-data.decorator.js +85 -0
- package/dist/file-upload/decorators/index.d.ts +5 -0
- package/dist/file-upload/decorators/index.js +38 -0
- package/dist/file-upload/decorators/validate-data.decorator.d.ts +91 -0
- package/dist/file-upload/decorators/validate-data.decorator.js +39 -0
- package/{file-upload → dist/file-upload}/dto/update-file.dto.d.ts +0 -1
- package/{file-upload → dist/file-upload}/dto/update-file.dto.js +0 -4
- package/{file-upload → dist/file-upload}/entities/file-metadata.entity.d.ts +6 -3
- package/{file-upload → dist/file-upload}/entities/file-metadata.entity.js +2 -10
- package/{file-upload → dist/file-upload}/entities/file.entity.d.ts +3 -18
- package/{file-upload → dist/file-upload}/entities/file.entity.js +0 -34
- package/{file-upload → dist/file-upload}/file-upload.module.d.ts +1 -1
- package/{file-upload → dist/file-upload}/file-upload.module.js +44 -16
- package/{file-upload → dist/file-upload}/index.d.ts +13 -2
- package/{file-upload → dist/file-upload}/index.js +21 -3
- package/dist/file-upload/interceptors/file-upload.interceptor.d.ts +101 -0
- package/dist/file-upload/interceptors/file-upload.interceptor.js +594 -0
- package/dist/file-upload/interfaces/file-processor.interface.d.ts +93 -0
- package/{file-upload → dist/file-upload}/interfaces/file-upload-options.interface.d.ts +3 -46
- package/dist/file-upload/interfaces/file-upload-options.interface.js +5 -0
- package/dist/file-upload/interfaces/processor-options.interface.d.ts +102 -0
- package/dist/file-upload/processors/csv.processor.d.ts +98 -0
- package/dist/file-upload/processors/csv.processor.js +391 -0
- package/dist/file-upload/processors/excel.processor.d.ts +130 -0
- package/dist/file-upload/processors/excel.processor.js +547 -0
- package/dist/file-upload/processors/image.processor.d.ts +199 -0
- package/dist/file-upload/processors/image.processor.js +377 -0
- package/{file-upload → dist/file-upload}/services/file.service.d.ts +3 -0
- package/{file-upload → dist/file-upload}/services/file.service.js +39 -10
- package/{file-upload → dist/file-upload}/services/malicious-file-detector.service.d.ts +29 -3
- package/{file-upload → dist/file-upload}/services/malicious-file-detector.service.js +256 -57
- package/{file-upload → dist/file-upload}/utils/dynamic-import.util.d.ts +6 -2
- package/{file-upload → dist/file-upload}/utils/dynamic-import.util.js +17 -5
- package/{http-client → dist/http-client}/decorators/http-client.decorators.d.ts +4 -2
- package/{http-client → dist/http-client}/decorators/http-client.decorators.js +2 -1
- package/{http-client → dist/http-client}/entities/http-log.entity.js +1 -9
- package/dist/http-client/examples/proxy-from-environment.example.d.ts +133 -0
- package/dist/http-client/examples/proxy-from-environment.example.js +410 -0
- package/{http-client → dist/http-client}/http-client.module.js +65 -6
- package/{http-client → dist/http-client}/interfaces/http-client-config.interface.d.ts +6 -0
- package/{http-client → dist/http-client}/services/http-client.service.d.ts +8 -0
- package/{http-client → dist/http-client}/services/http-client.service.js +61 -17
- package/{http-client → dist/http-client}/services/logging.service.d.ts +1 -1
- package/{http-client → dist/http-client}/services/logging.service.js +74 -58
- package/{http-client → dist/http-client}/utils/index.d.ts +1 -0
- package/{http-client → dist/http-client}/utils/index.js +1 -0
- package/dist/http-client/utils/proxy-environment.util.d.ts +42 -0
- package/dist/http-client/utils/proxy-environment.util.js +148 -0
- package/dist/package.json +105 -0
- package/{shared → dist/shared}/service-registry.module.js +18 -0
- package/dist/transaction/data-source.util.d.ts +142 -0
- package/dist/transaction/data-source.util.js +330 -0
- package/{transaction → dist/transaction}/index.d.ts +1 -0
- package/{transaction → dist/transaction}/index.js +12 -1
- package/{validators → dist/validators}/is-exists.validator.d.ts +19 -2
- package/{validators → dist/validators}/is-exists.validator.js +27 -2
- package/{validators → dist/validators}/is-unique.validator.d.ts +12 -1
- package/{validators → dist/validators}/is-unique.validator.js +26 -1
- package/dist/vault/interfaces/vault-options.interface.js +2 -0
- package/package.json +9 -5
- package/tsconfig.build.json +16 -0
- package/cache/dependencies/db.dependency.d.ts +0 -60
- package/file-upload/decorators/csv-data.decorator.d.ts +0 -44
- package/file-upload/decorators/csv-data.decorator.js +0 -131
- package/file-upload/decorators/excel-data.decorator.d.ts +0 -44
- package/file-upload/decorators/excel-data.decorator.js +0 -125
- package/file-upload/decorators/index.d.ts +0 -4
- package/file-upload/decorators/index.js +0 -20
- package/file-upload/interceptors/file-upload.interceptor.d.ts +0 -48
- package/file-upload/interceptors/file-upload.interceptor.js +0 -434
- /package/{.hygen → dist/.hygen}/new/crud/controller.ejs.t +0 -0
- /package/{.hygen → dist/.hygen}/new/crud/create.dto.ejs.t +0 -0
- /package/{.hygen → dist/.hygen}/new/crud/entity.ejs.t +0 -0
- /package/{.hygen → dist/.hygen}/new/crud/get.dto.ejs.t +0 -0
- /package/{.hygen → dist/.hygen}/new/crud/index-dto.ejs.t +0 -0
- /package/{.hygen → dist/.hygen}/new/crud/index-response.dto.ejs.t +0 -0
- /package/{.hygen → dist/.hygen}/new/crud/module.ejs.t +0 -0
- /package/{.hygen → dist/.hygen}/new/crud/prompt.js +0 -0
- /package/{.hygen → dist/.hygen}/new/crud/service.ejs.t +0 -0
- /package/{.hygen → dist/.hygen}/new/crud/update.dto.ejs.t +0 -0
- /package/{.hygen → dist/.hygen}/new/module/controller.ejs.t +0 -0
- /package/{.hygen → dist/.hygen}/new/module/create-command.ejs.t +0 -0
- /package/{.hygen → dist/.hygen}/new/module/create.dto.ejs.t +0 -0
- /package/{.hygen → dist/.hygen}/new/module/dto.ejs.t +0 -0
- /package/{.hygen → dist/.hygen}/new/module/entity.ejs.t +0 -0
- /package/{.hygen → dist/.hygen}/new/module/get-query.ejs.t +0 -0
- /package/{.hygen → dist/.hygen}/new/module/module.ejs.t +0 -0
- /package/{.hygen → dist/.hygen}/new/module/not-found.exception.ejs.t +0 -0
- /package/{.hygen → dist/.hygen}/new/module/page-options.dto.ejs.t +0 -0
- /package/{.hygen → dist/.hygen}/new/module/prompt.js +0 -0
- /package/{.hygen → dist/.hygen}/new/module/repository.ejs.t +0 -0
- /package/{.hygen → dist/.hygen}/new/module/service.ejs.t +0 -0
- /package/{.hygen → dist/.hygen}/new/module/translation-dto.ejs.t +0 -0
- /package/{.hygen → dist/.hygen}/new/module/translation-entity.ejs.t +0 -0
- /package/{.hygen → dist/.hygen}/new/module/translation-repository.ejs.t +0 -0
- /package/{.hygen → dist/.hygen}/new/module/update.dto.ejs.t +0 -0
- /package/{.hygen.js → dist/.hygen.js} +0 -0
- /package/{audit → dist/audit}/audit.module.d.ts +0 -0
- /package/{audit → dist/audit}/audit.module.js +0 -0
- /package/{audit → dist/audit}/controllers/audit.controller.d.ts +0 -0
- /package/{audit → dist/audit}/controllers/audit.controller.js +0 -0
- /package/{audit → dist/audit}/controllers/index.d.ts +0 -0
- /package/{audit → dist/audit}/controllers/index.js +0 -0
- /package/{audit → dist/audit}/decorators/audit-action.decorator.d.ts +0 -0
- /package/{audit → dist/audit}/decorators/audit-action.decorator.js +0 -0
- /package/{audit → dist/audit}/decorators/audit-controller.decorator.d.ts +0 -0
- /package/{audit → dist/audit}/decorators/audit-controller.decorator.js +0 -0
- /package/{audit → dist/audit}/decorators/audit-operation.decorator.d.ts +0 -0
- /package/{audit → dist/audit}/decorators/audit-operation.decorator.js +0 -0
- /package/{audit → dist/audit}/decorators/entity-audit.decorator.d.ts +0 -0
- /package/{audit → dist/audit}/decorators/entity-audit.decorator.js +0 -0
- /package/{audit → dist/audit}/decorators/index.d.ts +0 -0
- /package/{audit → dist/audit}/decorators/index.js +0 -0
- /package/{audit → dist/audit}/dto/audit-log-query.dto.d.ts +0 -0
- /package/{audit → dist/audit}/dto/audit-log-query.dto.js +0 -0
- /package/{audit → dist/audit}/dto/begin-transaction.dto.d.ts +0 -0
- /package/{audit → dist/audit}/dto/begin-transaction.dto.js +0 -0
- /package/{audit → dist/audit}/dto/compare-entities.dto.d.ts +0 -0
- /package/{audit → dist/audit}/dto/compare-entities.dto.js +0 -0
- /package/{audit → dist/audit}/dto/index.d.ts +0 -0
- /package/{audit → dist/audit}/dto/index.js +0 -0
- /package/{audit → dist/audit}/dto/pre-check-restore.dto.d.ts +0 -0
- /package/{audit → dist/audit}/dto/pre-check-restore.dto.js +0 -0
- /package/{audit → dist/audit}/dto/restore-entity.dto.d.ts +0 -0
- /package/{audit → dist/audit}/dto/restore-entity.dto.js +0 -0
- /package/{audit → dist/audit}/entities/audit-action-summary.entity.d.ts +0 -0
- /package/{audit → dist/audit}/entities/audit-action-summary.entity.js +0 -0
- /package/{audit → dist/audit}/entities/entity-audit-log.entity.d.ts +0 -0
- /package/{audit → dist/audit}/entities/entity-audit-log.entity.js +0 -0
- /package/{audit → dist/audit}/entities/entity-transaction.entity.d.ts +0 -0
- /package/{audit → dist/audit}/entities/entity-transaction.entity.js +0 -0
- /package/{audit → dist/audit}/entities/index.d.ts +0 -0
- /package/{audit → dist/audit}/entities/index.js +0 -0
- /package/{audit → dist/audit}/entities/manual-operation-log.entity.d.ts +0 -0
- /package/{audit → dist/audit}/entities/manual-operation-log.entity.js +0 -0
- /package/{audit → dist/audit}/entities/operation-template.entity.d.ts +0 -0
- /package/{audit → dist/audit}/entities/operation-template.entity.js +0 -0
- /package/{audit → dist/audit}/enums/audit.enums.d.ts +0 -0
- /package/{audit → dist/audit}/enums/audit.enums.js +0 -0
- /package/{audit → dist/audit}/enums/index.d.ts +0 -0
- /package/{audit → dist/audit}/enums/index.js +0 -0
- /package/{audit → dist/audit}/index.d.ts +0 -0
- /package/{audit → dist/audit}/index.js +0 -0
- /package/{audit → dist/audit}/interceptors/audit-action.interceptor.d.ts +0 -0
- /package/{audit → dist/audit}/interceptors/audit-action.interceptor.js +0 -0
- /package/{audit → dist/audit}/interceptors/audit.interceptor.d.ts +0 -0
- /package/{audit → dist/audit}/interceptors/audit.interceptor.js +0 -0
- /package/{audit → dist/audit}/interceptors/index.d.ts +0 -0
- /package/{audit → dist/audit}/interceptors/index.js +0 -0
- /package/{audit → dist/audit}/interfaces/audit.interfaces.d.ts +0 -0
- /package/{audit → dist/audit}/interfaces/audit.interfaces.js +0 -0
- /package/{audit → dist/audit}/interfaces/index.d.ts +0 -0
- /package/{audit → dist/audit}/interfaces/index.js +0 -0
- /package/{audit → dist/audit}/services/audit-action.service.d.ts +0 -0
- /package/{audit → dist/audit}/services/audit-action.service.js +0 -0
- /package/{audit → dist/audit}/services/audit-context.service.d.ts +0 -0
- /package/{audit → dist/audit}/services/audit-context.service.js +0 -0
- /package/{audit → dist/audit}/services/audit-strategy.service.d.ts +0 -0
- /package/{audit → dist/audit}/services/audit-strategy.service.js +0 -0
- /package/{audit → dist/audit}/services/entity-audit.service.d.ts +0 -0
- /package/{audit → dist/audit}/services/entity-audit.service.js +0 -0
- /package/{audit → dist/audit}/services/index.d.ts +0 -0
- /package/{audit → dist/audit}/services/index.js +0 -0
- /package/{audit → dist/audit}/services/manual-audit-log.service.d.ts +0 -0
- /package/{audit → dist/audit}/services/manual-audit-log.service.js +0 -0
- /package/{audit → dist/audit}/services/multi-database.service.d.ts +0 -0
- /package/{audit → dist/audit}/services/multi-database.service.js +0 -0
- /package/{audit → dist/audit}/services/operation-description.service.d.ts +0 -0
- /package/{audit → dist/audit}/services/operation-description.service.js +0 -0
- /package/{audit → dist/audit}/services/transaction-audit.service.d.ts +0 -0
- /package/{audit → dist/audit}/services/transaction-audit.service.js +0 -0
- /package/{audit → dist/audit}/subscribers/entity-audit.subscriber.d.ts +0 -0
- /package/{audit → dist/audit}/subscribers/entity-audit.subscriber.js +0 -0
- /package/{audit → dist/audit}/subscribers/index.d.ts +0 -0
- /package/{audit → dist/audit}/subscribers/index.js +0 -0
- /package/{cache → dist/cache}/cache-metrics.service.d.ts +0 -0
- /package/{cache → dist/cache}/cache-metrics.service.js +0 -0
- /package/{cache → dist/cache}/cache-serialization.service.d.ts +0 -0
- /package/{cache → dist/cache}/cache-serialization.service.js +0 -0
- /package/{cache → dist/cache}/cache.constants.d.ts +0 -0
- /package/{cache → dist/cache}/cache.constants.js +0 -0
- /package/{cache → dist/cache}/cache.health.d.ts +0 -0
- /package/{cache → dist/cache}/cache.health.js +0 -0
- /package/{cache → dist/cache}/cache.module.d.ts +0 -0
- /package/{cache → dist/cache}/cache.module.js +0 -0
- /package/{cache → dist/cache}/cache.service.d.ts +0 -0
- /package/{cache → dist/cache}/cache.service.js +0 -0
- /package/{cache → dist/cache}/cache.warmup.service.d.ts +0 -0
- /package/{cache → dist/cache}/cache.warmup.service.js +0 -0
- /package/{cache → dist/cache}/decorators/cache-evict.decorator.d.ts +0 -0
- /package/{cache → dist/cache}/decorators/cache-evict.decorator.js +0 -0
- /package/{cache → dist/cache}/decorators/cache-put.decorator.d.ts +0 -0
- /package/{cache → dist/cache}/decorators/cache-put.decorator.js +0 -0
- /package/{cache → dist/cache}/decorators/cacheable.decorator.d.ts +0 -0
- /package/{cache → dist/cache}/decorators/cacheable.decorator.js +0 -0
- /package/{cache → dist/cache}/decorators/index.d.ts +0 -0
- /package/{cache → dist/cache}/decorators/index.js +0 -0
- /package/{cache → dist/cache}/dependencies/callback.dependency.d.ts +0 -0
- /package/{cache → dist/cache}/dependencies/callback.dependency.js +0 -0
- /package/{cache → dist/cache}/dependencies/chain.dependency.d.ts +0 -0
- /package/{cache → dist/cache}/dependencies/chain.dependency.js +0 -0
- /package/{cache → dist/cache}/dependencies/file.dependency.d.ts +0 -0
- /package/{cache → dist/cache}/dependencies/file.dependency.js +0 -0
- /package/{cache → dist/cache}/dependencies/index.d.ts +0 -0
- /package/{cache → dist/cache}/dependencies/index.js +0 -0
- /package/{cache → dist/cache}/dependencies/tag.dependency.d.ts +0 -0
- /package/{cache → dist/cache}/dependencies/tag.dependency.js +0 -0
- /package/{cache → dist/cache}/dependencies/time.dependency.d.ts +0 -0
- /package/{cache → dist/cache}/dependencies/time.dependency.js +0 -0
- /package/{cache → dist/cache}/examples/basic-usage.d.ts +0 -0
- /package/{cache → dist/cache}/examples/basic-usage.js +0 -0
- /package/{cache → dist/cache}/index.d.ts +0 -0
- /package/{cache → dist/cache}/index.js +0 -0
- /package/{cache → dist/cache}/interfaces/cache-dependency.interface.d.ts +0 -0
- /package/{cache → dist/cache}/interfaces/cache-dependency.interface.js +0 -0
- /package/{cache → dist/cache}/interfaces/cache-options.interface.d.ts +0 -0
- /package/{cache → dist/cache}/interfaces/cache-options.interface.js +0 -0
- /package/{cache → dist/cache}/interfaces/cache-provider.interface.d.ts +0 -0
- /package/{cache → dist/cache}/interfaces/cache-provider.interface.js +0 -0
- /package/{cache → dist/cache}/interfaces/index.d.ts +0 -0
- /package/{cache → dist/cache}/interfaces/index.js +0 -0
- /package/{cache → dist/cache}/providers/base-cache.provider.d.ts +0 -0
- /package/{cache → dist/cache}/providers/base-cache.provider.js +0 -0
- /package/{cache → dist/cache}/providers/cls-cache.provider.d.ts +0 -0
- /package/{cache → dist/cache}/providers/cls-cache.provider.js +0 -0
- /package/{cache → dist/cache}/providers/index.d.ts +0 -0
- /package/{cache → dist/cache}/providers/index.js +0 -0
- /package/{cache → dist/cache}/providers/memory-cache.provider.d.ts +0 -0
- /package/{cache → dist/cache}/providers/memory-cache.provider.js +0 -0
- /package/{cache → dist/cache}/providers/redis-cache.provider.d.ts +0 -0
- /package/{cache → dist/cache}/providers/redis-cache.provider.js +0 -0
- /package/{cache → dist/cache}/utils/dependency-manager.util.d.ts +0 -0
- /package/{cache → dist/cache}/utils/dependency-manager.util.js +0 -0
- /package/{cache → dist/cache}/utils/index.d.ts +0 -0
- /package/{cache → dist/cache}/utils/index.js +0 -0
- /package/{cache → dist/cache}/utils/key-generator.util.d.ts +0 -0
- /package/{cache → dist/cache}/utils/key-generator.util.js +0 -0
- /package/{common → dist/common}/abstract.entity.d.ts +0 -0
- /package/{common → dist/common}/abstract.entity.js +0 -0
- /package/{common → dist/common}/boilerplate.polyfill.d.ts +0 -0
- /package/{common → dist/common}/dto/abstract.dto.d.ts +0 -0
- /package/{common → dist/common}/dto/abstract.dto.js +0 -0
- /package/{common → dist/common}/dto/bulk-id.dto.d.ts +0 -0
- /package/{common → dist/common}/dto/bulk-id.dto.js +0 -0
- /package/{common → dist/common}/dto/create-translation.dto.d.ts +0 -0
- /package/{common → dist/common}/dto/create-translation.dto.js +0 -0
- /package/{common → dist/common}/dto/dto-container.d.ts +0 -0
- /package/{common → dist/common}/dto/dto-container.js +0 -0
- /package/{common → dist/common}/dto/dto-decorators.d.ts +0 -0
- /package/{common → dist/common}/dto/dto-decorators.js +0 -0
- /package/{common → dist/common}/dto/dto-extensions.d.ts +0 -0
- /package/{common → dist/common}/dto/dto-extensions.js +0 -0
- /package/{common → dist/common}/dto/dto-service-accessor.d.ts +0 -0
- /package/{common → dist/common}/dto/dto-service-accessor.js +0 -0
- /package/{common → dist/common}/dto/dto-transformer.d.ts +0 -0
- /package/{common → dist/common}/dto/dto-transformer.js +0 -0
- /package/{common → dist/common}/dto/index.d.ts +0 -0
- /package/{common → dist/common}/dto/index.js +0 -0
- /package/{common → dist/common}/dto/page-meta.dto.d.ts +0 -0
- /package/{common → dist/common}/dto/page-meta.dto.js +0 -0
- /package/{common → dist/common}/dto/page-options.dto.d.ts +0 -0
- /package/{common → dist/common}/dto/page-options.dto.js +0 -0
- /package/{common → dist/common}/dto/page.dto.d.ts +0 -0
- /package/{common → dist/common}/dto/page.dto.js +0 -0
- /package/{common → dist/common}/examples/paginate-and-map.example.d.ts +0 -0
- /package/{common → dist/common}/examples/paginate-and-map.example.js +0 -0
- /package/{common → dist/common}/index.d.ts +0 -0
- /package/{common → dist/common}/index.js +0 -0
- /package/{common → dist/common}/snake-naming.strategy.d.ts +0 -0
- /package/{common → dist/common}/snake-naming.strategy.js +0 -0
- /package/{common → dist/common}/types.d.ts +0 -0
- /package/{common → dist/common}/types.js +0 -0
- /package/{common → dist/common}/utils.d.ts +0 -0
- /package/{common → dist/common}/utils.js +0 -0
- /package/{constants → dist/constants}/index.d.ts +0 -0
- /package/{constants → dist/constants}/index.js +0 -0
- /package/{constants → dist/constants}/language-code.d.ts +0 -0
- /package/{constants → dist/constants}/language-code.js +0 -0
- /package/{constants → dist/constants}/order.d.ts +0 -0
- /package/{constants → dist/constants}/order.js +0 -0
- /package/{decorators → dist/decorators}/api-page-ok-response.decorator.d.ts +0 -0
- /package/{decorators → dist/decorators}/api-page-ok-response.decorator.js +0 -0
- /package/{decorators → dist/decorators}/api-paginated-response.decorator.d.ts +0 -0
- /package/{decorators → dist/decorators}/api-paginated-response.decorator.js +0 -0
- /package/{decorators → dist/decorators}/auth-user.decorator.d.ts +0 -0
- /package/{decorators → dist/decorators}/auth-user.decorator.js +0 -0
- /package/{decorators → dist/decorators}/controller.decorator.d.ts +0 -0
- /package/{decorators → dist/decorators}/controller.decorator.js +0 -0
- /package/{decorators → dist/decorators}/field.decorators.d.ts +0 -0
- /package/{decorators → dist/decorators}/field.decorators.js +0 -0
- /package/{decorators → dist/decorators}/http.decorators.d.ts +0 -0
- /package/{decorators → dist/decorators}/http.decorators.js +0 -0
- /package/{decorators → dist/decorators}/index.d.ts +0 -0
- /package/{decorators → dist/decorators}/index.js +0 -0
- /package/{decorators → dist/decorators}/operation.decorator.d.ts +0 -0
- /package/{decorators → dist/decorators}/operation.decorator.js +0 -0
- /package/{decorators → dist/decorators}/paginated-response.decorator.d.ts +0 -0
- /package/{decorators → dist/decorators}/paginated-response.decorator.js +0 -0
- /package/{decorators → dist/decorators}/property.decorators.d.ts +0 -0
- /package/{decorators → dist/decorators}/property.decorators.js +0 -0
- /package/{decorators → dist/decorators}/public-route.decorator.d.ts +0 -0
- /package/{decorators → dist/decorators}/public-route.decorator.js +0 -0
- /package/{decorators → dist/decorators}/swagger.schema.d.ts +0 -0
- /package/{decorators → dist/decorators}/swagger.schema.js +0 -0
- /package/{decorators → dist/decorators}/timestamp-column.decorator.d.ts +0 -0
- /package/{decorators → dist/decorators}/timestamp-column.decorator.js +0 -0
- /package/{decorators → dist/decorators}/transform.decorators.d.ts +0 -0
- /package/{decorators → dist/decorators}/transform.decorators.js +0 -0
- /package/{decorators → dist/decorators}/translate.decorator.d.ts +0 -0
- /package/{decorators → dist/decorators}/translate.decorator.js +0 -0
- /package/{decorators → dist/decorators}/use-dto.decorator.d.ts +0 -0
- /package/{decorators → dist/decorators}/use-dto.decorator.js +0 -0
- /package/{decorators → dist/decorators}/user-check.decorator.d.ts +0 -0
- /package/{decorators → dist/decorators}/user-check.decorator.js +0 -0
- /package/{decorators → dist/decorators}/user.decorator.d.ts +0 -0
- /package/{decorators → dist/decorators}/user.decorator.js +0 -0
- /package/{decorators → dist/decorators}/user_auth.decorator.d.ts +0 -0
- /package/{decorators → dist/decorators}/user_auth.decorator.js +0 -0
- /package/{decorators → dist/decorators}/validator.decorators.d.ts +0 -0
- /package/{decorators → dist/decorators}/validator.decorators.js +0 -0
- /package/{exceptions → dist/exceptions}/file-not-image.exception.d.ts +0 -0
- /package/{exceptions → dist/exceptions}/file-not-image.exception.js +0 -0
- /package/{exceptions → dist/exceptions}/index.d.ts +0 -0
- /package/{exceptions → dist/exceptions}/index.js +0 -0
- /package/{exceptions → dist/exceptions}/page-type.exception.d.ts +0 -0
- /package/{exceptions → dist/exceptions}/page-type.exception.js +0 -0
- /package/{exceptions → dist/exceptions}/user-not-found.exception.d.ts +0 -0
- /package/{exceptions → dist/exceptions}/user-not-found.exception.js +0 -0
- /package/{file-upload → dist/file-upload}/controllers/file-access.controller.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/controllers/file-access.controller.js +0 -0
- /package/{file-upload → dist/file-upload}/decorators/file-upload.decorator.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/decorators/file-upload.decorator.js +0 -0
- /package/{file-upload → dist/file-upload}/decorators/process.decorator.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/decorators/process.decorator.js +0 -0
- /package/{file-upload → dist/file-upload}/dto/create-file.dto.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/dto/create-file.dto.js +0 -0
- /package/{file-upload → dist/file-upload}/dto/find-files.dto.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/dto/find-files.dto.js +0 -0
- /package/{file-upload → dist/file-upload}/dto/index.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/dto/index.js +0 -0
- /package/{file-upload → dist/file-upload}/dto/pagination.dto.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/dto/pagination.dto.js +0 -0
- /package/{file-upload → dist/file-upload}/entities/index.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/entities/index.js +0 -0
- /package/{file-upload → dist/file-upload}/enums/file-type.enum.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/enums/file-type.enum.js +0 -0
- /package/{file-upload → dist/file-upload}/exceptions/file-upload.exception.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/exceptions/file-upload.exception.js +0 -0
- /package/{file-upload → dist/file-upload}/exceptions/index.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/exceptions/index.js +0 -0
- /package/{file-upload → dist/file-upload}/interceptors/index.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/interceptors/index.js +0 -0
- /package/{file-upload → dist/file-upload}/interfaces/custom-file-type.interface.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/interfaces/custom-file-type.interface.js +0 -0
- /package/{file-upload → dist/file-upload}/interfaces/file-buffer.interface.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/interfaces/file-buffer.interface.js +0 -0
- /package/{file-upload → dist/file-upload}/interfaces/file-entity.interface.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/interfaces/file-entity.interface.js +0 -0
- /package/{file-upload → dist/file-upload}/interfaces/file-metadata.interface.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/interfaces/file-metadata.interface.js +0 -0
- /package/{file-upload/interfaces/file-upload-options.interface.js → dist/file-upload/interfaces/file-processor.interface.js} +0 -0
- /package/{file-upload → dist/file-upload}/interfaces/index.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/interfaces/index.js +0 -0
- /package/{file-upload/interfaces/storage-provider.interface.js → dist/file-upload/interfaces/processor-options.interface.js} +0 -0
- /package/{file-upload → dist/file-upload}/interfaces/storage-provider.interface.d.ts +0 -0
- /package/{file-upload/interfaces/upload-options.interface.js → dist/file-upload/interfaces/storage-provider.interface.js} +0 -0
- /package/{file-upload → dist/file-upload}/interfaces/upload-options.interface.d.ts +0 -0
- /package/{http-client/interfaces/http-client-config.interface.js → dist/file-upload/interfaces/upload-options.interface.js} +0 -0
- /package/{file-upload → dist/file-upload}/providers/index.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/providers/index.js +0 -0
- /package/{file-upload → dist/file-upload}/providers/local-storage.provider.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/providers/local-storage.provider.js +0 -0
- /package/{file-upload → dist/file-upload}/providers/s3-storage.provider.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/providers/s3-storage.provider.js +0 -0
- /package/{file-upload → dist/file-upload}/services/file-signature-validator.service.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/services/file-signature-validator.service.js +0 -0
- /package/{file-upload → dist/file-upload}/services/index.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/services/index.js +0 -0
- /package/{file-upload → dist/file-upload}/services/mime-registry.service.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/services/mime-registry.service.js +0 -0
- /package/{file-upload → dist/file-upload}/utils/checksum.util.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/utils/checksum.util.js +0 -0
- /package/{file-upload → dist/file-upload}/utils/filename.util.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/utils/filename.util.js +0 -0
- /package/{file-upload → dist/file-upload}/utils/filepath.util.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/utils/filepath.util.js +0 -0
- /package/{file-upload → dist/file-upload}/utils/index.d.ts +0 -0
- /package/{file-upload → dist/file-upload}/utils/index.js +0 -0
- /package/{filters → dist/filters}/bad-request.filter.d.ts +0 -0
- /package/{filters → dist/filters}/bad-request.filter.js +0 -0
- /package/{filters → dist/filters}/constraint-errors.d.ts +0 -0
- /package/{filters → dist/filters}/constraint-errors.js +0 -0
- /package/{filters → dist/filters}/index.d.ts +0 -0
- /package/{filters → dist/filters}/index.js +0 -0
- /package/{filters → dist/filters}/query-failed.filter.d.ts +0 -0
- /package/{filters → dist/filters}/query-failed.filter.js +0 -0
- /package/{health-checker → dist/health-checker}/health-checker.controller.d.ts +0 -0
- /package/{health-checker → dist/health-checker}/health-checker.controller.js +0 -0
- /package/{health-checker → dist/health-checker}/health-checker.module.d.ts +0 -0
- /package/{health-checker → dist/health-checker}/health-checker.module.js +0 -0
- /package/{health-checker → dist/health-checker}/index.d.ts +0 -0
- /package/{health-checker → dist/health-checker}/index.js +0 -0
- /package/{helpers → dist/helpers}/common.helper.d.ts +0 -0
- /package/{helpers → dist/helpers}/common.helper.js +0 -0
- /package/{helpers → dist/helpers}/date.helper.d.ts +0 -0
- /package/{helpers → dist/helpers}/date.helper.js +0 -0
- /package/{helpers → dist/helpers}/index.d.ts +0 -0
- /package/{helpers → dist/helpers}/index.js +0 -0
- /package/{http-client → dist/http-client}/config/http-client.config.d.ts +0 -0
- /package/{http-client → dist/http-client}/config/http-client.config.js +0 -0
- /package/{http-client → dist/http-client}/config/index.d.ts +0 -0
- /package/{http-client → dist/http-client}/config/index.js +0 -0
- /package/{http-client → dist/http-client}/decorators/index.d.ts +0 -0
- /package/{http-client → dist/http-client}/decorators/index.js +0 -0
- /package/{http-client → dist/http-client}/entities/http-log.entity.d.ts +0 -0
- /package/{http-client → dist/http-client}/entities/index.d.ts +0 -0
- /package/{http-client → dist/http-client}/entities/index.js +0 -0
- /package/{http-client → dist/http-client}/errors/http-client.errors.d.ts +0 -0
- /package/{http-client → dist/http-client}/errors/http-client.errors.js +0 -0
- /package/{http-client → dist/http-client}/errors/index.d.ts +0 -0
- /package/{http-client → dist/http-client}/errors/index.js +0 -0
- /package/{http-client → dist/http-client}/examples/advanced-usage.example.d.ts +0 -0
- /package/{http-client → dist/http-client}/examples/advanced-usage.example.js +0 -0
- /package/{http-client → dist/http-client}/examples/auth-with-waiting-lock.example.d.ts +0 -0
- /package/{http-client → dist/http-client}/examples/auth-with-waiting-lock.example.js +0 -0
- /package/{http-client → dist/http-client}/examples/basic-usage.example.d.ts +0 -0
- /package/{http-client → dist/http-client}/examples/basic-usage.example.js +0 -0
- /package/{http-client → dist/http-client}/examples/index.d.ts +0 -0
- /package/{http-client → dist/http-client}/examples/index.js +0 -0
- /package/{http-client → dist/http-client}/examples/multi-api-configuration.example.d.ts +0 -0
- /package/{http-client → dist/http-client}/examples/multi-api-configuration.example.js +0 -0
- /package/{http-client → dist/http-client}/http-client.module.d.ts +0 -0
- /package/{http-client → dist/http-client}/index.d.ts +0 -0
- /package/{http-client → dist/http-client}/index.js +0 -0
- /package/{http-client → dist/http-client}/interfaces/api-client-config.interface.d.ts +0 -0
- /package/{http-client → dist/http-client}/interfaces/api-client-config.interface.js +0 -0
- /package/{interfaces/IApiFile.js → dist/http-client/interfaces/http-client-config.interface.js} +0 -0
- /package/{http-client → dist/http-client}/services/api-client-registry.service.d.ts +0 -0
- /package/{http-client → dist/http-client}/services/api-client-registry.service.js +0 -0
- /package/{http-client → dist/http-client}/services/cache.service.d.ts +0 -0
- /package/{http-client → dist/http-client}/services/cache.service.js +0 -0
- /package/{http-client → dist/http-client}/services/circuit-breaker.service.d.ts +0 -0
- /package/{http-client → dist/http-client}/services/circuit-breaker.service.js +0 -0
- /package/{http-client → dist/http-client}/services/http-log-query.service.d.ts +0 -0
- /package/{http-client → dist/http-client}/services/http-log-query.service.js +0 -0
- /package/{http-client → dist/http-client}/services/http-replay.service.d.ts +0 -0
- /package/{http-client → dist/http-client}/services/http-replay.service.js +0 -0
- /package/{http-client → dist/http-client}/services/index.d.ts +0 -0
- /package/{http-client → dist/http-client}/services/index.js +0 -0
- /package/{http-client → dist/http-client}/services/log-cleanup.service.d.ts +0 -0
- /package/{http-client → dist/http-client}/services/log-cleanup.service.js +0 -0
- /package/{http-client → dist/http-client}/utils/call-stack-extractor.util.d.ts +0 -0
- /package/{http-client → dist/http-client}/utils/call-stack-extractor.util.js +0 -0
- /package/{http-client → dist/http-client}/utils/context-extractor.util.d.ts +0 -0
- /package/{http-client → dist/http-client}/utils/context-extractor.util.js +0 -0
- /package/{http-client → dist/http-client}/utils/curl-generator.util.d.ts +0 -0
- /package/{http-client → dist/http-client}/utils/curl-generator.util.js +0 -0
- /package/{http-client → dist/http-client}/utils/request-id.util.d.ts +0 -0
- /package/{http-client → dist/http-client}/utils/request-id.util.js +0 -0
- /package/{http-client → dist/http-client}/utils/retry-recorder.util.d.ts +0 -0
- /package/{http-client → dist/http-client}/utils/retry-recorder.util.js +0 -0
- /package/{i18n → dist/i18n}/en_US/validation.json +0 -0
- /package/{i18n → dist/i18n}/zh_CN/validation.json +0 -0
- /package/{index.d.ts → dist/index.d.ts} +0 -0
- /package/{index.js → dist/index.js} +0 -0
- /package/{interceptors → dist/interceptors}/index.d.ts +0 -0
- /package/{interceptors → dist/interceptors}/index.js +0 -0
- /package/{interceptors → dist/interceptors}/language-interceptor.service.d.ts +0 -0
- /package/{interceptors → dist/interceptors}/language-interceptor.service.js +0 -0
- /package/{interceptors → dist/interceptors}/translation-interceptor.service.d.ts +0 -0
- /package/{interceptors → dist/interceptors}/translation-interceptor.service.js +0 -0
- /package/{interfaces → dist/interfaces}/IApiFile.d.ts +0 -0
- /package/{interfaces/IFile.js → dist/interfaces/IApiFile.js} +0 -0
- /package/{interfaces → dist/interfaces}/IFile.d.ts +0 -0
- /package/{interfaces/ITranslationDecoratorInterface.js → dist/interfaces/IFile.js} +0 -0
- /package/{interfaces → dist/interfaces}/ITranslationDecoratorInterface.d.ts +0 -0
- /package/{interfaces/response.js → dist/interfaces/ITranslationDecoratorInterface.js} +0 -0
- /package/{interfaces → dist/interfaces}/index.d.ts +0 -0
- /package/{interfaces → dist/interfaces}/index.js +0 -0
- /package/{interfaces → dist/interfaces}/response.d.ts +0 -0
- /package/{vault/interfaces/vault-options.interface.js → dist/interfaces/response.js} +0 -0
- /package/{middlewares → dist/middlewares}/index.d.ts +0 -0
- /package/{middlewares → dist/middlewares}/index.js +0 -0
- /package/{middlewares → dist/middlewares}/omni-auth.middleware.d.ts +0 -0
- /package/{middlewares → dist/middlewares}/omni-auth.middleware.js +0 -0
- /package/{middlewares → dist/middlewares}/powerby.middleware.d.ts +0 -0
- /package/{middlewares → dist/middlewares}/powerby.middleware.js +0 -0
- /package/{middlewares → dist/middlewares}/request-id.middleware.d.ts +0 -0
- /package/{middlewares → dist/middlewares}/request-id.middleware.js +0 -0
- /package/{middlewares → dist/middlewares}/xml.middleware.d.ts +0 -0
- /package/{middlewares → dist/middlewares}/xml.middleware.js +0 -0
- /package/{providers → dist/providers}/context.provider.d.ts +0 -0
- /package/{providers → dist/providers}/context.provider.js +0 -0
- /package/{providers → dist/providers}/generator.provider.d.ts +0 -0
- /package/{providers → dist/providers}/generator.provider.js +0 -0
- /package/{providers → dist/providers}/index.d.ts +0 -0
- /package/{providers → dist/providers}/index.js +0 -0
- /package/{redis-lock → dist/redis-lock}/comprehensive-lock-cleanup.service.d.ts +0 -0
- /package/{redis-lock → dist/redis-lock}/comprehensive-lock-cleanup.service.js +0 -0
- /package/{redis-lock → dist/redis-lock}/examples/lock-strategy.examples.d.ts +0 -0
- /package/{redis-lock → dist/redis-lock}/examples/lock-strategy.examples.js +0 -0
- /package/{redis-lock → dist/redis-lock}/index.d.ts +0 -0
- /package/{redis-lock → dist/redis-lock}/index.js +0 -0
- /package/{redis-lock → dist/redis-lock}/lock-heartbeat.service.d.ts +0 -0
- /package/{redis-lock → dist/redis-lock}/lock-heartbeat.service.js +0 -0
- /package/{redis-lock → dist/redis-lock}/redis-lock.decorator.d.ts +0 -0
- /package/{redis-lock → dist/redis-lock}/redis-lock.decorator.js +0 -0
- /package/{redis-lock → dist/redis-lock}/redis-lock.module.d.ts +0 -0
- /package/{redis-lock → dist/redis-lock}/redis-lock.module.js +0 -0
- /package/{redis-lock → dist/redis-lock}/redis-lock.service.d.ts +0 -0
- /package/{redis-lock → dist/redis-lock}/redis-lock.service.js +0 -0
- /package/{setup → dist/setup}/bootstrap.setup.d.ts +0 -0
- /package/{setup → dist/setup}/bootstrap.setup.js +0 -0
- /package/{setup → dist/setup}/index.d.ts +0 -0
- /package/{setup → dist/setup}/index.js +0 -0
- /package/{setup → dist/setup}/mode.setup.d.ts +0 -0
- /package/{setup → dist/setup}/mode.setup.js +0 -0
- /package/{setup → dist/setup}/schedule.decorator.d.ts +0 -0
- /package/{setup → dist/setup}/schedule.decorator.js +0 -0
- /package/{setup → dist/setup}/worker.decorator.d.ts +0 -0
- /package/{setup → dist/setup}/worker.decorator.js +0 -0
- /package/{shared → dist/shared}/index.d.ts +0 -0
- /package/{shared → dist/shared}/index.js +0 -0
- /package/{shared → dist/shared}/service-registry.module.d.ts +0 -0
- /package/{shared → dist/shared}/services/api-config.service.d.ts +0 -0
- /package/{shared → dist/shared}/services/api-config.service.js +0 -0
- /package/{shared → dist/shared}/services/generator.service.d.ts +0 -0
- /package/{shared → dist/shared}/services/generator.service.js +0 -0
- /package/{shared → dist/shared}/services/index.d.ts +0 -0
- /package/{shared → dist/shared}/services/index.js +0 -0
- /package/{shared → dist/shared}/services/translation.service.d.ts +0 -0
- /package/{shared → dist/shared}/services/translation.service.js +0 -0
- /package/{transaction → dist/transaction}/__tests__/mocks.d.ts +0 -0
- /package/{transaction → dist/transaction}/__tests__/mocks.js +0 -0
- /package/{transaction → dist/transaction}/base-service-transaction.d.ts +0 -0
- /package/{transaction → dist/transaction}/base-service-transaction.js +0 -0
- /package/{transaction → dist/transaction}/cls-compatibility.service.d.ts +0 -0
- /package/{transaction → dist/transaction}/cls-compatibility.service.js +0 -0
- /package/{transaction → dist/transaction}/data-source-registry.d.ts +0 -0
- /package/{transaction → dist/transaction}/data-source-registry.js +0 -0
- /package/{transaction → dist/transaction}/database-adapter.d.ts +0 -0
- /package/{transaction → dist/transaction}/database-adapter.js +0 -0
- /package/{transaction → dist/transaction}/decorators/entity-datasource.decorator.d.ts +0 -0
- /package/{transaction → dist/transaction}/decorators/entity-datasource.decorator.js +0 -0
- /package/{transaction → dist/transaction}/logging-transactional.interceptor.d.ts +0 -0
- /package/{transaction → dist/transaction}/logging-transactional.interceptor.js +0 -0
- /package/{transaction → dist/transaction}/transaction-context.service.d.ts +0 -0
- /package/{transaction → dist/transaction}/transaction-context.service.js +0 -0
- /package/{transaction → dist/transaction}/transaction-manager.d.ts +0 -0
- /package/{transaction → dist/transaction}/transaction-manager.js +0 -0
- /package/{transaction → dist/transaction}/transaction-synchronization.d.ts +0 -0
- /package/{transaction → dist/transaction}/transaction-synchronization.js +0 -0
- /package/{transaction → dist/transaction}/transaction.errors.d.ts +0 -0
- /package/{transaction → dist/transaction}/transaction.errors.js +0 -0
- /package/{transaction → dist/transaction}/transaction.module.d.ts +0 -0
- /package/{transaction → dist/transaction}/transaction.module.js +0 -0
- /package/{transaction → dist/transaction}/transactional.decorator.d.ts +0 -0
- /package/{transaction → dist/transaction}/transactional.decorator.js +0 -0
- /package/{transaction → dist/transaction}/typeorm-module-wrapper.d.ts +0 -0
- /package/{transaction → dist/transaction}/typeorm-module-wrapper.js +0 -0
- /package/{validator-json → dist/validator-json}/decorators.d.ts +0 -0
- /package/{validator-json → dist/validator-json}/decorators.js +0 -0
- /package/{validator-json → dist/validator-json}/default.d.ts +0 -0
- /package/{validator-json → dist/validator-json}/default.js +0 -0
- /package/{validator-json → dist/validator-json}/defaultConverters.d.ts +0 -0
- /package/{validator-json → dist/validator-json}/defaultConverters.js +0 -0
- /package/{validator-json → dist/validator-json}/index.d.ts +0 -0
- /package/{validator-json → dist/validator-json}/index.js +0 -0
- /package/{validator-json → dist/validator-json}/options.d.ts +0 -0
- /package/{validator-json → dist/validator-json}/options.js +0 -0
- /package/{validators → dist/validators}/common-validators.d.ts +0 -0
- /package/{validators → dist/validators}/common-validators.js +0 -0
- /package/{validators → dist/validators}/custom-validate.examples.d.ts +0 -0
- /package/{validators → dist/validators}/custom-validate.examples.js +0 -0
- /package/{validators → dist/validators}/custom-validate.validator.d.ts +0 -0
- /package/{validators → dist/validators}/custom-validate.validator.js +0 -0
- /package/{validators → dist/validators}/file-mimetype.validator.d.ts +0 -0
- /package/{validators → dist/validators}/file-mimetype.validator.js +0 -0
- /package/{validators → dist/validators}/index.d.ts +0 -0
- /package/{validators → dist/validators}/index.js +0 -0
- /package/{validators → dist/validators}/phone-country-code.validator.d.ts +0 -0
- /package/{validators → dist/validators}/phone-country-code.validator.js +0 -0
- /package/{validators → dist/validators}/same-as.validator.d.ts +0 -0
- /package/{validators → dist/validators}/same-as.validator.js +0 -0
- /package/{validators → dist/validators}/skip-empty.validator.d.ts +0 -0
- /package/{validators → dist/validators}/skip-empty.validator.js +0 -0
- /package/{vault → dist/vault}/index.d.ts +0 -0
- /package/{vault → dist/vault}/index.js +0 -0
- /package/{vault → dist/vault}/interfaces/vault-options.interface.d.ts +0 -0
- /package/{vault → dist/vault}/vault-config.loader.d.ts +0 -0
- /package/{vault → dist/vault}/vault-config.loader.js +0 -0
- /package/{vault → dist/vault}/vault-config.service.d.ts +0 -0
- /package/{vault → dist/vault}/vault-config.service.js +0 -0
- /package/{vault → dist/vault}/vault.module.d.ts +0 -0
- /package/{vault → dist/vault}/vault.module.js +0 -0
|
@@ -80,6 +80,12 @@ export interface MaliciousDetectorOptions {
|
|
|
80
80
|
enableStructureAnalysis?: boolean;
|
|
81
81
|
/** 风险阈值 */
|
|
82
82
|
riskThreshold?: number;
|
|
83
|
+
/** 最大并发扫描数(防止 DoS) */
|
|
84
|
+
maxConcurrentScans?: number;
|
|
85
|
+
/** 最大扫描文件大小(字节,默认 10MB) */
|
|
86
|
+
maxScanSize?: number;
|
|
87
|
+
/** 扫描超时时间(毫秒,默认 60 秒) */
|
|
88
|
+
scanTimeout?: number;
|
|
83
89
|
}
|
|
84
90
|
/**
|
|
85
91
|
* 恶意文件检测服务
|
|
@@ -180,14 +186,30 @@ export interface MaliciousDetectorOptions {
|
|
|
180
186
|
export declare class MaliciousFileDetector {
|
|
181
187
|
private readonly options?;
|
|
182
188
|
private readonly logger;
|
|
189
|
+
private activeScanCount;
|
|
190
|
+
private readonly maxConcurrentScans;
|
|
191
|
+
private readonly maxScanSize;
|
|
192
|
+
private readonly scanTimeout;
|
|
183
193
|
private readonly encodings;
|
|
184
194
|
private readonly maliciousPatterns;
|
|
185
195
|
private readonly suspiciousSignatures;
|
|
186
196
|
constructor(options?: MaliciousDetectorOptions);
|
|
187
197
|
/**
|
|
188
|
-
*
|
|
198
|
+
* 扫描文件(增强版 - 带并发控制和流式处理)
|
|
189
199
|
*/
|
|
190
|
-
scanFile(filePath
|
|
200
|
+
scanFile(filePath?: string, buffer?: Buffer): Promise<DetectionResult>;
|
|
201
|
+
/**
|
|
202
|
+
* 等待直到有可用的扫描槽位
|
|
203
|
+
*/
|
|
204
|
+
private waitForScanSlot;
|
|
205
|
+
/**
|
|
206
|
+
* 执行实际的扫描操作
|
|
207
|
+
*/
|
|
208
|
+
private performScan;
|
|
209
|
+
/**
|
|
210
|
+
* 使用流式处理读取文件(防止大文件占用过多内存)
|
|
211
|
+
*/
|
|
212
|
+
private readFileStream;
|
|
191
213
|
/**
|
|
192
214
|
* 检查签名
|
|
193
215
|
*/
|
|
@@ -227,9 +249,13 @@ export declare class MaliciousFileDetector {
|
|
|
227
249
|
*/
|
|
228
250
|
private scanWithClamAV;
|
|
229
251
|
/**
|
|
230
|
-
* 本地ClamAV
|
|
252
|
+
* 本地ClamAV扫描(增强安全性)
|
|
231
253
|
*/
|
|
232
254
|
private scanWithLocalClamAV;
|
|
255
|
+
/**
|
|
256
|
+
* 验证 ClamAV 命令(仅允许白名单)
|
|
257
|
+
*/
|
|
258
|
+
private validateClamAVCommand;
|
|
233
259
|
/**
|
|
234
260
|
* 验证文件路径,防止命令注入
|
|
235
261
|
*/
|
|
@@ -129,6 +129,8 @@ let MaliciousFileDetector = MaliciousFileDetector_1 = class MaliciousFileDetecto
|
|
|
129
129
|
constructor(options) {
|
|
130
130
|
this.options = options;
|
|
131
131
|
this.logger = new common_1.Logger(MaliciousFileDetector_1.name);
|
|
132
|
+
// 并发控制:当前正在扫描的文件数
|
|
133
|
+
this.activeScanCount = 0;
|
|
132
134
|
// 支持的编码列表
|
|
133
135
|
this.encodings = ['utf8', 'utf16le', 'latin1', 'ascii', 'base64'];
|
|
134
136
|
// 恶意模式库(多编码)
|
|
@@ -269,12 +271,16 @@ let MaliciousFileDetector = MaliciousFileDetector_1 = class MaliciousFileDetecto
|
|
|
269
271
|
},
|
|
270
272
|
];
|
|
271
273
|
this.options = Object.assign({ enabled: true, enableClamAV: false, clamavMode: 'local', clamavCommand: 'clamdscan', enableMultiEncoding: true, enableStructureAnalysis: true, riskThreshold: 50 }, options);
|
|
272
|
-
|
|
274
|
+
// 初始化并发控制参数
|
|
275
|
+
this.maxConcurrentScans = this.options.maxConcurrentScans || 5;
|
|
276
|
+
this.maxScanSize = this.options.maxScanSize || 10 * 1024 * 1024; // 默认 10MB
|
|
277
|
+
this.scanTimeout = this.options.scanTimeout || 60000; // 默认 60 秒
|
|
278
|
+
this.logger.debug(`MaliciousFileDetector initialized - maxConcurrent: ${this.maxConcurrentScans}, maxSize: ${this.maxScanSize}, timeout: ${this.scanTimeout}`);
|
|
273
279
|
}
|
|
274
280
|
/**
|
|
275
|
-
*
|
|
281
|
+
* 扫描文件(增强版 - 带并发控制和流式处理)
|
|
276
282
|
*/
|
|
277
|
-
scanFile(filePath) {
|
|
283
|
+
scanFile(filePath, buffer) {
|
|
278
284
|
return __awaiter(this, void 0, void 0, function* () {
|
|
279
285
|
// 检查是否启用
|
|
280
286
|
if (this.options.enabled === false) {
|
|
@@ -286,42 +292,116 @@ let MaliciousFileDetector = MaliciousFileDetector_1 = class MaliciousFileDetecto
|
|
|
286
292
|
isMalware: false,
|
|
287
293
|
};
|
|
288
294
|
}
|
|
289
|
-
|
|
290
|
-
|
|
295
|
+
// 如果没有文件路径且没有buffer,返回安全
|
|
296
|
+
if (!filePath && !buffer) {
|
|
297
|
+
this.logger.debug('No file path or buffer provided for scanning');
|
|
298
|
+
return {
|
|
299
|
+
safe: true,
|
|
300
|
+
threats: [],
|
|
301
|
+
riskScore: 0,
|
|
302
|
+
isMalware: false,
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
// 并发控制:等待直到有可用的扫描槽位
|
|
306
|
+
yield this.waitForScanSlot();
|
|
307
|
+
try {
|
|
308
|
+
// 增加活跃扫描计数
|
|
309
|
+
this.activeScanCount++;
|
|
310
|
+
this.logger.debug(`MaliciousFileDetector: Starting scan (${this.activeScanCount}/${this.maxConcurrentScans}): ${filePath || '(buffer)'}`);
|
|
311
|
+
// 设置超时保护
|
|
312
|
+
const scanPromise = this.performScan(filePath, buffer);
|
|
313
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
314
|
+
setTimeout(() => {
|
|
315
|
+
reject(new Error(`Scan timeout after ${this.scanTimeout}ms`));
|
|
316
|
+
}, this.scanTimeout);
|
|
317
|
+
});
|
|
318
|
+
// 等待扫描完成或超时
|
|
319
|
+
return yield Promise.race([scanPromise, timeoutPromise]);
|
|
320
|
+
}
|
|
321
|
+
finally {
|
|
322
|
+
// 释放扫描槽位
|
|
323
|
+
this.activeScanCount--;
|
|
324
|
+
this.logger.debug(`MaliciousFileDetector: Scan completed (${this.activeScanCount}/${this.maxConcurrentScans})`);
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* 等待直到有可用的扫描槽位
|
|
330
|
+
*/
|
|
331
|
+
waitForScanSlot() {
|
|
332
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
333
|
+
while (this.activeScanCount >= this.maxConcurrentScans) {
|
|
334
|
+
this.logger.debug(`MaliciousFileDetector: Waiting for scan slot (${this.activeScanCount}/${this.maxConcurrentScans})`);
|
|
335
|
+
// 等待 100ms 后重试
|
|
336
|
+
yield new Promise((resolve) => setTimeout(resolve, 100));
|
|
337
|
+
}
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* 执行实际的扫描操作
|
|
342
|
+
*/
|
|
343
|
+
performScan(filePath, inputBuffer) {
|
|
344
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
291
345
|
const threats = [];
|
|
292
346
|
let riskScore = 0;
|
|
293
347
|
const details = {};
|
|
294
348
|
try {
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
349
|
+
let scanBuffer;
|
|
350
|
+
let fileSize;
|
|
351
|
+
if (inputBuffer) {
|
|
352
|
+
// Use provided buffer directly
|
|
353
|
+
scanBuffer = inputBuffer;
|
|
354
|
+
fileSize = inputBuffer.length;
|
|
355
|
+
this.logger.debug(`MaliciousFileDetector: Using provided buffer - size: ${fileSize}`);
|
|
356
|
+
}
|
|
357
|
+
else if (filePath) {
|
|
358
|
+
// Read file from disk
|
|
359
|
+
const stats = yield fs.stat(filePath);
|
|
360
|
+
fileSize = stats.size;
|
|
361
|
+
this.logger.debug(`MaliciousFileDetector: File stats - size: ${stats.size}`);
|
|
362
|
+
// Skip malicious file detection for very small files (< 100 bytes)
|
|
363
|
+
// These are usually test placeholders or empty files
|
|
364
|
+
if (fileSize < 100) {
|
|
365
|
+
this.logger.debug(`MaliciousFileDetector: Skipping scan for very small file (${fileSize} bytes)`);
|
|
366
|
+
return {
|
|
367
|
+
safe: true,
|
|
368
|
+
threats: [],
|
|
369
|
+
riskScore: 0,
|
|
370
|
+
isMalware: false,
|
|
371
|
+
};
|
|
309
372
|
}
|
|
373
|
+
// 使用流式处理读取文件(防止大文件占用过多内存)
|
|
374
|
+
scanBuffer = yield this.readFileStream(filePath, stats.size);
|
|
375
|
+
this.logger.debug(`MaliciousFileDetector: File read successfully, buffer size: ${scanBuffer.length}`);
|
|
310
376
|
}
|
|
311
377
|
else {
|
|
312
|
-
//
|
|
313
|
-
|
|
378
|
+
// No input provided
|
|
379
|
+
return {
|
|
380
|
+
safe: true,
|
|
381
|
+
threats: [],
|
|
382
|
+
riskScore: 0,
|
|
383
|
+
isMalware: false,
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
// Skip malicious file detection for very small buffers (< 100 bytes)
|
|
387
|
+
if (scanBuffer.length < 100) {
|
|
388
|
+
this.logger.debug(`MaliciousFileDetector: Skipping scan for very small buffer (${scanBuffer.length} bytes)`);
|
|
389
|
+
return {
|
|
390
|
+
safe: true,
|
|
391
|
+
threats: [],
|
|
392
|
+
riskScore: 0,
|
|
393
|
+
isMalware: false,
|
|
394
|
+
};
|
|
314
395
|
}
|
|
315
|
-
this.logger.debug(`MaliciousFileDetector: File read successfully, buffer size: ${buffer.length}`);
|
|
316
396
|
// 1. 检查可疑签名
|
|
317
397
|
for (const signature of this.suspiciousSignatures) {
|
|
318
|
-
if (this.checkSignature(
|
|
398
|
+
if (this.checkSignature(scanBuffer, signature)) {
|
|
319
399
|
threats.push(signature.description);
|
|
320
400
|
riskScore += signature.riskScore;
|
|
321
401
|
this.logger.debug(`MaliciousFileDetector: Found suspicious signature: ${signature.description}, risk: ${signature.riskScore}`);
|
|
322
402
|
// 如果需要检查压缩比
|
|
323
|
-
if (signature.checkRatio) {
|
|
324
|
-
const ratio = yield this.checkCompressionRatio(filePath,
|
|
403
|
+
if (signature.checkRatio && filePath) {
|
|
404
|
+
const ratio = yield this.checkCompressionRatio(filePath, scanBuffer);
|
|
325
405
|
if (ratio > 100) {
|
|
326
406
|
threats.push('Suspicious compression ratio (possible zip bomb)');
|
|
327
407
|
riskScore += 50;
|
|
@@ -332,7 +412,7 @@ let MaliciousFileDetector = MaliciousFileDetector_1 = class MaliciousFileDetecto
|
|
|
332
412
|
}
|
|
333
413
|
// 2. 多编码检测(新增)
|
|
334
414
|
if (this.options.enableMultiEncoding) {
|
|
335
|
-
const encodingResult = this.detectMultiEncodingThreats(
|
|
415
|
+
const encodingResult = this.detectMultiEncodingThreats(scanBuffer);
|
|
336
416
|
if (encodingResult.threats.length > 0) {
|
|
337
417
|
threats.push(...encodingResult.threats);
|
|
338
418
|
riskScore += encodingResult.riskScore;
|
|
@@ -342,7 +422,7 @@ let MaliciousFileDetector = MaliciousFileDetector_1 = class MaliciousFileDetecto
|
|
|
342
422
|
}
|
|
343
423
|
// 3. 文件结构分析(新增)
|
|
344
424
|
if (this.options.enableStructureAnalysis) {
|
|
345
|
-
const structureResult = yield this.analyzeFileStructure(filePath,
|
|
425
|
+
const structureResult = yield this.analyzeFileStructure(filePath, scanBuffer);
|
|
346
426
|
if (structureResult.anomalies.length > 0) {
|
|
347
427
|
threats.push(...structureResult.anomalies);
|
|
348
428
|
riskScore += structureResult.riskScore;
|
|
@@ -351,7 +431,7 @@ let MaliciousFileDetector = MaliciousFileDetector_1 = class MaliciousFileDetecto
|
|
|
351
431
|
}
|
|
352
432
|
}
|
|
353
433
|
// 4. ClamAV扫描(新增,可选)
|
|
354
|
-
if (this.options.enableClamAV) {
|
|
434
|
+
if (this.options.enableClamAV && filePath) {
|
|
355
435
|
const clamavResult = yield this.scanWithClamAV(filePath);
|
|
356
436
|
details.clamavResult = clamavResult;
|
|
357
437
|
if (clamavResult.infected) {
|
|
@@ -361,32 +441,45 @@ let MaliciousFileDetector = MaliciousFileDetector_1 = class MaliciousFileDetecto
|
|
|
361
441
|
}
|
|
362
442
|
}
|
|
363
443
|
// 5. 检查文件名
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
444
|
+
if (filePath) {
|
|
445
|
+
const fileName = path.basename(filePath);
|
|
446
|
+
if (this.hasSuspiciousName(fileName)) {
|
|
447
|
+
threats.push('Suspicious filename pattern');
|
|
448
|
+
riskScore += 20;
|
|
449
|
+
this.logger.debug(`MaliciousFileDetector: Suspicious filename pattern detected: ${fileName}`);
|
|
450
|
+
}
|
|
451
|
+
// 6. 检查双扩展名
|
|
452
|
+
if (this.hasDoubleExtension(fileName)) {
|
|
453
|
+
threats.push('Double extension detected');
|
|
454
|
+
riskScore += 30;
|
|
455
|
+
this.logger.debug(`MaliciousFileDetector: Double extension detected: ${fileName}`);
|
|
456
|
+
}
|
|
457
|
+
// 7. 检查隐藏扩展名技巧
|
|
458
|
+
if (this.hasHiddenExtension(fileName)) {
|
|
459
|
+
threats.push('Hidden extension trick detected');
|
|
460
|
+
riskScore += 40;
|
|
461
|
+
this.logger.debug(`MaliciousFileDetector: Hidden extension trick detected: ${fileName}`);
|
|
462
|
+
}
|
|
369
463
|
}
|
|
370
|
-
//
|
|
371
|
-
if (
|
|
464
|
+
// 8. 检查文件大小异常
|
|
465
|
+
if (fileSize > 500 * 1024 * 1024) {
|
|
372
466
|
// 大于500MB
|
|
373
467
|
threats.push('Unusually large file size');
|
|
374
468
|
riskScore += 15;
|
|
375
|
-
this.logger.debug(`MaliciousFileDetector: Unusually large file size: ${
|
|
469
|
+
this.logger.debug(`MaliciousFileDetector: Unusually large file size: ${fileSize}`);
|
|
376
470
|
}
|
|
377
|
-
//
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
471
|
+
// 9. 动态阈值调整(小文件更宽松)
|
|
472
|
+
let threshold = this.options.riskThreshold || 50;
|
|
473
|
+
if (fileSize < 1024) {
|
|
474
|
+
// 小于1KB的文件,提高阈值(减少误报)
|
|
475
|
+
threshold = Math.max(threshold, 80);
|
|
476
|
+
this.logger.debug(`MaliciousFileDetector: Using increased threshold for small file (${fileSize} bytes): ${threshold}`);
|
|
382
477
|
}
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
this.logger.debug(`MaliciousFileDetector: Hidden extension trick detected: ${fileName}`);
|
|
478
|
+
else if (fileSize < 10 * 1024) {
|
|
479
|
+
// 小于10KB的文件,适当提高阈值
|
|
480
|
+
threshold = Math.max(threshold, 65);
|
|
481
|
+
this.logger.debug(`MaliciousFileDetector: Using increased threshold for medium-small file (${fileSize} bytes): ${threshold}`);
|
|
388
482
|
}
|
|
389
|
-
const threshold = this.options.riskThreshold || 50;
|
|
390
483
|
const isSafe = riskScore < threshold;
|
|
391
484
|
this.logger.debug(`MaliciousFileDetector: Final result - safe: ${isSafe}, riskScore: ${riskScore}, threshold: ${threshold}, threats: ${threats.join(', ')}`);
|
|
392
485
|
return {
|
|
@@ -408,6 +501,46 @@ let MaliciousFileDetector = MaliciousFileDetector_1 = class MaliciousFileDetecto
|
|
|
408
501
|
}
|
|
409
502
|
});
|
|
410
503
|
}
|
|
504
|
+
/**
|
|
505
|
+
* 使用流式处理读取文件(防止大文件占用过多内存)
|
|
506
|
+
*/
|
|
507
|
+
readFileStream(filePath, fileSize) {
|
|
508
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
509
|
+
// 限制读取大小
|
|
510
|
+
const readSize = Math.min(fileSize, this.maxScanSize);
|
|
511
|
+
// 如果文件较小,直接读取
|
|
512
|
+
if (fileSize <= 1024 * 1024) {
|
|
513
|
+
// 1MB 以下直接读取
|
|
514
|
+
return fs.readFile(filePath);
|
|
515
|
+
}
|
|
516
|
+
// 大文件使用流式处理
|
|
517
|
+
return new Promise((resolve, reject) => {
|
|
518
|
+
const chunks = [];
|
|
519
|
+
let totalRead = 0;
|
|
520
|
+
const stream = fs.createReadStream(filePath, {
|
|
521
|
+
highWaterMark: 64 * 1024, // 每次读取 64KB
|
|
522
|
+
end: readSize - 1, // 只读取前 N 字节
|
|
523
|
+
});
|
|
524
|
+
stream.on('data', (chunk) => {
|
|
525
|
+
chunks.push(chunk);
|
|
526
|
+
totalRead += chunk.length;
|
|
527
|
+
// 额外的安全检查:如果超过限制,立即停止
|
|
528
|
+
if (totalRead > this.maxScanSize) {
|
|
529
|
+
stream.destroy();
|
|
530
|
+
reject(new Error(`File size exceeds scan limit: ${this.maxScanSize}`));
|
|
531
|
+
}
|
|
532
|
+
});
|
|
533
|
+
stream.on('end', () => {
|
|
534
|
+
const buffer = Buffer.concat(chunks);
|
|
535
|
+
this.logger.debug(`Read ${buffer.length} bytes from ${filePath} using stream`);
|
|
536
|
+
resolve(buffer);
|
|
537
|
+
});
|
|
538
|
+
stream.on('error', (error) => {
|
|
539
|
+
reject(error);
|
|
540
|
+
});
|
|
541
|
+
});
|
|
542
|
+
});
|
|
543
|
+
}
|
|
411
544
|
/**
|
|
412
545
|
* 检查签名
|
|
413
546
|
*/
|
|
@@ -660,46 +793,84 @@ let MaliciousFileDetector = MaliciousFileDetector_1 = class MaliciousFileDetecto
|
|
|
660
793
|
});
|
|
661
794
|
}
|
|
662
795
|
/**
|
|
663
|
-
* 本地ClamAV
|
|
796
|
+
* 本地ClamAV扫描(增强安全性)
|
|
664
797
|
*/
|
|
665
798
|
scanWithLocalClamAV(filePath) {
|
|
666
799
|
return __awaiter(this, void 0, void 0, function* () {
|
|
667
800
|
try {
|
|
668
|
-
//
|
|
801
|
+
// 1. 验证 ClamAV 命令(仅允许白名单命令)
|
|
802
|
+
this.validateClamAVCommand();
|
|
803
|
+
// 2. 验证文件路径安全性
|
|
669
804
|
this.validateFilePath(filePath);
|
|
805
|
+
// 3. 验证文件存在且可读
|
|
806
|
+
const absoluteFilePath = path.resolve(filePath);
|
|
807
|
+
if (!fs.existsSync(absoluteFilePath)) {
|
|
808
|
+
throw new Error(`File does not exist: ${filePath}`);
|
|
809
|
+
}
|
|
670
810
|
// 使用 spawn 和参数数组,避免命令注入
|
|
671
811
|
const { spawn } = yield Promise.resolve().then(() => require('child_process'));
|
|
672
812
|
return new Promise((resolve, reject) => {
|
|
673
|
-
const args = ['--no-summary',
|
|
674
|
-
|
|
813
|
+
const args = ['--no-summary', absoluteFilePath];
|
|
814
|
+
// 使用安全选项启动进程
|
|
815
|
+
const child = spawn(this.options.clamavCommand, args, {
|
|
816
|
+
timeout: 30000, // 进程级超时
|
|
817
|
+
windowsHide: true, // Windows 下隐藏窗口
|
|
818
|
+
shell: false, // 禁用 shell,防止 shell 注入
|
|
819
|
+
});
|
|
675
820
|
let stdout = '';
|
|
676
821
|
let stderr = '';
|
|
822
|
+
let killed = false;
|
|
823
|
+
// 限制输出大小,防止内存溢出
|
|
824
|
+
const MAX_OUTPUT_SIZE = 1024 * 1024; // 1MB
|
|
677
825
|
child.stdout.on('data', (data) => {
|
|
826
|
+
if (stdout.length + data.length > MAX_OUTPUT_SIZE) {
|
|
827
|
+
this.logger.warn('ClamAV output size exceeded limit');
|
|
828
|
+
child.kill('SIGKILL');
|
|
829
|
+
killed = true;
|
|
830
|
+
reject(new Error('ClamAV output size exceeded limit'));
|
|
831
|
+
return;
|
|
832
|
+
}
|
|
678
833
|
stdout += data.toString();
|
|
679
834
|
});
|
|
680
835
|
child.stderr.on('data', (data) => {
|
|
836
|
+
if (stderr.length + data.length > MAX_OUTPUT_SIZE) {
|
|
837
|
+
this.logger.warn('ClamAV error output size exceeded limit');
|
|
838
|
+
child.kill('SIGKILL');
|
|
839
|
+
killed = true;
|
|
840
|
+
reject(new Error('ClamAV error output size exceeded limit'));
|
|
841
|
+
return;
|
|
842
|
+
}
|
|
681
843
|
stderr += data.toString();
|
|
682
844
|
});
|
|
683
845
|
// 设置超时
|
|
684
846
|
const timeout = setTimeout(() => {
|
|
685
|
-
child.
|
|
686
|
-
|
|
847
|
+
if (!killed && !child.killed) {
|
|
848
|
+
this.logger.warn('ClamAV scan timeout, killing process');
|
|
849
|
+
child.kill('SIGKILL');
|
|
850
|
+
killed = true;
|
|
851
|
+
}
|
|
687
852
|
}, 30000);
|
|
688
853
|
child.on('close', (code) => {
|
|
689
854
|
clearTimeout(timeout);
|
|
855
|
+
// 如果已经被 killed,不再处理
|
|
856
|
+
if (killed) {
|
|
857
|
+
return;
|
|
858
|
+
}
|
|
859
|
+
// ClamAV 退出码:0=无病毒, 1=发现病毒, 其他=错误
|
|
690
860
|
if (code !== 0 && code !== 1) {
|
|
691
|
-
reject(new Error(`ClamAV process exited with code ${code}`));
|
|
861
|
+
reject(new Error(`ClamAV process exited with code ${code}: ${stderr}`));
|
|
692
862
|
return;
|
|
693
863
|
}
|
|
694
864
|
// 解析ClamAV输出
|
|
695
865
|
const output = stdout + stderr;
|
|
696
866
|
if (output.includes('FOUND')) {
|
|
697
|
-
//
|
|
867
|
+
// 提取病毒名称(限制长度)
|
|
698
868
|
const match = output.match(/: ([^:]+) FOUND/);
|
|
869
|
+
const virusName = match ? match[1].substring(0, 100) : 'Unknown';
|
|
699
870
|
resolve({
|
|
700
871
|
scanned: true,
|
|
701
872
|
infected: true,
|
|
702
|
-
virusName
|
|
873
|
+
virusName,
|
|
703
874
|
});
|
|
704
875
|
}
|
|
705
876
|
else {
|
|
@@ -711,7 +882,18 @@ let MaliciousFileDetector = MaliciousFileDetector_1 = class MaliciousFileDetecto
|
|
|
711
882
|
});
|
|
712
883
|
child.on('error', (error) => {
|
|
713
884
|
clearTimeout(timeout);
|
|
714
|
-
|
|
885
|
+
if (!killed) {
|
|
886
|
+
// 尝试清理进程
|
|
887
|
+
try {
|
|
888
|
+
if (!child.killed) {
|
|
889
|
+
child.kill('SIGKILL');
|
|
890
|
+
}
|
|
891
|
+
}
|
|
892
|
+
catch (killError) {
|
|
893
|
+
this.logger.error(`Failed to kill ClamAV process: ${killError.message}`);
|
|
894
|
+
}
|
|
895
|
+
reject(error);
|
|
896
|
+
}
|
|
715
897
|
});
|
|
716
898
|
});
|
|
717
899
|
}
|
|
@@ -726,6 +908,23 @@ let MaliciousFileDetector = MaliciousFileDetector_1 = class MaliciousFileDetecto
|
|
|
726
908
|
}
|
|
727
909
|
});
|
|
728
910
|
}
|
|
911
|
+
/**
|
|
912
|
+
* 验证 ClamAV 命令(仅允许白名单)
|
|
913
|
+
*/
|
|
914
|
+
validateClamAVCommand() {
|
|
915
|
+
const allowedCommands = ['clamscan', 'clamdscan'];
|
|
916
|
+
const commandBasename = path.basename(this.options.clamavCommand);
|
|
917
|
+
if (!allowedCommands.includes(commandBasename)) {
|
|
918
|
+
throw new Error(`Invalid ClamAV command: ${commandBasename}. Allowed: ${allowedCommands.join(', ')}`);
|
|
919
|
+
}
|
|
920
|
+
// 检查命令路径不包含危险字符
|
|
921
|
+
const dangerousChars = [';', '&', '|', '$', '`', '\n', '\r'];
|
|
922
|
+
for (const char of dangerousChars) {
|
|
923
|
+
if (this.options.clamavCommand.includes(char)) {
|
|
924
|
+
throw new Error(`Dangerous character in ClamAV command path: ${char}`);
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
}
|
|
729
928
|
/**
|
|
730
929
|
* 验证文件路径,防止命令注入
|
|
731
930
|
*/
|
|
@@ -36,9 +36,13 @@ export declare class DynamicImportUtil {
|
|
|
36
36
|
*/
|
|
37
37
|
static importExcelJs(): Promise<any>;
|
|
38
38
|
/**
|
|
39
|
-
* 动态导入
|
|
39
|
+
* 动态导入 XLSX 处理库
|
|
40
40
|
*/
|
|
41
|
-
static
|
|
41
|
+
static importXlsx(): Promise<any>;
|
|
42
|
+
/**
|
|
43
|
+
* 动态导入 fast-csv 处理库
|
|
44
|
+
*/
|
|
45
|
+
static importFastCsv(): Promise<any>;
|
|
42
46
|
/**
|
|
43
47
|
* 检查依赖是否已安装
|
|
44
48
|
*/
|
|
@@ -108,15 +108,27 @@ class DynamicImportUtil {
|
|
|
108
108
|
});
|
|
109
109
|
}
|
|
110
110
|
/**
|
|
111
|
-
* 动态导入
|
|
111
|
+
* 动态导入 XLSX 处理库
|
|
112
112
|
*/
|
|
113
|
-
static
|
|
113
|
+
static importXlsx() {
|
|
114
114
|
return __awaiter(this, void 0, void 0, function* () {
|
|
115
|
-
const
|
|
115
|
+
const xlsxModule = yield tryImport('xlsx');
|
|
116
|
+
if (!xlsxModule) {
|
|
117
|
+
throw new Error('XLSX is not installed. Please install it using: npm install xlsx');
|
|
118
|
+
}
|
|
119
|
+
return xlsxModule.default || xlsxModule;
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* 动态导入 fast-csv 处理库
|
|
124
|
+
*/
|
|
125
|
+
static importFastCsv() {
|
|
126
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
127
|
+
const csvModule = yield tryImport('fast-csv');
|
|
116
128
|
if (!csvModule) {
|
|
117
|
-
throw new Error('csv
|
|
129
|
+
throw new Error('fast-csv is not installed. Please install it using: npm install fast-csv');
|
|
118
130
|
}
|
|
119
|
-
return csvModule;
|
|
131
|
+
return csvModule.default || csvModule;
|
|
120
132
|
});
|
|
121
133
|
}
|
|
122
134
|
/**
|
|
@@ -75,8 +75,10 @@ export declare const HttpTimeout: (timeoutMs: number) => (target: any, propertyK
|
|
|
75
75
|
* 代理装饰器
|
|
76
76
|
*/
|
|
77
77
|
export declare const HttpUseProxy: (options: {
|
|
78
|
-
|
|
79
|
-
|
|
78
|
+
enabled?: boolean;
|
|
79
|
+
fromEnvironment?: boolean;
|
|
80
|
+
host?: string;
|
|
81
|
+
port?: number;
|
|
80
82
|
protocol?: "http" | "https";
|
|
81
83
|
auth?: {
|
|
82
84
|
username: string;
|
|
@@ -183,7 +183,8 @@ exports.HttpTimeout = HttpTimeout;
|
|
|
183
183
|
*/
|
|
184
184
|
const HttpUseProxy = (options) => {
|
|
185
185
|
return (target, propertyKey, descriptor) => {
|
|
186
|
-
|
|
186
|
+
const proxyConfig = Object.assign({ enabled: options.enabled !== false }, options);
|
|
187
|
+
(0, common_1.SetMetadata)(`${exports.PROXY_OPTIONS_KEY}_${propertyKey}`, proxyConfig)(descriptor.value);
|
|
187
188
|
return descriptor;
|
|
188
189
|
};
|
|
189
190
|
};
|
|
@@ -21,22 +21,18 @@ let HttpLogEntity = class HttpLogEntity extends common_1.AbstractUuidPrimaryEnti
|
|
|
21
21
|
exports.HttpLogEntity = HttpLogEntity;
|
|
22
22
|
__decorate([
|
|
23
23
|
(0, typeorm_1.Column)({ type: 'varchar', length: 36, nullable: true }),
|
|
24
|
-
(0, typeorm_1.Index)(),
|
|
25
24
|
__metadata("design:type", String)
|
|
26
25
|
], HttpLogEntity.prototype, "requestId", void 0);
|
|
27
26
|
__decorate([
|
|
28
27
|
(0, typeorm_1.Column)({ type: 'varchar', length: 36, nullable: true }),
|
|
29
|
-
(0, typeorm_1.Index)(),
|
|
30
28
|
__metadata("design:type", String)
|
|
31
29
|
], HttpLogEntity.prototype, "userId", void 0);
|
|
32
30
|
__decorate([
|
|
33
31
|
(0, typeorm_1.Column)({ type: 'varchar', length: 10 }),
|
|
34
|
-
(0, typeorm_1.Index)(),
|
|
35
32
|
__metadata("design:type", String)
|
|
36
33
|
], HttpLogEntity.prototype, "method", void 0);
|
|
37
34
|
__decorate([
|
|
38
|
-
(0, typeorm_1.Column)({ type: '
|
|
39
|
-
(0, typeorm_1.Index)(),
|
|
35
|
+
(0, typeorm_1.Column)({ type: 'varchar' }),
|
|
40
36
|
__metadata("design:type", String)
|
|
41
37
|
], HttpLogEntity.prototype, "url", void 0);
|
|
42
38
|
__decorate([
|
|
@@ -53,7 +49,6 @@ __decorate([
|
|
|
53
49
|
], HttpLogEntity.prototype, "params", void 0);
|
|
54
50
|
__decorate([
|
|
55
51
|
(0, typeorm_1.Column)({ type: 'int', nullable: true }),
|
|
56
|
-
(0, typeorm_1.Index)(),
|
|
57
52
|
__metadata("design:type", Number)
|
|
58
53
|
], HttpLogEntity.prototype, "statusCode", void 0);
|
|
59
54
|
__decorate([
|
|
@@ -66,7 +61,6 @@ __decorate([
|
|
|
66
61
|
], HttpLogEntity.prototype, "attemptCount", void 0);
|
|
67
62
|
__decorate([
|
|
68
63
|
(0, typeorm_1.Column)({ type: 'boolean', default: false }),
|
|
69
|
-
(0, typeorm_1.Index)(),
|
|
70
64
|
__metadata("design:type", Boolean)
|
|
71
65
|
], HttpLogEntity.prototype, "success", void 0);
|
|
72
66
|
__decorate([
|
|
@@ -103,7 +97,6 @@ __decorate([
|
|
|
103
97
|
], HttpLogEntity.prototype, "serviceName", void 0);
|
|
104
98
|
__decorate([
|
|
105
99
|
(0, typeorm_1.Column)({ type: 'varchar', length: 200, nullable: true }),
|
|
106
|
-
(0, typeorm_1.Index)(),
|
|
107
100
|
__metadata("design:type", String)
|
|
108
101
|
], HttpLogEntity.prototype, "operationName", void 0);
|
|
109
102
|
__decorate([
|
|
@@ -140,7 +133,6 @@ exports.HttpLogEntity = HttpLogEntity = __decorate([
|
|
|
140
133
|
(0, typeorm_1.Index)(['requestId']),
|
|
141
134
|
(0, typeorm_1.Index)(['userId']),
|
|
142
135
|
(0, typeorm_1.Index)(['method']),
|
|
143
|
-
(0, typeorm_1.Index)(['url']),
|
|
144
136
|
(0, typeorm_1.Index)(['statusCode']),
|
|
145
137
|
(0, typeorm_1.Index)(['success']),
|
|
146
138
|
(0, typeorm_1.Index)(['createdAt']),
|