@lyxa.ai/core 1.0.15 → 1.0.17
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/index.d.ts +4 -4
- package/dist/index.js +6 -7
- package/dist/index.js.map +1 -1
- package/dist/libraries/auth/index.d.ts +3 -3
- package/dist/libraries/auth/index.js +26 -26
- package/dist/libraries/auth/index.js.map +1 -1
- package/dist/libraries/auth/refreshtoken.d.ts +1 -1
- package/dist/libraries/auth/refreshtoken.js +6 -10
- package/dist/libraries/auth/refreshtoken.js.map +1 -1
- package/dist/libraries/auth/repository.d.ts +3 -3
- package/dist/libraries/auth/repository.js +1 -5
- package/dist/libraries/auth/repository.js.map +1 -1
- package/dist/libraries/configuration/index.d.ts +2 -2
- package/dist/libraries/configuration/index.js +20 -20
- package/dist/libraries/configuration/index.js.map +1 -1
- package/dist/libraries/configuration/types/EnvironmentConfigurationType.js.map +1 -1
- package/dist/libraries/dispatcher/index.d.ts +2 -2
- package/dist/libraries/dispatcher/index.js +2 -2
- package/dist/libraries/dispatcher/index.js.map +1 -1
- package/dist/libraries/event/BaseEvent.js.map +1 -1
- package/dist/libraries/event/decorators/metadata.d.ts +1 -1
- package/dist/libraries/event/decorators/metadata.js.map +1 -1
- package/dist/libraries/event/decorators/subscribe.js.map +1 -1
- package/dist/libraries/event/index.d.ts +1 -1
- package/dist/libraries/event/index.js +6 -6
- package/dist/libraries/event/index.js.map +1 -1
- package/dist/libraries/event/registry/SubscriptionRegistry.js.map +1 -1
- package/dist/libraries/event/test/OrderCreationEvent.d.ts +1 -1
- package/dist/libraries/event/test/OrderCreationEvent.js +9 -6
- package/dist/libraries/event/test/OrderCreationEvent.js.map +1 -1
- package/dist/libraries/firebase/index.d.ts +1 -1
- package/dist/libraries/firebase/index.js.map +1 -1
- package/dist/libraries/index.d.ts +9 -9
- package/dist/libraries/index.js +1 -1
- package/dist/libraries/index.js.map +1 -1
- package/dist/libraries/logger/index.d.ts +1 -1
- package/dist/libraries/logger/index.js +9 -9
- package/dist/libraries/logger/index.js.map +1 -1
- package/dist/libraries/mongo/index.d.ts +1 -1
- package/dist/libraries/mongo/index.js +11 -11
- package/dist/libraries/mongo/index.js.map +1 -1
- package/dist/libraries/mongo/models/activity-log.model.d.ts +1 -2
- package/dist/libraries/mongo/models/activity-log.model.js +1 -2
- package/dist/libraries/mongo/models/activity-log.model.js.map +1 -1
- package/dist/libraries/mongo/models/admin-access-control.model.d.ts +1 -2
- package/dist/libraries/mongo/models/admin-access-control.model.js +1 -2
- package/dist/libraries/mongo/models/admin-access-control.model.js.map +1 -1
- package/dist/libraries/mongo/models/admin.model.d.ts +3 -2
- package/dist/libraries/mongo/models/admin.model.js +20 -3
- package/dist/libraries/mongo/models/admin.model.js.map +1 -1
- package/dist/libraries/mongo/models/app-screen-setting.model.d.ts +0 -2
- package/dist/libraries/mongo/models/app-screen-setting.model.js +1 -2
- package/dist/libraries/mongo/models/app-screen-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/attribute.model.d.ts +1 -2
- package/dist/libraries/mongo/models/attribute.model.js +1 -2
- package/dist/libraries/mongo/models/attribute.model.js.map +1 -1
- package/dist/libraries/mongo/models/banner.model.d.ts +1 -2
- package/dist/libraries/mongo/models/banner.model.js +1 -2
- package/dist/libraries/mongo/models/banner.model.js.map +1 -1
- package/dist/libraries/mongo/models/base/base-coupon.model.js.map +1 -1
- package/dist/libraries/mongo/models/base/base-review.model.d.ts +1 -1
- package/dist/libraries/mongo/models/base/base-review.model.js +2 -2
- package/dist/libraries/mongo/models/base/base-review.model.js.map +1 -1
- package/dist/libraries/mongo/models/bob-finance.model.d.ts +2 -3
- package/dist/libraries/mongo/models/bob-finance.model.js +2 -3
- package/dist/libraries/mongo/models/bob-finance.model.js.map +1 -1
- package/dist/libraries/mongo/models/brand.model.d.ts +0 -2
- package/dist/libraries/mongo/models/brand.model.js +1 -2
- package/dist/libraries/mongo/models/brand.model.js.map +1 -1
- package/dist/libraries/mongo/models/category.model.d.ts +1 -2
- package/dist/libraries/mongo/models/category.model.js +1 -2
- package/dist/libraries/mongo/models/category.model.js.map +1 -1
- package/dist/libraries/mongo/models/core-auth-identity.model.js.map +1 -1
- package/dist/libraries/mongo/models/core-user.model.js.map +1 -1
- package/dist/libraries/mongo/models/counter.model.d.ts +0 -2
- package/dist/libraries/mongo/models/counter.model.js +1 -2
- package/dist/libraries/mongo/models/counter.model.js.map +1 -1
- package/dist/libraries/mongo/models/coupon.model.d.ts +0 -2
- package/dist/libraries/mongo/models/coupon.model.js +4 -3
- package/dist/libraries/mongo/models/coupon.model.js.map +1 -1
- package/dist/libraries/mongo/models/deal-setting.model.d.ts +0 -2
- package/dist/libraries/mongo/models/deal-setting.model.js +1 -2
- package/dist/libraries/mongo/models/deal-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/dish.model.d.ts +1 -2
- package/dist/libraries/mongo/models/dish.model.js +1 -2
- package/dist/libraries/mongo/models/dish.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/attribute-item.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/attribute-map.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/business-development-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/charge-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/charge.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/courier-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/currency-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/currency.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/featured-item.mode.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/otp-fields.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/package.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/parent-document.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/payout-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/price.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/product-nutrition.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/referral-discount-config.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/rider-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/service-fee-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/shop-document.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/subscription-summary.model.js.map +1 -1
- package/dist/libraries/mongo/models/embedded/zone-geometry.mode.js.map +1 -1
- package/dist/libraries/mongo/models/faq.model.d.ts +0 -2
- package/dist/libraries/mongo/models/faq.model.js +1 -2
- package/dist/libraries/mongo/models/faq.model.js.map +1 -1
- package/dist/libraries/mongo/models/favourite.model.d.ts +3 -4
- package/dist/libraries/mongo/models/favourite.model.js +3 -4
- package/dist/libraries/mongo/models/favourite.model.js.map +1 -1
- package/dist/libraries/mongo/models/featured-setting.model.d.ts +0 -2
- package/dist/libraries/mongo/models/featured-setting.model.js +1 -2
- package/dist/libraries/mongo/models/featured-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/filter-container.model.d.ts +0 -1
- package/dist/libraries/mongo/models/filter-container.model.js +1 -2
- package/dist/libraries/mongo/models/filter-container.model.js.map +1 -1
- package/dist/libraries/mongo/models/index.d.ts +114 -7
- package/dist/libraries/mongo/models/index.js +118 -7
- package/dist/libraries/mongo/models/index.js.map +1 -1
- package/dist/libraries/mongo/models/list-container.model.d.ts +2 -3
- package/dist/libraries/mongo/models/list-container.model.js +2 -3
- package/dist/libraries/mongo/models/list-container.model.js.map +1 -1
- package/dist/libraries/mongo/models/loyalty-point-category.model.d.ts +0 -2
- package/dist/libraries/mongo/models/loyalty-point-category.model.js +1 -2
- package/dist/libraries/mongo/models/loyalty-point-category.model.js.map +1 -1
- package/dist/libraries/mongo/models/loyalty-point-setting.model.d.ts +0 -2
- package/dist/libraries/mongo/models/loyalty-point-setting.model.js +1 -2
- package/dist/libraries/mongo/models/loyalty-point-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/marketing.model.d.ts +2 -3
- package/dist/libraries/mongo/models/marketing.model.js +13 -5
- package/dist/libraries/mongo/models/marketing.model.js.map +1 -1
- package/dist/libraries/mongo/models/meal-plan.model.d.ts +0 -2
- package/dist/libraries/mongo/models/meal-plan.model.js +1 -2
- package/dist/libraries/mongo/models/meal-plan.model.js.map +1 -1
- package/dist/libraries/mongo/models/notification.model.d.ts +8 -9
- package/dist/libraries/mongo/models/notification.model.js +8 -9
- package/dist/libraries/mongo/models/notification.model.js.map +1 -1
- package/dist/libraries/mongo/models/nutrition.model.d.ts +0 -2
- package/dist/libraries/mongo/models/nutrition.model.js +1 -2
- package/dist/libraries/mongo/models/nutrition.model.js.map +1 -1
- package/dist/libraries/mongo/models/order.model.js.map +1 -1
- package/dist/libraries/mongo/models/parent.model.d.ts +3 -4
- package/dist/libraries/mongo/models/parent.model.js +8 -5
- package/dist/libraries/mongo/models/parent.model.js.map +1 -1
- package/dist/libraries/mongo/models/payout.model.js.map +1 -1
- package/dist/libraries/mongo/models/product-marketing.model.d.ts +3 -4
- package/dist/libraries/mongo/models/product-marketing.model.js +3 -4
- package/dist/libraries/mongo/models/product-marketing.model.js.map +1 -1
- package/dist/libraries/mongo/models/product.model.d.ts +1 -3
- package/dist/libraries/mongo/models/product.model.js +8 -4
- package/dist/libraries/mongo/models/product.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/buy1-get1-marketing.model.d.ts +1 -2
- package/dist/libraries/mongo/models/providers/buy1-get1-marketing.model.js +1 -2
- package/dist/libraries/mongo/models/providers/buy1-get1-marketing.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/core-apple-auth-identity.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/core-email-auth-identity.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/core-google-auth-identity.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/core-phone-auth-identity.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/custom-coupon.model.d.ts +1 -2
- package/dist/libraries/mongo/models/providers/custom-coupon.model.js +1 -3
- package/dist/libraries/mongo/models/providers/custom-coupon.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/discount-marketing.model.d.ts +1 -2
- package/dist/libraries/mongo/models/providers/discount-marketing.model.js +1 -2
- package/dist/libraries/mongo/models/providers/discount-marketing.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/featured-marketing.model.d.ts +0 -2
- package/dist/libraries/mongo/models/providers/featured-marketing.model.js +1 -2
- package/dist/libraries/mongo/models/providers/featured-marketing.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/free-delivery-marketing.model.d.ts +0 -2
- package/dist/libraries/mongo/models/providers/free-delivery-marketing.model.js +1 -2
- package/dist/libraries/mongo/models/providers/free-delivery-marketing.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/global-coupon.model.d.ts +0 -2
- package/dist/libraries/mongo/models/providers/global-coupon.model.js +1 -4
- package/dist/libraries/mongo/models/providers/global-coupon.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/individual-store-coupon.model.d.ts +1 -2
- package/dist/libraries/mongo/models/providers/individual-store-coupon.model.js +1 -3
- package/dist/libraries/mongo/models/providers/individual-store-coupon.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/individual-user-coupon.model.d.ts +1 -2
- package/dist/libraries/mongo/models/providers/individual-user-coupon.model.js +1 -3
- package/dist/libraries/mongo/models/providers/individual-user-coupon.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/loyalty-point-marketing.model.d.ts +1 -2
- package/dist/libraries/mongo/models/providers/loyalty-point-marketing.model.js +1 -2
- package/dist/libraries/mongo/models/providers/loyalty-point-marketing.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/punch-marketing.model.d.ts +0 -2
- package/dist/libraries/mongo/models/providers/punch-marketing.model.js +1 -2
- package/dist/libraries/mongo/models/providers/punch-marketing.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/referral-code-coupon.model.d.ts +1 -2
- package/dist/libraries/mongo/models/providers/referral-code-coupon.model.js +1 -2
- package/dist/libraries/mongo/models/providers/referral-code-coupon.model.js.map +1 -1
- package/dist/libraries/mongo/models/providers/referral-reward-coupon.model.d.ts +1 -2
- package/dist/libraries/mongo/models/providers/referral-reward-coupon.model.js +1 -3
- package/dist/libraries/mongo/models/providers/referral-reward-coupon.model.js.map +1 -1
- package/dist/libraries/mongo/models/punch-marketing-history.model.d.ts +1 -2
- package/dist/libraries/mongo/models/punch-marketing-history.model.js +1 -2
- package/dist/libraries/mongo/models/punch-marketing-history.model.js.map +1 -1
- package/dist/libraries/mongo/models/rating-setting.model.d.ts +0 -2
- package/dist/libraries/mongo/models/rating-setting.model.js +1 -2
- package/dist/libraries/mongo/models/rating-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/referral-setting.model.d.ts +0 -2
- package/dist/libraries/mongo/models/referral-setting.model.js +1 -2
- package/dist/libraries/mongo/models/referral-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/request-area.model.d.ts +1 -2
- package/dist/libraries/mongo/models/request-area.model.js +1 -2
- package/dist/libraries/mongo/models/request-area.model.js.map +1 -1
- package/dist/libraries/mongo/models/rider-review.model.d.ts +1 -2
- package/dist/libraries/mongo/models/rider-review.model.js +1 -2
- package/dist/libraries/mongo/models/rider-review.model.js.map +1 -1
- package/dist/libraries/mongo/models/rider.model.js.map +1 -1
- package/dist/libraries/mongo/models/role.model.d.ts +0 -2
- package/dist/libraries/mongo/models/role.model.js +1 -3
- package/dist/libraries/mongo/models/role.model.js.map +1 -1
- package/dist/libraries/mongo/models/setting.model.d.ts +6 -8
- package/dist/libraries/mongo/models/setting.model.js +7 -8
- package/dist/libraries/mongo/models/setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/shared/address.model.d.ts +1 -1
- package/dist/libraries/mongo/models/shared/address.model.js.map +1 -1
- package/dist/libraries/mongo/models/shared/duration.model.js.map +1 -1
- package/dist/libraries/mongo/models/shared/work-hour.model.d.ts +1 -1
- package/dist/libraries/mongo/models/shared/work-hour.model.js +1 -1
- package/dist/libraries/mongo/models/shared/work-hour.model.js.map +1 -1
- package/dist/libraries/mongo/models/shop-access-control.model.d.ts +1 -2
- package/dist/libraries/mongo/models/shop-access-control.model.js +1 -2
- package/dist/libraries/mongo/models/shop-access-control.model.js.map +1 -1
- package/dist/libraries/mongo/models/shop-category.model.d.ts +2 -3
- package/dist/libraries/mongo/models/shop-category.model.js +2 -3
- package/dist/libraries/mongo/models/shop-category.model.js.map +1 -1
- package/dist/libraries/mongo/models/shop-meal-plan.model.d.ts +2 -3
- package/dist/libraries/mongo/models/shop-meal-plan.model.js +2 -3
- package/dist/libraries/mongo/models/shop-meal-plan.model.js.map +1 -1
- package/dist/libraries/mongo/models/shop-product.model.d.ts +4 -5
- package/dist/libraries/mongo/models/shop-product.model.js +4 -5
- package/dist/libraries/mongo/models/shop-product.model.js.map +1 -1
- package/dist/libraries/mongo/models/shop-review.model.d.ts +1 -2
- package/dist/libraries/mongo/models/shop-review.model.js +1 -2
- package/dist/libraries/mongo/models/shop-review.model.js.map +1 -1
- package/dist/libraries/mongo/models/shop.model.d.ts +3 -4
- package/dist/libraries/mongo/models/shop.model.js +12 -6
- package/dist/libraries/mongo/models/shop.model.js.map +1 -1
- package/dist/libraries/mongo/models/subscription-setting.model.d.ts +0 -2
- package/dist/libraries/mongo/models/subscription-setting.model.js +7 -3
- package/dist/libraries/mongo/models/subscription-setting.model.js.map +1 -1
- package/dist/libraries/mongo/models/subscription.model.d.ts +3 -4
- package/dist/libraries/mongo/models/subscription.model.js +13 -6
- package/dist/libraries/mongo/models/subscription.model.js.map +1 -1
- package/dist/libraries/mongo/models/tag.model.d.ts +0 -2
- package/dist/libraries/mongo/models/tag.model.js +1 -2
- package/dist/libraries/mongo/models/tag.model.js.map +1 -1
- package/dist/libraries/mongo/models/transaction.model.js.map +1 -1
- package/dist/libraries/mongo/models/zone.model.d.ts +0 -2
- package/dist/libraries/mongo/models/zone.model.js +1 -2
- package/dist/libraries/mongo/models/zone.model.js.map +1 -1
- package/dist/libraries/mongo/plugins/soft-delete-plugin.d.ts +8 -7
- package/dist/libraries/mongo/plugins/soft-delete-plugin.js +6 -6
- package/dist/libraries/mongo/plugins/soft-delete-plugin.js.map +1 -1
- package/dist/libraries/redis/index.d.ts +1 -1
- package/dist/libraries/redis/index.js +4 -1
- package/dist/libraries/redis/index.js.map +1 -1
- package/dist/libraries/secrets/index.d.ts +2 -2
- package/dist/libraries/secrets/index.js +13 -13
- package/dist/libraries/secrets/index.js.map +1 -1
- package/dist/libraries/trpc/context.d.ts +4 -4
- package/dist/libraries/trpc/context.js +1 -1
- package/dist/libraries/trpc/context.js.map +1 -1
- package/dist/libraries/trpc/index.js.map +1 -1
- package/dist/libraries/trpc/middlewares/auth.d.ts +1 -1
- package/dist/libraries/trpc/middlewares/auth.js +12 -13
- package/dist/libraries/trpc/middlewares/auth.js.map +1 -1
- package/dist/libraries/trpc/middlewares/cors.d.ts +12 -0
- package/dist/libraries/trpc/middlewares/cors.js +50 -0
- package/dist/libraries/trpc/middlewares/cors.js.map +1 -0
- package/dist/libraries/twilio/index.d.ts +1 -1
- package/dist/libraries/twilio/index.js +2 -3
- package/dist/libraries/twilio/index.js.map +1 -1
- package/dist/libraries/upload/index.js +3 -3
- package/dist/libraries/upload/index.js.map +1 -1
- package/dist/utilities/enum.js.map +1 -1
- package/dist/utilities/error-handler.js.map +1 -1
- package/dist/utilities/error-middleware.js.map +1 -1
- package/dist/utilities/pagination.d.ts +4 -4
- package/dist/utilities/pagination.js +3 -8
- package/dist/utilities/pagination.js.map +1 -1
- package/dist/utilities/transformers.d.ts +2 -2
- package/dist/utilities/transformers.js +6 -6
- package/dist/utilities/transformers.js.map +1 -1
- package/dist/utilities/validation/common-validation.js.map +1 -1
- package/dist/utilities/validation/global-validation.js.map +1 -1
- package/dist/utilities/validation/index.js.map +1 -1
- package/package.json +44 -41
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.corsMiddleware = corsMiddleware;
|
|
4
|
+
function corsMiddleware(options = {}) {
|
|
5
|
+
const config = {
|
|
6
|
+
origin: options.origin || '*',
|
|
7
|
+
methods: options.methods || ['GET, POST, OPTIONS'],
|
|
8
|
+
allowedHeaders: options.allowedHeaders || ['Content-Type', 'Authorization', 'X-Requested-With'],
|
|
9
|
+
exposedHeaders: options.exposedHeaders || ['Content-Range', 'X-Content-Range'],
|
|
10
|
+
credentials: options.credentials || false,
|
|
11
|
+
maxAge: options.maxAge || 86400,
|
|
12
|
+
preflightContinue: options.preflightContinue || false,
|
|
13
|
+
};
|
|
14
|
+
const methodsString = Array.isArray(config.methods) ? config.methods.join(', ') : config.methods;
|
|
15
|
+
const allowedHeadersString = Array.isArray(config.allowedHeaders)
|
|
16
|
+
? config.allowedHeaders.join(', ')
|
|
17
|
+
: config.allowedHeaders;
|
|
18
|
+
const exposedHeadersString = Array.isArray(config.exposedHeaders)
|
|
19
|
+
? config.exposedHeaders.join(', ')
|
|
20
|
+
: config.exposedHeaders;
|
|
21
|
+
return (req, res, next) => {
|
|
22
|
+
try {
|
|
23
|
+
res.setHeader('Access-Control-Allow-Origin', config.origin);
|
|
24
|
+
if (config.origin !== 'none') {
|
|
25
|
+
res.setHeader('Access-Control-Allow-Methods', methodsString);
|
|
26
|
+
res.setHeader('Access-Control-Allow-Headers', allowedHeadersString);
|
|
27
|
+
if (exposedHeadersString) {
|
|
28
|
+
res.setHeader('Access-Control-Expose-Headers', exposedHeadersString);
|
|
29
|
+
}
|
|
30
|
+
if (config.credentials) {
|
|
31
|
+
res.setHeader('Access-Control-Allow-Credentials', 'true');
|
|
32
|
+
}
|
|
33
|
+
if (config.maxAge) {
|
|
34
|
+
res.setHeader('Access-Control-Max-Age', config.maxAge.toString());
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (req.method === 'OPTIONS') {
|
|
38
|
+
res.writeHead(204);
|
|
39
|
+
res.end();
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
next();
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
console.error('CORS middleware error:', error);
|
|
46
|
+
next();
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=cors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.js","sourceRoot":"/","sources":["libraries/trpc/middlewares/cors.ts"],"names":[],"mappings":";;AAqBA,wCA6DC;AA7DD,SAAgB,cAAc,CAAC,UAAuB,EAAE;IAEvD,MAAM,MAAM,GAA0B;QACrC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,GAAG;QAC7B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC,oBAAoB,CAAC;QAClD,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,CAAC,cAAc,EAAE,eAAe,EAAE,kBAAkB,CAAC;QAC/F,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,CAAC,eAAe,EAAE,iBAAiB,CAAC;QAC9E,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,KAAK;QACzC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;QAC/B,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,KAAK;KACrD,CAAC;IAGF,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;IACjG,MAAM,oBAAoB,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC;QAChE,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QAClC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;IACzB,MAAM,oBAAoB,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC;QAChE,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QAClC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC;IAGzB,OAAO,CAAC,GAAoB,EAAE,GAAmB,EAAE,IAAgB,EAAE,EAAE;QACtE,IAAI,CAAC;YAEJ,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAG5D,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC9B,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,aAAa,CAAC,CAAC;gBAC7D,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,oBAAoB,CAAC,CAAC;gBAEpE,IAAI,oBAAoB,EAAE,CAAC;oBAC1B,GAAG,CAAC,SAAS,CAAC,+BAA+B,EAAE,oBAAoB,CAAC,CAAC;gBACtE,CAAC;gBAED,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;oBACxB,GAAG,CAAC,SAAS,CAAC,kCAAkC,EAAE,MAAM,CAAC,CAAC;gBAC3D,CAAC;gBAED,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;oBACnB,GAAG,CAAC,SAAS,CAAC,wBAAwB,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACnE,CAAC;YACF,CAAC;YAGD,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC9B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,EAAE,CAAC;gBACV,OAAO;YACR,CAAC;YAGD,IAAI,EAAE,CAAC;QACR,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAEhB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;YAE/C,IAAI,EAAE,CAAC;QACR,CAAC;IACF,CAAC,CAAC;AACH,CAAC","sourcesContent":["import type { IncomingMessage, ServerResponse } from 'http';\r\n\r\n/**\r\n * Interface for CORS middleware options\r\n */\r\ninterface CorsOptions {\r\n\torigin?: string | string[];\r\n\tmethods?: string[];\r\n\tallowedHeaders?: string[];\r\n\texposedHeaders?: string[];\r\n\tcredentials?: boolean;\r\n\tmaxAge?: number;\r\n\tpreflightContinue?: boolean;\r\n}\r\n\r\n/**\r\n * Creates a configurable CORS middleware for tRPC applications\r\n *\r\n * @param options Configuration options for CORS\r\n * @returns A middleware function for handling CORS\r\n */\r\nexport function corsMiddleware(options: CorsOptions = {}) {\r\n\t// Default configuration with sensible values\r\n\tconst config: Required<CorsOptions> = {\r\n\t\torigin: options.origin || '*',\r\n\t\tmethods: options.methods || ['GET, POST, OPTIONS'],\r\n\t\tallowedHeaders: options.allowedHeaders || ['Content-Type', 'Authorization', 'X-Requested-With'],\r\n\t\texposedHeaders: options.exposedHeaders || ['Content-Range', 'X-Content-Range'],\r\n\t\tcredentials: options.credentials || false,\r\n\t\tmaxAge: options.maxAge || 86400, // 24 hours\r\n\t\tpreflightContinue: options.preflightContinue || false,\r\n\t};\r\n\r\n\t// Convert arrays to comma-separated strings for header values\r\n\tconst methodsString = Array.isArray(config.methods) ? config.methods.join(', ') : config.methods;\r\n\tconst allowedHeadersString = Array.isArray(config.allowedHeaders)\r\n\t\t? config.allowedHeaders.join(', ')\r\n\t\t: config.allowedHeaders;\r\n\tconst exposedHeadersString = Array.isArray(config.exposedHeaders)\r\n\t\t? config.exposedHeaders.join(', ')\r\n\t\t: config.exposedHeaders;\r\n\r\n\t// Return the middleware function\r\n\treturn (req: IncomingMessage, res: ServerResponse, next: () => void) => {\r\n\t\ttry {\r\n\t\t\t// Always set the CORS headers\r\n\t\t\tres.setHeader('Access-Control-Allow-Origin', config.origin);\r\n\r\n\t\t\t// Only set other headers if origin is not blocking the request\r\n\t\t\tif (config.origin !== 'none') {\r\n\t\t\t\tres.setHeader('Access-Control-Allow-Methods', methodsString);\r\n\t\t\t\tres.setHeader('Access-Control-Allow-Headers', allowedHeadersString);\r\n\r\n\t\t\t\tif (exposedHeadersString) {\r\n\t\t\t\t\tres.setHeader('Access-Control-Expose-Headers', exposedHeadersString);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (config.credentials) {\r\n\t\t\t\t\tres.setHeader('Access-Control-Allow-Credentials', 'true');\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (config.maxAge) {\r\n\t\t\t\t\tres.setHeader('Access-Control-Max-Age', config.maxAge.toString());\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Handle OPTIONS preflight requests\r\n\t\t\tif (req.method === 'OPTIONS') {\r\n\t\t\t\tres.writeHead(204); // 204 No Content is more appropriate for preflight\r\n\t\t\t\tres.end();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// Move to the next middleware\r\n\t\t\tnext();\r\n\t\t} catch (error) {\r\n\t\t\t// Handle any errors that might occur\r\n\t\t\tconsole.error('CORS middleware error:', error);\r\n\t\t\t// Call next without the error as it expects no arguments\r\n\t\t\tnext();\r\n\t\t}\r\n\t};\r\n}\r\n"]}
|
|
@@ -25,15 +25,14 @@ let TwilioService = class TwilioService {
|
|
|
25
25
|
messagingServiceSid: 'MG7388a0916945dcd333451f22f9f723f7',
|
|
26
26
|
contentSid: 'HXbd364741884cfdbbfd7dd38ce7f6b5d3',
|
|
27
27
|
contentVariables: JSON.stringify({
|
|
28
|
-
|
|
29
|
-
})
|
|
28
|
+
'1': otp,
|
|
29
|
+
}),
|
|
30
30
|
});
|
|
31
31
|
}
|
|
32
32
|
catch (error) {
|
|
33
33
|
return null;
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
|
-
;
|
|
37
36
|
};
|
|
38
37
|
exports.TwilioService = TwilioService;
|
|
39
38
|
exports.TwilioService = TwilioService = __decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/twilio/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/twilio/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,mCAAiC;AACjC,mCAAgC;AAGzB,IAAM,aAAa,GAAnB,MAAM,aAAa;IACjB,OAAO,CAAS;IAExB;QACC,IAAI,CAAC,OAAO,GAAG,IAAI,eAAM,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC1F,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,QAAgB,EAAE,GAAW;QACzD,IAAI,CAAC;YACJ,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACzC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,kBAAkB;gBACpC,EAAE,EAAE,YAAY,QAAQ,EAAE;gBAC1B,mBAAmB,EAAE,oCAAoC;gBACzD,UAAU,EAAE,oCAAoC;gBAChD,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC;oBAChC,GAAG,EAAE,GAAG;iBACR,CAAC;aACF,CAAC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAEhB,OAAO,IAAI,CAAC;QACb,CAAC;IACF,CAAC;CACD,CAAA;AAvBY,sCAAa;wBAAb,aAAa;IADzB,IAAA,gBAAO,GAAE;;GACG,aAAa,CAuBzB","sourcesContent":["import { MessageInstance } from 'twilio/lib/rest/api/v2010/account/message';\r\nimport { Service } from 'typedi';\r\nimport { Twilio } from 'twilio';\r\n\r\n@Service()\r\nexport class TwilioService {\r\n\tprivate _client: Twilio;\r\n\r\n\tconstructor() {\r\n\t\tthis._client = new Twilio(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN);\r\n\t}\r\n\r\n\tpublic async sendWhatsappOTP(toNumber: number, otp: string): Promise<MessageInstance | null> {\r\n\t\ttry {\r\n\t\t\treturn await this._client.messages.create({\r\n\t\t\t\tfrom: process.env.TWILIO_FROM_NUMBER,\r\n\t\t\t\tto: `whatsapp:${toNumber}`,\r\n\t\t\t\tmessagingServiceSid: 'MG7388a0916945dcd333451f22f9f723f7',\r\n\t\t\t\tcontentSid: 'HXbd364741884cfdbbfd7dd38ce7f6b5d3',\r\n\t\t\t\tcontentVariables: JSON.stringify({\r\n\t\t\t\t\t'1': otp,\r\n\t\t\t\t}),\r\n\t\t\t});\r\n\t\t} catch (error) {\r\n\t\t\t//todo log error in logger\r\n\t\t\treturn null;\r\n\t\t}\r\n\t}\r\n}\r\n"]}
|
|
@@ -20,10 +20,10 @@ class UploadService {
|
|
|
20
20
|
websiteName;
|
|
21
21
|
constructor(bucketName) {
|
|
22
22
|
if (!bucketName) {
|
|
23
|
-
bucketName =
|
|
23
|
+
bucketName = 'lyxa-global';
|
|
24
24
|
}
|
|
25
25
|
this.bucket = (0, index_1.getLibraries)().getFirebaseService().superApp.storage().bucket(bucketName);
|
|
26
|
-
this.websiteName =
|
|
26
|
+
this.websiteName = 'lyxa-' + (0, index_1.getLibraries)().getConfigurationService().options.tenet;
|
|
27
27
|
}
|
|
28
28
|
generateFilename(originalFilename) {
|
|
29
29
|
const nameWithoutExt = path_1.default.parse(originalFilename).name;
|
|
@@ -109,7 +109,7 @@ class UploadService {
|
|
|
109
109
|
}
|
|
110
110
|
async getListFiles() {
|
|
111
111
|
const [files] = await this.bucket.getFiles();
|
|
112
|
-
return files.map(
|
|
112
|
+
return files.map(file => ({
|
|
113
113
|
name: file.name,
|
|
114
114
|
url: file.metadata.mediaLink,
|
|
115
115
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/upload/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Storage } from '@google-cloud/storage';\r\nimport axios from 'axios';\r\nimport sharp, {FormatEnum} from 'sharp';\r\nimport moment from 'moment';\r\nimport path from 'path';\r\nimport {Service} from \"typedi\";\r\nimport {ConfigurationService} from \"../configuration\";\r\nimport {FirebaseService} from \"../firebase\";\r\nimport {getLibraries} from \"../../index\";\r\n\r\nfunction makeSlug(input: string): string {\r\n return input\r\n .toLowerCase()\r\n .replace(/[^a-z0-9]+/g, '-')\r\n .replace(/(^-|-$)/g, '');\r\n}\r\n\r\nexport class UploadService {\r\n private bucket;\r\n private readonly websiteName;\r\n\r\n constructor(bucketName?: string) {\r\n if(!bucketName) {\r\n bucketName = \"lyxa-global\";\r\n }\r\n\r\n this.bucket = getLibraries().getFirebaseService().superApp.storage().bucket(bucketName);\r\n this.websiteName = \"lyxa-\" + getLibraries().getConfigurationService().options.tenet;\r\n }\r\n\r\n /**\r\n * Generates a unique filename using the original filename.\r\n */\r\n private generateFilename(originalFilename: string): string {\r\n const nameWithoutExt = path.parse(originalFilename).name;\r\n const extension = path.extname(originalFilename);\r\n const timestamp = moment().format('DDMMYYHmmss');\r\n const randomId = Math.floor(Math.random() * 100);\r\n const baseName = `${makeSlug(nameWithoutExt)}-${this.websiteName}-${timestamp}-${randomId}`;\r\n return baseName + extension;\r\n }\r\n\r\n /**\r\n * Uploads an image buffer after processing it with Sharp.\r\n * An optional destinationPath can be provided (e.g., 'images/product.jpg').\r\n */\r\n async uploadImage(\r\n buffer: Buffer,\r\n originalFilename: string,\r\n ): Promise<{ filename: string; url: string }> {\r\n const newFilename = this.generateFilename(originalFilename);\r\n const extension = path.extname(newFilename).toLowerCase();\r\n let processedImage: sharp.Sharp;\r\n let contentType: string;\r\n if (extension === '.png') {\r\n processedImage = sharp(buffer).png({ quality: 80 });\r\n contentType = 'image/png';\r\n } else if (extension === '.webp') {\r\n processedImage = sharp(buffer).webp({ quality: 80 });\r\n contentType = 'image/webp';\r\n } else {\r\n processedImage = sharp(buffer).jpeg({ quality: 80 });\r\n contentType = 'image/jpeg';\r\n }\r\n\r\n const file = this.bucket.file(newFilename);\r\n return new Promise((resolve, reject) => {\r\n const blobStream = file.createWriteStream({\r\n resumable: false,\r\n contentType,\r\n });\r\n\r\n blobStream.on('error', (err: Error) => {\r\n reject(err);\r\n });\r\n\r\n blobStream.on('finish', async () => {\r\n try {\r\n await file.makePublic();\r\n const publicUrl = `https://storage.googleapis.com/${this.bucket.name}/${file.name}`;\r\n resolve({ filename: file.name, url: publicUrl });\r\n } catch (err) {\r\n reject(err);\r\n }\r\n });\r\n\r\n processedImage.pipe(blobStream);\r\n });\r\n }\r\n\r\n /**\r\n * Transcodes (resizes) an image buffer into multiple resolutions.\r\n * An optional destinationPrefix can be provided to force a specific path or filename base.\r\n *\r\n * For example, if destinationPrefix is 'images/product', then the original might be\r\n * uploaded as 'images/product.jpg' and the resized versions as 'images/product-480.jpg', etc.\r\n */\r\n async transcodeImage(\r\n buffer: Buffer,\r\n originalFilename: string,\r\n resolutions: number[],\r\n ): Promise<{\r\n originalUrl: string;\r\n resizedResults: Array<{ resolution: number; url: string }>;\r\n }> {\r\n const extension = path.extname(originalFilename);\r\n const contentType = `image/${extension.replace('.', '') || 'jpeg'}`;\r\n const timestamp = moment().format('DDMMYYHmmss');\r\n const randomId = Math.floor(Math.random() * 100);\r\n\r\n const baseFilename = `${makeSlug(path.parse(originalFilename).name)}-${this.websiteName}-${timestamp}-${randomId}`;\r\n\r\n const originalFileName = `${baseFilename}${extension}`;\r\n const originalUrl = await this.uploadBuffer(buffer, originalFileName, contentType);\r\n\r\n const metadata = await sharp(buffer).metadata();\r\n const isLandscape =\r\n metadata.width && metadata.height ? metadata.width > metadata.height : true;\r\n\r\n const resizedResults = await Promise.all(\r\n resolutions.map(async (resolution) => {\r\n const resizeOptions = isLandscape ? { width: resolution } : { height: resolution };\r\n const formatKey = (extension.replace('.', '') || 'jpeg') as keyof sharp.FormatEnum;\r\n const resizedBuffer = await sharp(buffer)\r\n .resize({\r\n ...resizeOptions,\r\n withoutEnlargement: true,\r\n })\r\n .toFormat(formatKey, { quality: 80 })\r\n .toBuffer();\r\n const resizedFilename = `${baseFilename}-${resolution}${extension}`;\r\n const resizedUrl = await this.uploadBuffer(resizedBuffer, resizedFilename, contentType);\r\n return { resolution, url: resizedUrl };\r\n })\r\n );\r\n\r\n return { originalUrl, resizedResults };\r\n }\r\n\r\n /**\r\n * Helper function to upload a buffer to a specified filename.\r\n */\r\n private async uploadBuffer(\r\n buffer: Buffer,\r\n filename: string,\r\n contentType: string\r\n ): Promise<string> {\r\n const file = this.bucket.file(filename);\r\n await file.save(buffer, {\r\n resumable: false,\r\n contentType,\r\n });\r\n await file.makePublic();\r\n return `https://storage.googleapis.com/${this.bucket.name}/${file.name}`;\r\n }\r\n\r\n async getListFiles(): Promise<Array<{ name: string; url: string }>> {\r\n const [files] = await this.bucket.getFiles();\r\n return files.map((file) => ({\r\n name: file.name!,\r\n url: file.metadata.mediaLink!,\r\n }));\r\n }\r\n\r\n async downloadFile(filename: string): Promise<Buffer> {\r\n const file = this.bucket.file(filename);\r\n const [buffer] = await file.download();\r\n return buffer;\r\n }\r\n\r\n async deleteFile(filename: string): Promise<void> {\r\n const file = this.bucket.file(filename);\r\n const [exists] = await file.exists();\r\n if (!exists) {\r\n throw new Error('File does not exist.');\r\n }\r\n await file.delete();\r\n }\r\n\r\n async downloadImage(url: string): Promise<Buffer> {\r\n const response = await axios.get(url, { responseType: 'arraybuffer' });\r\n return Buffer.from(response.data, 'binary');\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"/","sources":["libraries/upload/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Storage } from '@google-cloud/storage';\r\nimport axios from 'axios';\r\nimport sharp, { FormatEnum } from 'sharp';\r\nimport moment from 'moment';\r\nimport path from 'path';\r\nimport { Service } from 'typedi';\r\nimport { ConfigurationService } from '../configuration';\r\nimport { FirebaseService } from '../firebase';\r\nimport { getLibraries } from '../../index';\r\n\r\nfunction makeSlug(input: string): string {\r\n\treturn input\r\n\t\t.toLowerCase()\r\n\t\t.replace(/[^a-z0-9]+/g, '-')\r\n\t\t.replace(/(^-|-$)/g, '');\r\n}\r\n\r\nexport class UploadService {\r\n\tprivate bucket;\r\n\tprivate readonly websiteName;\r\n\r\n\tconstructor(bucketName?: string) {\r\n\t\tif (!bucketName) {\r\n\t\t\tbucketName = 'lyxa-global';\r\n\t\t}\r\n\r\n\t\tthis.bucket = getLibraries().getFirebaseService().superApp.storage().bucket(bucketName);\r\n\t\tthis.websiteName = 'lyxa-' + getLibraries().getConfigurationService().options.tenet;\r\n\t}\r\n\r\n\t/**\r\n\t * Generates a unique filename using the original filename.\r\n\t */\r\n\tprivate generateFilename(originalFilename: string): string {\r\n\t\tconst nameWithoutExt = path.parse(originalFilename).name;\r\n\t\tconst extension = path.extname(originalFilename);\r\n\t\tconst timestamp = moment().format('DDMMYYHmmss');\r\n\t\tconst randomId = Math.floor(Math.random() * 100);\r\n\t\tconst baseName = `${makeSlug(nameWithoutExt)}-${this.websiteName}-${timestamp}-${randomId}`;\r\n\t\treturn baseName + extension;\r\n\t}\r\n\r\n\t/**\r\n\t * Uploads an image buffer after processing it with Sharp.\r\n\t * An optional destinationPath can be provided (e.g., 'images/product.jpg').\r\n\t */\r\n\tasync uploadImage(buffer: Buffer, originalFilename: string): Promise<{ filename: string; url: string }> {\r\n\t\tconst newFilename = this.generateFilename(originalFilename);\r\n\t\tconst extension = path.extname(newFilename).toLowerCase();\r\n\t\tlet processedImage: sharp.Sharp;\r\n\t\tlet contentType: string;\r\n\t\tif (extension === '.png') {\r\n\t\t\tprocessedImage = sharp(buffer).png({ quality: 80 });\r\n\t\t\tcontentType = 'image/png';\r\n\t\t} else if (extension === '.webp') {\r\n\t\t\tprocessedImage = sharp(buffer).webp({ quality: 80 });\r\n\t\t\tcontentType = 'image/webp';\r\n\t\t} else {\r\n\t\t\tprocessedImage = sharp(buffer).jpeg({ quality: 80 });\r\n\t\t\tcontentType = 'image/jpeg';\r\n\t\t}\r\n\r\n\t\tconst file = this.bucket.file(newFilename);\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\tconst blobStream = file.createWriteStream({\r\n\t\t\t\tresumable: false,\r\n\t\t\t\tcontentType,\r\n\t\t\t});\r\n\r\n\t\t\tblobStream.on('error', (err: Error) => {\r\n\t\t\t\treject(err);\r\n\t\t\t});\r\n\r\n\t\t\tblobStream.on('finish', async () => {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tawait file.makePublic();\r\n\t\t\t\t\tconst publicUrl = `https://storage.googleapis.com/${this.bucket.name}/${file.name}`;\r\n\t\t\t\t\tresolve({ filename: file.name, url: publicUrl });\r\n\t\t\t\t} catch (err) {\r\n\t\t\t\t\treject(err);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tprocessedImage.pipe(blobStream);\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Transcodes (resizes) an image buffer into multiple resolutions.\r\n\t * An optional destinationPrefix can be provided to force a specific path or filename base.\r\n\t *\r\n\t * For example, if destinationPrefix is 'images/product', then the original might be\r\n\t * uploaded as 'images/product.jpg' and the resized versions as 'images/product-480.jpg', etc.\r\n\t */\r\n\tasync transcodeImage(\r\n\t\tbuffer: Buffer,\r\n\t\toriginalFilename: string,\r\n\t\tresolutions: number[]\r\n\t): Promise<{\r\n\t\toriginalUrl: string;\r\n\t\tresizedResults: Array<{ resolution: number; url: string }>;\r\n\t}> {\r\n\t\tconst extension = path.extname(originalFilename);\r\n\t\tconst contentType = `image/${extension.replace('.', '') || 'jpeg'}`;\r\n\t\tconst timestamp = moment().format('DDMMYYHmmss');\r\n\t\tconst randomId = Math.floor(Math.random() * 100);\r\n\r\n\t\tconst baseFilename = `${makeSlug(path.parse(originalFilename).name)}-${this.websiteName}-${timestamp}-${randomId}`;\r\n\r\n\t\tconst originalFileName = `${baseFilename}${extension}`;\r\n\t\tconst originalUrl = await this.uploadBuffer(buffer, originalFileName, contentType);\r\n\r\n\t\tconst metadata = await sharp(buffer).metadata();\r\n\t\tconst isLandscape = metadata.width && metadata.height ? metadata.width > metadata.height : true;\r\n\r\n\t\tconst resizedResults = await Promise.all(\r\n\t\t\tresolutions.map(async resolution => {\r\n\t\t\t\tconst resizeOptions = isLandscape ? { width: resolution } : { height: resolution };\r\n\t\t\t\tconst formatKey = (extension.replace('.', '') || 'jpeg') as keyof sharp.FormatEnum;\r\n\t\t\t\tconst resizedBuffer = await sharp(buffer)\r\n\t\t\t\t\t.resize({\r\n\t\t\t\t\t\t...resizeOptions,\r\n\t\t\t\t\t\twithoutEnlargement: true,\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.toFormat(formatKey, { quality: 80 })\r\n\t\t\t\t\t.toBuffer();\r\n\t\t\t\tconst resizedFilename = `${baseFilename}-${resolution}${extension}`;\r\n\t\t\t\tconst resizedUrl = await this.uploadBuffer(resizedBuffer, resizedFilename, contentType);\r\n\t\t\t\treturn { resolution, url: resizedUrl };\r\n\t\t\t})\r\n\t\t);\r\n\r\n\t\treturn { originalUrl, resizedResults };\r\n\t}\r\n\r\n\t/**\r\n\t * Helper function to upload a buffer to a specified filename.\r\n\t */\r\n\tprivate async uploadBuffer(buffer: Buffer, filename: string, contentType: string): Promise<string> {\r\n\t\tconst file = this.bucket.file(filename);\r\n\t\tawait file.save(buffer, {\r\n\t\t\tresumable: false,\r\n\t\t\tcontentType,\r\n\t\t});\r\n\t\tawait file.makePublic();\r\n\t\treturn `https://storage.googleapis.com/${this.bucket.name}/${file.name}`;\r\n\t}\r\n\r\n\tasync getListFiles(): Promise<Array<{ name: string; url: string }>> {\r\n\t\tconst [files] = await this.bucket.getFiles();\r\n\t\treturn files.map(file => ({\r\n\t\t\tname: file.name!,\r\n\t\t\turl: file.metadata.mediaLink!,\r\n\t\t}));\r\n\t}\r\n\r\n\tasync downloadFile(filename: string): Promise<Buffer> {\r\n\t\tconst file = this.bucket.file(filename);\r\n\t\tconst [buffer] = await file.download();\r\n\t\treturn buffer;\r\n\t}\r\n\r\n\tasync deleteFile(filename: string): Promise<void> {\r\n\t\tconst file = this.bucket.file(filename);\r\n\t\tconst [exists] = await file.exists();\r\n\t\tif (!exists) {\r\n\t\t\tthrow new Error('File does not exist.');\r\n\t\t}\r\n\t\tawait file.delete();\r\n\t}\r\n\r\n\tasync downloadImage(url: string): Promise<Buffer> {\r\n\t\tconst response = await axios.get(url, { responseType: 'arraybuffer' });\r\n\t\treturn Buffer.from(response.data, 'binary');\r\n\t}\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enum.js","sourceRoot":"/","sources":["utilities/enum.ts"],"names":[],"mappings":"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","sourcesContent":["export enum Status {\r\n\tACTIVE = 'active',\r\n\tINACTIVE = 'inactive',\r\n}\r\n\r\nexport enum ItemType {\r\n\tFOOD = 'food',\r\n\tGROCERY = 'grocery',\r\n\tPHARMACY = 'pharmacy',\r\n\tCOFFEE = 'coffee',\r\n\tFLOWER = 'flower',\r\n\tPET = 'pet',\r\n\tHEALTHY_CORNER = 'healthy_corner',\r\n}\r\n\r\nexport enum WeekDay {\r\n\tSunday = 0,\r\n\tMonday = 1,\r\n\tTuesday = 2,\r\n\tWednesday = 3,\r\n\tThursday = 4,\r\n\tFriday = 5,\r\n\tSaturday = 6,\r\n}\r\n\r\nexport enum WorkStatus {\r\n\tOPEN = 'open',\r\n\tCLOSED = 'closed',\r\n\tFULL_DAY = 'full_day',\r\n}\r\n\r\nexport enum HolidayWorkStatus {\r\n\tCLOSED = WorkStatus.CLOSED,\r\n\tFULL_DAY = WorkStatus.FULL_DAY,\r\n}\r\n\r\nexport enum ValueType {\r\n\tPERCENTAGE = 'percentage',\r\n\tFIXED = 'fixed',\r\n}\r\n\r\nexport enum PaymentMethod {\r\n\tCASH = 'cash',\r\n\tCARD = 'card',\r\n}\r\n\r\nexport enum PaymentStatus {\r\n\tPAID = 'paid',\r\n\tPENDING = 'pending',\r\n\tFAILED = 'failed',\r\n}\r\n\r\nexport enum PaidCurrency {\r\n\tBASE = 'base',\r\n\tSECONDARY = 'secondary',\r\n\tMIXED = 'mixed',\r\n}\r\n\r\nexport enum SubscriptionPackage {\r\n\tMONTHLY = 'monthly',\r\n\tYEARLY = 'yearly',\r\n}\r\n\r\nexport enum SubscriptionStatus {\r\n\tONGOING = 'ongoing',\r\n\tEXPIRED = 'expired',\r\n}\r\n\r\nexport enum RatingAccountType {\r\n\tSHOP = 'shop',\r\n\tRIDER = 'rider',\r\n}\r\n\r\nexport enum GeoLocationType {\r\n\tPOINT = 'point',\r\n\tPOLYGON = 'polygon',\r\n}\r\n\r\nexport enum UpdatedField {\r\n\tMAX_TOTAL_EST_ITEMS_PRICE = 'max_total_est_items_price',\r\n\tMAX_DISTANCE = 'max_distance',\r\n\tDAILY_WORKING_HOURS = 'daily_working_hours',\r\n\tBOB_CASH_SETTLEMENT_LIMIT = 'bob_cash_settlement_limit',\r\n\tTIPS = 'tips',\r\n\tEQUIPMENTS = 'equipments',\r\n\tMONTHLY_SHOP_TARGET = 'monthly_shop_target',\r\n\tMONTHLY_REWARD_PRIZE = 'monthly_reward_prize',\r\n\tBASE_CURRENCY = 'base_currency',\r\n\tSECONDARY_CURRENCY = 'secondary_currency',\r\n\tIS_DUAL_CURRENCY_ENABLED = 'is_dual_currency_enabled',\r\n\tEXCHANGE_RATE = 'exchange_rate',\r\n\tISSUANCE_DAY = 'issuance_day',\r\n\tOVER_DUE_PERIODS = 'over_due_periods',\r\n\tPAY_LIMIT_FOR_USER = 'pay_limit_for_user',\r\n\tVAT_PERCENTAGE = 'vat_percentage',\r\n\tRIDER_SEARCH_RANGES = 'rider_search_ranges',\r\n\tNEAR_BY_SHOP_DISTANCE = 'near_by_shop_distance',\r\n\tNEAR_BY_SHOP_DISTANCE_IN_HOME_SCREEN = 'near_by_shop_distance_in_home_screen',\r\n\tUNITS = 'units',\r\n\tCURRENCY_SETTING = 'currency_setting',\r\n\tPAYMENT_METHODS = 'payment_methods',\r\n\tIS_GROUND_ORDER_ENABLED = 'is_ground_order_enabled',\r\n\tCUSTOMER_SUPPORT_PHONE_NUMBER = 'customer_support_phone_number',\r\n}\r\n\r\nexport enum SectionType {\r\n\tSTORE_PUNCHES = 'store_punches',\r\n\tNEARBY_RESTAURANT = 'nearby_restaurant',\r\n\tNEARBY_GROCERY = 'nearby_grocery',\r\n\tNEARBY_PHARMACY = 'nearby_pharmacy',\r\n\tDISCOUNT = 'discount',\r\n\tFREE_DELIVERY = 'free_delivery',\r\n\tCRAZY_OFFER_SHOPS = 'crazy_offer_shops',\r\n\tORDER_AGAIN = 'order_again',\r\n\tFEATURED = 'featured',\r\n\tLOVE = 'love',\r\n\tAUTHENTIC_BEIRUT = 'authentic_beirut',\r\n\tNEAR_ME = 'near_me',\r\n}\r\n\r\nexport enum CoreAuthIdentityType {\r\n\tEMAIL = 'email',\r\n\tPHONE = 'phone',\r\n\tGOOGLE = 'google',\r\n\tAPPLE = 'apple',\r\n}\r\n\r\nexport enum FoodGroup {\r\n\tMEAT = 'meat',\r\n\tCHICKEN = 'chicken',\r\n\tFISH = 'fish',\r\n\tVEGETARIAN = 'vegetarian',\r\n\tOTHER = 'other',\r\n}\r\n\r\nexport enum PriceType {\r\n\tPRICE = 'price',\r\n\tUNIT = 'unit',\r\n\tPORTION = 'portion',\r\n}\r\n\r\nexport enum AttributeItemSelectionType {\r\n\tSINGLE = 'single',\r\n\tMULTIPLE = 'multiple',\r\n}\r\n\r\nexport enum ProductDietaryType {\r\n\tGLUTEN_FREE = 'gluten_free',\r\n\tLOW_CAL = 'low_cal',\r\n\tVEGETARIAN = 'vegetarian',\r\n\tVEGAN = 'vegan',\r\n\tGLUE_FREE = 'glue_free',\r\n\tKETO = 'keto',\r\n\tLACTOSE_FREE = 'lactose_free',\r\n\tHIGH_PROTEIN = 'high_protein',\r\n}\r\n\r\nexport enum DishCategory {\r\n\tBREAKFAST = 'breakfast',\r\n\tLUNCH = 'lunch',\r\n\tDINNER = 'dinner',\r\n\tSNACKS = 'snacks',\r\n}\r\n\r\nexport enum NotificationAccountType {\r\n\tUSER = 'user',\r\n\tPARENT = 'parent',\r\n\tSHOP = 'shop',\r\n\tRIDER = 'rider',\r\n\tADMIN = 'admin',\r\n\tCUSTOMER_SERVICE = 'customer_service',\r\n}\r\n\r\nexport enum ClickType {\r\n\tCLICKABLE_URL = 'clickable_url',\r\n\tCLICKABLE_ORDER = 'clickable_order',\r\n\tCLICKABLE_SHOP = 'clickable_shop',\r\n\tCLICKABLE_PRODUCT = 'clickable_product',\r\n\tCLICKABLE_LIST_CONTAINER = 'clickable_list_container',\r\n\tCLICKABLE_PAYOUT = 'clickable_payout',\r\n\tCLICKABLE_BOB_FINANCE = 'clickable_bob_finance',\r\n\tCLICKABLE_REQUEST_AREA = 'clickable_request_area',\r\n}\r\n\r\nexport enum ChargeType {\r\n\tGLOBAL = 'global',\r\n\tCUSTOM = 'custom',\r\n}\r\n\r\nexport enum ShopOnlineStatus {\r\n\tONLINE = 'online',\r\n\tOFFLINE = 'offline',\r\n\tBUSY = 'busy',\r\n}\r\n\r\nexport enum ShopRole {\r\n\tPARENT = 'parent',\r\n\tPARENT_ORDER_MANAGER = 'parent_order_manager',\r\n\tSHOP = 'shop',\r\n\tSHOP_ORDER_MANAGER = 'shop_order_manager',\r\n}\r\n\r\nexport enum BannerClickType {\r\n\tLINK = 'link',\r\n\tSHOP = 'shop',\r\n\tPRODUCT = 'product',\r\n\tLIST_CONTAINER = 'list_container',\r\n\tPLUS = 'plus',\r\n}\r\n\r\nexport enum BannerLinkType {\r\n\tURL = 'url',\r\n\tAPP_ROUTE = 'app-route',\r\n}\r\n\r\nexport enum BannerUserType {\r\n\tALL = 'all',\r\n\tPLUS = 'plus',\r\n\tNORMAL = 'normal',\r\n}\r\n\r\nexport enum CounterType {\r\n\tORDER = 'order',\r\n\tCRM_NUMBER = 'crm_number',\r\n\tshop = 'shop',\r\n}\r\n\r\nexport enum FaqAccountType {\r\n\tUSER = 'user',\r\n\tSHOP = 'shop',\r\n\tRIDER = 'rider',\r\n}\r\n\r\nexport enum ZoneStatus {\r\n\tACTIVE = 'active',\r\n\tINACTIVE = 'inactive',\r\n\tBUSY = 'busy',\r\n}\r\n\r\nexport enum BobAccountType {\r\n\tRIDER = 'rider',\r\n\tSHOP = 'shop',\r\n}\r\n\r\nexport enum BobSettlementType {\r\n\tSETTLE_CASH = 'settle_cash',\r\n\tSETTLE_PAYOUT = 'settle_Payout',\r\n}\r\n\r\nexport enum BobSettlementStatus {\r\n\tNOT_PAID = 'not_paid',\r\n\tPAID = 'paid',\r\n\tREVOKED = 'revoked',\r\n}\r\n\r\nexport enum BobModel {\r\n\tC2B = 'C2B',\r\n\tB2C = 'B2C',\r\n}\r\n\r\nexport enum BobType {\r\n\tINWARD = 'inward',\r\n\tOUTWARD = 'outward',\r\n}\r\n\r\nexport enum CouponType {\r\n\tGLOBAL = 'global',\r\n\tINDIVIDUAL_STORE = 'individual_store',\r\n\tINDIVIDUAL_USER = 'individual_user',\r\n\tCUSTOM_COUPON = 'custom_coupon',\r\n\tREFERRAL_CODE = 'referral_code',\r\n\tREFERRAL_REWARD = 'referral_reward',\r\n}\r\n\r\nexport enum CouponExpirationReason {\r\n\tDURATION = 'duration',\r\n\tSPEND_LIMIT = 'spendLimit',\r\n\tTOTAL_ORDER_LIMIT = 'totalOrderLimit',\r\n}\r\n\r\nexport enum FavouriteType {\r\n\tPRODUCT = 'product',\r\n\tSHOP = 'shop',\r\n}\r\n\r\nexport enum MarketingType {\r\n\tDISCOUNT = 'discount',\r\n\tBUY1GET1 = 'buy1get1',\r\n\tFREE_DELIVERY = 'free_delivery',\r\n\tFEATURED = 'featured',\r\n\tLOYALTY_POINT = 'loyalty_point',\r\n\tPUNCH_MARKETING = 'punch_marketing',\r\n}\r\n\r\nexport enum MarketingStatus {\r\n\tACTIVE = 'active',\r\n\tPAUSED = 'paused',\r\n\tEXPIRED = 'expired',\r\n\tDELETED = 'deleted',\r\n}\r\n\r\nexport enum AdminRole {\r\n\tSUPER_ADMIN = 'super_admin',\r\n\tGENERAL_MANAGER = 'general_manager',\r\n\tORDER_MANAGEMENT_MANAGER = 'order_management_lead',\r\n\tORDER_MANAGEMENT_AGENT = 'order_management_agent',\r\n\tACCOUNT_MANAGER = 'account_manager',\r\n\tBUSINESS_DEVELOPMENT_EXECUTIVE = 'business_development_executive',\r\n\tACCOUNTING = 'accounting',\r\n\tMARKETING_MANAGER = 'marketing_manager',\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"enum.js","sourceRoot":"/","sources":["utilities/enum.ts"],"names":[],"mappings":"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","sourcesContent":["export enum Status {\n\tACTIVE = 'active',\n\tINACTIVE = 'inactive',\n}\n\nexport enum ItemType {\n\tFOOD = 'food',\n\tGROCERY = 'grocery',\n\tPHARMACY = 'pharmacy',\n\tCOFFEE = 'coffee',\n\tFLOWER = 'flower',\n\tPET = 'pet',\n\tHEALTHY_CORNER = 'healthy_corner',\n}\n\nexport enum WeekDay {\n\tSunday = 0,\n\tMonday = 1,\n\tTuesday = 2,\n\tWednesday = 3,\n\tThursday = 4,\n\tFriday = 5,\n\tSaturday = 6,\n}\n\nexport enum WorkStatus {\n\tOPEN = 'open',\n\tCLOSED = 'closed',\n\tFULL_DAY = 'full_day',\n}\n\nexport enum HolidayWorkStatus {\n\tCLOSED = WorkStatus.CLOSED,\n\tFULL_DAY = WorkStatus.FULL_DAY,\n}\n\nexport enum ValueType {\n\tPERCENTAGE = 'percentage',\n\tFIXED = 'fixed',\n}\n\nexport enum PaymentMethod {\n\tCASH = 'cash',\n\tCARD = 'card',\n}\n\nexport enum PaymentStatus {\n\tPAID = 'paid',\n\tPENDING = 'pending',\n\tFAILED = 'failed',\n}\n\nexport enum PaidCurrency {\n\tBASE = 'base',\n\tSECONDARY = 'secondary',\n\tMIXED = 'mixed',\n}\n\nexport enum SubscriptionPackage {\n\tMONTHLY = 'monthly',\n\tYEARLY = 'yearly',\n}\n\nexport enum SubscriptionStatus {\n\tONGOING = 'ongoing',\n\tEXPIRED = 'expired',\n}\n\nexport enum RatingAccountType {\n\tSHOP = 'shop',\n\tRIDER = 'rider',\n}\n\nexport enum GeoLocationType {\n\tPOINT = 'point',\n\tPOLYGON = 'polygon',\n}\n\nexport enum UpdatedField {\n\tMAX_TOTAL_EST_ITEMS_PRICE = 'max_total_est_items_price',\n\tMAX_DISTANCE = 'max_distance',\n\tDAILY_WORKING_HOURS = 'daily_working_hours',\n\tBOB_CASH_SETTLEMENT_LIMIT = 'bob_cash_settlement_limit',\n\tTIPS = 'tips',\n\tEQUIPMENTS = 'equipments',\n\tMONTHLY_SHOP_TARGET = 'monthly_shop_target',\n\tMONTHLY_REWARD_PRIZE = 'monthly_reward_prize',\n\tBASE_CURRENCY = 'base_currency',\n\tSECONDARY_CURRENCY = 'secondary_currency',\n\tIS_DUAL_CURRENCY_ENABLED = 'is_dual_currency_enabled',\n\tEXCHANGE_RATE = 'exchange_rate',\n\tISSUANCE_DAY = 'issuance_day',\n\tOVER_DUE_PERIODS = 'over_due_periods',\n\tPAY_LIMIT_FOR_USER = 'pay_limit_for_user',\n\tVAT_PERCENTAGE = 'vat_percentage',\n\tRIDER_SEARCH_RANGES = 'rider_search_ranges',\n\tNEAR_BY_SHOP_DISTANCE = 'near_by_shop_distance',\n\tNEAR_BY_SHOP_DISTANCE_IN_HOME_SCREEN = 'near_by_shop_distance_in_home_screen',\n\tUNITS = 'units',\n\tCURRENCY_SETTING = 'currency_setting',\n\tPAYMENT_METHODS = 'payment_methods',\n\tIS_GROUND_ORDER_ENABLED = 'is_ground_order_enabled',\n\tCUSTOMER_SUPPORT_PHONE_NUMBER = 'customer_support_phone_number',\n}\n\nexport enum SectionType {\n\tSTORE_PUNCHES = 'store_punches',\n\tNEARBY_RESTAURANT = 'nearby_restaurant',\n\tNEARBY_GROCERY = 'nearby_grocery',\n\tNEARBY_PHARMACY = 'nearby_pharmacy',\n\tDISCOUNT = 'discount',\n\tFREE_DELIVERY = 'free_delivery',\n\tCRAZY_OFFER_SHOPS = 'crazy_offer_shops',\n\tORDER_AGAIN = 'order_again',\n\tFEATURED = 'featured',\n\tLOVE = 'love',\n\tAUTHENTIC_BEIRUT = 'authentic_beirut',\n\tNEAR_ME = 'near_me',\n}\n\nexport enum CoreAuthIdentityType {\n\tEMAIL = 'email',\n\tPHONE = 'phone',\n\tGOOGLE = 'google',\n\tAPPLE = 'apple',\n}\n\nexport enum FoodGroup {\n\tMEAT = 'meat',\n\tCHICKEN = 'chicken',\n\tFISH = 'fish',\n\tVEGETARIAN = 'vegetarian',\n\tOTHER = 'other',\n}\n\nexport enum PriceType {\n\tPRICE = 'price',\n\tUNIT = 'unit',\n\tPORTION = 'portion',\n}\n\nexport enum AttributeItemSelectionType {\n\tSINGLE = 'single',\n\tMULTIPLE = 'multiple',\n}\n\nexport enum ProductDietaryType {\n\tGLUTEN_FREE = 'gluten_free',\n\tLOW_CAL = 'low_cal',\n\tVEGETARIAN = 'vegetarian',\n\tVEGAN = 'vegan',\n\tGLUE_FREE = 'glue_free',\n\tKETO = 'keto',\n\tLACTOSE_FREE = 'lactose_free',\n\tHIGH_PROTEIN = 'high_protein',\n}\n\nexport enum DishCategory {\n\tBREAKFAST = 'breakfast',\n\tLUNCH = 'lunch',\n\tDINNER = 'dinner',\n\tSNACKS = 'snacks',\n}\n\nexport enum NotificationAccountType {\n\tUSER = 'user',\n\tPARENT = 'parent',\n\tSHOP = 'shop',\n\tRIDER = 'rider',\n\tADMIN = 'admin',\n\tCUSTOMER_SERVICE = 'customer_service',\n}\n\nexport enum ClickType {\n\tCLICKABLE_URL = 'clickable_url',\n\tCLICKABLE_ORDER = 'clickable_order',\n\tCLICKABLE_SHOP = 'clickable_shop',\n\tCLICKABLE_PRODUCT = 'clickable_product',\n\tCLICKABLE_LIST_CONTAINER = 'clickable_list_container',\n\tCLICKABLE_PAYOUT = 'clickable_payout',\n\tCLICKABLE_BOB_FINANCE = 'clickable_bob_finance',\n\tCLICKABLE_REQUEST_AREA = 'clickable_request_area',\n}\n\nexport enum ChargeType {\n\tGLOBAL = 'global',\n\tCUSTOM = 'custom',\n}\n\nexport enum ShopOnlineStatus {\n\tONLINE = 'online',\n\tOFFLINE = 'offline',\n\tBUSY = 'busy',\n}\n\nexport enum ShopRole {\n\tPARENT = 'parent',\n\tPARENT_ORDER_MANAGER = 'parent_order_manager',\n\tSHOP = 'shop',\n\tSHOP_ORDER_MANAGER = 'shop_order_manager',\n}\n\nexport enum BannerClickType {\n\tLINK = 'link',\n\tSHOP = 'shop',\n\tPRODUCT = 'product',\n\tLIST_CONTAINER = 'list_container',\n\tPLUS = 'plus',\n}\n\nexport enum BannerLinkType {\n\tURL = 'url',\n\tAPP_ROUTE = 'app-route',\n}\n\nexport enum BannerUserType {\n\tALL = 'all',\n\tPLUS = 'plus',\n\tNORMAL = 'normal',\n}\n\nexport enum CounterType {\n\tORDER = 'order',\n\tCRM_NUMBER = 'crm_number',\n\tshop = 'shop',\n}\n\nexport enum FaqAccountType {\n\tUSER = 'user',\n\tSHOP = 'shop',\n\tRIDER = 'rider',\n}\n\nexport enum ZoneStatus {\n\tACTIVE = 'active',\n\tINACTIVE = 'inactive',\n\tBUSY = 'busy',\n}\n\nexport enum BobAccountType {\n\tRIDER = 'rider',\n\tSHOP = 'shop',\n}\n\nexport enum BobSettlementType {\n\tSETTLE_CASH = 'settle_cash',\n\tSETTLE_PAYOUT = 'settle_Payout',\n}\n\nexport enum BobSettlementStatus {\n\tNOT_PAID = 'not_paid',\n\tPAID = 'paid',\n\tREVOKED = 'revoked',\n}\n\nexport enum BobModel {\n\tC2B = 'C2B',\n\tB2C = 'B2C',\n}\n\nexport enum BobType {\n\tINWARD = 'inward',\n\tOUTWARD = 'outward',\n}\n\nexport enum CouponType {\n\tGLOBAL = 'global',\n\tINDIVIDUAL_STORE = 'individual_store',\n\tINDIVIDUAL_USER = 'individual_user',\n\tCUSTOM_COUPON = 'custom_coupon',\n\tREFERRAL_CODE = 'referral_code',\n\tREFERRAL_REWARD = 'referral_reward',\n}\n\nexport enum CouponExpirationReason {\n\tDURATION = 'duration',\n\tSPEND_LIMIT = 'spendLimit',\n\tTOTAL_ORDER_LIMIT = 'totalOrderLimit',\n}\n\nexport enum FavouriteType {\n\tPRODUCT = 'product',\n\tSHOP = 'shop',\n}\n\nexport enum MarketingType {\n\tDISCOUNT = 'discount',\n\tBUY1GET1 = 'buy1get1',\n\tFREE_DELIVERY = 'free_delivery',\n\tFEATURED = 'featured',\n\tLOYALTY_POINT = 'loyalty_point',\n\tPUNCH_MARKETING = 'punch_marketing',\n}\n\nexport enum MarketingStatus {\n\tACTIVE = 'active',\n\tPAUSED = 'paused',\n\tEXPIRED = 'expired',\n\tDELETED = 'deleted',\n}\n\nexport enum AdminRole {\n\tSUPER_ADMIN = 'super_admin',\n\tGENERAL_MANAGER = 'general_manager',\n\tORDER_MANAGEMENT_MANAGER = 'order_management_lead',\n\tORDER_MANAGEMENT_AGENT = 'order_management_agent',\n\tACCOUNT_MANAGER = 'account_manager',\n\tBUSINESS_DEVELOPMENT_EXECUTIVE = 'business_development_executive',\n\tACCOUNTING = 'accounting',\n\tMARKETING_MANAGER = 'marketing_manager',\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.js","sourceRoot":"/","sources":["utilities/error-handler.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * @fileoverview Error handling utility for TRPC and MongoDB operations.\r\n * Provides centralized error handling, logging, and retry mechanisms.\r\n */\r\n\r\nimport { TRPCError } from '@trpc/server';\r\nimport { MongoServerError, MongoError, MongoNetworkError } from 'mongodb';\r\nimport { ZodError } from 'zod';\r\n\r\n/**\r\n * A utility class for handling various types of errors in a TRPC-MongoDB application.\r\n * Provides error transformation, logging, and retry mechanisms.\r\n */\r\nexport class ErrorHandler {\r\n /**\r\n * Configuration options for error handling behavior\r\n * @private\r\n */\r\n private static readonly CONFIG = {\r\n /** Whether to log errors to console */\r\n shouldLogErrors: true,\r\n /** Maximum number of stack trace lines to include in logs */\r\n maxStackTraceLines: 10,\r\n /** Set of error codes that are considered retryable */\r\n retryableErrors: new Set(['ECONNRESET', 'ECONNREFUSED', 'ETIMEDOUT', 'EPIPE']),\r\n };\r\n\r\n /**\r\n * Mapping of MongoDB error codes to TRPC error types and messages\r\n * @private\r\n */\r\n private static readonly MONGO_ERROR_CODES: Record<\r\n number,\r\n {\r\n code: TRPCError['code'];\r\n message: string;\r\n }\r\n > = {\r\n 11000: { code: 'CONFLICT', message: 'Duplicate key error: A record with this value already exists.' },\r\n 11001: { code: 'CONFLICT', message: 'Duplicate key error on index update.' },\r\n 121: { code: 'BAD_REQUEST', message: 'Document validation failed.' },\r\n 7: { code: 'INTERNAL_SERVER_ERROR', message: 'Not primary - database is in recovery mode.' },\r\n 89: { code: 'FORBIDDEN', message: 'Unauthorized operation attempted.' },\r\n 91: { code: 'TIMEOUT', message: 'Operation timeout exceeded.' },\r\n 189: { code: 'BAD_REQUEST', message: 'Invalid modification - document would exceed size limit.' },\r\n 50: { code: 'INTERNAL_SERVER_ERROR', message: 'Database execution error.' },\r\n };\r\n\r\n /**\r\n * Logs error information with metadata and stack trace\r\n * @private\r\n * @param error - The error to log\r\n * @param context - Additional context information for the error\r\n */\r\n private static logError(error: unknown, context: Record<string, unknown> = {}): void {\r\n if (!this.CONFIG.shouldLogErrors) return;\r\n\r\n const errorMeta = this.extractErrorMetadata(error);\r\n const timestamp = new Date().toISOString();\r\n\r\n const logData = {\r\n timestamp,\r\n type: errorMeta.type,\r\n message: error instanceof Error ? error.message : 'Unknown error',\r\n stack:\r\n error instanceof Error\r\n ? error.stack?.split('\\n').slice(0, this.CONFIG.maxStackTraceLines).join('\\n')\r\n : undefined,\r\n context,\r\n metadata: errorMeta,\r\n };\r\n\r\n console.error('[ErrorHandler]:', JSON.stringify(logData, null, 2));\r\n }\r\n\r\n /**\r\n * Main error handling method that transforms various error types into TRPC errors\r\n * @param error - The error to handle\r\n * @param customMessage - Optional custom error message\r\n * @param context - Additional context information\r\n * @throws {TRPCError} Transformed error with appropriate error code and message\r\n */\r\n public static handleError(\r\n error: unknown,\r\n customMessage = 'An unexpected error occurred',\r\n context: Record<string, unknown> = {}\r\n ): never {\r\n this.logError(error, context);\r\n\r\n if (error instanceof TRPCError) {\r\n throw error;\r\n }\r\n\r\n if (error instanceof ZodError) {\r\n throw new TRPCError({\r\n code: 'BAD_REQUEST',\r\n message: 'Validation error',\r\n cause: error.flatten(),\r\n });\r\n }\r\n\r\n if (error instanceof MongoNetworkError) {\r\n throw new TRPCError({\r\n code: 'INTERNAL_SERVER_ERROR',\r\n message: 'Database connection error',\r\n cause: error,\r\n });\r\n }\r\n\r\n if (this.isMongoError(error)) {\r\n throw this.createMongoTRPCError(error);\r\n }\r\n\r\n if (error instanceof Error) {\r\n throw new TRPCError({\r\n code: this.mapNodeErrorCode(error),\r\n message: error.message || customMessage,\r\n cause: error,\r\n });\r\n }\r\n\r\n throw new TRPCError({\r\n code: 'INTERNAL_SERVER_ERROR',\r\n message: customMessage,\r\n cause: error,\r\n });\r\n }\r\n\r\n /**\r\n * Type guard to check if an error is a MongoDB error\r\n * @private\r\n * @param error - The error to check\r\n * @returns True if the error is a MongoDB error\r\n */\r\n private static isMongoError(error: unknown): error is MongoServerError {\r\n return (\r\n error instanceof MongoServerError ||\r\n error instanceof MongoError ||\r\n (typeof error === 'object' &&\r\n error !== null &&\r\n 'code' in error &&\r\n 'name' in error &&\r\n ((error as MongoServerError).name === 'MongoServerError' ||\r\n (error as MongoServerError).name === 'MongoError'))\r\n );\r\n }\r\n\r\n /**\r\n * Creates a TRPC error from a MongoDB error\r\n * @private\r\n * @param error - MongoDB error to transform\r\n * @returns Transformed TRPC error\r\n */\r\n private static createMongoTRPCError(error: MongoServerError): TRPCError {\r\n const errorCode = typeof error.code === 'number' ? error.code : 0;\r\n const errorInfo = this.MONGO_ERROR_CODES[errorCode] || {\r\n code: 'INTERNAL_SERVER_ERROR',\r\n message: `Database error occurred. Code: ${errorCode}`,\r\n };\r\n\r\n return new TRPCError({\r\n code: errorInfo.code,\r\n message: errorInfo.message,\r\n cause: error,\r\n });\r\n }\r\n\r\n /**\r\n * Maps Node.js error codes to TRPC error codes\r\n * @private\r\n * @param error - Node.js error to map\r\n * @returns Appropriate TRPC error code\r\n */\r\n private static mapNodeErrorCode(error: Error): TRPCError['code'] {\r\n const nodeErrorMap: Record<string, TRPCError['code']> = {\r\n ENOENT: 'NOT_FOUND',\r\n EACCES: 'FORBIDDEN',\r\n ECONNREFUSED: 'INTERNAL_SERVER_ERROR',\r\n ECONNRESET: 'INTERNAL_SERVER_ERROR',\r\n ETIMEDOUT: 'TIMEOUT',\r\n EPIPE: 'INTERNAL_SERVER_ERROR',\r\n ENOTFOUND: 'NOT_FOUND',\r\n EINVAL: 'BAD_REQUEST',\r\n EMFILE: 'INTERNAL_SERVER_ERROR',\r\n EPERM: 'FORBIDDEN',\r\n };\r\n\r\n const code = (error as NodeJS.ErrnoException).code;\r\n return code ? nodeErrorMap[code] || 'INTERNAL_SERVER_ERROR' : 'INTERNAL_SERVER_ERROR';\r\n }\r\n\r\n /**\r\n * Wraps an async function with error handling\r\n * @param fn - Async function to wrap\r\n * @param context - Additional context information\r\n * @returns Promise resolving to the function's return type\r\n * @throws {TRPCError} If the function throws an error\r\n */\r\n public static async wrapAsync<T>(fn: () => Promise<T>, context: Record<string, unknown> = {}): Promise<T> {\r\n try {\r\n return await fn();\r\n } catch (error) {\r\n this.handleError(error, undefined, context);\r\n }\r\n }\r\n\r\n /**\r\n * Executes an async function with retry mechanism for transient errors\r\n * @param fn - Async function to execute\r\n * @param options - Retry configuration options\r\n * @returns Promise resolving to the function's return type\r\n * @throws {TRPCError} If all retry attempts fail\r\n */\r\n public static async withRetry<T>(\r\n fn: () => Promise<T>,\r\n options: {\r\n maxAttempts?: number;\r\n delayMs?: number;\r\n backoffFactor?: number;\r\n context?: Record<string, unknown>;\r\n } = {}\r\n ): Promise<T> {\r\n const { maxAttempts = 3, delayMs = 1000, backoffFactor = 2, context = {} } = options;\r\n\r\n let lastError: unknown;\r\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\r\n try {\r\n return await fn();\r\n } catch (error) {\r\n lastError = error;\r\n\r\n const isRetryable = this.isRetryableError(error);\r\n const isLastAttempt = attempt === maxAttempts;\r\n\r\n if (!isRetryable || isLastAttempt) {\r\n this.handleError(error, undefined, { ...context, attempt });\r\n }\r\n\r\n await new Promise(resolve => setTimeout(resolve, delayMs * Math.pow(backoffFactor, attempt - 1)));\r\n }\r\n }\r\n\r\n throw lastError;\r\n }\r\n\r\n /**\r\n * Determines if an error is retryable\r\n * @private\r\n * @param error - The error to check\r\n * @returns True if the error is retryable\r\n */\r\n private static isRetryableError(error: unknown): boolean {\r\n if (error instanceof MongoNetworkError) return true;\r\n if (error instanceof Error) {\r\n const code = (error as NodeJS.ErrnoException).code;\r\n return code ? this.CONFIG.retryableErrors.has(code) : false;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Extracts metadata from an error for logging and analysis\r\n * @param error - The error to extract metadata from\r\n * @returns Object containing error type, original error, and additional details\r\n */\r\n public static extractErrorMetadata(error: unknown): {\r\n type: string;\r\n originalError: unknown;\r\n details?: Record<string, unknown>;\r\n } {\r\n if (error instanceof TRPCError) {\r\n return {\r\n type: 'TRPCError',\r\n originalError: error.cause ?? error,\r\n details: {\r\n code: error.code,\r\n message: error.message,\r\n },\r\n };\r\n }\r\n\r\n if (error instanceof ZodError) {\r\n return {\r\n type: 'ZodError',\r\n originalError: error,\r\n details: error.flatten(),\r\n };\r\n }\r\n\r\n if (error instanceof MongoNetworkError) {\r\n return {\r\n type: 'MongoNetworkError',\r\n originalError: error,\r\n details: {\r\n message: error.message,\r\n isRetryable: true,\r\n },\r\n };\r\n }\r\n\r\n if (this.isMongoError(error)) {\r\n return {\r\n type: 'MongoError',\r\n originalError: error,\r\n details: {\r\n code: (error as MongoServerError).code,\r\n codeName: (error as MongoServerError).codeName,\r\n keyPattern: (error as MongoServerError).keyPattern,\r\n },\r\n };\r\n }\r\n\r\n if (error instanceof Error) {\r\n return {\r\n type: 'NodeError',\r\n originalError: error,\r\n details: {\r\n name: error.name,\r\n code: (error as NodeJS.ErrnoException).code,\r\n },\r\n };\r\n }\r\n\r\n return { type: 'UnknownError', originalError: error };\r\n }\r\n}"]}
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"/","sources":["utilities/error-handler.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * @fileoverview Error handling utility for TRPC and MongoDB operations.\r\n * Provides centralized error handling, logging, and retry mechanisms.\r\n */\r\n\r\nimport { TRPCError } from '@trpc/server';\r\nimport { MongoServerError, MongoError, MongoNetworkError } from 'mongodb';\r\nimport { ZodError } from 'zod';\r\n\r\n/**\r\n * A utility class for handling various types of errors in a TRPC-MongoDB application.\r\n * Provides error transformation, logging, and retry mechanisms.\r\n */\r\nexport class ErrorHandler {\r\n\t/**\r\n\t * Configuration options for error handling behavior\r\n\t * @private\r\n\t */\r\n\tprivate static readonly CONFIG = {\r\n\t\t/** Whether to log errors to console */\r\n\t\tshouldLogErrors: true,\r\n\t\t/** Maximum number of stack trace lines to include in logs */\r\n\t\tmaxStackTraceLines: 10,\r\n\t\t/** Set of error codes that are considered retryable */\r\n\t\tretryableErrors: new Set(['ECONNRESET', 'ECONNREFUSED', 'ETIMEDOUT', 'EPIPE']),\r\n\t};\r\n\r\n\t/**\r\n\t * Mapping of MongoDB error codes to TRPC error types and messages\r\n\t * @private\r\n\t */\r\n\tprivate static readonly MONGO_ERROR_CODES: Record<\r\n\t\tnumber,\r\n\t\t{\r\n\t\t\tcode: TRPCError['code'];\r\n\t\t\tmessage: string;\r\n\t\t}\r\n\t> = {\r\n\t\t11000: { code: 'CONFLICT', message: 'Duplicate key error: A record with this value already exists.' },\r\n\t\t11001: { code: 'CONFLICT', message: 'Duplicate key error on index update.' },\r\n\t\t121: { code: 'BAD_REQUEST', message: 'Document validation failed.' },\r\n\t\t7: { code: 'INTERNAL_SERVER_ERROR', message: 'Not primary - database is in recovery mode.' },\r\n\t\t89: { code: 'FORBIDDEN', message: 'Unauthorized operation attempted.' },\r\n\t\t91: { code: 'TIMEOUT', message: 'Operation timeout exceeded.' },\r\n\t\t189: { code: 'BAD_REQUEST', message: 'Invalid modification - document would exceed size limit.' },\r\n\t\t50: { code: 'INTERNAL_SERVER_ERROR', message: 'Database execution error.' },\r\n\t};\r\n\r\n\t/**\r\n\t * Logs error information with metadata and stack trace\r\n\t * @private\r\n\t * @param error - The error to log\r\n\t * @param context - Additional context information for the error\r\n\t */\r\n\tprivate static logError(error: unknown, context: Record<string, unknown> = {}): void {\r\n\t\tif (!this.CONFIG.shouldLogErrors) return;\r\n\r\n\t\tconst errorMeta = this.extractErrorMetadata(error);\r\n\t\tconst timestamp = new Date().toISOString();\r\n\r\n\t\tconst logData = {\r\n\t\t\ttimestamp,\r\n\t\t\ttype: errorMeta.type,\r\n\t\t\tmessage: error instanceof Error ? error.message : 'Unknown error',\r\n\t\t\tstack:\r\n\t\t\t\terror instanceof Error\r\n\t\t\t\t\t? error.stack?.split('\\n').slice(0, this.CONFIG.maxStackTraceLines).join('\\n')\r\n\t\t\t\t\t: undefined,\r\n\t\t\tcontext,\r\n\t\t\tmetadata: errorMeta,\r\n\t\t};\r\n\r\n\t\tconsole.error('[ErrorHandler]:', JSON.stringify(logData, null, 2));\r\n\t}\r\n\r\n\t/**\r\n\t * Main error handling method that transforms various error types into TRPC errors\r\n\t * @param error - The error to handle\r\n\t * @param customMessage - Optional custom error message\r\n\t * @param context - Additional context information\r\n\t * @throws {TRPCError} Transformed error with appropriate error code and message\r\n\t */\r\n\tpublic static handleError(\r\n\t\terror: unknown,\r\n\t\tcustomMessage = 'An unexpected error occurred',\r\n\t\tcontext: Record<string, unknown> = {}\r\n\t): never {\r\n\t\tthis.logError(error, context);\r\n\r\n\t\tif (error instanceof TRPCError) {\r\n\t\t\tthrow error;\r\n\t\t}\r\n\r\n\t\tif (error instanceof ZodError) {\r\n\t\t\tthrow new TRPCError({\r\n\t\t\t\tcode: 'BAD_REQUEST',\r\n\t\t\t\tmessage: 'Validation error',\r\n\t\t\t\tcause: error.flatten(),\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (error instanceof MongoNetworkError) {\r\n\t\t\tthrow new TRPCError({\r\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\r\n\t\t\t\tmessage: 'Database connection error',\r\n\t\t\t\tcause: error,\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (this.isMongoError(error)) {\r\n\t\t\tthrow this.createMongoTRPCError(error);\r\n\t\t}\r\n\r\n\t\tif (error instanceof Error) {\r\n\t\t\tthrow new TRPCError({\r\n\t\t\t\tcode: this.mapNodeErrorCode(error),\r\n\t\t\t\tmessage: error.message || customMessage,\r\n\t\t\t\tcause: error,\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tthrow new TRPCError({\r\n\t\t\tcode: 'INTERNAL_SERVER_ERROR',\r\n\t\t\tmessage: customMessage,\r\n\t\t\tcause: error,\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Type guard to check if an error is a MongoDB error\r\n\t * @private\r\n\t * @param error - The error to check\r\n\t * @returns True if the error is a MongoDB error\r\n\t */\r\n\tprivate static isMongoError(error: unknown): error is MongoServerError {\r\n\t\treturn (\r\n\t\t\terror instanceof MongoServerError ||\r\n\t\t\terror instanceof MongoError ||\r\n\t\t\t(typeof error === 'object' &&\r\n\t\t\t\terror !== null &&\r\n\t\t\t\t'code' in error &&\r\n\t\t\t\t'name' in error &&\r\n\t\t\t\t((error as MongoServerError).name === 'MongoServerError' ||\r\n\t\t\t\t\t(error as MongoServerError).name === 'MongoError'))\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a TRPC error from a MongoDB error\r\n\t * @private\r\n\t * @param error - MongoDB error to transform\r\n\t * @returns Transformed TRPC error\r\n\t */\r\n\tprivate static createMongoTRPCError(error: MongoServerError): TRPCError {\r\n\t\tconst errorCode = typeof error.code === 'number' ? error.code : 0;\r\n\t\tconst errorInfo = this.MONGO_ERROR_CODES[errorCode] || {\r\n\t\t\tcode: 'INTERNAL_SERVER_ERROR',\r\n\t\t\tmessage: `Database error occurred. Code: ${errorCode}`,\r\n\t\t};\r\n\r\n\t\treturn new TRPCError({\r\n\t\t\tcode: errorInfo.code,\r\n\t\t\tmessage: errorInfo.message,\r\n\t\t\tcause: error,\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Maps Node.js error codes to TRPC error codes\r\n\t * @private\r\n\t * @param error - Node.js error to map\r\n\t * @returns Appropriate TRPC error code\r\n\t */\r\n\tprivate static mapNodeErrorCode(error: Error): TRPCError['code'] {\r\n\t\tconst nodeErrorMap: Record<string, TRPCError['code']> = {\r\n\t\t\tENOENT: 'NOT_FOUND',\r\n\t\t\tEACCES: 'FORBIDDEN',\r\n\t\t\tECONNREFUSED: 'INTERNAL_SERVER_ERROR',\r\n\t\t\tECONNRESET: 'INTERNAL_SERVER_ERROR',\r\n\t\t\tETIMEDOUT: 'TIMEOUT',\r\n\t\t\tEPIPE: 'INTERNAL_SERVER_ERROR',\r\n\t\t\tENOTFOUND: 'NOT_FOUND',\r\n\t\t\tEINVAL: 'BAD_REQUEST',\r\n\t\t\tEMFILE: 'INTERNAL_SERVER_ERROR',\r\n\t\t\tEPERM: 'FORBIDDEN',\r\n\t\t};\r\n\r\n\t\tconst code = (error as NodeJS.ErrnoException).code;\r\n\t\treturn code ? nodeErrorMap[code] || 'INTERNAL_SERVER_ERROR' : 'INTERNAL_SERVER_ERROR';\r\n\t}\r\n\r\n\t/**\r\n\t * Wraps an async function with error handling\r\n\t * @param fn - Async function to wrap\r\n\t * @param context - Additional context information\r\n\t * @returns Promise resolving to the function's return type\r\n\t * @throws {TRPCError} If the function throws an error\r\n\t */\r\n\tpublic static async wrapAsync<T>(fn: () => Promise<T>, context: Record<string, unknown> = {}): Promise<T> {\r\n\t\ttry {\r\n\t\t\treturn await fn();\r\n\t\t} catch (error) {\r\n\t\t\tthis.handleError(error, undefined, context);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Executes an async function with retry mechanism for transient errors\r\n\t * @param fn - Async function to execute\r\n\t * @param options - Retry configuration options\r\n\t * @returns Promise resolving to the function's return type\r\n\t * @throws {TRPCError} If all retry attempts fail\r\n\t */\r\n\tpublic static async withRetry<T>(\r\n\t\tfn: () => Promise<T>,\r\n\t\toptions: {\r\n\t\t\tmaxAttempts?: number;\r\n\t\t\tdelayMs?: number;\r\n\t\t\tbackoffFactor?: number;\r\n\t\t\tcontext?: Record<string, unknown>;\r\n\t\t} = {}\r\n\t): Promise<T> {\r\n\t\tconst { maxAttempts = 3, delayMs = 1000, backoffFactor = 2, context = {} } = options;\r\n\r\n\t\tlet lastError: unknown;\r\n\t\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\r\n\t\t\ttry {\r\n\t\t\t\treturn await fn();\r\n\t\t\t} catch (error) {\r\n\t\t\t\tlastError = error;\r\n\r\n\t\t\t\tconst isRetryable = this.isRetryableError(error);\r\n\t\t\t\tconst isLastAttempt = attempt === maxAttempts;\r\n\r\n\t\t\t\tif (!isRetryable || isLastAttempt) {\r\n\t\t\t\t\tthis.handleError(error, undefined, { ...context, attempt });\r\n\t\t\t\t}\r\n\r\n\t\t\t\tawait new Promise(resolve => setTimeout(resolve, delayMs * Math.pow(backoffFactor, attempt - 1)));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthrow lastError;\r\n\t}\r\n\r\n\t/**\r\n\t * Determines if an error is retryable\r\n\t * @private\r\n\t * @param error - The error to check\r\n\t * @returns True if the error is retryable\r\n\t */\r\n\tprivate static isRetryableError(error: unknown): boolean {\r\n\t\tif (error instanceof MongoNetworkError) return true;\r\n\t\tif (error instanceof Error) {\r\n\t\t\tconst code = (error as NodeJS.ErrnoException).code;\r\n\t\t\treturn code ? this.CONFIG.retryableErrors.has(code) : false;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * Extracts metadata from an error for logging and analysis\r\n\t * @param error - The error to extract metadata from\r\n\t * @returns Object containing error type, original error, and additional details\r\n\t */\r\n\tpublic static extractErrorMetadata(error: unknown): {\r\n\t\ttype: string;\r\n\t\toriginalError: unknown;\r\n\t\tdetails?: Record<string, unknown>;\r\n\t} {\r\n\t\tif (error instanceof TRPCError) {\r\n\t\t\treturn {\r\n\t\t\t\ttype: 'TRPCError',\r\n\t\t\t\toriginalError: error.cause ?? error,\r\n\t\t\t\tdetails: {\r\n\t\t\t\t\tcode: error.code,\r\n\t\t\t\t\tmessage: error.message,\r\n\t\t\t\t},\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tif (error instanceof ZodError) {\r\n\t\t\treturn {\r\n\t\t\t\ttype: 'ZodError',\r\n\t\t\t\toriginalError: error,\r\n\t\t\t\tdetails: error.flatten(),\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tif (error instanceof MongoNetworkError) {\r\n\t\t\treturn {\r\n\t\t\t\ttype: 'MongoNetworkError',\r\n\t\t\t\toriginalError: error,\r\n\t\t\t\tdetails: {\r\n\t\t\t\t\tmessage: error.message,\r\n\t\t\t\t\tisRetryable: true,\r\n\t\t\t\t},\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tif (this.isMongoError(error)) {\r\n\t\t\treturn {\r\n\t\t\t\ttype: 'MongoError',\r\n\t\t\t\toriginalError: error,\r\n\t\t\t\tdetails: {\r\n\t\t\t\t\tcode: (error as MongoServerError).code,\r\n\t\t\t\t\tcodeName: (error as MongoServerError).codeName,\r\n\t\t\t\t\tkeyPattern: (error as MongoServerError).keyPattern,\r\n\t\t\t\t},\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tif (error instanceof Error) {\r\n\t\t\treturn {\r\n\t\t\t\ttype: 'NodeError',\r\n\t\t\t\toriginalError: error,\r\n\t\t\t\tdetails: {\r\n\t\t\t\t\tname: error.name,\r\n\t\t\t\t\tcode: (error as NodeJS.ErrnoException).code,\r\n\t\t\t\t},\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn { type: 'UnknownError', originalError: error };\r\n\t}\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-middleware.js","sourceRoot":"/","sources":["utilities/error-middleware.ts"],"names":[],"mappings":"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","sourcesContent":["import { TRPCError } from '@trpc/server';\r\nimport { ErrorHandler } from './error-handler';\r\nimport * as util from 'util';\r\n\r\n/**\r\n * Parameters for the tRPC error handler\r\n * @typedef {Object} ErrorHandlerParams\r\n * @property {TRPCError|Error|unknown} error - The error object to handle\r\n * @property {'query'|'mutation'|'subscription'|'unknown'} type - The type of tRPC procedure\r\n * @property {string|undefined} path - The path of the tRPC procedure\r\n * @property {Record<string,any>|undefined} ctx - The context of the request\r\n * @property {any} req - The request object\r\n * @property {unknown} input - The input parameters for the procedure\r\n */\r\ninterface ErrorHandlerParams {\r\n\terror: TRPCError | Error | unknown;\r\n\ttype: 'query' | 'mutation' | 'subscription' | 'unknown';\r\n\tpath: string | undefined;\r\n\tctx: Record<string, any> | undefined;\r\n\treq: any;\r\n\tinput: unknown;\r\n}\r\n\r\n/**\r\n * Structure of validation errors from zod validation\r\n * @typedef {Object} ValidationError\r\n * @property {string} code - The error code (e.g., 'invalid_type')\r\n * @property {string} expected - The expected type or value\r\n * @property {string} received - The received type or value\r\n * @property {(string|number)[]} path - The path to the field with the error\r\n * @property {string} message - The error message\r\n */\r\ninterface ValidationError {\r\n\tcode: string;\r\n\texpected: string;\r\n\treceived: string;\r\n\tpath: (string | number)[];\r\n\tmessage: string;\r\n}\r\n\r\n/**\r\n * Central error handler for tRPC HTTP server.\r\n * \r\n * This handler provides comprehensive error logging with structured, formatted output in the console.\r\n * It specializes in handling validation errors from zod schemas, presenting them in a readable format\r\n * both for console debugging and client response.\r\n * \r\n * Key features:\r\n * - Beautiful console formatting with box-styled outputs\r\n * - Special handling for validation errors with field-by-field breakdown\r\n * - Proper handling of nested error objects and stack traces\r\n * - Integration with ErrorHandler utility for extracting additional metadata\r\n * - Client-friendly error message formatting for validation errors\r\n * \r\n * @param {ErrorHandlerParams} params - The error handler parameters\r\n * @param {TRPCError|Error|unknown} params.error - The error that occurred\r\n * @param {'query'|'mutation'|'subscription'|'unknown'} params.type - Type of tRPC procedure\r\n * @param {string|undefined} params.path - Path of the tRPC procedure\r\n * @param {Record<string,any>|undefined} params.ctx - Request context\r\n * @param {any} params.req - The request object\r\n * @param {unknown} params.input - The input parameters\r\n * \r\n * @returns {void}\r\n */\r\nexport function handleTRPCError({ error, type, path, ctx }: ErrorHandlerParams): void {\r\n\tconst errorContext = {\r\n\t\tprocedurePath: path ?? 'unknown',\r\n\t\tprocedureType: type,\r\n\t\trequestId: ctx?.requestId ?? 'unknown',\r\n\t\ttimestamp: new Date().toISOString(),\r\n\t};\r\n\r\n\tconsole.error(error);\r\n\r\n\t// Print a clear error header with context\r\n\tconsole.error('\\n\\n');\r\n\tconsole.error('╔═══════════════════════════════════════════════════════════════════╗');\r\n\tconsole.error('║ 🔥 TRPC ERROR 🔥 ║');\r\n\tconsole.error('╚═══════════════════════════════════════════════════════════════════╝');\r\n\r\n\t// Print context information in a structured format\r\n\tconsole.error('\\n📋 Error Context:');\r\n\tconsole.error('┌─────────────────────────────────────────────────────────────────┐');\r\n\tconsole.error(`│ Path: ${errorContext.procedurePath.padEnd(52)} │`);\r\n\tconsole.error(`│ Type: ${errorContext.procedureType.padEnd(52)} │`);\r\n\tconsole.error(`│ Request ID: ${errorContext.requestId.padEnd(51)} │`);\r\n\tconsole.error(`│ Timestamp: ${errorContext.timestamp.padEnd(51)} │`);\r\n\tconsole.error('└─────────────────────────────────────────────────────────────────┘');\r\n\r\n\tif (error instanceof TRPCError) {\r\n\t\t// Print basic error info\r\n\t\tconsole.error('\\n🚨 Error Details:');\r\n\t\tconsole.error('┌─────────────────────────────────────────────────────────────────┐');\r\n\t\tconsole.error(`│ Code: ${error.code.padEnd(54)} │`);\r\n\t\tconsole.error('└─────────────────────────────────────────────────────────────────┘');\r\n\r\n\t\t// Handle validation errors specially\r\n\t\tif (error.code === 'BAD_REQUEST') {\r\n\t\t\ttry {\r\n\t\t\t\tif (error.message.trim().startsWith('[') && error.message.includes('\"code\"')) {\r\n\t\t\t\t\tconst validationErrors = JSON.parse(error.message) as ValidationError[];\r\n\r\n\t\t\t\t\tconsole.error('\\n📋 Validation Errors:');\r\n\r\n\t\t\t\t\tvalidationErrors.forEach((err, index) => {\r\n\t\t\t\t\t\tconst fieldPath = err.path.join('.');\r\n\t\t\t\t\t\tconsole.error(`│ ${(index + 1).toString().padStart(2)}. Field: ${fieldPath.padEnd(52)} │`);\r\n\t\t\t\t\t\tconsole.error(`│ Error: ${err.message.padEnd(53)} │`);\r\n\t\t\t\t\t\tconsole.error(`│ Expected: ${err.expected?.padEnd(50) || 'N/A'.padEnd(50)} │`);\r\n\t\t\t\t\t\tconsole.error(`│ Received: ${err.received?.padEnd(50) || 'N/A'.padEnd(50)} │`);\r\n\r\n\t\t\t\t\t\t// Add a separator between errors, except for the last one\r\n\t\t\t\t\t\tif (index < validationErrors.length - 1) {\r\n\t\t\t\t\t\t\tconsole.error('│ │');\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\t// Format field errors for the client response\r\n\t\t\t\t\tconst fieldErrors = validationErrors.map(err => `(${err.path.join('.')}: ${err.message})`);\r\n\r\n\t\t\t\t\terror.message = `Validation failed: ${fieldErrors.join(', ')}`;\r\n\r\n\t\t\t\t\t// Print the formatted client message\r\n\t\t\t\t\tconsole.error('\\n📤 Client Response Message:');\r\n\r\n\t\t\t\t\t// Split the message into multiple lines if it's too long\r\n\t\t\t\t\tconst message = error.message;\r\n\t\t\t\t\tconst chunkSize = 65;\r\n\r\n\t\t\t\t\tfor (let i = 0; i < message.length; i += chunkSize) {\r\n\t\t\t\t\t\tconst chunk = message.substring(i, i + chunkSize);\r\n\t\t\t\t\t\tconsole.error(`│ ${chunk.padEnd(65)}`);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t} catch (parseError) {\r\n\t\t\t\tconsole.error('\\n⚠️ Error Parsing Validation Error:');\r\n\t\t\t\tconsole.error(\r\n\t\t\t\t\t`│ ${parseError instanceof Error ? parseError.message.padEnd(65) : String(parseError).padEnd(65)}`\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Print the error message\r\n\t\tconsole.error('\\n📝 Error Message:');\r\n\r\n\t\t// Split the message into multiple lines if it's too long\r\n\t\tconst message = error.message;\r\n\t\tconst chunkSize = 65;\r\n\r\n\t\tfor (let i = 0; i < message.length; i += chunkSize) {\r\n\t\t\tconst chunk = message.substring(i, i + chunkSize);\r\n\t\t\tconsole.error(`│ ${chunk.padEnd(65)}`);\r\n\t\t}\r\n\r\n\t\t// Print the error cause if available\r\n\t\tif (error.cause) {\r\n\t\t\tconsole.error('\\n🔍 Error Cause:');\r\n\r\n\t\t\t// Use util.inspect to format the cause object nicely\r\n\t\t\tconst causeString = util.inspect(error.cause, { depth: 4, colors: true });\r\n\t\t\tconst causeLines = causeString.split('\\n');\r\n\r\n\t\t\tcauseLines.forEach(line => {\r\n\t\t\t\t// Remove ANSI color codes for padding calculation\r\n\t\t\t\tconst plainLine = line.replace(/\\x1b\\[\\d+m/g, '');\r\n\t\t\t\tconsole.error(`│ ${line.padEnd(65 - (line.length - plainLine.length))}`);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Print stack trace if available\r\n\t\tif (error.stack) {\r\n\t\t\tconsole.error('\\n📚 Stack Trace:');\r\n\r\n\t\t\tconst stackLines = error.stack.split('\\n');\r\n\t\t\tstackLines.forEach(line => {\r\n\t\t\t\t// Truncate or split long lines\r\n\t\t\t\tif (line.length > 65) {\r\n\t\t\t\t\tfor (let i = 0; i < line.length; i += 65) {\r\n\t\t\t\t\t\tconst chunk = line.substring(i, i + 65);\r\n\t\t\t\t\t\tconsole.error(`│ ${chunk.padEnd(65)}`);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.error(`│ ${line.padEnd(65)}`);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t} else if (error instanceof Error) {\r\n\t\t// Handle standard errors\r\n\t\tconsole.error('\\n🚨 Standard Error:');\r\n\t\tconsole.error('┌─────────────────────────────────────────────────────────────────┐');\r\n\t\tconsole.error(`│ Name: ${error.name.padEnd(54)} │`);\r\n\t\tconsole.error(`│ Message: ${error.message.padEnd(54)} │`);\r\n\t\tconsole.error('└─────────────────────────────────────────────────────────────────┘');\r\n\r\n\t\t// Print stack trace if available\r\n\t\tif (error.stack) {\r\n\t\t\tconsole.error('\\n📚 Stack Trace:');\r\n\r\n\t\t\tconst stackLines = error.stack.split('\\n');\r\n\t\t\tstackLines.forEach(line => {\r\n\t\t\t\t// Truncate or split long lines\r\n\t\t\t\tif (line.length > 65) {\r\n\t\t\t\t\tfor (let i = 0; i < line.length; i += 65) {\r\n\t\t\t\t\t\tconst chunk = line.substring(i, i + 65);\r\n\t\t\t\t\t\tconsole.error(`│ ${chunk.padEnd(65)} │`);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.error(`│ ${line.padEnd(65)} │`);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t} else {\r\n\t\t// Handle unknown errors\r\n\t\tconsole.error('\\n❓ Unknown Error:');\r\n\r\n\t\tconst errorString = util.inspect(error, { depth: 4, colors: true });\r\n\t\tconst errorLines = errorString.split('\\n');\r\n\r\n\t\terrorLines.forEach(line => {\r\n\t\t\t// Remove ANSI color codes for padding calculation\r\n\t\t\tconst plainLine = line.replace(/\\x1b\\[\\d+m/g, '');\r\n\t\t\tconsole.error(`│ ${line.padEnd(65 - (line.length - plainLine.length))}`);\r\n\t\t});\r\n\t}\r\n\r\n\t// Use ErrorHandler's methods for additional metadata\r\n\ttry {\r\n\t\tconst errorMeta = ErrorHandler.extractErrorMetadata(error);\r\n\r\n\t\tif (errorMeta && Object.keys(errorMeta).length > 0) {\r\n\t\t\tconsole.error('\\n🔬 Additional Error Metadata:');\r\n\r\n\t\t\tconst metaString = util.inspect(errorMeta, { depth: 4, colors: true });\r\n\t\t\tconst metaLines = metaString.split('\\n');\r\n\r\n\t\t\tmetaLines.forEach(line => {\r\n\t\t\t\t// Remove ANSI color codes for padding calculation\r\n\t\t\t\tconst plainLine = line.replace(/\\x1b\\[\\d+m/g, '');\r\n\t\t\t\tconsole.error(`│ ${line.padEnd(65 - (line.length - plainLine.length))}`);\r\n\t\t\t});\r\n\t\t}\r\n\t} catch (handlingError) {\r\n\t\tconsole.error('\\n⚠️ Error While Extracting Metadata:');\r\n\t\tconsole.error(\r\n\t\t\t`│ ${\r\n\t\t\t\thandlingError instanceof Error ? handlingError.message.padEnd(65) : String(handlingError).padEnd(65)\r\n\t\t\t}`\r\n\t\t);\r\n\t}\r\n\r\n\tconsole.error('\\n\\n');\r\n}"]}
|
|
1
|
+
{"version":3,"file":"error-middleware.js","sourceRoot":"/","sources":["utilities/error-middleware.ts"],"names":[],"mappings":"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","sourcesContent":["import { TRPCError } from '@trpc/server';\r\nimport { ErrorHandler } from './error-handler';\r\nimport * as util from 'util';\r\n\r\n/**\r\n * Parameters for the tRPC error handler\r\n * @typedef {Object} ErrorHandlerParams\r\n * @property {TRPCError|Error|unknown} error - The error object to handle\r\n * @property {'query'|'mutation'|'subscription'|'unknown'} type - The type of tRPC procedure\r\n * @property {string|undefined} path - The path of the tRPC procedure\r\n * @property {Record<string,any>|undefined} ctx - The context of the request\r\n * @property {any} req - The request object\r\n * @property {unknown} input - The input parameters for the procedure\r\n */\r\ninterface ErrorHandlerParams {\r\n\terror: TRPCError | Error | unknown;\r\n\ttype: 'query' | 'mutation' | 'subscription' | 'unknown';\r\n\tpath: string | undefined;\r\n\tctx: Record<string, any> | undefined;\r\n\treq: any;\r\n\tinput: unknown;\r\n}\r\n\r\n/**\r\n * Structure of validation errors from zod validation\r\n * @typedef {Object} ValidationError\r\n * @property {string} code - The error code (e.g., 'invalid_type')\r\n * @property {string} expected - The expected type or value\r\n * @property {string} received - The received type or value\r\n * @property {(string|number)[]} path - The path to the field with the error\r\n * @property {string} message - The error message\r\n */\r\ninterface ValidationError {\r\n\tcode: string;\r\n\texpected: string;\r\n\treceived: string;\r\n\tpath: (string | number)[];\r\n\tmessage: string;\r\n}\r\n\r\n/**\r\n * Central error handler for tRPC HTTP server.\r\n *\r\n * This handler provides comprehensive error logging with structured, formatted output in the console.\r\n * It specializes in handling validation errors from zod schemas, presenting them in a readable format\r\n * both for console debugging and client response.\r\n *\r\n * Key features:\r\n * - Beautiful console formatting with box-styled outputs\r\n * - Special handling for validation errors with field-by-field breakdown\r\n * - Proper handling of nested error objects and stack traces\r\n * - Integration with ErrorHandler utility for extracting additional metadata\r\n * - Client-friendly error message formatting for validation errors\r\n *\r\n * @param {ErrorHandlerParams} params - The error handler parameters\r\n * @param {TRPCError|Error|unknown} params.error - The error that occurred\r\n * @param {'query'|'mutation'|'subscription'|'unknown'} params.type - Type of tRPC procedure\r\n * @param {string|undefined} params.path - Path of the tRPC procedure\r\n * @param {Record<string,any>|undefined} params.ctx - Request context\r\n * @param {any} params.req - The request object\r\n * @param {unknown} params.input - The input parameters\r\n *\r\n * @returns {void}\r\n */\r\nexport function handleTRPCError({ error, type, path, ctx }: ErrorHandlerParams): void {\r\n\tconst errorContext = {\r\n\t\tprocedurePath: path ?? 'unknown',\r\n\t\tprocedureType: type,\r\n\t\trequestId: ctx?.requestId ?? 'unknown',\r\n\t\ttimestamp: new Date().toISOString(),\r\n\t};\r\n\r\n\tconsole.error(error);\r\n\r\n\t// Print a clear error header with context\r\n\tconsole.error('\\n\\n');\r\n\tconsole.error('╔═══════════════════════════════════════════════════════════════════╗');\r\n\tconsole.error('║ 🔥 TRPC ERROR 🔥 ║');\r\n\tconsole.error('╚═══════════════════════════════════════════════════════════════════╝');\r\n\r\n\t// Print context information in a structured format\r\n\tconsole.error('\\n📋 Error Context:');\r\n\tconsole.error('┌─────────────────────────────────────────────────────────────────┐');\r\n\tconsole.error(`│ Path: ${errorContext.procedurePath.padEnd(52)} │`);\r\n\tconsole.error(`│ Type: ${errorContext.procedureType.padEnd(52)} │`);\r\n\tconsole.error(`│ Request ID: ${errorContext.requestId.padEnd(51)} │`);\r\n\tconsole.error(`│ Timestamp: ${errorContext.timestamp.padEnd(51)} │`);\r\n\tconsole.error('└─────────────────────────────────────────────────────────────────┘');\r\n\r\n\tif (error instanceof TRPCError) {\r\n\t\t// Print basic error info\r\n\t\tconsole.error('\\n🚨 Error Details:');\r\n\t\tconsole.error('┌─────────────────────────────────────────────────────────────────┐');\r\n\t\tconsole.error(`│ Code: ${error.code.padEnd(54)} │`);\r\n\t\tconsole.error('└─────────────────────────────────────────────────────────────────┘');\r\n\r\n\t\t// Handle validation errors specially\r\n\t\tif (error.code === 'BAD_REQUEST') {\r\n\t\t\ttry {\r\n\t\t\t\tif (error.message.trim().startsWith('[') && error.message.includes('\"code\"')) {\r\n\t\t\t\t\tconst validationErrors = JSON.parse(error.message) as ValidationError[];\r\n\r\n\t\t\t\t\tconsole.error('\\n📋 Validation Errors:');\r\n\r\n\t\t\t\t\tvalidationErrors.forEach((err, index) => {\r\n\t\t\t\t\t\tconst fieldPath = err.path.join('.');\r\n\t\t\t\t\t\tconsole.error(`│ ${(index + 1).toString().padStart(2)}. Field: ${fieldPath.padEnd(52)} │`);\r\n\t\t\t\t\t\tconsole.error(`│ Error: ${err.message.padEnd(53)} │`);\r\n\t\t\t\t\t\tconsole.error(`│ Expected: ${err.expected?.padEnd(50) || 'N/A'.padEnd(50)} │`);\r\n\t\t\t\t\t\tconsole.error(`│ Received: ${err.received?.padEnd(50) || 'N/A'.padEnd(50)} │`);\r\n\r\n\t\t\t\t\t\t// Add a separator between errors, except for the last one\r\n\t\t\t\t\t\tif (index < validationErrors.length - 1) {\r\n\t\t\t\t\t\t\tconsole.error('│ │');\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\t// Format field errors for the client response\r\n\t\t\t\t\tconst fieldErrors = validationErrors.map(err => `(${err.path.join('.')}: ${err.message})`);\r\n\r\n\t\t\t\t\terror.message = `Validation failed: ${fieldErrors.join(', ')}`;\r\n\r\n\t\t\t\t\t// Print the formatted client message\r\n\t\t\t\t\tconsole.error('\\n📤 Client Response Message:');\r\n\r\n\t\t\t\t\t// Split the message into multiple lines if it's too long\r\n\t\t\t\t\tconst message = error.message;\r\n\t\t\t\t\tconst chunkSize = 65;\r\n\r\n\t\t\t\t\tfor (let i = 0; i < message.length; i += chunkSize) {\r\n\t\t\t\t\t\tconst chunk = message.substring(i, i + chunkSize);\r\n\t\t\t\t\t\tconsole.error(`│ ${chunk.padEnd(65)}`);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t} catch (parseError) {\r\n\t\t\t\tconsole.error('\\n⚠️ Error Parsing Validation Error:');\r\n\t\t\t\tconsole.error(\r\n\t\t\t\t\t`│ ${parseError instanceof Error ? parseError.message.padEnd(65) : String(parseError).padEnd(65)}`\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Print the error message\r\n\t\tconsole.error('\\n📝 Error Message:');\r\n\r\n\t\t// Split the message into multiple lines if it's too long\r\n\t\tconst message = error.message;\r\n\t\tconst chunkSize = 65;\r\n\r\n\t\tfor (let i = 0; i < message.length; i += chunkSize) {\r\n\t\t\tconst chunk = message.substring(i, i + chunkSize);\r\n\t\t\tconsole.error(`│ ${chunk.padEnd(65)}`);\r\n\t\t}\r\n\r\n\t\t// Print the error cause if available\r\n\t\tif (error.cause) {\r\n\t\t\tconsole.error('\\n🔍 Error Cause:');\r\n\r\n\t\t\t// Use util.inspect to format the cause object nicely\r\n\t\t\tconst causeString = util.inspect(error.cause, { depth: 4, colors: true });\r\n\t\t\tconst causeLines = causeString.split('\\n');\r\n\r\n\t\t\tcauseLines.forEach(line => {\r\n\t\t\t\t// Remove ANSI color codes for padding calculation\r\n\t\t\t\tconst plainLine = line.replace(/\\x1b\\[\\d+m/g, '');\r\n\t\t\t\tconsole.error(`│ ${line.padEnd(65 - (line.length - plainLine.length))}`);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Print stack trace if available\r\n\t\tif (error.stack) {\r\n\t\t\tconsole.error('\\n📚 Stack Trace:');\r\n\r\n\t\t\tconst stackLines = error.stack.split('\\n');\r\n\t\t\tstackLines.forEach(line => {\r\n\t\t\t\t// Truncate or split long lines\r\n\t\t\t\tif (line.length > 65) {\r\n\t\t\t\t\tfor (let i = 0; i < line.length; i += 65) {\r\n\t\t\t\t\t\tconst chunk = line.substring(i, i + 65);\r\n\t\t\t\t\t\tconsole.error(`│ ${chunk.padEnd(65)}`);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.error(`│ ${line.padEnd(65)}`);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t} else if (error instanceof Error) {\r\n\t\t// Handle standard errors\r\n\t\tconsole.error('\\n🚨 Standard Error:');\r\n\t\tconsole.error('┌─────────────────────────────────────────────────────────────────┐');\r\n\t\tconsole.error(`│ Name: ${error.name.padEnd(54)} │`);\r\n\t\tconsole.error(`│ Message: ${error.message.padEnd(54)} │`);\r\n\t\tconsole.error('└─────────────────────────────────────────────────────────────────┘');\r\n\r\n\t\t// Print stack trace if available\r\n\t\tif (error.stack) {\r\n\t\t\tconsole.error('\\n📚 Stack Trace:');\r\n\r\n\t\t\tconst stackLines = error.stack.split('\\n');\r\n\t\t\tstackLines.forEach(line => {\r\n\t\t\t\t// Truncate or split long lines\r\n\t\t\t\tif (line.length > 65) {\r\n\t\t\t\t\tfor (let i = 0; i < line.length; i += 65) {\r\n\t\t\t\t\t\tconst chunk = line.substring(i, i + 65);\r\n\t\t\t\t\t\tconsole.error(`│ ${chunk.padEnd(65)} │`);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.error(`│ ${line.padEnd(65)} │`);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t} else {\r\n\t\t// Handle unknown errors\r\n\t\tconsole.error('\\n❓ Unknown Error:');\r\n\r\n\t\tconst errorString = util.inspect(error, { depth: 4, colors: true });\r\n\t\tconst errorLines = errorString.split('\\n');\r\n\r\n\t\terrorLines.forEach(line => {\r\n\t\t\t// Remove ANSI color codes for padding calculation\r\n\t\t\tconst plainLine = line.replace(/\\x1b\\[\\d+m/g, '');\r\n\t\t\tconsole.error(`│ ${line.padEnd(65 - (line.length - plainLine.length))}`);\r\n\t\t});\r\n\t}\r\n\r\n\t// Use ErrorHandler's methods for additional metadata\r\n\ttry {\r\n\t\tconst errorMeta = ErrorHandler.extractErrorMetadata(error);\r\n\r\n\t\tif (errorMeta && Object.keys(errorMeta).length > 0) {\r\n\t\t\tconsole.error('\\n🔬 Additional Error Metadata:');\r\n\r\n\t\t\tconst metaString = util.inspect(errorMeta, { depth: 4, colors: true });\r\n\t\t\tconst metaLines = metaString.split('\\n');\r\n\r\n\t\t\tmetaLines.forEach(line => {\r\n\t\t\t\t// Remove ANSI color codes for padding calculation\r\n\t\t\t\tconst plainLine = line.replace(/\\x1b\\[\\d+m/g, '');\r\n\t\t\t\tconsole.error(`│ ${line.padEnd(65 - (line.length - plainLine.length))}`);\r\n\t\t\t});\r\n\t\t}\r\n\t} catch (handlingError) {\r\n\t\tconsole.error('\\n⚠️ Error While Extracting Metadata:');\r\n\t\tconsole.error(\r\n\t\t\t`│ ${\r\n\t\t\t\thandlingError instanceof Error ? handlingError.message.padEnd(65) : String(handlingError).padEnd(65)\r\n\t\t\t}`\r\n\t\t);\r\n\t}\r\n\r\n\tconsole.error('\\n\\n');\r\n}\r\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { DocumentType, ReturnModelType } from
|
|
2
|
-
import { FilterQuery, PopulateOptions } from
|
|
3
|
-
import { z } from
|
|
4
|
-
import { AnyParamConstructor } from
|
|
1
|
+
import { DocumentType, ReturnModelType } from '@typegoose/typegoose';
|
|
2
|
+
import { FilterQuery, PopulateOptions } from 'mongoose';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { AnyParamConstructor } from '@typegoose/typegoose/lib/types';
|
|
5
5
|
export declare function createPaginatedSchema<ItemType extends z.ZodTypeAny>(itemSchema: ItemType): z.ZodObject<{
|
|
6
6
|
metadata: z.ZodObject<{
|
|
7
7
|
page: z.ZodNumber;
|
|
@@ -16,16 +16,13 @@ function createPaginatedSchema(itemSchema) {
|
|
|
16
16
|
});
|
|
17
17
|
}
|
|
18
18
|
async function _basePaginate(model, options) {
|
|
19
|
-
const { filter = {}, page = 1, size = 10, sort = {}, populate
|
|
19
|
+
const { filter = {}, page = 1, size = 10, sort = {}, populate } = options;
|
|
20
20
|
const skip = (page - 1) * size;
|
|
21
21
|
let query = model.find(filter).sort(sort).skip(skip).limit(size);
|
|
22
22
|
if (populate) {
|
|
23
23
|
query = query.populate(populate);
|
|
24
24
|
}
|
|
25
|
-
const [documents, totalElements] = await Promise.all([
|
|
26
|
-
query.exec(),
|
|
27
|
-
model.countDocuments(filter),
|
|
28
|
-
]);
|
|
25
|
+
const [documents, totalElements] = await Promise.all([query.exec(), model.countDocuments(filter)]);
|
|
29
26
|
const totalPages = Math.ceil(totalElements / size);
|
|
30
27
|
return {
|
|
31
28
|
metadata: {
|
|
@@ -50,9 +47,7 @@ function createPaginatorObject(model, itemSchema, transformFn) {
|
|
|
50
47
|
const PaginatedSchema = createPaginatedSchema(itemSchema);
|
|
51
48
|
return async function paginate(options) {
|
|
52
49
|
const { metadata, documents } = await _basePaginate(model, options);
|
|
53
|
-
const items = transformFn
|
|
54
|
-
? documents.map(transformFn)
|
|
55
|
-
: documents;
|
|
50
|
+
const items = transformFn ? documents.map(transformFn) : documents;
|
|
56
51
|
const paginatedResult = {
|
|
57
52
|
metadata,
|
|
58
53
|
items,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagination.js","sourceRoot":"/","sources":["utilities/pagination.ts"],"names":[],"mappings":";;AAQA,
|
|
1
|
+
{"version":3,"file":"pagination.js","sourceRoot":"/","sources":["utilities/pagination.ts"],"names":[],"mappings":";;AAQA,sDAUC;AAiED,4EAWC;AASD,sDAmBC;AAxHD,6BAAwB;AAMxB,SAAgB,qBAAqB,CAAgC,UAAoB;IACxF,OAAO,OAAC,CAAC,MAAM,CAAC;QACf,QAAQ,EAAE,OAAC,CAAC,MAAM,CAAC;YAClB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;YAChB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;YAChB,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE;YACzB,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE;SACtB,CAAC;QACF,KAAK,EAAE,OAAC,CAAC,KAAK,CAAC,UAAU,CAAC;KAC1B,CAAC,CAAC;AACJ,CAAC;AA8BD,KAAK,UAAU,aAAa,CAC3B,KAAyB,EACzB,OAA4B;IAE5B,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAE1E,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IAE/B,IAAI,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEjE,IAAI,QAAQ,EAAE,CAAC;QACd,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAEnG,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAEnD,OAAO;QACN,QAAQ,EAAE;YACT,IAAI;YACJ,IAAI;YACJ,aAAa;YACb,UAAU;SACV;QACD,SAAS,EAAE,SAAyC;KACpD,CAAC;AACH,CAAC;AAQD,SAAgB,gCAAgC,CAC/C,KAAyB;IAEzB,OAAO,KAAK,UAAU,QAAQ,CAAC,OAA4B;QAC1D,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAEpE,OAAO;YACN,QAAQ;YACR,SAAS;SACT,CAAC;IACH,CAAC,CAAC;AACH,CAAC;AASD,SAAgB,qBAAqB,CACpC,KAAyB,EACzB,UAAwB,EACxB,WAAkE;IAElE,MAAM,eAAe,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IAE1D,OAAO,KAAK,UAAU,QAAQ,CAAC,OAA4B;QAC1D,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAEpE,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAEnE,MAAM,eAAe,GAAG;YACvB,QAAQ;YACR,KAAK;SACL,CAAC;QAEF,OAAO,eAAe,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAC/C,CAAC,CAAC;AACH,CAAC","sourcesContent":["import { DocumentType, ReturnModelType } from '@typegoose/typegoose';\r\nimport { FilterQuery, PopulateOptions } from 'mongoose';\r\nimport { z } from 'zod';\r\nimport { AnyParamConstructor } from '@typegoose/typegoose/lib/types';\r\n\r\n/**\r\n * A helper to create a paginated Zod schema for an item type.\r\n */\r\nexport function createPaginatedSchema<ItemType extends z.ZodTypeAny>(itemSchema: ItemType) {\r\n\treturn z.object({\r\n\t\tmetadata: z.object({\r\n\t\t\tpage: z.number(),\r\n\t\t\tsize: z.number(),\r\n\t\t\ttotalElements: z.number(),\r\n\t\t\ttotalPages: z.number(),\r\n\t\t}),\r\n\t\titems: z.array(itemSchema),\r\n\t});\r\n}\r\n\r\nexport interface RawPaginatedResult<T extends AnyParamConstructor<any>> {\r\n\tmetadata: {\r\n\t\tpage: number;\r\n\t\tsize: number;\r\n\t\ttotalElements: number;\r\n\t\ttotalPages: number;\r\n\t};\r\n\tdocuments: DocumentType<T>[];\r\n}\r\n\r\n/**\r\n * The common pagination options.\r\n */\r\nexport interface PaginatorOptions<TClass extends AnyParamConstructor<any>> {\r\n\tfilter?: FilterQuery<DocumentType<TClass>>;\r\n\tpage?: number;\r\n\tsize?: number;\r\n\tsort?: Record<string, 1 | -1>;\r\n\tpopulate?: PopulateOptions | (PopulateOptions | string)[];\r\n}\r\n\r\n/**\r\n * This internal function wraps the common query logic:\r\n * - filter, page, size, sort, populate\r\n * - fetch documents, count documents\r\n * - compute totalPages\r\n * Returns a standard object with `metadata` & `documents`.\r\n */\r\nasync function _basePaginate<T extends AnyParamConstructor<any>>(\r\n\tmodel: ReturnModelType<T>,\r\n\toptions: PaginatorOptions<T>\r\n): Promise<RawPaginatedResult<T>> {\r\n\tconst { filter = {}, page = 1, size = 10, sort = {}, populate } = options;\r\n\r\n\tconst skip = (page - 1) * size;\r\n\r\n\tlet query = model.find(filter).sort(sort).skip(skip).limit(size);\r\n\r\n\tif (populate) {\r\n\t\tquery = query.populate(populate);\r\n\t}\r\n\r\n\tconst [documents, totalElements] = await Promise.all([query.exec(), model.countDocuments(filter)]);\r\n\r\n\tconst totalPages = Math.ceil(totalElements / size);\r\n\r\n\treturn {\r\n\t\tmetadata: {\r\n\t\t\tpage,\r\n\t\t\tsize,\r\n\t\t\ttotalElements,\r\n\t\t\ttotalPages,\r\n\t\t},\r\n\t\tdocuments: documents as unknown as DocumentType<T>[],\r\n\t};\r\n}\r\n\r\n/**\r\n * Creates a paginator returning raw documents.\r\n *\r\n * @param model The Typegoose model\r\n * @returns A function that, when passed `PaginatorOptions`, returns raw docs + metadata.\r\n */\r\nexport function createRawDocumentPaginatorObject<T extends AnyParamConstructor<any>>(\r\n\tmodel: ReturnModelType<T>\r\n) {\r\n\treturn async function paginate(options: PaginatorOptions<T>): Promise<RawPaginatedResult<T>> {\r\n\t\tconst { metadata, documents } = await _basePaginate(model, options);\r\n\r\n\t\treturn {\r\n\t\t\tmetadata,\r\n\t\t\tdocuments,\r\n\t\t};\r\n\t};\r\n}\r\n\r\n/**\r\n * Creates a paginator that returns Zod-validated items.\r\n *\r\n * @param model The Typegoose model\r\n * @param itemSchema A Zod schema describing the shape of each item\r\n * @param transformFn Optional transform function to convert raw doc -> item\r\n */\r\nexport function createPaginatorObject<T extends AnyParamConstructor<any>>(\r\n\tmodel: ReturnModelType<T>,\r\n\titemSchema: z.ZodTypeAny,\r\n\ttransformFn?: (doc: DocumentType<T>) => z.infer<typeof itemSchema>\r\n) {\r\n\tconst PaginatedSchema = createPaginatedSchema(itemSchema);\r\n\r\n\treturn async function paginate(options: PaginatorOptions<T>) {\r\n\t\tconst { metadata, documents } = await _basePaginate(model, options);\r\n\r\n\t\tconst items = transformFn ? documents.map(transformFn) : documents;\r\n\r\n\t\tconst paginatedResult = {\r\n\t\t\tmetadata,\r\n\t\t\titems,\r\n\t\t};\r\n\r\n\t\treturn PaginatedSchema.parse(paginatedResult);\r\n\t};\r\n}\r\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { DocumentType } from
|
|
2
|
-
import { z } from
|
|
1
|
+
import { DocumentType } from '@typegoose/typegoose';
|
|
2
|
+
import { z } from 'zod';
|
|
3
3
|
export declare class GlobalTransformer<ModelType, DTOType> {
|
|
4
4
|
private schema;
|
|
5
5
|
constructor(schema: z.ZodType<any>);
|
|
@@ -53,7 +53,7 @@ let GlobalTransformer = class GlobalTransformer {
|
|
|
53
53
|
}
|
|
54
54
|
transformToBasicView(record) {
|
|
55
55
|
if (!record) {
|
|
56
|
-
throw new Error(
|
|
56
|
+
throw new Error('Record not found');
|
|
57
57
|
}
|
|
58
58
|
return this.schema.parse(record);
|
|
59
59
|
}
|
|
@@ -61,12 +61,12 @@ let GlobalTransformer = class GlobalTransformer {
|
|
|
61
61
|
if (records.length === 0) {
|
|
62
62
|
return [];
|
|
63
63
|
}
|
|
64
|
-
return records.map(
|
|
64
|
+
return records.map(record => this.transformToBasicView(record));
|
|
65
65
|
}
|
|
66
66
|
transformToPartialView(record, fields) {
|
|
67
67
|
const fullView = this.transformToBasicView(record);
|
|
68
68
|
const partialView = {};
|
|
69
|
-
fields.forEach(
|
|
69
|
+
fields.forEach(field => {
|
|
70
70
|
const dto = fullView;
|
|
71
71
|
partialView[field] = dto[field];
|
|
72
72
|
});
|
|
@@ -76,7 +76,7 @@ let GlobalTransformer = class GlobalTransformer {
|
|
|
76
76
|
if (records.length === 0) {
|
|
77
77
|
return [];
|
|
78
78
|
}
|
|
79
|
-
return records.map(
|
|
79
|
+
return records.map(record => this.transformToPartialView(record, fields));
|
|
80
80
|
}
|
|
81
81
|
transformWithAdditionalData(record, additionalData) {
|
|
82
82
|
const basicView = this.transformToBasicView(record);
|
|
@@ -88,9 +88,9 @@ let GlobalTransformer = class GlobalTransformer {
|
|
|
88
88
|
}
|
|
89
89
|
transformNestedProperty(record, path, nestedSchema) {
|
|
90
90
|
if (!record) {
|
|
91
|
-
throw new Error(
|
|
91
|
+
throw new Error('Record not found');
|
|
92
92
|
}
|
|
93
|
-
const parts = path.split(
|
|
93
|
+
const parts = path.split('.');
|
|
94
94
|
let current = record;
|
|
95
95
|
for (const part of parts) {
|
|
96
96
|
if (current && part in current) {
|