@infrab4a/connect-angular 3.11.0-beta.1 → 4.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/angular-connect.module.d.ts +5 -6
- package/angular-firebase-auth.module.d.ts +6 -4
- package/angular-firestore.module.d.ts +7 -5
- package/consts/firebase-const.d.ts +3 -0
- package/consts/index.d.ts +1 -2
- package/esm2020/angular-connect.module.mjs +49 -0
- package/esm2020/angular-elastic-search.module.mjs +38 -0
- package/esm2020/angular-firebase-auth.module.mjs +130 -0
- package/esm2020/angular-firestore.module.mjs +358 -0
- package/esm2020/angular-hasura-graphql.module.mjs +90 -0
- package/esm2020/consts/firebase-const.mjs +4 -0
- package/esm2020/consts/index.mjs +5 -0
- package/esm2020/index.mjs +6 -0
- package/esm2020/services/auth.service.mjs +37 -0
- package/esm2020/services/cart.service.mjs +143 -0
- package/esm2020/services/checkout-subscription.service.mjs +51 -0
- package/esm2020/services/checkout.service.mjs +73 -0
- package/esm2020/services/coupon.service.mjs +226 -0
- package/esm2020/services/errors/group-invalid-coupon.error.mjs +8 -0
- package/esm2020/services/errors/index.mjs +3 -0
- package/esm2020/services/errors/invalid-coupon.error.mjs +7 -0
- package/esm2020/services/home-shop.service.mjs +114 -0
- package/esm2020/services/index.mjs +8 -0
- package/esm2020/services/order.service.mjs +30 -0
- package/esm2020/types/firebase-app-config.type.mjs +2 -0
- package/esm2020/types/index.mjs +2 -0
- package/fesm2015/infrab4a-connect-angular.mjs +1336 -0
- package/fesm2015/infrab4a-connect-angular.mjs.map +1 -0
- package/fesm2020/infrab4a-connect-angular.mjs +1291 -0
- package/fesm2020/infrab4a-connect-angular.mjs.map +1 -0
- package/index.d.ts +2 -2
- package/package.json +24 -12
- package/services/auth.service.d.ts +3 -4
- package/services/cart.service.d.ts +2 -9
- package/services/coupon.service.d.ts +10 -13
- package/services/errors/group-invalid-coupon.error.d.ts +6 -0
- package/services/errors/index.d.ts +2 -0
- package/services/errors/invalid-coupon.error.d.ts +4 -0
- package/services/index.d.ts +2 -4
- package/services/order.service.d.ts +2 -2
- package/types/firebase-app-config.type.d.ts +1 -0
- package/types/index.d.ts +1 -0
- package/bundles/infrab4a-connect-angular.umd.js +0 -2649
- package/bundles/infrab4a-connect-angular.umd.js.map +0 -1
- package/consts/backend-url.const.d.ts +0 -1
- package/consts/category-structure.d.ts +0 -1
- package/esm2015/angular-connect.module.js +0 -63
- package/esm2015/angular-elastic-search.module.js +0 -34
- package/esm2015/angular-firebase-auth.module.js +0 -113
- package/esm2015/angular-firestore.module.js +0 -394
- package/esm2015/angular-hasura-graphql.module.js +0 -172
- package/esm2015/consts/backend-url.const.js +0 -2
- package/esm2015/consts/category-structure.js +0 -2
- package/esm2015/consts/index.js +0 -6
- package/esm2015/index.js +0 -6
- package/esm2015/services/auth.service.js +0 -42
- package/esm2015/services/cart.service.js +0 -281
- package/esm2015/services/catalog/adapters/category-structure.adapter.js +0 -2
- package/esm2015/services/catalog/adapters/index.js +0 -4
- package/esm2015/services/catalog/adapters/new-category-structure.adapter.js +0 -51
- package/esm2015/services/catalog/adapters/old-category-structure.adapter.js +0 -27
- package/esm2015/services/catalog/catalog.service.js +0 -96
- package/esm2015/services/catalog/category.service.js +0 -56
- package/esm2015/services/catalog/enums/index.js +0 -2
- package/esm2015/services/catalog/enums/product-sorts.enum.js +0 -11
- package/esm2015/services/catalog/index.js +0 -6
- package/esm2015/services/catalog/models/category-with-tree.model.js +0 -10
- package/esm2015/services/catalog/models/index.js +0 -2
- package/esm2015/services/catalog/types/index.js +0 -2
- package/esm2015/services/catalog/types/product-sort.type.js +0 -2
- package/esm2015/services/checkout-subscription.service.js +0 -53
- package/esm2015/services/checkout.service.js +0 -70
- package/esm2015/services/coupon.service.js +0 -240
- package/esm2015/services/home-shop.service.js +0 -116
- package/esm2015/services/index.js +0 -10
- package/esm2015/services/order.service.js +0 -32
- package/esm2015/services/shipping.service.js +0 -98
- package/esm2015/services/types/shipping-methods.type.js +0 -2
- package/fesm2015/infrab4a-connect-angular.js +0 -1868
- package/fesm2015/infrab4a-connect-angular.js.map +0 -1
- package/infrab4a-connect-angular.d.ts +0 -5
- package/services/catalog/adapters/category-structure.adapter.d.ts +0 -4
- package/services/catalog/adapters/index.d.ts +0 -3
- package/services/catalog/adapters/new-category-structure.adapter.d.ts +0 -14
- package/services/catalog/adapters/old-category-structure.adapter.d.ts +0 -10
- package/services/catalog/catalog.service.d.ts +0 -54
- package/services/catalog/category.service.d.ts +0 -15
- package/services/catalog/enums/index.d.ts +0 -1
- package/services/catalog/enums/product-sorts.enum.d.ts +0 -9
- package/services/catalog/index.d.ts +0 -5
- package/services/catalog/models/category-with-tree.model.d.ts +0 -4
- package/services/catalog/models/index.d.ts +0 -1
- package/services/catalog/types/index.d.ts +0 -1
- package/services/catalog/types/product-sort.type.d.ts +0 -2
- package/services/shipping.service.d.ts +0 -19
- package/services/types/shipping-methods.type.d.ts +0 -12
- /package/{esm2015/consts/default-shop.const.js → esm2020/consts/default-shop.const.mjs} +0 -0
- /package/{esm2015/consts/es-config.const.js → esm2020/consts/es-config.const.mjs} +0 -0
- /package/{esm2015/consts/hasura-options.const.js → esm2020/consts/hasura-options.const.mjs} +0 -0
- /package/{esm2015/infrab4a-connect-angular.js → esm2020/infrab4a-connect-angular.mjs} +0 -0
- /package/{esm2015/services/types/index.js → esm2020/services/types/index.mjs} +0 -0
- /package/{esm2015/services/types/required-checkout-data.type.js → esm2020/services/types/required-checkout-data.type.mjs} +0 -0
- /package/{esm2015/services/types/required-checkout-subscription-data.type.js → esm2020/services/types/required-checkout-subscription-data.type.mjs} +0 -0
|
@@ -1,240 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { Inject, Injectable } from '@angular/core';
|
|
3
|
-
import { CheckoutTypes, CouponTypes, Exclusivities, Shops, Where, } from '@infrab4a/connect';
|
|
4
|
-
import { from, of } from 'rxjs';
|
|
5
|
-
import { concatMap, map } from 'rxjs/operators';
|
|
6
|
-
import { DEFAULT_SHOP } from '../consts';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "@infrab4a/connect";
|
|
9
|
-
export class CouponService {
|
|
10
|
-
constructor(couponRepository, defaultShop, orderRepository, categoryRepository) {
|
|
11
|
-
this.couponRepository = couponRepository;
|
|
12
|
-
this.defaultShop = defaultShop;
|
|
13
|
-
this.orderRepository = orderRepository;
|
|
14
|
-
this.categoryRepository = categoryRepository;
|
|
15
|
-
this.emailIsFromCollaborator = (userEmail) => !!(userEmail === null || userEmail === void 0 ? void 0 : userEmail.match(/@b4a.com.br/g));
|
|
16
|
-
}
|
|
17
|
-
checkCoupon(nickname, checkoutType, checkout, plan) {
|
|
18
|
-
return from(this.couponRepository
|
|
19
|
-
.find({
|
|
20
|
-
filters: {
|
|
21
|
-
nickname: { operator: Where.EQUALS, value: nickname },
|
|
22
|
-
active: { operator: Where.EQUALS, value: true },
|
|
23
|
-
},
|
|
24
|
-
})
|
|
25
|
-
.then((result) => result.data[0])).pipe(concatMap((coupon) => this.couponValidation(coupon, checkoutType)), concatMap((couponValid) => this.couponRulesValidation(couponValid, checkoutType, checkout, plan)), map((couponValidated) => couponValidated));
|
|
26
|
-
}
|
|
27
|
-
couponValidation(coupon, checkoutType) {
|
|
28
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
29
|
-
if (!coupon)
|
|
30
|
-
throw 'Cupom inválido.';
|
|
31
|
-
if ((coupon === null || coupon === void 0 ? void 0 : coupon.beginAt) && (coupon === null || coupon === void 0 ? void 0 : coupon.beginAt.getTime()) > new Date().getTime())
|
|
32
|
-
throw 'Cupom inválido.';
|
|
33
|
-
if ((coupon === null || coupon === void 0 ? void 0 : coupon.expiresIn) && (coupon === null || coupon === void 0 ? void 0 : coupon.expiresIn.getTime()) < new Date().getTime())
|
|
34
|
-
throw 'Cupom expirado.';
|
|
35
|
-
const isInShop = coupon.shopAvailability === Shops.ALL || coupon.shopAvailability === this.defaultShop;
|
|
36
|
-
if (!isInShop)
|
|
37
|
-
throw 'Cupom inválido para loja.';
|
|
38
|
-
const isCheckoutType = coupon.checkoutType === CheckoutTypes.ALL || coupon.checkoutType === checkoutType;
|
|
39
|
-
if (!isCheckoutType)
|
|
40
|
-
throw 'Cupom inválido. Erro de checkout.';
|
|
41
|
-
return coupon;
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
couponRulesValidation(coupon, checkoutType, checkout, plan) {
|
|
45
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
46
|
-
if (checkoutType == CheckoutTypes.SUBSCRIPTION) {
|
|
47
|
-
if (coupon.plan && coupon.plan.toUpperCase() !== plan.toUpperCase())
|
|
48
|
-
throw 'Cupom inválido para sua assinatura.';
|
|
49
|
-
return coupon;
|
|
50
|
-
}
|
|
51
|
-
const validUser = this.coupomUserValidation(coupon, checkout === null || checkout === void 0 ? void 0 : checkout.user);
|
|
52
|
-
if (!validUser)
|
|
53
|
-
throw 'Usuário não elegível.';
|
|
54
|
-
const orders = yield this.getOrdersWithCoupon(coupon);
|
|
55
|
-
const ordersWithUser = this.countOrdersWithUser(orders, checkout.user.email);
|
|
56
|
-
const couponUseLimits = this.getCouponUseLimits(coupon, checkoutType, checkout.user);
|
|
57
|
-
if (couponUseLimits.limitedPerUser && ordersWithUser > 0)
|
|
58
|
-
throw 'Limite de uso por usuário atingido.';
|
|
59
|
-
if (!couponUseLimits.unlimited && couponUseLimits.total && orders.length >= couponUseLimits.total)
|
|
60
|
-
throw 'Limite de uso atingido.';
|
|
61
|
-
const hasProductCategories = yield this.hasProductCategories(coupon, checkout);
|
|
62
|
-
if (!hasProductCategories)
|
|
63
|
-
throw 'Seu carrinho não possui produtos elegíveis para desconto.';
|
|
64
|
-
const hasMinSubTotal = yield this.hasMinSubTotal(coupon, checkout);
|
|
65
|
-
if (!hasMinSubTotal)
|
|
66
|
-
throw `Valor mínimo de ${Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(coupon.minSubTotalValue)} não atingido`;
|
|
67
|
-
return coupon;
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
calcDiscountSubscription(coupon, checkout) {
|
|
71
|
-
let discount = 0;
|
|
72
|
-
if (coupon.discount.subscription.type == CouponTypes.ABSOLUTE)
|
|
73
|
-
discount = coupon.discount.subscription.value;
|
|
74
|
-
else
|
|
75
|
-
discount = checkout.subscriptionPlan.recurrencePrice * (coupon.discount.subscription.value / 100);
|
|
76
|
-
return of(discount);
|
|
77
|
-
}
|
|
78
|
-
calcDiscountShopping(coupon, checkout) {
|
|
79
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
80
|
-
let discount = 0;
|
|
81
|
-
if (checkout.user.isSubscriber && coupon.discount.subscriber.value) {
|
|
82
|
-
discount = yield this.calcDiscountByType(coupon.discount.subscriber.type, coupon.discount.subscriber.value, coupon.productsCategories, checkout);
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
discount = yield this.calcDiscountByType(coupon.discount.non_subscriber.type, coupon.discount.non_subscriber.value, coupon.productsCategories, checkout);
|
|
86
|
-
}
|
|
87
|
-
return discount;
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
calcDiscountByType(type, value, categories, checkout) {
|
|
91
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
92
|
-
let discount = 0;
|
|
93
|
-
let lineItensDiscount = yield this.getLineItensEligebleForDiscount(categories, checkout);
|
|
94
|
-
const subTotal = this.calcCheckoutSubtotal(lineItensDiscount, checkout.user, checkout.shop);
|
|
95
|
-
if (type == CouponTypes.ABSOLUTE) {
|
|
96
|
-
discount = value > subTotal ? subTotal : value;
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
99
|
-
discount = subTotal * (value / 100);
|
|
100
|
-
}
|
|
101
|
-
return discount;
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
hasMinSubTotal(coupon, checkout) {
|
|
105
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
106
|
-
if (!coupon.minSubTotalValue)
|
|
107
|
-
return true;
|
|
108
|
-
let lineItensDiscount = yield this.getLineItensEligebleForDiscount(coupon.productsCategories, checkout);
|
|
109
|
-
const subTotal = this.calcCheckoutSubtotal(lineItensDiscount, checkout.user, checkout.shop);
|
|
110
|
-
if (coupon.minSubTotalValue <= subTotal)
|
|
111
|
-
return true;
|
|
112
|
-
return false;
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
hasProductCategories(coupon, checkout) {
|
|
116
|
-
var _a;
|
|
117
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
118
|
-
if (!coupon.productsCategories || !coupon.productsCategories.length) {
|
|
119
|
-
return true;
|
|
120
|
-
}
|
|
121
|
-
const couponCategories = yield this.getCouponCategoriesId(coupon.productsCategories);
|
|
122
|
-
const hasCategories = (_a = checkout.lineItems) === null || _a === void 0 ? void 0 : _a.filter((i) => {
|
|
123
|
-
var _a;
|
|
124
|
-
if (!i.categories || !((_a = i.categories) === null || _a === void 0 ? void 0 : _a.length))
|
|
125
|
-
return true;
|
|
126
|
-
return i.categories.some((c) => couponCategories.some((cat) => cat == c));
|
|
127
|
-
});
|
|
128
|
-
return hasCategories.length ? true : false;
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
coupomUserValidation(coupon, user) {
|
|
132
|
-
if (!user || coupon.exclusivityType.includes(Exclusivities.ALL_USERS))
|
|
133
|
-
return true;
|
|
134
|
-
let userTypes = [];
|
|
135
|
-
if (coupon.exclusivityType.includes(Exclusivities.COLLABORATORS) && this.emailIsFromCollaborator(user.email))
|
|
136
|
-
userTypes.push(Exclusivities.COLLABORATORS);
|
|
137
|
-
if (coupon.exclusivityType.includes(Exclusivities.SPECIFIC_USER) && coupon.userExclusiveEmail.includes(user.email))
|
|
138
|
-
userTypes.push(Exclusivities.SPECIFIC_USER);
|
|
139
|
-
if (coupon.exclusivityType.includes(Exclusivities.ACTIVE_SUBSCRIBER) &&
|
|
140
|
-
user.isSubscriber &&
|
|
141
|
-
user.subscriptionPlan != '')
|
|
142
|
-
userTypes.push(Exclusivities.ACTIVE_SUBSCRIBER);
|
|
143
|
-
if (user.isSubscriber &&
|
|
144
|
-
user.subscriptionPlan == '' &&
|
|
145
|
-
coupon.exclusivityType.includes(Exclusivities.INACTIVE_SUBSCRIBER))
|
|
146
|
-
userTypes.push(Exclusivities.INACTIVE_SUBSCRIBER);
|
|
147
|
-
if (coupon.exclusivityType.includes(Exclusivities.NON_SUBSCRIBER) && !user.isSubscriber)
|
|
148
|
-
userTypes.push(Exclusivities.NON_SUBSCRIBER);
|
|
149
|
-
return coupon.exclusivityType.some((r) => userTypes.includes(r));
|
|
150
|
-
}
|
|
151
|
-
getCouponCategoriesId(productsCategories) {
|
|
152
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
153
|
-
const couponCategories = [];
|
|
154
|
-
for (let index = 0; index < productsCategories.length; index++) {
|
|
155
|
-
const category = yield this.categoryRepository.get({
|
|
156
|
-
id: productsCategories[index],
|
|
157
|
-
});
|
|
158
|
-
if (category) {
|
|
159
|
-
const children = yield this.categoryRepository.getChildren(parseInt(productsCategories[index]));
|
|
160
|
-
couponCategories.push(category.id, ...children.map((c) => c.id.toString()));
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
return [...new Set(couponCategories)];
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
getLineItensEligebleForDiscount(productsCategories, checkout) {
|
|
167
|
-
var _a;
|
|
168
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
169
|
-
let lineItensDiscount = [];
|
|
170
|
-
const couponCategories = yield this.getCouponCategoriesId(productsCategories);
|
|
171
|
-
if (productsCategories && productsCategories.length) {
|
|
172
|
-
lineItensDiscount = (_a = checkout.lineItems) === null || _a === void 0 ? void 0 : _a.filter((i) => {
|
|
173
|
-
var _a;
|
|
174
|
-
if ((_a = i.categories) === null || _a === void 0 ? void 0 : _a.length) {
|
|
175
|
-
return i.categories.some((c) => couponCategories.some((cat) => cat == c));
|
|
176
|
-
}
|
|
177
|
-
return true;
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
else {
|
|
181
|
-
lineItensDiscount = checkout.lineItems;
|
|
182
|
-
}
|
|
183
|
-
return lineItensDiscount;
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
calcCheckoutSubtotal(lineItens, user, shop) {
|
|
187
|
-
return ((lineItens === null || lineItens === void 0 ? void 0 : lineItens.reduce((acc, curr) => {
|
|
188
|
-
var _a, _b;
|
|
189
|
-
return (user === null || user === void 0 ? void 0 : user.isSubscriber) && ((_a = curr.price[shop]) === null || _a === void 0 ? void 0 : _a.subscriberPrice)
|
|
190
|
-
? acc + ((_b = curr.price[shop]) === null || _b === void 0 ? void 0 : _b.subscriberPrice) * curr.quantity
|
|
191
|
-
: acc + curr.pricePaid * curr.quantity;
|
|
192
|
-
}, 0)) || 0);
|
|
193
|
-
}
|
|
194
|
-
getOrdersWithCoupon(coupon) {
|
|
195
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
196
|
-
return yield this.orderRepository
|
|
197
|
-
.find({
|
|
198
|
-
filters: {
|
|
199
|
-
coupon: { id: coupon.id },
|
|
200
|
-
payment: { status: 'paid' },
|
|
201
|
-
},
|
|
202
|
-
})
|
|
203
|
-
.then((result) => result.data);
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
countOrdersWithUser(orders, email) {
|
|
207
|
-
return orders.filter((o) => o.user.email == email).length;
|
|
208
|
-
}
|
|
209
|
-
getCouponUseLimits(coupon, checkoutType, user) {
|
|
210
|
-
let couponUseLimits;
|
|
211
|
-
if (checkoutType == CheckoutTypes.ECOMMERCE || checkoutType == CheckoutTypes.ALL) {
|
|
212
|
-
couponUseLimits = user && user.isSubscriber ? coupon.useLimits.subscriber : coupon.useLimits.non_subscriber;
|
|
213
|
-
}
|
|
214
|
-
else {
|
|
215
|
-
couponUseLimits = coupon.useLimits.subscription;
|
|
216
|
-
}
|
|
217
|
-
return couponUseLimits;
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
CouponService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: CouponService, deps: [{ token: 'CouponRepository' }, { token: DEFAULT_SHOP }, { token: 'OrderRepository' }, { token: 'CategoryRepository' }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
221
|
-
CouponService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: CouponService, providedIn: 'root' });
|
|
222
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: CouponService, decorators: [{
|
|
223
|
-
type: Injectable,
|
|
224
|
-
args: [{
|
|
225
|
-
providedIn: 'root',
|
|
226
|
-
}]
|
|
227
|
-
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
228
|
-
type: Inject,
|
|
229
|
-
args: ['CouponRepository']
|
|
230
|
-
}] }, { type: i1.Shops, decorators: [{
|
|
231
|
-
type: Inject,
|
|
232
|
-
args: [DEFAULT_SHOP]
|
|
233
|
-
}] }, { type: undefined, decorators: [{
|
|
234
|
-
type: Inject,
|
|
235
|
-
args: ['OrderRepository']
|
|
236
|
-
}] }, { type: undefined, decorators: [{
|
|
237
|
-
type: Inject,
|
|
238
|
-
args: ['CategoryRepository']
|
|
239
|
-
}] }]; } });
|
|
240
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291cG9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25uZWN0LWFuZ3VsYXIvc3JjL3NlcnZpY2VzL2NvdXBvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUNsRCxPQUFPLEVBS0wsYUFBYSxFQUdiLFdBQVcsRUFDWCxhQUFhLEVBSWIsS0FBSyxFQUVMLEtBQUssR0FDTixNQUFNLG1CQUFtQixDQUFBO0FBQzFCLE9BQU8sRUFBRSxJQUFJLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQTs7O0FBS3hDLE1BQU0sT0FBTyxhQUFhO0lBQ3hCLFlBQytDLGdCQUFrQyxFQUN4QyxXQUFrQixFQUNiLGVBQWdDLEVBQzdCLGtCQUFzQztRQUh4QyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ3hDLGdCQUFXLEdBQVgsV0FBVyxDQUFPO1FBQ2Isb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQzdCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFvTi9FLDRCQUF1QixHQUFHLENBQUMsU0FBaUIsRUFBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUEsU0FBUyxhQUFULFNBQVMsdUJBQVQsU0FBUyxDQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQSxDQUFBO0lBbk5qRyxDQUFDO0lBRUosV0FBVyxDQUNULFFBQWdCLEVBQ2hCLFlBQTJCLEVBQzNCLFFBQTJCLEVBQzNCLElBQVk7UUFFWixPQUFPLElBQUksQ0FDVCxJQUFJLENBQUMsZ0JBQWdCO2FBQ2xCLElBQUksQ0FBQztZQUNKLE9BQU8sRUFBRTtnQkFDUCxR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LGFBQWEsQ0FBQyxHQUFHLEVBQUU7WUFDaEYsZUFBZSxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUE7U0FDNUc7YUFBTTtZQUNMLGVBQWUsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQTtTQUNoRDtRQUVELE9BQU8sZUFBZSxDQUFBO0lBQ3hCLENBQUM7OzJHQXBSVSxhQUFhLGtCQUVkLGtCQUFrQixhQUNsQixZQUFZLGFBQ1osaUJBQWlCLGFBQ2pCLG9CQUFvQjsrR0FMbkIsYUFBYSxjQUZaLE1BQU07NEZBRVAsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQUdJLE1BQU07MkJBQUMsa0JBQWtCOzswQkFDekIsTUFBTTsyQkFBQyxZQUFZOzswQkFDbkIsTUFBTTsyQkFBQyxpQkFBaUI7OzBCQUN4QixNQUFNOzJCQUFDLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQge1xuICBDYXRlZ29yeSxcbiAgQ2F0ZWdvcnlSZXBvc2l0b3J5LFxuICBDaGVja291dCxcbiAgQ2hlY2tvdXRTdWJzY3JpcHRpb24sXG4gIENoZWNrb3V0VHlwZXMsXG4gIENvdXBvbixcbiAgQ291cG9uUmVwb3NpdG9yeSxcbiAgQ291cG9uVHlwZXMsXG4gIEV4Y2x1c2l2aXRpZXMsXG4gIExpbmVJdGVtLFxuICBPcmRlcixcbiAgT3JkZXJSZXBvc2l0b3J5LFxuICBTaG9wcyxcbiAgVXNlcixcbiAgV2hlcmUsXG59IGZyb20gJ0BpbmZyYWI0YS9jb25uZWN0J1xuaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgY29uY2F0TWFwLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcbmltcG9ydCB7IERFRkFVTFRfU0hPUCB9IGZyb20gJy4uL2NvbnN0cydcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIENvdXBvblNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KCdDb3Vwb25SZXBvc2l0b3J5JykgcHJpdmF0ZSByZWFkb25seSBjb3Vwb25SZXBvc2l0b3J5OiBDb3Vwb25SZXBvc2l0b3J5LFxuICAgIEBJbmplY3QoREVGQVVMVF9TSE9QKSBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRTaG9wOiBTaG9wcyxcbiAgICBASW5qZWN0KCdPcmRlclJlcG9zaXRvcnknKSBwcml2YXRlIHJlYWRvbmx5IG9yZGVyUmVwb3NpdG9yeTogT3JkZXJSZXBvc2l0b3J5LFxuICAgIEBJbmplY3QoJ0NhdGVnb3J5UmVwb3NpdG9yeScpIHByaXZhdGUgcmVhZG9ubHkgY2F0ZWdvcnlSZXBvc2l0b3J5OiBDYXRlZ29yeVJlcG9zaXRvcnksXG4gICkge31cblxuICBjaGVja0NvdXBvbihcbiAgICBuaWNrbmFtZTogc3RyaW5nLFxuICAgIGNoZWNrb3V0VHlwZTogQ2hlY2tvdXRUeXBlcyxcbiAgICBjaGVja291dDogUGFydGlhbDxDaGVja291dD4sXG4gICAgcGxhbjogc3RyaW5nLFxuICApOiBPYnNlcnZhYmxlPENvdXBvbj4ge1xuICAgIHJldHVybiBmcm9tKFxuICAgICAgdGhpcy5jb3Vwb25SZXBvc2l0b3J5XG4gICAgICAgIC5maW5kKHtcbiAgICAgICAgICBmaWx0ZXJzOiB7XG4gICAgICAgICAgICBuaWNrbmFtZTogeyBvcGVyYXRvcjogV2hlcmUuRVFVQUxTLCB2YWx1ZTogbmlja25hbWUgfSxcbiAgICAgICAgICAgIGFjdGl2ZTogeyBvcGVyYXRvcjogV2hlcmUuRVFVQUxTLCB2YWx1ZTogdHJ1ZSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKChyZXN1bHQpID0+IHJlc3VsdC5kYXRhWzBdKSxcbiAgICApLnBpcGUoXG4gICAgICBjb25jYXRNYXAoKGNvdXBvbikgPT4gdGhpcy5jb3Vwb25WYWxpZGF0aW9uKGNvdXBvbiwgY2hlY2tvdXRUeXBlKSksXG4gICAgICBjb25jYXRNYXAoKGNvdXBvblZhbGlkOiBDb3Vwb24pID0+IHRoaXMuY291cG9uUnVsZXNWYWxpZGF0aW9uKGNvdXBvblZhbGlkLCBjaGVja291dFR5cGUsIGNoZWNrb3V0LCBwbGFuKSksXG4gICAgICBtYXAoKGNvdXBvblZhbGlkYXRlZDogQ291cG9uKSA9PiBjb3Vwb25WYWxpZGF0ZWQgYXMgQ291cG9uKSxcbiAgICApXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvdXBvblZhbGlkYXRpb24oY291cG9uOiBDb3Vwb24sIGNoZWNrb3V0VHlwZTogQ2hlY2tvdXRUeXBlcykge1xuICAgIGlmICghY291cG9uKSB0aHJvdyAnQ3Vwb20gaW52w6FsaWRvLidcblxuICAgIGlmIChjb3Vwb24/LmJlZ2luQXQgJiYgY291cG9uPy5iZWdpbkF0LmdldFRpbWUoKSA+IG5ldyBEYXRlKCkuZ2V0VGltZSgpKSB0aHJvdyAnQ3Vwb20gaW52w6FsaWRvLidcblxuICAgIGlmIChjb3Vwb24/LmV4cGlyZXNJbiAmJiBjb3Vwb24/LmV4cGlyZXNJbi5nZXRUaW1lKCkgPCBuZXcgRGF0ZSgpLmdldFRpbWUoKSkgdGhyb3cgJ0N1cG9tIGV4cGlyYWRvLidcblxuICAgIGNvbnN0IGlzSW5TaG9wID0gY291cG9uLnNob3BBdmFpbGFiaWxpdHkgPT09IFNob3BzLkFMTCB8fCBjb3Vwb24uc2hvcEF2YWlsYWJpbGl0eSA9PT0gdGhpcy5kZWZhdWx0U2hvcFxuXG4gICAgaWYgKCFpc0luU2hvcCkgdGhyb3cgJ0N1cG9tIGludsOhbGlkbyBwYXJhIGxvamEuJ1xuXG4gICAgY29uc3QgaXNDaGVja291dFR5cGUgPSBjb3Vwb24uY2hlY2tvdXRUeXBlID09PSBDaGVja291dFR5cGVzLkFMTCB8fCBjb3Vwb24uY2hlY2tvdXRUeXBlID09PSBjaGVja291dFR5cGVcblxuICAgIGlmICghaXNDaGVja291dFR5cGUpIHRocm93ICdDdXBvbSBpbnbDoWxpZG8uIEVycm8gZGUgY2hlY2tvdXQuJ1xuXG4gICAgcmV0dXJuIGNvdXBvblxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb3Vwb25SdWxlc1ZhbGlkYXRpb24oXG4gICAgY291cG9uOiBDb3Vwb24sXG4gICAgY2hlY2tvdXRUeXBlOiBDaGVja291dFR5cGVzLFxuICAgIGNoZWNrb3V0OiBQYXJ0aWFsPENoZWNrb3V0PixcbiAgICBwbGFuOiBzdHJpbmcsXG4gICkge1xuICAgIGlmIChjaGVja291dFR5cGUgPT0gQ2hlY2tvdXRUeXBlcy5TVUJTQ1JJUFRJT04pIHtcbiAgICAgIGlmIChjb3Vwb24ucGxhbiAmJiBjb3Vwb24ucGxhbi50b1VwcGVyQ2FzZSgpICE9PSBwbGFuLnRvVXBwZXJDYXNlKCkpIHRocm93ICdDdXBvbSBpbnbDoWxpZG8gcGFyYSBzdWEgYXNzaW5hdHVyYS4nXG5cbiAgICAgIHJldHVybiBjb3Vwb25cbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZFVzZXIgPSB0aGlzLmNvdXBvbVVzZXJWYWxpZGF0aW9uKGNvdXBvbiwgY2hlY2tvdXQ/LnVzZXIpXG5cbiAgICBpZiAoIXZhbGlkVXNlcikgdGhyb3cgJ1VzdcOhcmlvIG7Do28gZWxlZ8OtdmVsLidcblxuICAgIGNvbnN0IG9yZGVycyA9IGF3YWl0IHRoaXMuZ2V0T3JkZXJzV2l0aENvdXBvbihjb3Vwb24pXG5cbiAgICBjb25zdCBvcmRlcnNXaXRoVXNlciA9IHRoaXMuY291bnRPcmRlcnNXaXRoVXNlcihvcmRlcnMsIGNoZWNrb3V0LnVzZXIuZW1haWwpXG5cbiAgICBjb25zdCBjb3Vwb25Vc2VMaW1pdHMgPSB0aGlzLmdldENvdXBvblVzZUxpbWl0cyhjb3Vwb24sIGNoZWNrb3V0VHlwZSwgY2hlY2tvdXQudXNlcilcblxuICAgIGlmIChjb3Vwb25Vc2VMaW1pdHMubGltaXRlZFBlclVzZXIgJiYgb3JkZXJzV2l0aFVzZXIgPiAwKSB0aHJvdyAnTGltaXRlIGRlIHVzbyBwb3IgdXN1w6FyaW8gYXRpbmdpZG8uJ1xuXG4gICAgaWYgKCFjb3Vwb25Vc2VMaW1pdHMudW5saW1pdGVkICYmIGNvdXBvblVzZUxpbWl0cy50b3RhbCAmJiBvcmRlcnMubGVuZ3RoID49IGNvdXBvblVzZUxpbWl0cy50b3RhbClcbiAgICAgIHRocm93ICdMaW1pdGUgZGUgdXNvIGF0aW5naWRvLidcblxuICAgIGNvbnN0IGhhc1Byb2R1Y3RDYXRlZ29yaWVzID0gYXdhaXQgdGhpcy5oYXNQcm9kdWN0Q2F0ZWdvcmllcyhjb3Vwb24sIGNoZWNrb3V0KVxuXG4gICAgaWYgKCFoYXNQcm9kdWN0Q2F0ZWdvcmllcykgdGhyb3cgJ1NldSBjYXJyaW5obyBuw6NvIHBvc3N1aSBwcm9kdXRvcyBlbGVnw612ZWlzIHBhcmEgZGVzY29udG8uJ1xuXG4gICAgY29uc3QgaGFzTWluU3ViVG90YWwgPSBhd2FpdCB0aGlzLmhhc01pblN1YlRvdGFsKGNvdXBvbiwgY2hlY2tvdXQpXG5cbiAgICBpZiAoIWhhc01pblN1YlRvdGFsKVxuICAgICAgdGhyb3cgYFZhbG9yIG3DrW5pbW8gZGUgJHtJbnRsLk51bWJlckZvcm1hdCgncHQtQlInLCB7IHN0eWxlOiAnY3VycmVuY3knLCBjdXJyZW5jeTogJ0JSTCcgfSkuZm9ybWF0KFxuICAgICAgICBjb3Vwb24ubWluU3ViVG90YWxWYWx1ZSxcbiAgICAgICl9IG7Do28gYXRpbmdpZG9gXG5cbiAgICByZXR1cm4gY291cG9uXG4gIH1cblxuICBwdWJsaWMgY2FsY0Rpc2NvdW50U3Vic2NyaXB0aW9uKGNvdXBvbjogQ291cG9uLCBjaGVja291dDogUGFydGlhbDxDaGVja291dFN1YnNjcmlwdGlvbj4pOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIGxldCBkaXNjb3VudCA9IDBcblxuICAgIGlmIChjb3Vwb24uZGlzY291bnQuc3Vic2NyaXB0aW9uLnR5cGUgPT0gQ291cG9uVHlwZXMuQUJTT0xVVEUpIGRpc2NvdW50ID0gY291cG9uLmRpc2NvdW50LnN1YnNjcmlwdGlvbi52YWx1ZVxuICAgIGVsc2UgZGlzY291bnQgPSBjaGVja291dC5zdWJzY3JpcHRpb25QbGFuLnJlY3VycmVuY2VQcmljZSAqIChjb3Vwb24uZGlzY291bnQuc3Vic2NyaXB0aW9uLnZhbHVlIC8gMTAwKVxuXG4gICAgcmV0dXJuIG9mKGRpc2NvdW50KVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGNhbGNEaXNjb3VudFNob3BwaW5nKGNvdXBvbjogQ291cG9uLCBjaGVja291dDogUGFydGlhbDxDaGVja291dD4pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGxldCBkaXNjb3VudCA9IDBcblxuICAgIGlmIChjaGVja291dC51c2VyLmlzU3Vic2NyaWJlciAmJiBjb3Vwb24uZGlzY291bnQuc3Vic2NyaWJlci52YWx1ZSkge1xuICAgICAgZGlzY291bnQgPSBhd2FpdCB0aGlzLmNhbGNEaXNjb3VudEJ5VHlwZShcbiAgICAgICAgY291cG9uLmRpc2NvdW50LnN1YnNjcmliZXIudHlwZSxcbiAgICAgICAgY291cG9uLmRpc2NvdW50LnN1YnNjcmliZXIudmFsdWUsXG4gICAgICAgIGNvdXBvbi5wcm9kdWN0c0NhdGVnb3JpZXMsXG4gICAgICAgIGNoZWNrb3V0LFxuICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICBkaXNjb3VudCA9IGF3YWl0IHRoaXMuY2FsY0Rpc2NvdW50QnlUeXBlKFxuICAgICAgICBjb3Vwb24uZGlzY291bnQubm9uX3N1YnNjcmliZXIudHlwZSxcbiAgICAgICAgY291cG9uLmRpc2NvdW50Lm5vbl9zdWJzY3JpYmVyLnZhbHVlLFxuICAgICAgICBjb3Vwb24ucHJvZHVjdHNDYXRlZ29yaWVzLFxuICAgICAgICBjaGVja291dCxcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gZGlzY291bnRcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY2FsY0Rpc2NvdW50QnlUeXBlKFxuICAgIHR5cGU6IENvdXBvblR5cGVzLFxuICAgIHZhbHVlOiBudW1iZXIsXG4gICAgY2F0ZWdvcmllcyxcbiAgICBjaGVja291dDogUGFydGlhbDxDaGVja291dD4sXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgbGV0IGRpc2NvdW50ID0gMFxuXG4gICAgbGV0IGxpbmVJdGVuc0Rpc2NvdW50ID0gYXdhaXQgdGhpcy5nZXRMaW5lSXRlbnNFbGlnZWJsZUZvckRpc2NvdW50KGNhdGVnb3JpZXMsIGNoZWNrb3V0KVxuXG4gICAgY29uc3Qgc3ViVG90YWwgPSB0aGlzLmNhbGNDaGVja291dFN1YnRvdGFsKGxpbmVJdGVuc0Rpc2NvdW50LCBjaGVja291dC51c2VyLCBjaGVja291dC5zaG9wKVxuXG4gICAgaWYgKHR5cGUgPT0gQ291cG9uVHlwZXMuQUJTT0xVVEUpIHtcbiAgICAgIGRpc2NvdW50ID0gdmFsdWUgPiBzdWJUb3RhbCA/IHN1YlRvdGFsIDogdmFsdWVcbiAgICB9IGVsc2Uge1xuICAgICAgZGlzY291bnQgPSBzdWJUb3RhbCAqICh2YWx1ZSAvIDEwMClcbiAgICB9XG5cbiAgICByZXR1cm4gZGlzY291bnRcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFzTWluU3ViVG90YWwoY291cG9uOiBDb3Vwb24sIGNoZWNrb3V0OiBQYXJ0aWFsPENoZWNrb3V0Pik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghY291cG9uLm1pblN1YlRvdGFsVmFsdWUpIHJldHVybiB0cnVlXG5cbiAgICBsZXQgbGluZUl0ZW5zRGlzY291bnQgPSBhd2FpdCB0aGlzLmdldExpbmVJdGVuc0VsaWdlYmxlRm9yRGlzY291bnQoY291cG9uLnByb2R1Y3RzQ2F0ZWdvcmllcywgY2hlY2tvdXQpXG5cbiAgICBjb25zdCBzdWJUb3RhbCA9IHRoaXMuY2FsY0NoZWNrb3V0U3VidG90YWwobGluZUl0ZW5zRGlzY291bnQsIGNoZWNrb3V0LnVzZXIsIGNoZWNrb3V0LnNob3ApXG5cbiAgICBpZiAoY291cG9uLm1pblN1YlRvdGFsVmFsdWUgPD0gc3ViVG90YWwpIHJldHVybiB0cnVlXG5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFzUHJvZHVjdENhdGVnb3JpZXMoY291cG9uOiBDb3Vwb24sIGNoZWNrb3V0OiBQYXJ0aWFsPENoZWNrb3V0Pik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICghY291cG9uLnByb2R1Y3RzQ2F0ZWdvcmllcyB8fCAhY291cG9uLnByb2R1Y3RzQ2F0ZWdvcmllcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgY29uc3QgY291cG9uQ2F0ZWdvcmllcyA9IGF3YWl0IHRoaXMuZ2V0Q291cG9uQ2F0ZWdvcmllc0lkKGNvdXBvbi5wcm9kdWN0c0NhdGVnb3JpZXMpXG5cbiAgICBjb25zdCBoYXNDYXRlZ29yaWVzID0gY2hlY2tvdXQubGluZUl0ZW1zPy5maWx0ZXIoKGkpID0+IHtcbiAgICAgIGlmICghaS5jYXRlZ29yaWVzIHx8ICFpLmNhdGVnb3JpZXM/Lmxlbmd0aCkgcmV0dXJuIHRydWVcbiAgICAgIHJldHVybiBpLmNhdGVnb3JpZXMuc29tZSgoYykgPT4gY291cG9uQ2F0ZWdvcmllcy5zb21lKChjYXQpID0+IGNhdCA9PSBjKSlcbiAgICB9KVxuXG4gICAgcmV0dXJuIGhhc0NhdGVnb3JpZXMubGVuZ3RoID8gdHJ1ZSA6IGZhbHNlXG4gIH1cblxuICBwcml2YXRlIGNvdXBvbVVzZXJWYWxpZGF0aW9uKGNvdXBvbjogQ291cG9uLCB1c2VyOiBVc2VyKSB7XG4gICAgaWYgKCF1c2VyIHx8IGNvdXBvbi5leGNsdXNpdml0eVR5cGUuaW5jbHVkZXMoRXhjbHVzaXZpdGllcy5BTExfVVNFUlMpKSByZXR1cm4gdHJ1ZVxuXG4gICAgbGV0IHVzZXJUeXBlcyA9IFtdXG5cbiAgICBpZiAoY291cG9uLmV4Y2x1c2l2aXR5VHlwZS5pbmNsdWRlcyhFeGNsdXNpdml0aWVzLkNPTExBQk9SQVRPUlMpICYmIHRoaXMuZW1haWxJc0Zyb21Db2xsYWJvcmF0b3IodXNlci5lbWFpbCkpXG4gICAgICB1c2VyVHlwZXMucHVzaChFeGNsdXNpdml0aWVzLkNPTExBQk9SQVRPUlMpXG5cbiAgICBpZiAoY291cG9uLmV4Y2x1c2l2aXR5VHlwZS5pbmNsdWRlcyhFeGNsdXNpdml0aWVzLlNQRUNJRklDX1VTRVIpICYmIGNvdXBvbi51c2VyRXhjbHVzaXZlRW1haWwuaW5jbHVkZXModXNlci5lbWFpbCkpXG4gICAgICB1c2VyVHlwZXMucHVzaChFeGNsdXNpdml0aWVzLlNQRUNJRklDX1VTRVIpXG5cbiAgICBpZiAoXG4gICAgICBjb3Vwb24uZXhjbHVzaXZpdHlUeXBlLmluY2x1ZGVzKEV4Y2x1c2l2aXRpZXMuQUNUSVZFX1NVQlNDUklCRVIpICYmXG4gICAgICB1c2VyLmlzU3Vic2NyaWJlciAmJlxuICAgICAgdXNlci5zdWJzY3JpcHRpb25QbGFuICE9ICcnXG4gICAgKVxuICAgICAgdXNlclR5cGVzLnB1c2goRXhjbHVzaXZpdGllcy5BQ1RJVkVfU1VCU0NSSUJFUilcblxuICAgIGlmIChcbiAgICAgIHVzZXIuaXNTdWJzY3JpYmVyICYmXG4gICAgICB1c2VyLnN1YnNjcmlwdGlvblBsYW4gPT0gJycgJiZcbiAgICAgIGNvdXBvbi5leGNsdXNpdml0eVR5cGUuaW5jbHVkZXMoRXhjbHVzaXZpdGllcy5JTkFDVElWRV9TVUJTQ1JJQkVSKVxuICAgIClcbiAgICAgIHVzZXJUeXBlcy5wdXNoKEV4Y2x1c2l2aXRpZXMuSU5BQ1RJVkVfU1VCU0NSSUJFUilcblxuICAgIGlmIChjb3Vwb24uZXhjbHVzaXZpdHlUeXBlLmluY2x1ZGVzKEV4Y2x1c2l2aXRpZXMuTk9OX1NVQlNDUklCRVIpICYmICF1c2VyLmlzU3Vic2NyaWJlcilcbiAgICAgIHVzZXJUeXBlcy5wdXNoKEV4Y2x1c2l2aXRpZXMuTk9OX1NVQlNDUklCRVIpXG5cbiAgICByZXR1cm4gY291cG9uLmV4Y2x1c2l2aXR5VHlwZS5zb21lKChyKSA9PiB1c2VyVHlwZXMuaW5jbHVkZXMocikpXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldENvdXBvbkNhdGVnb3JpZXNJZChwcm9kdWN0c0NhdGVnb3JpZXM6IHN0cmluZ1tdKTogUHJvbWlzZTxBcnJheTxTdHJpbmc+PiB7XG4gICAgY29uc3QgY291cG9uQ2F0ZWdvcmllczogQXJyYXk8U3RyaW5nPiA9IFtdXG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcHJvZHVjdHNDYXRlZ29yaWVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgY2F0ZWdvcnk6IENhdGVnb3J5ICYgeyBmaXJlc3RvcmVJZD86IHN0cmluZyB9ID0gYXdhaXQgdGhpcy5jYXRlZ29yeVJlcG9zaXRvcnkuZ2V0KHtcbiAgICAgICAgaWQ6IHByb2R1Y3RzQ2F0ZWdvcmllc1tpbmRleF0sXG4gICAgICB9KVxuXG4gICAgICBpZiAoY2F0ZWdvcnkpIHtcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBhd2FpdCB0aGlzLmNhdGVnb3J5UmVwb3NpdG9yeS5nZXRDaGlsZHJlbihwYXJzZUludChwcm9kdWN0c0NhdGVnb3JpZXNbaW5kZXhdKSlcblxuICAgICAgICBjb3Vwb25DYXRlZ29yaWVzLnB1c2goY2F0ZWdvcnkuaWQsIC4uLmNoaWxkcmVuLm1hcCgoYykgPT4gYy5pZC50b1N0cmluZygpKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gWy4uLm5ldyBTZXQoY291cG9uQ2F0ZWdvcmllcyldXG4gIH1cblxuICBwcml2YXRlIGVtYWlsSXNGcm9tQ29sbGFib3JhdG9yID0gKHVzZXJFbWFpbDogc3RyaW5nKTogYm9vbGVhbiA9PiAhIXVzZXJFbWFpbD8ubWF0Y2goL0BiNGEuY29tLmJyL2cpXG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRMaW5lSXRlbnNFbGlnZWJsZUZvckRpc2NvdW50KFxuICAgIHByb2R1Y3RzQ2F0ZWdvcmllczogc3RyaW5nW10sXG4gICAgY2hlY2tvdXQ6IFBhcnRpYWw8Q2hlY2tvdXQ+LFxuICApOiBQcm9taXNlPExpbmVJdGVtW10+IHtcbiAgICBsZXQgbGluZUl0ZW5zRGlzY291bnQgPSBbXVxuICAgIGNvbnN0IGNvdXBvbkNhdGVnb3JpZXMgPSBhd2FpdCB0aGlzLmdldENvdXBvbkNhdGVnb3JpZXNJZChwcm9kdWN0c0NhdGVnb3JpZXMpXG5cbiAgICBpZiAocHJvZHVjdHNDYXRlZ29yaWVzICYmIHByb2R1Y3RzQ2F0ZWdvcmllcy5sZW5ndGgpIHtcbiAgICAgIGxpbmVJdGVuc0Rpc2NvdW50ID0gY2hlY2tvdXQubGluZUl0ZW1zPy5maWx0ZXIoKGkpID0+IHtcbiAgICAgICAgaWYgKGkuY2F0ZWdvcmllcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIGkuY2F0ZWdvcmllcy5zb21lKChjKSA9PiBjb3Vwb25DYXRlZ29yaWVzLnNvbWUoKGNhdCkgPT4gY2F0ID09IGMpKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9KVxuICAgIH0gZWxzZSB7XG4gICAgICBsaW5lSXRlbnNEaXNjb3VudCA9IGNoZWNrb3V0LmxpbmVJdGVtc1xuICAgIH1cblxuICAgIHJldHVybiBsaW5lSXRlbnNEaXNjb3VudFxuICB9XG5cbiAgcHJpdmF0ZSBjYWxjQ2hlY2tvdXRTdWJ0b3RhbChsaW5lSXRlbnM6IExpbmVJdGVtW10sIHVzZXI6IFVzZXIsIHNob3A6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIChcbiAgICAgIGxpbmVJdGVucz8ucmVkdWNlKFxuICAgICAgICAoYWNjLCBjdXJyKSA9PlxuICAgICAgICAgIHVzZXI/LmlzU3Vic2NyaWJlciAmJiBjdXJyLnByaWNlW3Nob3BdPy5zdWJzY3JpYmVyUHJpY2VcbiAgICAgICAgICAgID8gYWNjICsgY3Vyci5wcmljZVtzaG9wXT8uc3Vic2NyaWJlclByaWNlICogY3Vyci5xdWFudGl0eVxuICAgICAgICAgICAgOiBhY2MgKyBjdXJyLnByaWNlUGFpZCAqIGN1cnIucXVhbnRpdHksXG4gICAgICAgIDAsXG4gICAgICApIHx8IDBcbiAgICApXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldE9yZGVyc1dpdGhDb3Vwb24oY291cG9uOiBDb3Vwb24pOiBQcm9taXNlPE9yZGVyW10+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5vcmRlclJlcG9zaXRvcnlcbiAgICAgIC5maW5kKHtcbiAgICAgICAgZmlsdGVyczoge1xuICAgICAgICAgIGNvdXBvbjogeyBpZDogY291cG9uLmlkIH0sXG4gICAgICAgICAgcGF5bWVudDogeyBzdGF0dXM6ICdwYWlkJyB9LFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC50aGVuKChyZXN1bHQpID0+IHJlc3VsdC5kYXRhKVxuICB9XG5cbiAgcHJpdmF0ZSBjb3VudE9yZGVyc1dpdGhVc2VyKG9yZGVyczogT3JkZXJbXSwgZW1haWw6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIG9yZGVycy5maWx0ZXIoKG8pID0+IG8udXNlci5lbWFpbCA9PSBlbWFpbCkubGVuZ3RoXG4gIH1cblxuICBwcml2YXRlIGdldENvdXBvblVzZUxpbWl0cyhjb3Vwb246IENvdXBvbiwgY2hlY2tvdXRUeXBlOiBDaGVja291dFR5cGVzLCB1c2VyOiBVc2VyKSB7XG4gICAgbGV0IGNvdXBvblVzZUxpbWl0czogeyB1bmxpbWl0ZWQ/OiBib29sZWFuOyB0b3RhbD86IG51bWJlcjsgbGltaXRlZFBlclVzZXI/OiBib29sZWFuIH1cbiAgICBpZiAoY2hlY2tvdXRUeXBlID09IENoZWNrb3V0VHlwZXMuRUNPTU1FUkNFIHx8IGNoZWNrb3V0VHlwZSA9PSBDaGVja291dFR5cGVzLkFMTCkge1xuICAgICAgY291cG9uVXNlTGltaXRzID0gdXNlciAmJiB1c2VyLmlzU3Vic2NyaWJlciA/IGNvdXBvbi51c2VMaW1pdHMuc3Vic2NyaWJlciA6IGNvdXBvbi51c2VMaW1pdHMubm9uX3N1YnNjcmliZXJcbiAgICB9IGVsc2Uge1xuICAgICAgY291cG9uVXNlTGltaXRzID0gY291cG9uLnVzZUxpbWl0cy5zdWJzY3JpcHRpb25cbiAgICB9XG5cbiAgICByZXR1cm4gY291cG9uVXNlTGltaXRzXG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable } from '@angular/core';
|
|
2
|
-
import { add, Category, pick, Product, RequiredArgumentError, Shops, Where, } from '@infrab4a/connect';
|
|
3
|
-
import { forkJoin, from, of, throwError } from 'rxjs';
|
|
4
|
-
import { concatMap, map, tap } from 'rxjs/operators';
|
|
5
|
-
import { DEFAULT_SHOP } from '../consts';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@infrab4a/connect";
|
|
8
|
-
export class HomeShopService {
|
|
9
|
-
constructor(categoryRepository, homeRepository, productRepository, defaultShop) {
|
|
10
|
-
this.categoryRepository = categoryRepository;
|
|
11
|
-
this.homeRepository = homeRepository;
|
|
12
|
-
this.productRepository = productRepository;
|
|
13
|
-
this.defaultShop = defaultShop;
|
|
14
|
-
this.buildCategoryGroupWithRequiredData = (group) => {
|
|
15
|
-
var _a, _b;
|
|
16
|
-
return ({
|
|
17
|
-
category: Category.toInstance(pick(((_a = group === null || group === void 0 ? void 0 : group.category) === null || _a === void 0 ? void 0 : _a.toPlain()) || {}, ['id', 'name', 'slug', 'conditions'])),
|
|
18
|
-
products: ((_b = group === null || group === void 0 ? void 0 : group.products) === null || _b === void 0 ? void 0 : _b.map((product) => Product.toInstance(pick((product === null || product === void 0 ? void 0 : product.toPlain()) || {}, [
|
|
19
|
-
'id',
|
|
20
|
-
'price',
|
|
21
|
-
'reviews',
|
|
22
|
-
'hasVariants',
|
|
23
|
-
'slug',
|
|
24
|
-
'sku',
|
|
25
|
-
'stock',
|
|
26
|
-
'costPrice',
|
|
27
|
-
'images',
|
|
28
|
-
'miniatures',
|
|
29
|
-
'name',
|
|
30
|
-
'weight',
|
|
31
|
-
'rate',
|
|
32
|
-
'type',
|
|
33
|
-
])))) || [],
|
|
34
|
-
});
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
get homeId() {
|
|
38
|
-
if (this.defaultShop === Shops.GLAMSHOP)
|
|
39
|
-
return 'glamshop';
|
|
40
|
-
if (this.defaultShop === Shops.MENSMARKET)
|
|
41
|
-
return 'mens_market';
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
getHomeData() {
|
|
45
|
-
return this.getHomeConfiguration().pipe(map((home) => { var _a; return (((_a = home === null || home === void 0 ? void 0 : home.data) === null || _a === void 0 ? void 0 : _a.expiresAt) > new Date() ? home : null); }), concatMap((home) => home
|
|
46
|
-
? of(home)
|
|
47
|
-
: forkJoin([this.getDiscoverProducts(), this.getFeaturedProducts(), this.getVerticalProducts()]).pipe(map(([discoverProducts, featuredProducts, verticalProducts]) => ({
|
|
48
|
-
discoverProducts,
|
|
49
|
-
featuredProducts,
|
|
50
|
-
verticalProducts,
|
|
51
|
-
})), concatMap((data) => this.saveHomeData(data)))));
|
|
52
|
-
}
|
|
53
|
-
getBanners(type) {
|
|
54
|
-
return this.getHomeConfiguration().pipe(map((home) => {
|
|
55
|
-
if (type === 'brand')
|
|
56
|
-
return home.brandsCarousel;
|
|
57
|
-
if (type === 'buyToWin')
|
|
58
|
-
return [home.buyToWinBanner];
|
|
59
|
-
if (type === 'block')
|
|
60
|
-
return home.blockBanners;
|
|
61
|
-
if (type === 'blog')
|
|
62
|
-
return [home.blogBanner];
|
|
63
|
-
}));
|
|
64
|
-
}
|
|
65
|
-
getMinValueForFreeShipping() {
|
|
66
|
-
return this.getHomeConfiguration().pipe(map((home) => home.minValueForFreeShipping));
|
|
67
|
-
}
|
|
68
|
-
getDiscoverProducts() {
|
|
69
|
-
return this.getHomeConfiguration().pipe(concatMap((home) => from(this.categoryRepository.getCategoriesForHome(home.discoverCategories)).pipe(map((groups) => groups.map(this.buildCategoryGroupWithRequiredData)))));
|
|
70
|
-
}
|
|
71
|
-
getFeaturedProducts() {
|
|
72
|
-
return this.getHomeConfiguration().pipe(concatMap((home) => from(this.categoryRepository.getCategoriesForHome(home.featuredCategories)).pipe(map((groups) => groups.map(this.buildCategoryGroupWithRequiredData)))));
|
|
73
|
-
}
|
|
74
|
-
getVerticalProducts() {
|
|
75
|
-
return this.getHomeConfiguration().pipe(concatMap((home) => forkJoin(home.verticalCarousels.filter(Boolean).map((id) => from(this.categoryRepository.get({ id })).pipe(concatMap((category) => from(this.productRepository.find({
|
|
76
|
-
filters: { categories: { operator: Where.IN, value: [category.id] } },
|
|
77
|
-
limits: { limit: 12 },
|
|
78
|
-
})).pipe(map((products) => ({ category, products })))), map(({ category, products }) => ({ category, products: products.data })), map(this.buildCategoryGroupWithRequiredData))))));
|
|
79
|
-
}
|
|
80
|
-
getHomeConfiguration() {
|
|
81
|
-
return of(this.homeConfiguration).pipe(concatMap((home) => home
|
|
82
|
-
? of(home)
|
|
83
|
-
: !this.homeId
|
|
84
|
-
? throwError(new RequiredArgumentError(['homeId']))
|
|
85
|
-
: from(this.homeRepository.get({ id: this.homeId })).pipe(tap((homeLoaded) => (this.homeConfiguration = homeLoaded)))));
|
|
86
|
-
}
|
|
87
|
-
saveHomeData(homeData) {
|
|
88
|
-
const data = {
|
|
89
|
-
createdAt: new Date(),
|
|
90
|
-
expiresAt: add(new Date(), { hours: 1 }),
|
|
91
|
-
data: homeData,
|
|
92
|
-
};
|
|
93
|
-
return from(this.homeRepository.update({
|
|
94
|
-
id: this.homeId,
|
|
95
|
-
data,
|
|
96
|
-
})).pipe(tap(() => (this.homeConfiguration.data = data)), map(() => this.homeConfiguration));
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
HomeShopService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: HomeShopService, deps: [{ token: 'CategoryRepository' }, { token: 'HomeRepository' }, { token: 'ProductRepository' }, { token: DEFAULT_SHOP }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
100
|
-
HomeShopService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: HomeShopService });
|
|
101
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: HomeShopService, decorators: [{
|
|
102
|
-
type: Injectable
|
|
103
|
-
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
104
|
-
type: Inject,
|
|
105
|
-
args: ['CategoryRepository']
|
|
106
|
-
}] }, { type: undefined, decorators: [{
|
|
107
|
-
type: Inject,
|
|
108
|
-
args: ['HomeRepository']
|
|
109
|
-
}] }, { type: undefined, decorators: [{
|
|
110
|
-
type: Inject,
|
|
111
|
-
args: ['ProductRepository']
|
|
112
|
-
}] }, { type: i1.Shops, decorators: [{
|
|
113
|
-
type: Inject,
|
|
114
|
-
args: [DEFAULT_SHOP]
|
|
115
|
-
}] }]; } });
|
|
116
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9tZS1zaG9wLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25uZWN0LWFuZ3VsYXIvc3JjL3NlcnZpY2VzL2hvbWUtc2hvcC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ2xELE9BQU8sRUFDTCxHQUFHLEVBRUgsUUFBUSxFQU1SLElBQUksRUFDSixPQUFPLEVBRVAscUJBQXFCLEVBQ3JCLEtBQUssRUFDTCxLQUFLLEdBQ04sTUFBTSxtQkFBbUIsQ0FBQTtBQUMxQixPQUFPLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBYyxFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRXBELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUE7OztBQU14QyxNQUFNLE9BQU8sZUFBZTtJQVUxQixZQUNpRCxrQkFBc0MsRUFDMUMsY0FBOEIsRUFDM0IsaUJBQW9DLEVBQzNDLFdBQWtCO1FBSFYsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUMxQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDM0Isc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUMzQyxnQkFBVyxHQUFYLFdBQVcsQ0FBTztRQStHbkQsdUNBQWtDLEdBQUcsQ0FBQyxLQUF3QixFQUFxQixFQUFFOztZQUFDLE9BQUEsQ0FBQztnQkFDN0YsUUFBUSxFQUFFLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUEsTUFBQSxLQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsUUFBUSwwQ0FBRSxPQUFPLEVBQUUsS0FBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFF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QUMsQ0FBQyxDQUFDLElBQUksQ0FDckQsR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUMzRCxDQUNOLENBQ0YsQ0FBQTtJQUNILENBQUM7SUFFTyxZQUFZLENBQUMsUUFBa0I7UUFDckMsTUFBTSxJQUFJLEdBQUc7WUFDWCxTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUU7WUFDckIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3hDLElBQUksRUFBRSxRQUFRO1NBQ2YsQ0FBQTtRQUVELE9BQU8sSUFBSSxDQUNULElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDO1lBQ3pCLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNmLElBQUk7U0FDTCxDQUFDLENBQ0gsQ0FBQyxJQUFJLENBQ0osR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxFQUMvQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQ2xDLENBQUE7SUFDSCxDQUFDOzs2R0EzSFUsZUFBZSxrQkFXaEIsb0JBQW9CLGFBQ3BCLGdCQUFnQixhQUNoQixtQkFBbUIsYUFDbkIsWUFBWTtpSEFkWCxlQUFlOzRGQUFmLGVBQWU7a0JBRDNCLFVBQVU7OzBCQVlOLE1BQU07MkJBQUMsb0JBQW9COzswQkFDM0IsTUFBTTsyQkFBQyxnQkFBZ0I7OzBCQUN2QixNQUFNOzJCQUFDLG1CQUFtQjs7MEJBQzFCLE1BQU07MkJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQge1xuICBhZGQsXG4gIEJhbm5lcixcbiAgQ2F0ZWdvcnksXG4gIENhdGVnb3J5UmVwb3NpdG9yeSxcbiAgSG9tZSxcbiAgSG9tZUNhdGVnb3J5R3JvdXAsXG4gIEhvbWVEYXRhLFxuICBIb21lUmVwb3NpdG9yeSxcbiAgcGljayxcbiAgUHJvZHVjdCxcbiAgUHJvZHVjdFJlcG9zaXRvcnksXG4gIFJlcXVpcmVkQXJndW1lbnRFcnJvcixcbiAgU2hvcHMsXG4gIFdoZXJlLFxufSBmcm9tICdAaW5mcmFiNGEvY29ubmVjdCdcbmltcG9ydCB7IGZvcmtKb2luLCBmcm9tLCBPYnNlcnZhYmxlLCBvZiwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBjb25jYXRNYXAsIG1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5cbmltcG9ydCB7IERFRkFVTFRfU0hPUCB9IGZyb20gJy4uL2NvbnN0cydcblxudHlwZSBIb21lQ29uZmlndXJhdGlvbklkID0gJ2dsYW1zaG9wJyB8ICdtZW5zX21hcmtldCdcbnR5cGUgQmFubmVyVHlwZSA9ICdicmFuZCcgfCAnYnV5VG9XaW4nIHwgJ2Jsb2NrJyB8ICdibG9nJ1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSG9tZVNob3BTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBob21lQ29uZmlndXJhdGlvbjogSG9tZVxuXG4gIHByaXZhdGUgZ2V0IGhvbWVJZCgpOiBIb21lQ29uZmlndXJhdGlvbklkIHtcbiAgICBpZiAodGhpcy5kZWZhdWx0U2hvcCA9PT0gU2hvcHMuR0xBTVNIT1ApIHJldHVybiAnZ2xhbXNob3AnXG4gICAgaWYgKHRoaXMuZGVmYXVsdFNob3AgPT09IFNob3BzLk1FTlNNQVJLRVQpIHJldHVybiAnbWVuc19tYXJrZXQnXG5cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdCgnQ2F0ZWdvcnlSZXBvc2l0b3J5JykgcHJpdmF0ZSByZWFkb25seSBjYXRlZ29yeVJlcG9zaXRvcnk6IENhdGVnb3J5UmVwb3NpdG9yeSxcbiAgICBASW5qZWN0KCdIb21lUmVwb3NpdG9yeScpIHByaXZhdGUgcmVhZG9ubHkgaG9tZVJlcG9zaXRvcnk6IEhvbWVSZXBvc2l0b3J5LFxuICAgIEBJbmplY3QoJ1Byb2R1Y3RSZXBvc2l0b3J5JykgcHJpdmF0ZSByZWFkb25seSBwcm9kdWN0UmVwb3NpdG9yeTogUHJvZHVjdFJlcG9zaXRvcnksXG4gICAgQEluamVjdChERUZBVUxUX1NIT1ApIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdFNob3A6IFNob3BzLFxuICApIHt9XG5cbiAgZ2V0SG9tZURhdGEoKTogT2JzZXJ2YWJsZTxIb21lPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SG9tZUNvbmZpZ3VyYXRpb24oKS5waXBlKFxuICAgICAgbWFwKChob21lKSA9PiAoaG9tZT8uZGF0YT8uZXhwaXJlc0F0ID4gbmV3IERhdGUoKSA/IGhvbWUgOiBudWxsKSksXG4gICAgICBjb25jYXRNYXAoKGhvbWUpID0+XG4gICAgICAgIGhvbWVcbiAgICAgICAgICA/IG9mKGhvbWUpXG4gICAgICAgICAgOiBmb3JrSm9pbihbdGhpcy5nZXREaXNjb3ZlclByb2R1Y3RzKCksIHRoaXMuZ2V0RmVhdHVyZWRQcm9kdWN0cygpLCB0aGlzLmdldFZlcnRpY2FsUHJvZHVjdHMoKV0pLnBpcGUoXG4gICAgICAgICAgICAgIG1hcCgoW2Rpc2NvdmVyUHJvZHVjdHMsIGZlYXR1cmVkUHJvZHVjdHMsIHZlcnRpY2FsUHJvZHVjdHNdKSA9PiAoe1xuICAgICAgICAgICAgICAgIGRpc2NvdmVyUHJvZHVjdHMsXG4gICAgICAgICAgICAgICAgZmVhdHVyZWRQcm9kdWN0cyxcbiAgICAgICAgICAgICAgICB2ZXJ0aWNhbFByb2R1Y3RzLFxuICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgIGNvbmNhdE1hcCgoZGF0YSkgPT4gdGhpcy5zYXZlSG9tZURhdGEoZGF0YSkpLFxuICAgICAgICAgICAgKSxcbiAgICAgICksXG4gICAgKVxuICB9XG5cbiAgZ2V0QmFubmVycyh0eXBlOiBCYW5uZXJUeXBlKTogT2JzZXJ2YWJsZTxCYW5uZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLmdldEhvbWVDb25maWd1cmF0aW9uKCkucGlwZShcbiAgICAgIG1hcCgoaG9tZSkgPT4ge1xuICAgICAgICBpZiAodHlwZSA9PT0gJ2JyYW5kJykgcmV0dXJuIGhvbWUuYnJhbmRzQ2Fyb3VzZWxcbiAgICAgICAgaWYgKHR5cGUgPT09ICdidXlUb1dpbicpIHJldHVybiBbaG9tZS5idXlUb1dpbkJhbm5lcl1cbiAgICAgICAgaWYgKHR5cGUgPT09ICdibG9jaycpIHJldHVybiBob21lLmJsb2NrQmFubmVyc1xuICAgICAgICBpZiAodHlwZSA9PT0gJ2Jsb2cnKSByZXR1cm4gW2hvbWUuYmxvZ0Jhbm5lcl1cbiAgICAgIH0pLFxuICAgIClcbiAgfVxuXG4gIGdldE1pblZhbHVlRm9yRnJlZVNoaXBwaW5nKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0SG9tZUNvbmZpZ3VyYXRpb24oKS5waXBlKG1hcCgoaG9tZSkgPT4gaG9tZS5taW5WYWx1ZUZvckZyZWVTaGlwcGluZykpXG4gIH1cblxuICBwcml2YXRlIGdldERpc2NvdmVyUHJvZHVjdHMoKTogT2JzZXJ2YWJsZTx7IGNhdGVnb3J5OiBDYXRlZ29yeTsgcHJvZHVjdHM6IFByb2R1Y3RbXSB9W10+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRIb21lQ29uZmlndXJhdGlvbigpLnBpcGUoXG4gICAgICBjb25jYXRNYXAoKGhvbWUpID0+XG4gICAgICAgIGZyb20odGhpcy5jYXRlZ29yeVJlcG9zaXRvcnkuZ2V0Q2F0ZWdvcmllc0ZvckhvbWUoaG9tZS5kaXNjb3ZlckNhdGVnb3JpZXMpKS5waXBlKFxuICAgICAgICAgIG1hcCgoZ3JvdXBzKSA9PiBncm91cHMubWFwKHRoaXMuYnVpbGRDYXRlZ29yeUdyb3VwV2l0aFJlcXVpcmVkRGF0YSkpLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApXG4gIH1cblxuICBwcml2YXRlIGdldEZlYXR1cmVkUHJvZHVjdHMoKTogT2JzZXJ2YWJsZTx7IGNhdGVnb3J5OiBDYXRlZ29yeTsgcHJvZHVjdHM6IFByb2R1Y3RbXSB9W10+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRIb21lQ29uZmlndXJhdGlvbigpLnBpcGUoXG4gICAgICBjb25jYXRNYXAoKGhvbWUpID0+XG4gICAgICAgIGZyb20odGhpcy5jYXRlZ29yeVJlcG9zaXRvcnkuZ2V0Q2F0ZWdvcmllc0ZvckhvbWUoaG9tZS5mZWF0dXJlZENhdGVnb3JpZXMpKS5waXBlKFxuICAgICAgICAgIG1hcCgoZ3JvdXBzKSA9PiBncm91cHMubWFwKHRoaXMuYnVpbGRDYXRlZ29yeUdyb3VwV2l0aFJlcXVpcmVkRGF0YSkpLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICApXG4gIH1cblxuICBwcml2YXRlIGdldFZlcnRpY2FsUHJvZHVjdHMoKTogT2JzZXJ2YWJsZTx7IGNhdGVnb3J5OiBDYXRlZ29yeTsgcHJvZHVjdHM6IFByb2R1Y3RbXSB9W10+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRIb21lQ29uZmlndXJhdGlvbigpLnBpcGUoXG4gICAgICBjb25jYXRNYXAoKGhvbWUpID0+XG4gICAgICAgIGZvcmtKb2luKFxuICAgICAgICAgIGhvbWUudmVydGljYWxDYXJvdXNlbHMuZmlsdGVyKEJvb2xlYW4pLm1hcCgoaWQpID0+XG4gICAgICAgICAgICBmcm9tKHRoaXMuY2F0ZWdvcnlSZXBvc2l0b3J5LmdldCh7IGlkIH0pKS5waXBlKFxuICAgICAgICAgICAgICBjb25jYXRNYXAoKGNhdGVnb3J5KSA9PlxuICAgICAgICAgICAgICAgIGZyb20oXG4gICAgICAgICAgICAgICAgICB0aGlzLnByb2R1Y3RSZXBvc2l0b3J5LmZpbmQoe1xuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiB7IGNhdGVnb3JpZXM6IHsgb3BlcmF0b3I6IFdoZXJlLklOLCB2YWx1ZTogW2NhdGVnb3J5LmlkXSB9IH0sXG4gICAgICAgICAgICAgICAgICAgIGxpbWl0czogeyBsaW1pdDogMTIgfSxcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICkucGlwZShtYXAoKHByb2R1Y3RzKSA9PiAoeyBjYXRlZ29yeSwgcHJvZHVjdHMgfSkpKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgbWFwKCh7IGNhdGVnb3J5LCBwcm9kdWN0cyB9KSA9PiAoeyBjYXRlZ29yeSwgcHJvZHVjdHM6IHByb2R1Y3RzLmRhdGEgfSkpLFxuICAgICAgICAgICAgICBtYXAodGhpcy5idWlsZENhdGVnb3J5R3JvdXBXaXRoUmVxdWlyZWREYXRhKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRIb21lQ29uZmlndXJhdGlvbigpOiBPYnNlcnZhYmxlPEhvbWU+IHtcbiAgICByZXR1cm4gb2YodGhpcy5ob21lQ29uZmlndXJhdGlvbikucGlwZShcbiAgICAgIGNvbmNhdE1hcCgoaG9tZSkgPT5cbiAgICAgICAgaG9tZVxuICAgICAgICAgID8gb2YoaG9tZSlcbiAgICAgICAgICA6ICF0aGlzLmhvbWVJZFxuICAgICAgICAgID8gdGhyb3dFcnJvcihuZXcgUmVxdWlyZWRBcmd1bWVudEVycm9yKFsnaG9tZUlkJ10pKVxuICAgICAgICAgIDogZnJvbSh0aGlzLmhvbWVSZXBvc2l0b3J5LmdldCh7IGlkOiB0aGlzLmhvbWVJZCB9KSkucGlwZShcbiAgICAgICAgICAgICAgdGFwKChob21lTG9hZGVkKSA9PiAodGhpcy5ob21lQ29uZmlndXJhdGlvbiA9IGhvbWVMb2FkZWQpKSxcbiAgICAgICAgICAgICksXG4gICAgICApLFxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgc2F2ZUhvbWVEYXRhKGhvbWVEYXRhOiBIb21lRGF0YSk6IE9ic2VydmFibGU8SG9tZT4ge1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICBleHBpcmVzQXQ6IGFkZChuZXcgRGF0ZSgpLCB7IGhvdXJzOiAxIH0pLFxuICAgICAgZGF0YTogaG9tZURhdGEsXG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb20oXG4gICAgICB0aGlzLmhvbWVSZXBvc2l0b3J5LnVwZGF0ZSh7XG4gICAgICAgIGlkOiB0aGlzLmhvbWVJZCxcbiAgICAgICAgZGF0YSxcbiAgICAgIH0pLFxuICAgICkucGlwZShcbiAgICAgIHRhcCgoKSA9PiAodGhpcy5ob21lQ29uZmlndXJhdGlvbi5kYXRhID0gZGF0YSkpLFxuICAgICAgbWFwKCgpID0+IHRoaXMuaG9tZUNvbmZpZ3VyYXRpb24pLFxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRDYXRlZ29yeUdyb3VwV2l0aFJlcXVpcmVkRGF0YSA9IChncm91cDogSG9tZUNhdGVnb3J5R3JvdXApOiBIb21lQ2F0ZWdvcnlHcm91cCA9PiAoe1xuICAgIGNhdGVnb3J5OiBDYXRlZ29yeS50b0luc3RhbmNlKHBpY2soZ3JvdXA/LmNhdGVnb3J5Py50b1BsYWluKCkgfHwge30sIFsnaWQnLCAnbmFtZScsICdzbHVnJywgJ2NvbmRpdGlvbnMnXSkpLFxuICAgIHByb2R1Y3RzOlxuICAgICAgZ3JvdXA/LnByb2R1Y3RzPy5tYXAoKHByb2R1Y3QpID0+XG4gICAgICAgIFByb2R1Y3QudG9JbnN0YW5jZShcbiAgICAgICAgICBwaWNrKHByb2R1Y3Q/LnRvUGxhaW4oKSB8fCB7fSwgW1xuICAgICAgICAgICAgJ2lkJyxcbiAgICAgICAgICAgICdwcmljZScsXG4gICAgICAgICAgICAncmV2aWV3cycsXG4gICAgICAgICAgICAnaGFzVmFyaWFudHMnLFxuICAgICAgICAgICAgJ3NsdWcnLFxuICAgICAgICAgICAgJ3NrdScsXG4gICAgICAgICAgICAnc3RvY2snLFxuICAgICAgICAgICAgJ2Nvc3RQcmljZScsXG4gICAgICAgICAgICAnaW1hZ2VzJyxcbiAgICAgICAgICAgICdtaW5pYXR1cmVzJyxcbiAgICAgICAgICAgICduYW1lJyxcbiAgICAgICAgICAgICd3ZWlnaHQnLFxuICAgICAgICAgICAgJ3JhdGUnLFxuICAgICAgICAgICAgJ3R5cGUnLFxuICAgICAgICAgIF0pLFxuICAgICAgICApLFxuICAgICAgKSB8fCBbXSxcbiAgfSlcbn1cbiJdfQ==
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export * from './auth.service';
|
|
2
|
-
export * from './cart.service';
|
|
3
|
-
export * from './catalog';
|
|
4
|
-
export * from './checkout-subscription.service';
|
|
5
|
-
export * from './checkout.service';
|
|
6
|
-
export * from './coupon.service';
|
|
7
|
-
export * from './home-shop.service';
|
|
8
|
-
export * from './order.service';
|
|
9
|
-
export * from './shipping.service';
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb25uZWN0LWFuZ3VsYXIvc3JjL3NlcnZpY2VzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsZ0JBQWdCLENBQUE7QUFDOUIsY0FBYyxnQkFBZ0IsQ0FBQTtBQUM5QixjQUFjLFdBQVcsQ0FBQTtBQUN6QixjQUFjLGlDQUFpQyxDQUFBO0FBQy9DLGNBQWMsb0JBQW9CLENBQUE7QUFDbEMsY0FBYyxrQkFBa0IsQ0FBQTtBQUNoQyxjQUFjLHFCQUFxQixDQUFBO0FBQ25DLGNBQWMsaUJBQWlCLENBQUE7QUFDL0IsY0FBYyxvQkFBb0IsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYXV0aC5zZXJ2aWNlJ1xuZXhwb3J0ICogZnJvbSAnLi9jYXJ0LnNlcnZpY2UnXG5leHBvcnQgKiBmcm9tICcuL2NhdGFsb2cnXG5leHBvcnQgKiBmcm9tICcuL2NoZWNrb3V0LXN1YnNjcmlwdGlvbi5zZXJ2aWNlJ1xuZXhwb3J0ICogZnJvbSAnLi9jaGVja291dC5zZXJ2aWNlJ1xuZXhwb3J0ICogZnJvbSAnLi9jb3Vwb24uc2VydmljZSdcbmV4cG9ydCAqIGZyb20gJy4vaG9tZS1zaG9wLnNlcnZpY2UnXG5leHBvcnQgKiBmcm9tICcuL29yZGVyLnNlcnZpY2UnXG5leHBvcnQgKiBmcm9tICcuL3NoaXBwaW5nLnNlcnZpY2UnXG4iXX0=
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { Injectable, Inject } from '@angular/core';
|
|
2
|
-
import { AngularFirestore } from '@angular/fire/firestore';
|
|
3
|
-
import { Order, OrderFirestoreRepository } from '@infrab4a/connect';
|
|
4
|
-
import { Subject } from 'rxjs';
|
|
5
|
-
import { map } from 'rxjs/operators';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@angular/fire/firestore";
|
|
8
|
-
import * as i2 from "@infrab4a/connect";
|
|
9
|
-
export class OrderService {
|
|
10
|
-
constructor(angularFirestore, orderRepository) {
|
|
11
|
-
this.angularFirestore = angularFirestore;
|
|
12
|
-
this.orderRepository = orderRepository;
|
|
13
|
-
this.orderSubject = new Subject();
|
|
14
|
-
}
|
|
15
|
-
getOrder(id) {
|
|
16
|
-
this.angularFirestore
|
|
17
|
-
.doc(`${this.orderRepository.collectionName}/${id}`)
|
|
18
|
-
.valueChanges()
|
|
19
|
-
.pipe(map((doc) => Order.toInstance(doc)))
|
|
20
|
-
.subscribe((doc) => this.orderSubject.next(doc));
|
|
21
|
-
return this.orderSubject;
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
OrderService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: OrderService, deps: [{ token: i1.AngularFirestore }, { token: 'OrderRepository' }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
25
|
-
OrderService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: OrderService });
|
|
26
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: OrderService, decorators: [{
|
|
27
|
-
type: Injectable
|
|
28
|
-
}], ctorParameters: function () { return [{ type: i1.AngularFirestore }, { type: i2.OrderFirestoreRepository, decorators: [{
|
|
29
|
-
type: Inject,
|
|
30
|
-
args: ['OrderRepository']
|
|
31
|
-
}] }]; } });
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JkZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Nvbm5lY3QtYW5ndWxhci9zcmMvc2VydmljZXMvb3JkZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUNsRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQXlCLE1BQU0seUJBQXlCLENBQUE7QUFDakYsT0FBTyxFQUFFLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ25FLE9BQU8sRUFBb0IsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQ2hELE9BQU8sRUFBRSxHQUFHLEVBQWlCLE1BQU0sZ0JBQWdCLENBQUE7Ozs7QUFHbkQsTUFBTSxPQUFPLFlBQVk7SUFHdkIsWUFDbUIsZ0JBQWtDLEVBQ1AsZUFBeUM7UUFEcEUscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNQLG9CQUFlLEdBQWYsZUFBZSxDQUEwQjtRQUp2RixpQkFBWSxHQUFHLElBQUksT0FBTyxFQUFTLENBQUE7SUFLaEMsQ0FBQztJQUVKLFFBQVEsQ0FBQyxFQUFVO1FBQ2pCLElBQUksQ0FBQyxnQkFBZ0I7YUFDbEIsR0FBRyxDQUErQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxJQUFJLEVBQUUsRUFBRSxDQUFDO2FBQ2pGLFlBQVksRUFBRTthQUNkLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUN6QyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFFbEQsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFBO0lBQzFCLENBQUM7OzBHQWhCVSxZQUFZLGtEQUtiLGlCQUFpQjs4R0FMaEIsWUFBWTs0RkFBWixZQUFZO2tCQUR4QixVQUFVOzswQkFNTixNQUFNOzJCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBBbmd1bGFyRmlyZXN0b3JlLCBRdWVyeURvY3VtZW50U25hcHNob3QgfSBmcm9tICdAYW5ndWxhci9maXJlL2ZpcmVzdG9yZSdcbmltcG9ydCB7IE9yZGVyLCBPcmRlckZpcmVzdG9yZVJlcG9zaXRvcnkgfSBmcm9tICdAaW5mcmFiNGEvY29ubmVjdCdcbmltcG9ydCB7IGZyb20sIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgbWFwLCBtZXJnZU1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBPcmRlclNlcnZpY2Uge1xuICBvcmRlclN1YmplY3QgPSBuZXcgU3ViamVjdDxPcmRlcj4oKVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYW5ndWxhckZpcmVzdG9yZTogQW5ndWxhckZpcmVzdG9yZSxcbiAgICBASW5qZWN0KCdPcmRlclJlcG9zaXRvcnknKSBwcml2YXRlIHJlYWRvbmx5IG9yZGVyUmVwb3NpdG9yeTogT3JkZXJGaXJlc3RvcmVSZXBvc2l0b3J5LFxuICApIHt9XG5cbiAgZ2V0T3JkZXIoaWQ6IHN0cmluZyk6IFN1YmplY3Q8T3JkZXI+IHtcbiAgICB0aGlzLmFuZ3VsYXJGaXJlc3RvcmVcbiAgICAgIC5kb2M8UXVlcnlEb2N1bWVudFNuYXBzaG90PE9yZGVyPj4oYCR7dGhpcy5vcmRlclJlcG9zaXRvcnkuY29sbGVjdGlvbk5hbWV9LyR7aWR9YClcbiAgICAgIC52YWx1ZUNoYW5nZXMoKVxuICAgICAgLnBpcGUobWFwKChkb2MpID0+IE9yZGVyLnRvSW5zdGFuY2UoZG9jKSkpXG4gICAgICAuc3Vic2NyaWJlKChkb2MpID0+IHRoaXMub3JkZXJTdWJqZWN0Lm5leHQoZG9jKSlcblxuICAgIHJldHVybiB0aGlzLm9yZGVyU3ViamVjdFxuICB9XG59XG4iXX0=
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import { HttpClient } from '@angular/common/http';
|
|
2
|
-
import { Inject, Injectable } from '@angular/core';
|
|
3
|
-
import { Shops } from '@infrab4a/connect';
|
|
4
|
-
import { combineLatest } from 'rxjs';
|
|
5
|
-
import { map } from 'rxjs/operators';
|
|
6
|
-
import { BACKEND_URL } from '../consts';
|
|
7
|
-
import { HomeShopService } from './home-shop.service';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "@angular/common/http";
|
|
10
|
-
import * as i2 from "./home-shop.service";
|
|
11
|
-
export class ShippingService {
|
|
12
|
-
constructor(http, apiUrl, homeService) {
|
|
13
|
-
this.http = http;
|
|
14
|
-
this.apiUrl = apiUrl;
|
|
15
|
-
this.homeService = homeService;
|
|
16
|
-
}
|
|
17
|
-
getShippingMethods(shop, zip, weightGrams, totalPrice, personId, subscriptionPlan) {
|
|
18
|
-
return combineLatest([
|
|
19
|
-
this.homeService.getHomeData(),
|
|
20
|
-
this.http.get(`${this.apiUrl}open/checkshippingcompany?personId=${personId}&postalCode=${zip}&weightGrams=${weightGrams}`),
|
|
21
|
-
]).pipe(map(([datas, shippingMethodsResponse]) => {
|
|
22
|
-
let shippingMethods = shippingMethodsResponse.result;
|
|
23
|
-
if (!shippingMethods.length)
|
|
24
|
-
return [];
|
|
25
|
-
shippingMethods = shippingMethods.map((s) => {
|
|
26
|
-
if (s.ShippingCompanyName == 'Same Day EG')
|
|
27
|
-
s.ShippingCompanyName = 'Same Day';
|
|
28
|
-
else
|
|
29
|
-
return s;
|
|
30
|
-
});
|
|
31
|
-
const datasSameDayNotAvaliable = datas.sameDayNotAvaliable;
|
|
32
|
-
if (this.isHolidays(datasSameDayNotAvaliable)) {
|
|
33
|
-
shippingMethods = shippingMethods.filter((method) => method.serviceName !== 'Same Day');
|
|
34
|
-
}
|
|
35
|
-
if (totalPrice >= 200) {
|
|
36
|
-
shippingMethods = shippingMethods.map((s) => {
|
|
37
|
-
if (s.serviceName !== 'Same Day')
|
|
38
|
-
return Object.assign(Object.assign({}, s), { totalPrice: 0 });
|
|
39
|
-
else
|
|
40
|
-
return s;
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
if (shop == Shops.GLAMSHOP)
|
|
44
|
-
return shippingMethods;
|
|
45
|
-
if (this.isFreeShippingBySubscription(shop, subscriptionPlan)) {
|
|
46
|
-
shippingMethods = shippingMethods.map((s) => {
|
|
47
|
-
if (s.serviceName == 'Same Day')
|
|
48
|
-
return Object.assign(Object.assign({}, s), { totalPrice: s.totalPrice / 2 });
|
|
49
|
-
else
|
|
50
|
-
return Object.assign(Object.assign({}, s), { totalPrice: 0 });
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
if (this.isHalfShippingBySubscription(shop, subscriptionPlan)) {
|
|
54
|
-
shippingMethods = shippingMethods.map((s) => {
|
|
55
|
-
return Object.assign(Object.assign({}, s), { totalPrice: s.totalPrice / 2 });
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
return shippingMethods;
|
|
59
|
-
}));
|
|
60
|
-
}
|
|
61
|
-
isFreeShippingBySubscription(shop, subscriptionPlan) {
|
|
62
|
-
if (!subscriptionPlan)
|
|
63
|
-
return false;
|
|
64
|
-
if (shop == Shops.MENSMARKET && subscriptionPlan == 'SELECT') {
|
|
65
|
-
return true;
|
|
66
|
-
}
|
|
67
|
-
return false;
|
|
68
|
-
}
|
|
69
|
-
isHalfShippingBySubscription(shop, subscriptionPlan) {
|
|
70
|
-
if (!subscriptionPlan)
|
|
71
|
-
return false;
|
|
72
|
-
if (shop == Shops.MENSMARKET && subscriptionPlan == 'PRIME') {
|
|
73
|
-
return true;
|
|
74
|
-
}
|
|
75
|
-
return false;
|
|
76
|
-
}
|
|
77
|
-
isHolidays(datas) {
|
|
78
|
-
const today = new Date();
|
|
79
|
-
for (const key in datas) {
|
|
80
|
-
let start = new Date(`${today.getFullYear()}-${datas[key].beginDate}`);
|
|
81
|
-
let end = new Date(`${today.getFullYear()}-${datas[key].endDate}`);
|
|
82
|
-
if (start > end)
|
|
83
|
-
end = new Date(`${today.getFullYear() + 1}-${datas[key].endDate}`);
|
|
84
|
-
if (today >= start && today <= end)
|
|
85
|
-
return true;
|
|
86
|
-
}
|
|
87
|
-
return false;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
ShippingService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: ShippingService, deps: [{ token: i1.HttpClient }, { token: BACKEND_URL }, { token: i2.HomeShopService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
91
|
-
ShippingService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: ShippingService });
|
|
92
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.12", ngImport: i0, type: ShippingService, decorators: [{
|
|
93
|
-
type: Injectable
|
|
94
|
-
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: undefined, decorators: [{
|
|
95
|
-
type: Inject,
|
|
96
|
-
args: [BACKEND_URL]
|
|
97
|
-
}] }, { type: i2.HomeShopService }]; } });
|
|
98
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hpcHBpbmcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Nvbm5lY3QtYW5ndWxhci9zcmMvc2VydmljZXMvc2hpcHBpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFDakQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDbEQsT0FBTyxFQUFRLEtBQUssRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQy9DLE9BQU8sRUFBRSxhQUFhLEVBQWMsTUFBTSxNQUFNLENBQUE7QUFDaEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRXBDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDdkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFBOzs7O0FBSXJELE1BQU0sT0FBTyxlQUFlO0lBQzFCLFlBQ1UsSUFBZ0IsRUFDSyxNQUFjLEVBQ25DLFdBQTRCO1FBRjVCLFNBQUksR0FBSixJQUFJLENBQVk7UUFDSyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ25DLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtJQUNuQyxDQUFDO0lBRUcsa0JBQWtCLENBQ3ZCLElBQVksRUFDWixHQUFXLEVBQ1gsV0FBbUIsRUFDbkIsVUFBa0IsRUFDbEIsUUFBZ0IsRUFDaEIsZ0JBQXlCO1FBRXpCLE9BQU8sYUFBYSxDQUFDO1lBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFO1lBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUNYLEdBQUcsSUFBSSxDQUFDLE1BQU0sc0NBQXNDLFFBQVEsZUFBZSxHQUFHLGdCQUFnQixXQUFXLEVBQUUsQ0FDNUc7U0FDRixDQUFDLENBQUMsSUFBSSxDQUNMLEdBQUcsQ0FBQyxDQUFD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QUFJLEtBQUssRUFBRTtZQUN2QixJQUFJLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQTtZQUN0RSxJQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtZQUVsRSxJQUFJLEtBQUssR0FBRyxHQUFHO2dCQUFFLEdBQUcsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7WUFFbkYsSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxHQUFHO2dCQUFFLE9BQU8sSUFBSSxDQUFBO1NBQ2hEO1FBRUQsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDOzs2R0FsR1UsZUFBZSw0Q0FHaEIsV0FBVztpSEFIVixlQUFlOzRGQUFmLGVBQWU7a0JBRDNCLFVBQVU7OzBCQUlOLE1BQU07MkJBQUMsV0FBVyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCdcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBIb21lLCBTaG9wcyB9IGZyb20gJ0BpbmZyYWI0YS9jb25uZWN0J1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcblxuaW1wb3J0IHsgQkFDS0VORF9VUkwgfSBmcm9tICcuLi9jb25zdHMnXG5pbXBvcnQgeyBIb21lU2hvcFNlcnZpY2UgfSBmcm9tICcuL2hvbWUtc2hvcC5zZXJ2aWNlJ1xuaW1wb3J0IHsgU2hpcHBpbmdNZXRob2RSZXNwb25zZSB9IGZyb20gJy4vdHlwZXMvc2hpcHBpbmctbWV0aG9kcy50eXBlJ1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2hpcHBpbmdTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgIEBJbmplY3QoQkFDS0VORF9VUkwpIHByaXZhdGUgYXBpVXJsOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBob21lU2VydmljZTogSG9tZVNob3BTZXJ2aWNlLFxuICApIHt9XG5cbiAgcHVibGljIGdldFNoaXBwaW5nTWV0aG9kcyhcbiAgICBzaG9wOiBzdHJpbmcsXG4gICAgemlwOiBzdHJpbmcsXG4gICAgd2VpZ2h0R3JhbXM6IG51bWJlcixcbiAgICB0b3RhbFByaWNlOiBudW1iZXIsXG4gICAgcGVyc29uSWQ6IHN0cmluZyxcbiAgICBzdWJzY3JpcHRpb25QbGFuPzogc3RyaW5nLFxuICApOiBPYnNlcnZhYmxlPEFycmF5PFNoaXBwaW5nTWV0aG9kUmVzcG9uc2UgJiB7IFNoaXBwaW5nQ29tcGFueU5hbWU/OiBzdHJpbmcgfT4+IHtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLmhvbWVTZXJ2aWNlLmdldEhvbWVEYXRhKCksXG4gICAgICB0aGlzLmh0dHAuZ2V0KFxuICAgICAgICBgJHt0aGlzLmFwaVVybH1vcGVuL2NoZWNrc2hpcHBpbmdjb21wYW55P3BlcnNvbklkPSR7cGVyc29uSWR9JnBvc3RhbENvZGU9JHt6aXB9JndlaWdodEdyYW1zPSR7d2VpZ2h0R3JhbXN9YCxcbiAgICAgICksXG4gICAgXSkucGlwZShcbiAgICAgIG1hcCgoW2RhdGFzLCBzaGlwcGluZ01ldGhvZHNSZXNwb25zZV06IFtIb21lICYgeyBzYW1lRGF5Tm90QXZhbGlhYmxlIH0sIGFueV0pID0+IHtcbiAgICAgICAgbGV0IHNoaXBwaW5nTWV0aG9kcyA9IHNoaXBwaW5nTWV0aG9kc1Jlc3BvbnNlLnJlc3VsdCBhcyAoU2hpcHBpbmdNZXRob2RSZXNwb25zZSAmIHtcbiAgICAgICAgICBTaGlwcGluZ0NvbXBhbnlOYW1lPzogc3RyaW5nXG4gICAgICAgIH0pW11cblxuICAgICAgICBpZiAoIXNoaXBwaW5nTWV0aG9kcy5sZW5ndGgpIHJldHVybiBbXVxuXG4gICAgICAgIHNoaXBwaW5nTWV0aG9kcyA9IHNoaXBwaW5nTWV0aG9kcy5tYXAoKHMpID0+IHtcbiAgICAgICAgICBpZiAocy5TaGlwcGluZ0NvbXBhbnlOYW1lID09ICdTYW1lIERheSBFRycpIHMuU2hpcHBpbmdDb21wYW55TmFtZSA9ICdTYW1lIERheSdcbiAgICAgICAgICBlbHNlIHJldHVybiBzXG4gICAgICAgIH0pXG5cbiAgICAgICAgY29uc3QgZGF0YXNTYW1lRGF5Tm90QXZhbGlhYmxlID0gZGF0YXMuc2FtZURheU5vdEF2YWxpYWJsZVxuXG4gICAgICAgIGlmICh0aGlzLmlzSG9saWRheXMoZGF0YXNTYW1lRGF5Tm90QXZhbGlhYmxlKSkge1xuICAgICAgICAgIHNoaXBwaW5nTWV0aG9kcyA9IHNoaXBwaW5nTWV0aG9kcy5maWx0ZXIoKG1ldGhvZCkgPT4gbWV0aG9kLnNlcnZpY2VOYW1lICE9PSAnU2FtZSBEYXknKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRvdGFsUHJpY2UgPj0gMjAwKSB7XG4gICAgICAgICAgc2hpcHBpbmdNZXRob2RzID0gc2hpcHBpbmdNZXRob2RzLm1hcCgocykgPT4ge1xuICAgICAgICAgICAgaWYgKHMuc2VydmljZU5hbWUgIT09ICdTYW1lIERheScpIHJldHVybiB7IC4uLnMsIHRvdGFsUHJpY2U6IDAgfVxuICAgICAgICAgICAgZWxzZSByZXR1cm4gc1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2hvcCA9PSBTaG9wcy5HTEFNU0hPUCkgcmV0dXJuIHNoaXBwaW5nTWV0aG9kc1xuXG4gICAgICAgIGlmICh0aGlzLmlzRnJlZVNoaXBwaW5nQnlTdWJzY3JpcHRpb24oc2hvcCwgc3Vic2NyaXB0aW9uUGxhbikpIHtcbiAgICAgICAgICBzaGlwcGluZ01ldGhvZHMgPSBzaGlwcGluZ01ldGhvZHMubWFwKChzKSA9PiB7XG4gICAgICAgICAgICBpZiAocy5zZXJ2aWNlTmFtZSA9PSAnU2FtZSBEYXknKSByZXR1cm4geyAuLi5zLCB0b3RhbFByaWNlOiBzLnRvdGFsUHJpY2UgLyAyIH1cbiAgICAgICAgICAgIGVsc2UgcmV0dXJuIHsgLi4ucywgdG90YWxQcmljZTogMCB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzSGFsZlNoaXBwaW5nQnlTdWJzY3JpcHRpb24oc2hvcCwgc3Vic2NyaXB0aW9uUGxhbikpIHtcbiAgICAgICAgICBzaGlwcGluZ01ldGhvZHMgPSBzaGlwcGluZ01ldGhvZHMubWFwKChzKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyAuLi5zLCB0b3RhbFByaWNlOiBzLnRvdGFsUHJpY2UgLyAyIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNoaXBwaW5nTWV0aG9kc1xuICAgICAgfSksXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBpc0ZyZWVTaGlwcGluZ0J5U3Vic2NyaXB0aW9uKHNob3A6IHN0cmluZywgc3Vic2NyaXB0aW9uUGxhbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCFzdWJzY3JpcHRpb25QbGFuKSByZXR1cm4gZmFsc2VcblxuICAgIGlmIChzaG9wID09IFNob3BzLk1FTlNNQVJLRVQgJiYgc3Vic2NyaXB0aW9uUGxhbiA9PSAnU0VMRUNUJykge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBwcml2YXRlIGlzSGFsZlNoaXBwaW5nQnlTdWJzY3JpcHRpb24oc2hvcDogc3RyaW5nLCBzdWJzY3JpcHRpb25QbGFuOiBzdHJpbmcpIHtcbiAgICBpZiAoIXN1YnNjcmlwdGlvblBsYW4pIHJldHVybiBmYWxzZVxuXG4gICAgaWYgKHNob3AgPT0gU2hvcHMuTUVOU01BUktFVCAmJiBzdWJzY3JpcHRpb25QbGFuID09ICdQUklNRScpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBwcml2YXRlIGlzSG9saWRheXMoZGF0YXM6IGFueSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YXMpIHtcbiAgICAgIGxldCBzdGFydCA9IG5ldyBEYXRlKGAke3RvZGF5LmdldEZ1bGxZZWFyKCl9LSR7ZGF0YXNba2V5XS5iZWdpbkRhdGV9YClcbiAgICAgIGxldCBlbmQgPSBuZXcgRGF0ZShgJHt0b2RheS5nZXRGdWxsWWVhcigpfS0ke2RhdGFzW2tleV0uZW5kRGF0ZX1gKVxuXG4gICAgICBpZiAoc3RhcnQgPiBlbmQpIGVuZCA9IG5ldyBEYXRlKGAke3RvZGF5LmdldEZ1bGxZZWFyKCkgKyAxfS0ke2RhdGFzW2tleV0uZW5kRGF0ZX1gKVxuXG4gICAgICBpZiAodG9kYXkgPj0gc3RhcnQgJiYgdG9kYXkgPD0gZW5kKSByZXR1cm4gdHJ1ZVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG4iXX0=
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hpcHBpbmctbWV0aG9kcy50eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29ubmVjdC1hbmd1bGFyL3NyYy9zZXJ2aWNlcy90eXBlcy9zaGlwcGluZy1tZXRob2RzLnR5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgU2hpcHBpbmdNZXRob2RSZXNwb25zZSB7XG4gIGRheXNUb0RlbGl2ZXJ5OiBudW1iZXI7XG4gIGN1cnJlbmN5OiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIG1heERlbGl2ZXJ5RGF0ZTogc3RyaW5nO1xuICBtaW5EZWxpdmVyeURhdGU6IHN0cmluZztcbiAgc2VydmljZUNvZGU6IHN0cmluZztcbiAgc2VydmljZU5hbWU6IHN0cmluZztcbiAgdG90YWxQcmljZTogbnVtYmVyO1xuICBhZGRpdGlvbmFsRGVzY3JpcHRpb246IHN0cmluZztcbiAgY25wajogc3RyaW5nO1xufSJdfQ==
|