@infrab4a/connect-angular 5.1.0 → 6.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/eslint.config.js +18 -0
  2. package/index.ts +1 -0
  3. package/karma.conf.js +32 -0
  4. package/ng-package.json +8 -0
  5. package/package.json +10 -28
  6. package/project.json +37 -0
  7. package/src/angular-connect.module.ts +256 -0
  8. package/src/angular-elastic-search.module.ts +23 -0
  9. package/src/angular-firebase-auth.module.ts +101 -0
  10. package/src/angular-firestore.module.ts +371 -0
  11. package/src/angular-hasura-graphql.module.ts +219 -0
  12. package/src/angular-vertex-search.module.ts +23 -0
  13. package/src/consts/backend-url.const.ts +1 -0
  14. package/src/consts/category-structure.ts +1 -0
  15. package/src/consts/default-shop.const.ts +1 -0
  16. package/src/consts/es-config.const.ts +1 -0
  17. package/src/consts/firebase-const.ts +5 -0
  18. package/src/consts/hasura-options.const.ts +1 -0
  19. package/src/consts/index.ts +8 -0
  20. package/src/consts/persistence.const.ts +1 -0
  21. package/src/consts/storage-base-url.const.ts +1 -0
  22. package/src/consts/vertex-config.const.ts +1 -0
  23. package/src/helpers/index.ts +1 -0
  24. package/src/helpers/mobile-operation-system-checker.helper.ts +10 -0
  25. package/src/index.ts +6 -0
  26. package/src/interfaces/catalog-strategies.interface.ts +36 -0
  27. package/src/interfaces/category-facades.interface.ts +7 -0
  28. package/src/interfaces/index.ts +2 -0
  29. package/src/persistence/cookie-data-persistence.ts +21 -0
  30. package/src/persistence/data-persistence.ts +7 -0
  31. package/src/persistence/index.ts +2 -0
  32. package/src/services/auth.service.ts +39 -0
  33. package/src/services/cart/cart-services.facade.ts +14 -0
  34. package/src/services/cart/index.ts +1 -0
  35. package/src/services/cart.service.ts +124 -0
  36. package/src/services/catalog/adapters/category-structure.adapter.ts +5 -0
  37. package/src/services/catalog/adapters/index.ts +3 -0
  38. package/src/services/catalog/adapters/new-category-structure.adapter.ts +42 -0
  39. package/src/services/catalog/adapters/old-category-structure.adapter.ts +17 -0
  40. package/src/services/catalog/catalog.service.ts +153 -0
  41. package/src/services/catalog/category.service.ts +52 -0
  42. package/src/services/catalog/context/catalog-search.context.ts +61 -0
  43. package/src/services/catalog/enums/index.ts +1 -0
  44. package/src/services/catalog/enums/product-sorts.enum.ts +9 -0
  45. package/src/services/catalog/facades/catalog-service.facade.ts +32 -0
  46. package/src/services/catalog/facades/catalog-strategies.facade.ts +12 -0
  47. package/src/services/catalog/facades/category-repository.facade.ts +10 -0
  48. package/src/services/catalog/facades/category-service.facade.ts +25 -0
  49. package/src/services/catalog/facades/index.ts +5 -0
  50. package/src/services/catalog/facades/product-catalog.facade.ts +13 -0
  51. package/src/services/catalog/helpers/brand-manager.helper.ts +63 -0
  52. package/src/services/catalog/helpers/catalog-filter.helper.ts +50 -0
  53. package/src/services/catalog/helpers/catalog-sort.helper.ts +54 -0
  54. package/src/services/catalog/helpers/index.ts +4 -0
  55. package/src/services/catalog/helpers/product-fields.helper.ts +35 -0
  56. package/src/services/catalog/index.ts +7 -0
  57. package/src/services/catalog/models/category-with-tree.model.ts +7 -0
  58. package/src/services/catalog/models/index.ts +1 -0
  59. package/src/services/catalog/services/catalog-helpers.service.ts +35 -0
  60. package/src/services/catalog/services/catalog-operations.facade.ts +24 -0
  61. package/src/services/catalog/services/catalog-repository.service.ts +20 -0
  62. package/src/services/catalog/services/index.ts +4 -0
  63. package/src/services/catalog/services/product-management.facade.ts +20 -0
  64. package/src/services/catalog/strategies/category-search.strategy.ts +172 -0
  65. package/src/services/catalog/strategies/index.ts +3 -0
  66. package/src/services/catalog/strategies/profile-search.strategy.ts +51 -0
  67. package/src/services/catalog/strategies/term-search.strategy.ts +178 -0
  68. package/src/services/catalog/strategies/types/strategy-params.type.ts +58 -0
  69. package/src/services/catalog/types/fetch-products-options.type.ts +10 -0
  70. package/src/services/catalog/types/fetch-products-params.type.ts +27 -0
  71. package/src/services/catalog/types/fetch-products-response.type.ts +11 -0
  72. package/src/services/catalog/types/index.ts +5 -0
  73. package/src/services/catalog/types/method-params.type.ts +21 -0
  74. package/src/services/catalog/types/product-sort.type.ts +3 -0
  75. package/src/services/catalog/wishlist.service.ts +368 -0
  76. package/src/services/checkout/checkout-dependencies.facade.ts +13 -0
  77. package/src/services/checkout/checkout-repositories.facade.ts +10 -0
  78. package/src/services/checkout/index.ts +2 -0
  79. package/src/services/checkout-subscription.service.ts +76 -0
  80. package/src/services/checkout.service.ts +196 -0
  81. package/src/services/coupon/coupon-repositories.facade.ts +11 -0
  82. package/src/services/coupon/index.ts +1 -0
  83. package/src/services/coupon/types/coupon-params.type.ts +15 -0
  84. package/src/services/coupon.service.ts +347 -0
  85. package/src/services/errors/group-invalid-coupon.error.ts +9 -0
  86. package/src/services/errors/index.ts +2 -0
  87. package/src/services/errors/invalid-coupon.error.ts +7 -0
  88. package/src/services/helpers/index.ts +1 -0
  89. package/src/services/helpers/util.helper.ts +17 -0
  90. package/src/services/home-shop/home-shop-repositories.facade.ts +11 -0
  91. package/src/services/home-shop/index.ts +1 -0
  92. package/src/services/home-shop.service.ts +196 -0
  93. package/src/services/index.ts +9 -0
  94. package/src/services/order.service.ts +23 -0
  95. package/src/services/shared/configuration.facade.ts +21 -0
  96. package/src/services/shared/index.ts +1 -0
  97. package/src/services/types/index.ts +2 -0
  98. package/src/services/types/required-checkout-data.type.ts +3 -0
  99. package/src/services/types/required-checkout-subscription-data.type.ts +3 -0
  100. package/src/types/firebase-app-config.type.ts +1 -0
  101. package/src/types/index.ts +1 -0
  102. package/tsconfig.json +17 -0
  103. package/tsconfig.lib.json +13 -0
  104. package/tsconfig.lib.prod.json +13 -0
  105. package/tsconfig.spec.json +17 -0
  106. package/angular-connect.module.d.ts +0 -26
  107. package/angular-elastic-search.module.d.ts +0 -9
  108. package/angular-firebase-auth.module.d.ts +0 -11
  109. package/angular-firestore.module.d.ts +0 -18
  110. package/angular-hasura-graphql.module.d.ts +0 -16
  111. package/consts/backend-url.const.d.ts +0 -1
  112. package/consts/category-structure.d.ts +0 -1
  113. package/consts/default-shop.const.d.ts +0 -1
  114. package/consts/es-config.const.d.ts +0 -1
  115. package/consts/firebase-const.d.ts +0 -3
  116. package/consts/hasura-options.const.d.ts +0 -1
  117. package/consts/index.d.ts +0 -7
  118. package/consts/persistence.const.d.ts +0 -1
  119. package/consts/storage-base-url.const.d.ts +0 -1
  120. package/esm2020/angular-connect.module.mjs +0 -115
  121. package/esm2020/angular-elastic-search.module.mjs +0 -34
  122. package/esm2020/angular-firebase-auth.module.mjs +0 -115
  123. package/esm2020/angular-firestore.module.mjs +0 -504
  124. package/esm2020/angular-hasura-graphql.module.mjs +0 -265
  125. package/esm2020/consts/backend-url.const.mjs +0 -2
  126. package/esm2020/consts/category-structure.mjs +0 -2
  127. package/esm2020/consts/default-shop.const.mjs +0 -2
  128. package/esm2020/consts/es-config.const.mjs +0 -2
  129. package/esm2020/consts/firebase-const.mjs +0 -4
  130. package/esm2020/consts/hasura-options.const.mjs +0 -2
  131. package/esm2020/consts/index.mjs +0 -8
  132. package/esm2020/consts/persistence.const.mjs +0 -2
  133. package/esm2020/consts/storage-base-url.const.mjs +0 -2
  134. package/esm2020/helpers/index.mjs +0 -2
  135. package/esm2020/helpers/mobile-operation-system-checker.helper.mjs +0 -7
  136. package/esm2020/index.mjs +0 -7
  137. package/esm2020/infrab4a-connect-angular.mjs +0 -5
  138. package/esm2020/persistence/cookie-data-persistence.mjs +0 -22
  139. package/esm2020/persistence/data-persistence.mjs +0 -2
  140. package/esm2020/persistence/index.mjs +0 -3
  141. package/esm2020/services/auth.service.mjs +0 -37
  142. package/esm2020/services/cart.service.mjs +0 -281
  143. package/esm2020/services/catalog/adapters/category-structure.adapter.mjs +0 -2
  144. package/esm2020/services/catalog/adapters/index.mjs +0 -4
  145. package/esm2020/services/catalog/adapters/new-category-structure.adapter.mjs +0 -43
  146. package/esm2020/services/catalog/adapters/old-category-structure.adapter.mjs +0 -23
  147. package/esm2020/services/catalog/catalog.service.mjs +0 -194
  148. package/esm2020/services/catalog/category.service.mjs +0 -51
  149. package/esm2020/services/catalog/enums/index.mjs +0 -2
  150. package/esm2020/services/catalog/enums/product-sorts.enum.mjs +0 -11
  151. package/esm2020/services/catalog/index.mjs +0 -8
  152. package/esm2020/services/catalog/models/category-with-tree.model.mjs +0 -10
  153. package/esm2020/services/catalog/models/index.mjs +0 -2
  154. package/esm2020/services/catalog/types/index.mjs +0 -2
  155. package/esm2020/services/catalog/types/product-sort.type.mjs +0 -2
  156. package/esm2020/services/catalog/wishlist.service.mjs +0 -115
  157. package/esm2020/services/checkout-subscription.service.mjs +0 -50
  158. package/esm2020/services/checkout.service.mjs +0 -68
  159. package/esm2020/services/coupon.service.mjs +0 -235
  160. package/esm2020/services/helpers/index.mjs +0 -2
  161. package/esm2020/services/helpers/util.helper.mjs +0 -18
  162. package/esm2020/services/home-shop.service.mjs +0 -125
  163. package/esm2020/services/index.mjs +0 -11
  164. package/esm2020/services/order.service.mjs +0 -30
  165. package/esm2020/services/shipping.service.mjs +0 -96
  166. package/esm2020/services/types/index.mjs +0 -3
  167. package/esm2020/services/types/required-checkout-data.type.mjs +0 -2
  168. package/esm2020/services/types/required-checkout-subscription-data.type.mjs +0 -2
  169. package/esm2020/services/types/shipping-methods.type.mjs +0 -2
  170. package/esm2020/types/firebase-app-config.type.mjs +0 -2
  171. package/esm2020/types/index.mjs +0 -2
  172. package/fesm2015/infrab4a-connect-angular.mjs +0 -2417
  173. package/fesm2015/infrab4a-connect-angular.mjs.map +0 -1
  174. package/fesm2020/infrab4a-connect-angular.mjs +0 -2352
  175. package/fesm2020/infrab4a-connect-angular.mjs.map +0 -1
  176. package/helpers/index.d.ts +0 -1
  177. package/helpers/mobile-operation-system-checker.helper.d.ts +0 -3
  178. package/index.d.ts +0 -6
  179. package/persistence/cookie-data-persistence.d.ts +0 -10
  180. package/persistence/data-persistence.d.ts +0 -6
  181. package/persistence/index.d.ts +0 -2
  182. package/services/auth.service.d.ts +0 -18
  183. package/services/cart.service.d.ts +0 -42
  184. package/services/catalog/adapters/category-structure.adapter.d.ts +0 -4
  185. package/services/catalog/adapters/index.d.ts +0 -3
  186. package/services/catalog/adapters/new-category-structure.adapter.d.ts +0 -12
  187. package/services/catalog/adapters/old-category-structure.adapter.d.ts +0 -10
  188. package/services/catalog/catalog.service.d.ts +0 -86
  189. package/services/catalog/category.service.d.ts +0 -20
  190. package/services/catalog/enums/index.d.ts +0 -1
  191. package/services/catalog/enums/product-sorts.enum.d.ts +0 -9
  192. package/services/catalog/index.d.ts +0 -7
  193. package/services/catalog/models/category-with-tree.model.d.ts +0 -4
  194. package/services/catalog/models/index.d.ts +0 -1
  195. package/services/catalog/types/index.d.ts +0 -1
  196. package/services/catalog/types/product-sort.type.d.ts +0 -2
  197. package/services/catalog/wishlist.service.d.ts +0 -38
  198. package/services/checkout-subscription.service.d.ts +0 -19
  199. package/services/checkout.service.d.ts +0 -24
  200. package/services/coupon.service.d.ts +0 -29
  201. package/services/helpers/index.d.ts +0 -1
  202. package/services/helpers/util.helper.d.ts +0 -3
  203. package/services/home-shop.service.d.ts +0 -26
  204. package/services/index.d.ts +0 -10
  205. package/services/order.service.d.ts +0 -13
  206. package/services/shipping.service.d.ts +0 -19
  207. package/services/types/index.d.ts +0 -2
  208. package/services/types/required-checkout-data.type.d.ts +0 -2
  209. package/services/types/required-checkout-subscription-data.type.d.ts +0 -2
  210. package/services/types/shipping-methods.type.d.ts +0 -12
  211. package/types/firebase-app-config.type.d.ts +0 -1
  212. package/types/index.d.ts +0 -1
@@ -0,0 +1,17 @@
1
+ export class UtilHelper {
2
+ static createSlug(name: string): string {
3
+ return name
4
+ .toLowerCase()
5
+ .replace(/\s+/g, '-') // Replace spaces with -
6
+ .replace(/[ãàáäâ]/g, 'a') // Replace spaces with -
7
+ .replace(/[ẽèéëê]/g, 'e') // Replace spaces with -
8
+ .replace(/[ìíïî]/g, 'i') // Replace spaces with -
9
+ .replace(/[õòóöô]/g, 'o') // Replace spaces with -
10
+ .replace(/[ùúüû]/g, 'u') // Replace spaces with -
11
+ .replace(/[ñ]/g, 'n') // Replace spaces with -
12
+ .replace(/[ç]/g, 'c') // Replace spaces with -
13
+ .replace(/[&]/g, 'and') // Replace spaces with -
14
+ .replace(/[^\w-]+/g, '') // Remove all non-word chars
15
+ .replace(/--+/g, '-') // Replace multiple - with single -
16
+ }
17
+ }
@@ -0,0 +1,11 @@
1
+ import { Inject, Injectable } from '@angular/core'
2
+ import { CategoryRepository, HomeRepository, ProductRepository } from '@infrab4a/connect'
3
+
4
+ @Injectable()
5
+ export class HomeShopRepositoriesFacade {
6
+ constructor(
7
+ @Inject('CategoryRepository') public readonly categoryRepository: CategoryRepository,
8
+ @Inject('HomeRepository') public readonly homeRepository: HomeRepository,
9
+ @Inject('ProductRepository') public readonly productRepository: ProductRepository,
10
+ ) {}
11
+ }
@@ -0,0 +1 @@
1
+ export { HomeShopRepositoriesFacade } from './home-shop-repositories.facade'
@@ -0,0 +1,196 @@
1
+ import { Injectable } from '@angular/core'
2
+ import {
3
+ add,
4
+ Banner,
5
+ Category,
6
+ Home,
7
+ HomeCategoryGroup,
8
+ HomeData,
9
+ pick,
10
+ Product,
11
+ RequiredArgumentError,
12
+ Shops,
13
+ Where,
14
+ } from '@infrab4a/connect'
15
+ import { forkJoin, from, Observable, of, throwError } from 'rxjs'
16
+ import { concatMap, map, tap } from 'rxjs/operators'
17
+
18
+ import { HomeShopRepositoriesFacade } from './home-shop'
19
+ import { ConfigurationFacade } from './shared'
20
+
21
+ type HomeConfigurationId = 'glamshop' | 'mens_market'
22
+ type BannerType = 'brand' | 'buyToWin' | 'block' | 'blog'
23
+
24
+ @Injectable()
25
+ export class HomeShopService {
26
+ private homeConfiguration: Home
27
+
28
+ private get homeId(): HomeConfigurationId {
29
+ if (this.configurationFacade.defaultShop === Shops.GLAMSHOP) return 'glamshop'
30
+
31
+ if (this.configurationFacade.defaultShop === Shops.MENSMARKET) return 'mens_market'
32
+
33
+ return null
34
+ }
35
+
36
+ constructor(
37
+ private readonly repositoriesFacade: HomeShopRepositoriesFacade,
38
+ private readonly configurationFacade: ConfigurationFacade,
39
+ ) {}
40
+
41
+ getHomeData(): Observable<Home> {
42
+ return this.getHomeConfiguration().pipe(
43
+ map((home) => (home?.data?.expiresAt > new Date() ? home : null)),
44
+ concatMap((home) =>
45
+ home
46
+ ? of(home)
47
+ : forkJoin([
48
+ this.getDiscoverProducts(this.gender),
49
+ this.getFeaturedProducts(this.gender),
50
+ this.getVerticalProducts(this.gender),
51
+ ]).pipe(
52
+ map(([discoverProducts, featuredProducts, verticalProducts]) => ({
53
+ discoverProducts,
54
+ featuredProducts,
55
+ verticalProducts,
56
+ })),
57
+ concatMap((data) => this.saveHomeData(data)),
58
+ ),
59
+ ),
60
+ )
61
+ }
62
+
63
+ getBanners(type: BannerType): Observable<Banner[]> {
64
+ return this.getHomeConfiguration().pipe(
65
+ map((home) => {
66
+ if (type === 'brand') return home.brandsCarousel
67
+
68
+ if (type === 'buyToWin') return [home.buyToWinBanner]
69
+
70
+ if (type === 'block') return home.blockBanners
71
+
72
+ if (type === 'blog') return [home.blogBanner]
73
+
74
+ return []
75
+ }),
76
+ )
77
+ }
78
+
79
+ getMinValueForFreeShipping(): Observable<number> {
80
+ return this.getHomeConfiguration().pipe(map((home) => home.minValueForFreeShipping))
81
+ }
82
+
83
+ private getDiscoverProducts(_gender?: string): Observable<{ category: Category; products: Product[] }[]> {
84
+ return this.getHomeConfiguration().pipe(
85
+ concatMap((home) =>
86
+ from(
87
+ this.repositoriesFacade.categoryRepository.getCategoriesForHome({
88
+ categoryIds: home.discoverCategories,
89
+ shop: this.configurationFacade.defaultShop,
90
+ }),
91
+ ).pipe(map((groups) => groups.map(this.buildCategoryGroupWithRequiredData))),
92
+ ),
93
+ )
94
+ }
95
+
96
+ private getFeaturedProducts(_gender?: string): Observable<{ category: Category; products: Product[] }[]> {
97
+ return this.getHomeConfiguration().pipe(
98
+ concatMap((home) =>
99
+ from(
100
+ this.repositoriesFacade.categoryRepository.getCategoriesForHome({
101
+ categoryIds: home.featuredCategories,
102
+ shop: this.configurationFacade.defaultShop,
103
+ }),
104
+ ).pipe(map((groups) => groups.map(this.buildCategoryGroupWithRequiredData))),
105
+ ),
106
+ )
107
+ }
108
+
109
+ private getVerticalProducts(gender?: string): Observable<{ category: Category; products: Product[] }[]> {
110
+ return this.getHomeConfiguration().pipe(
111
+ concatMap((home) =>
112
+ forkJoin(
113
+ home.verticalCarousels.filter(Boolean).map((id) =>
114
+ from(this.repositoriesFacade.categoryRepository.get({ id })).pipe(
115
+ concatMap((category) =>
116
+ from(
117
+ this.repositoriesFacade.productRepository.find({
118
+ filters: {
119
+ categories: { operator: Where.IN, value: [category.id] },
120
+ ...(gender ? { tags: { operator: Where.IN, value: [gender] } } : {}),
121
+ },
122
+ limits: { limit: 12 },
123
+ }),
124
+ ).pipe(map((products) => ({ category, products }))),
125
+ ),
126
+ map(({ category, products }) => ({ category, products: products.data })),
127
+ map(this.buildCategoryGroupWithRequiredData),
128
+ ),
129
+ ),
130
+ ),
131
+ ),
132
+ )
133
+ }
134
+
135
+ private getHomeConfiguration(): Observable<Home> {
136
+ return of(this.homeConfiguration).pipe(
137
+ concatMap((home) =>
138
+ home
139
+ ? of(home)
140
+ : !this.homeId
141
+ ? throwError(() => new RequiredArgumentError(['homeId']))
142
+ : from(this.repositoriesFacade.homeRepository.get({ id: this.homeId })).pipe(
143
+ tap((homeLoaded) => (this.homeConfiguration = homeLoaded)),
144
+ ),
145
+ ),
146
+ )
147
+ }
148
+
149
+ private saveHomeData(homeData: HomeData): Observable<Home> {
150
+ const data = {
151
+ createdAt: new Date(),
152
+ expiresAt: add(new Date(), { hours: 1 }),
153
+ data: homeData,
154
+ }
155
+
156
+ return from(
157
+ this.repositoriesFacade.homeRepository.update({
158
+ id: this.homeId,
159
+ data,
160
+ }),
161
+ ).pipe(
162
+ tap(() => (this.homeConfiguration.data = data)),
163
+ map(() => this.homeConfiguration),
164
+ )
165
+ }
166
+
167
+ private buildCategoryGroupWithRequiredData = (group: HomeCategoryGroup): HomeCategoryGroup => ({
168
+ category: Category.toInstance(pick(group?.category?.toPlain() || {}, ['id', 'name', 'slug', 'conditions'])),
169
+ products:
170
+ group?.products?.map((product) =>
171
+ Product.toInstance(
172
+ pick(product?.toPlain() || {}, [
173
+ 'id',
174
+ 'price',
175
+ 'reviews',
176
+ 'hasVariants',
177
+ 'slug',
178
+ 'sku',
179
+ 'stock',
180
+ 'costPrice',
181
+ 'images',
182
+ 'miniatures',
183
+ 'name',
184
+ 'weight',
185
+ 'rate',
186
+ 'type',
187
+ 'brand',
188
+ ]),
189
+ ),
190
+ ) || [],
191
+ })
192
+
193
+ private get gender() {
194
+ return this.homeId === 'mens_market' ? 'masculino' : undefined
195
+ }
196
+ }
@@ -0,0 +1,9 @@
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 './helpers'
8
+ export * from './home-shop.service'
9
+ export * from './order.service'
@@ -0,0 +1,23 @@
1
+ import { Injectable, Inject } from '@angular/core'
2
+ import { doc, Firestore, docSnapshots } from '@angular/fire/firestore'
3
+ import { Order, OrderFirestoreRepository } from '@infrab4a/connect'
4
+ import { Subject } from 'rxjs'
5
+ import { map } from 'rxjs/operators'
6
+
7
+ @Injectable()
8
+ export class OrderService {
9
+ orderSubject = new Subject<Order>()
10
+
11
+ constructor(
12
+ private readonly angularFirestore: Firestore,
13
+ @Inject('OrderRepository') private readonly orderRepository: OrderFirestoreRepository,
14
+ ) {}
15
+
16
+ getOrder(id: string): Subject<Order> {
17
+ docSnapshots(doc(this.angularFirestore, `${this.orderRepository.collectionName}/${id}`))
18
+ .pipe(map((doc) => Order.toInstance(doc.data())))
19
+ .subscribe((doc) => this.orderSubject.next(doc))
20
+
21
+ return this.orderSubject
22
+ }
23
+ }
@@ -0,0 +1,21 @@
1
+ import { Inject, Injectable } from '@angular/core'
2
+ import { FirebaseOptions } from '@angular/fire/app'
3
+ import { Shops } from '@infrab4a/connect'
4
+
5
+ import { DEFAULT_SHOP, FIREBASE_OPTIONS } from '../../consts'
6
+
7
+ @Injectable()
8
+ export class ConfigurationFacade {
9
+ constructor(
10
+ @Inject(DEFAULT_SHOP) public readonly defaultShop: Shops,
11
+ @Inject(FIREBASE_OPTIONS) public readonly firebaseOptions: FirebaseOptions,
12
+ ) {}
13
+
14
+ getCheckoutUrl(): string {
15
+ return `https://southamerica-east1-${this.firebaseOptions.projectId}.cloudfunctions.net`
16
+ }
17
+
18
+ getProjectId(): string {
19
+ return this.firebaseOptions.projectId
20
+ }
21
+ }
@@ -0,0 +1 @@
1
+ export { ConfigurationFacade } from './configuration.facade'
@@ -0,0 +1,2 @@
1
+ export * from './required-checkout-data.type'
2
+ export * from './required-checkout-subscription-data.type'
@@ -0,0 +1,3 @@
1
+ import { Checkout } from '@infrab4a/connect'
2
+
3
+ export type RequiredCheckoutData = Partial<Pick<Checkout, 'id' | 'user' | 'shop' | 'lineItems'>>
@@ -0,0 +1,3 @@
1
+ import { CheckoutSubscription } from '@infrab4a/connect'
2
+
3
+ export type RequiredCheckoutSubscriptionData = Partial<Pick<CheckoutSubscription, 'id'>>
@@ -0,0 +1 @@
1
+ export type FirebaseAppConfig = Record<string, any>
@@ -0,0 +1 @@
1
+ export * from './firebase-app-config.type'
package/tsconfig.json ADDED
@@ -0,0 +1,17 @@
1
+ {
2
+ "extends": "../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "declarationMap": true,
5
+ "inlineSources": true,
6
+ "noEmit": true,
7
+ "composite": false,
8
+ "lib": ["es2018", "dom"]
9
+ },
10
+ "exclude": [
11
+ "**/*.spec.ts"
12
+ ],
13
+ "references": [
14
+ { "path": "../connect" }
15
+ ],
16
+ "include": ["./src"]
17
+ }
@@ -0,0 +1,13 @@
1
+ /* To learn more about this file see: https://angular.io/config/tsconfig. */
2
+ {
3
+ "extends": "./tsconfig.json",
4
+ "compilerOptions": {
5
+ "noEmit": false,
6
+ "composite": false
7
+ },
8
+ "angularCompilerOptions": {
9
+ "skipTemplateCodegen": true,
10
+ "strictMetadataEmit": true,
11
+ "enableResourceInlining": true,
12
+ }
13
+ }
@@ -0,0 +1,13 @@
1
+ /* To learn more about this file see: https://angular.io/config/tsconfig. */
2
+ {
3
+ "extends": "./tsconfig.lib.json",
4
+ "compilerOptions": {
5
+ "declarationMap": false,
6
+ "importHelpers": true,
7
+ "target": "es2017",
8
+ "module": "es2020"
9
+ },
10
+ "angularCompilerOptions": {
11
+ "compilationMode": "partial"
12
+ }
13
+ }
@@ -0,0 +1,17 @@
1
+ /* To learn more about this file see: https://angular.io/config/tsconfig. */
2
+ {
3
+ "extends": "../../tsconfig.json",
4
+ "compilerOptions": {
5
+ "outDir": "../../dist/spec",
6
+ "types": [
7
+ "jasmine"
8
+ ]
9
+ },
10
+ "files": [
11
+ "src/test.ts"
12
+ ],
13
+ "include": [
14
+ "**/*.spec.ts",
15
+ "**/*.d.ts"
16
+ ]
17
+ }
@@ -1,26 +0,0 @@
1
- import { ModuleWithProviders, Type } from '@angular/core';
2
- import { FirebaseOptions } from '@angular/fire/app';
3
- import { AxiosElasticSearchConfig, Shops } from '@infrab4a/connect';
4
- import { HasuraGraphQLOptions } from './angular-hasura-graphql.module';
5
- import { DataPersistence } from './persistence';
6
- import { FirebaseAppConfig } from './types';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/fire/app";
9
- import * as i2 from "./angular-elastic-search.module";
10
- import * as i3 from "./angular-firebase-auth.module";
11
- import * as i4 from "./angular-firestore.module";
12
- import * as i5 from "./angular-hasura-graphql.module";
13
- export declare class AngularConnectModule {
14
- static initializeApp(defaultShop: Shops, options: {
15
- firebase: FirebaseOptions;
16
- elasticSearch: AxiosElasticSearchConfig;
17
- hasura: HasuraGraphQLOptions;
18
- backendUrl: string;
19
- oldCategoryStructure?: boolean;
20
- storageBaseUrl?: string;
21
- persistenceProvider?: Type<DataPersistence>;
22
- }, nameOrConfig?: string | FirebaseAppConfig): ModuleWithProviders<AngularConnectModule>;
23
- static ɵfac: i0.ɵɵFactoryDeclaration<AngularConnectModule, never>;
24
- static ɵmod: i0.ɵɵNgModuleDeclaration<AngularConnectModule, never, [typeof i1.FirebaseAppModule, typeof i2.AngularElasticSeachModule, typeof i3.AngularFirebaseAuthModule, typeof i4.AngularFirestoreModule, typeof i5.AngularHasuraGraphQLModule], never>;
25
- static ɵinj: i0.ɵɵInjectorDeclaration<AngularConnectModule>;
26
- }
@@ -1,9 +0,0 @@
1
- import { ModuleWithProviders } from '@angular/core';
2
- import { AxiosElasticSearchConfig } from '@infrab4a/connect';
3
- import * as i0 from "@angular/core";
4
- export declare class AngularElasticSeachModule {
5
- static initializeApp(options: AxiosElasticSearchConfig): ModuleWithProviders<AngularElasticSeachModule>;
6
- static ɵfac: i0.ɵɵFactoryDeclaration<AngularElasticSeachModule, never>;
7
- static ɵmod: i0.ɵɵNgModuleDeclaration<AngularElasticSeachModule, never, never, never>;
8
- static ɵinj: i0.ɵɵInjectorDeclaration<AngularElasticSeachModule>;
9
- }
@@ -1,11 +0,0 @@
1
- import { ModuleWithProviders } from '@angular/core';
2
- import { FirebaseOptions } from '@angular/fire/app';
3
- import { FirebaseAppConfig } from './types';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/fire/auth";
6
- export declare class AngularFirebaseAuthModule {
7
- static initializeApp(options: FirebaseOptions, nameOrConfig?: string | FirebaseAppConfig): ModuleWithProviders<AngularFirebaseAuthModule>;
8
- static ɵfac: i0.ɵɵFactoryDeclaration<AngularFirebaseAuthModule, never>;
9
- static ɵmod: i0.ɵɵNgModuleDeclaration<AngularFirebaseAuthModule, never, [typeof i1.AuthModule], never>;
10
- static ɵinj: i0.ɵɵInjectorDeclaration<AngularFirebaseAuthModule>;
11
- }
@@ -1,18 +0,0 @@
1
- import { ModuleWithProviders } from '@angular/core';
2
- import { FirebaseOptions } from '@angular/fire/app';
3
- import { AxiosElasticSearchConfig, FirestoreConstructorParams } from '@infrab4a/connect';
4
- import { FirebaseAppConfig } from './types';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "./angular-elastic-search.module";
7
- import * as i2 from "@angular/fire/firestore";
8
- import * as i3 from "@angular/fire/storage";
9
- export type FirestoreOptions = Pick<FirestoreConstructorParams<any>, 'firestore' | 'interceptors'>;
10
- export declare class AngularFirestoreModule {
11
- static initializeApp(options: {
12
- firebase: FirebaseOptions;
13
- elasticSearch: AxiosElasticSearchConfig;
14
- }, nameOrConfig?: string | FirebaseAppConfig): ModuleWithProviders<AngularFirestoreModule>;
15
- static ɵfac: i0.ɵɵFactoryDeclaration<AngularFirestoreModule, never>;
16
- static ɵmod: i0.ɵɵNgModuleDeclaration<AngularFirestoreModule, never, [typeof i1.AngularElasticSeachModule, typeof i2.FirestoreModule, typeof i3.StorageModule], never>;
17
- static ɵinj: i0.ɵɵInjectorDeclaration<AngularFirestoreModule>;
18
- }
@@ -1,16 +0,0 @@
1
- import { ModuleWithProviders } from '@angular/core';
2
- import { HasuraGraphQLAuthOptions } from '@infrab4a/connect';
3
- import * as i0 from "@angular/core";
4
- export type HasuraGraphQLOptions = {
5
- endpoint: string;
6
- credentials: HasuraGraphQLAuthOptions;
7
- };
8
- export declare class AngularHasuraGraphQLModule {
9
- static initializeApp(options: {
10
- endpoint: string;
11
- credentials: HasuraGraphQLAuthOptions;
12
- }): ModuleWithProviders<AngularHasuraGraphQLModule>;
13
- static ɵfac: i0.ɵɵFactoryDeclaration<AngularHasuraGraphQLModule, never>;
14
- static ɵmod: i0.ɵɵNgModuleDeclaration<AngularHasuraGraphQLModule, never, never, never>;
15
- static ɵinj: i0.ɵɵInjectorDeclaration<AngularHasuraGraphQLModule>;
16
- }
@@ -1 +0,0 @@
1
- export declare const BACKEND_URL = "BACKEND_URL";
@@ -1 +0,0 @@
1
- export declare const CATEGORY_STRUCTURE = "CATEGORY_STRUCTURE";
@@ -1 +0,0 @@
1
- export declare const DEFAULT_SHOP = "DEFAULT_SHOP";
@@ -1 +0,0 @@
1
- export declare const ES_CONFIG = "ES_CONFIG";
@@ -1,3 +0,0 @@
1
- import { InjectionToken } from '@angular/core';
2
- export declare const FIREBASE_APP_NAME: InjectionToken<unknown>;
3
- export declare const FIREBASE_OPTIONS: InjectionToken<unknown>;
@@ -1 +0,0 @@
1
- export declare const HASURA_OPTIONS = "HASURA_OPTIONS";
package/consts/index.d.ts DELETED
@@ -1,7 +0,0 @@
1
- export * from './backend-url.const';
2
- export * from './category-structure';
3
- export * from './default-shop.const';
4
- export * from './es-config.const';
5
- export * from './firebase-const';
6
- export * from './hasura-options.const';
7
- export * from './persistence.const';
@@ -1 +0,0 @@
1
- export declare const PERSISTENCE_PROVIDER = "PERSISTENCE_PROVIDER";
@@ -1 +0,0 @@
1
- export declare const STORAGE_BASE_URL = "STORAGE_BASE_URL";
@@ -1,115 +0,0 @@
1
- import { NgModule } from '@angular/core';
2
- import { getApp, initializeApp, provideFirebaseApp } from '@angular/fire/app';
3
- import { UpdateUserImage, isNil, } from '@infrab4a/connect';
4
- import { AngularElasticSeachModule } from './angular-elastic-search.module';
5
- import { AngularFirebaseAuthModule } from './angular-firebase-auth.module';
6
- import { AngularFirestoreModule } from './angular-firestore.module';
7
- import { AngularHasuraGraphQLModule } from './angular-hasura-graphql.module';
8
- import { BACKEND_URL, CATEGORY_STRUCTURE, DEFAULT_SHOP, ES_CONFIG, FIREBASE_APP_NAME, FIREBASE_OPTIONS, HASURA_OPTIONS, PERSISTENCE_PROVIDER, } from './consts';
9
- import { STORAGE_BASE_URL } from './consts/storage-base-url.const';
10
- import { CookieDataPersistence } from './persistence';
11
- import { AuthService, CartService, CatalogService, CategoryService, CheckoutService, CheckoutSubscriptionService, CouponService, HomeShopService, OrderService, ShippingService, WishlistService, } from './services';
12
- import { NewCategoryStructureAdapter, OldCategoryStructureAdapter } from './services/catalog/adapters';
13
- import * as i0 from "@angular/core";
14
- import * as i1 from "@angular/fire/app";
15
- export class AngularConnectModule {
16
- static initializeApp(defaultShop, options, nameOrConfig) {
17
- return {
18
- ngModule: AngularConnectModule,
19
- providers: [
20
- {
21
- provide: CATEGORY_STRUCTURE,
22
- useClass: isNil(options?.oldCategoryStructure) || options?.oldCategoryStructure
23
- ? OldCategoryStructureAdapter
24
- : NewCategoryStructureAdapter,
25
- },
26
- { provide: PERSISTENCE_PROVIDER, useClass: options?.persistenceProvider || CookieDataPersistence },
27
- ...(isNil(defaultShop) ? [] : [{ provide: DEFAULT_SHOP, useValue: defaultShop }]),
28
- ...(isNil(options?.firebase) ? [] : [{ provide: FIREBASE_OPTIONS, useValue: options?.firebase }]),
29
- ...(isNil(options?.firebase) ? [] : [{ provide: FIREBASE_APP_NAME, useValue: nameOrConfig }]),
30
- ...(isNil(options?.elasticSearch) ? [] : [{ provide: ES_CONFIG, useValue: options.elasticSearch }]),
31
- ...(isNil(options?.hasura) ? [] : [{ provide: HASURA_OPTIONS, useValue: options.hasura }]),
32
- ...(isNil(options?.backendUrl) ? [] : [{ provide: BACKEND_URL, useValue: options.backendUrl }]),
33
- ...(isNil(options?.storageBaseUrl) ? [] : [{ provide: STORAGE_BASE_URL, useValue: options.storageBaseUrl }]),
34
- ],
35
- };
36
- }
37
- }
38
- AngularConnectModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: AngularConnectModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
39
- AngularConnectModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.1.0", ngImport: i0, type: AngularConnectModule, imports: [i1.FirebaseAppModule, AngularElasticSeachModule,
40
- AngularFirebaseAuthModule,
41
- AngularFirestoreModule,
42
- AngularHasuraGraphQLModule] });
43
- AngularConnectModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: AngularConnectModule, providers: [
44
- AuthService,
45
- CartService,
46
- CatalogService,
47
- CategoryService,
48
- CheckoutService,
49
- CheckoutSubscriptionService,
50
- CouponService,
51
- HomeShopService,
52
- OrderService,
53
- ShippingService,
54
- WishlistService,
55
- {
56
- provide: UpdateUserImage,
57
- useFactory: (userRepository, fileUploader) => {
58
- return new UpdateUserImage(userRepository, fileUploader);
59
- },
60
- deps: ['UserRepository', 'FileUploaderService'],
61
- },
62
- ], imports: [provideFirebaseApp((injector) => {
63
- const appName = injector.get(FIREBASE_APP_NAME) || '[DEFAULT]';
64
- try {
65
- return getApp(appName);
66
- }
67
- catch (error) {
68
- return initializeApp(injector.get(FIREBASE_OPTIONS), appName);
69
- }
70
- }),
71
- AngularElasticSeachModule,
72
- AngularFirebaseAuthModule,
73
- AngularFirestoreModule,
74
- AngularHasuraGraphQLModule] });
75
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: AngularConnectModule, decorators: [{
76
- type: NgModule,
77
- args: [{
78
- imports: [
79
- provideFirebaseApp((injector) => {
80
- const appName = injector.get(FIREBASE_APP_NAME) || '[DEFAULT]';
81
- try {
82
- return getApp(appName);
83
- }
84
- catch (error) {
85
- return initializeApp(injector.get(FIREBASE_OPTIONS), appName);
86
- }
87
- }),
88
- AngularElasticSeachModule,
89
- AngularFirebaseAuthModule,
90
- AngularFirestoreModule,
91
- AngularHasuraGraphQLModule,
92
- ],
93
- providers: [
94
- AuthService,
95
- CartService,
96
- CatalogService,
97
- CategoryService,
98
- CheckoutService,
99
- CheckoutSubscriptionService,
100
- CouponService,
101
- HomeShopService,
102
- OrderService,
103
- ShippingService,
104
- WishlistService,
105
- {
106
- provide: UpdateUserImage,
107
- useFactory: (userRepository, fileUploader) => {
108
- return new UpdateUserImage(userRepository, fileUploader);
109
- },
110
- deps: ['UserRepository', 'FileUploaderService'],
111
- },
112
- ],
113
- }]
114
- }] });
115
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1jb25uZWN0Lm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2Nvbm5lY3QtYW5ndWxhci9zcmMvYW5ndWxhci1jb25uZWN0Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlDLFFBQVEsRUFBUSxNQUFNLGVBQWUsQ0FBQTtBQUM3RSxPQUFPLEVBQW1CLE1BQU0sRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUM5RixPQUFPLEVBSUwsZUFBZSxFQUVmLEtBQUssR0FDTixNQUFNLG1CQUFtQixDQUFBO0FBQzFCLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFBO0FBQzNFLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFBO0FBQzFFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFBO0FBQ25FLE9BQU8sRUFBRSwwQkFBMEIsRUFBd0IsTUFBTSxpQ0FBaUMsQ0FBQTtBQUNsRyxPQUFPLEVBQ0wsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixZQUFZLEVBQ1osU0FBUyxFQUNULGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsY0FBYyxFQUNkLG9CQUFvQixHQUNyQixNQUFNLFVBQVUsQ0FBQTtBQUNqQixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQTtBQUNsRSxPQUFPLEVBQUUscUJBQXFCLEVBQW1CLE1BQU0sZUFBZSxDQUFBO0FBQ3RFLE9BQU8sRUFDTCxXQUFXLEVBQ1gsV0FBVyxFQUNYLGNBQWMsRUFDZCxlQUFlLEVBQ2YsZUFBZSxFQUNmLDJCQUEyQixFQUMzQixhQUFhLEVBQ2IsZUFBZSxFQUNmLFlBQVksRUFDWixlQUFlLEVBQ2YsZUFBZSxHQUNoQixNQUFNLFlBQVksQ0FBQTtBQUNuQixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsMkJBQTJCLEVB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QWU7d0JBQ2YsZUFBZTt3QkFDZjs0QkFDRSxPQUFPLEVBQUUsZUFBZTs0QkFDeEIsVUFBVSxFQUFFLENBQUMsY0FBOEIsRUFBRSxZQUFpQyxFQUFFLEVBQUU7Z0NBQ2hGLE9BQU8sSUFBSSxlQUFlLENBQUMsY0FBYyxFQUFFLFlBQVksQ0FBQyxDQUFBOzRCQUMxRCxDQUFDOzRCQUNELElBQUksRUFBRSxDQUFDLGdCQUFnQixFQUFFLHFCQUFxQixDQUFDO3lCQUNoRDtxQkFDRjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdG9yLCBNb2R1bGVXaXRoUHJvdmlkZXJzLCBOZ01vZHVsZSwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBGaXJlYmFzZU9wdGlvbnMsIGdldEFwcCwgaW5pdGlhbGl6ZUFwcCwgcHJvdmlkZUZpcmViYXNlQXBwIH0gZnJvbSAnQGFuZ3VsYXIvZmlyZS9hcHAnXG5pbXBvcnQge1xuICBBeGlvc0VsYXN0aWNTZWFyY2hDb25maWcsXG4gIEZpbGVVcGxvYWRlclNlcnZpY2UsXG4gIFNob3BzLFxuICBVcGRhdGVVc2VySW1hZ2UsXG4gIFVzZXJSZXBvc2l0b3J5LFxuICBpc05pbCxcbn0gZnJvbSAnQGluZnJhYjRhL2Nvbm5lY3QnXG5pbXBvcnQgeyBBbmd1bGFyRWxhc3RpY1NlYWNoTW9kdWxlIH0gZnJvbSAnLi9hbmd1bGFyLWVsYXN0aWMtc2VhcmNoLm1vZHVsZSdcbmltcG9ydCB7IEFuZ3VsYXJGaXJlYmFzZUF1dGhNb2R1bGUgfSBmcm9tICcuL2FuZ3VsYXItZmlyZWJhc2UtYXV0aC5tb2R1bGUnXG5pbXBvcnQgeyBBbmd1bGFyRmlyZXN0b3JlTW9kdWxlIH0gZnJvbSAnLi9hbmd1bGFyLWZpcmVzdG9yZS5tb2R1bGUnXG5pbXBvcnQgeyBBbmd1bGFySGFzdXJhR3JhcGhRTE1vZHVsZSwgSGFzdXJhR3JhcGhRTE9wdGlvbnMgfSBmcm9tICcuL2FuZ3VsYXItaGFzdXJhLWdyYXBocWwubW9kdWxlJ1xuaW1wb3J0IHtcbiAgQkFDS0VORF9VUkwsXG4gIENBVEVHT1JZX1NUUlVDVFVSRSxcbiAgREVGQVVMVF9TSE9QLFxuICBFU19DT05GSUcsXG4gIEZJUkVCQVNFX0FQUF9OQU1FLFxuICBGSVJFQkFTRV9PUFRJT05TLFxuICBIQVNVUkFfT1BUSU9OUyxcbiAgUEVSU0lTVEVOQ0VfUFJPVklERVIsXG59IGZyb20gJy4vY29uc3RzJ1xuaW1wb3J0IHsgU1RPUkFHRV9CQVNFX1VSTCB9IGZyb20gJy4vY29uc3RzL3N0b3JhZ2UtYmFzZS11cmwuY29uc3QnXG5pbXBvcnQgeyBDb29raWVEYXRhUGVyc2lzdGVuY2UsIERhdGFQZXJzaXN0ZW5jZSB9IGZyb20gJy4vcGVyc2lzdGVuY2UnXG5pbXBvcnQge1xuICBBdXRoU2VydmljZSxcbiAgQ2FydFNlcnZpY2UsXG4gIENhdGFsb2dTZXJ2aWNlLFxuICBDYXRlZ29yeVNlcnZpY2UsXG4gIENoZWNrb3V0U2VydmljZSxcbiAgQ2hlY2tvdXRTdWJzY3JpcHRpb25TZXJ2aWNlLFxuICBDb3Vwb25TZXJ2aWNlLFxuICBIb21lU2hvcFNlcnZpY2UsXG4gIE9yZGVyU2VydmljZSxcbiAgU2hpcHBpbmdTZXJ2aWNlLFxuICBXaXNobGlzdFNlcnZpY2UsXG59IGZyb20gJy4vc2VydmljZXMnXG5pbXBvcnQgeyBOZXdDYXRlZ29yeVN0cnVjdHVyZUFkYXB0ZXIsIE9sZENhdGVnb3J5U3RydWN0dXJlQWRhcHRlciB9IGZyb20gJy4vc2VydmljZXMvY2F0YWxvZy9hZGFwdGVycydcbmltcG9ydCB7IEZpcmViYXNlQXBwQ29uZmlnIH0gZnJvbSAnLi90eXBlcydcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIHByb3ZpZGVGaXJlYmFzZUFwcCgoaW5qZWN0b3I6IEluamVjdG9yKSA9PiB7XG4gICAgICBjb25zdCBhcHBOYW1lID0gaW5qZWN0b3IuZ2V0PHN0cmluZz4oRklSRUJBU0VfQVBQX05BTUUpIHx8ICdbREVGQVVMVF0nXG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBnZXRBcHAoYXBwTmFtZSlcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBpbml0aWFsaXplQXBwKGluamVjdG9yLmdldChGSVJFQkFTRV9PUFRJT05TKSwgYXBwTmFtZSlcbiAgICAgIH1cbiAgICB9KSxcbiAgICBBbmd1bGFyRWxhc3RpY1NlYWNoTW9kdWxlLFxuICAgIEFuZ3VsYXJGaXJlYmFzZUF1dGhNb2R1bGUsXG4gICAgQW5ndWxhckZpcmVzdG9yZU1vZHVsZSxcbiAgICBBbmd1bGFySGFzdXJhR3JhcGhRTE1vZHVsZSxcbiAgXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgQXV0aFNlcnZpY2UsXG4gICAgQ2FydFNlcnZpY2UsXG4gICAgQ2F0YWxvZ1NlcnZpY2UsXG4gICAgQ2F0ZWdvcnlTZXJ2aWNlLFxuICAgIENoZWNrb3V0U2VydmljZSxcbiAgICBDaGVja291dFN1YnNjcmlwdGlvblNlcnZpY2UsXG4gICAgQ291cG9uU2VydmljZSxcbiAgICBIb21lU2hvcFNlcnZpY2UsXG4gICAgT3JkZXJTZXJ2aWNlLFxuICAgIFNoaXBwaW5nU2VydmljZSxcbiAgICBXaXNobGlzdFNlcnZpY2UsXG4gICAge1xuICAgICAgcHJvdmlkZTogVXBkYXRlVXNlckltYWdlLFxuICAgICAgdXNlRmFjdG9yeTogKHVzZXJSZXBvc2l0b3J5OiBVc2VyUmVwb3NpdG9yeSwgZmlsZVVwbG9hZGVyOiBGaWxlVXBsb2FkZXJTZXJ2aWNlKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgVXBkYXRlVXNlckltYWdlKHVzZXJSZXBvc2l0b3J5LCBmaWxlVXBsb2FkZXIpXG4gICAgICB9LFxuICAgICAgZGVwczogWydVc2VyUmVwb3NpdG9yeScsICdGaWxlVXBsb2FkZXJTZXJ2aWNlJ10sXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQW5ndWxhckNvbm5lY3RNb2R1bGUge1xuICBzdGF0aWMgaW5pdGlhbGl6ZUFwcChcbiAgICBkZWZhdWx0U2hvcDogU2hvcHMsXG4gICAgb3B0aW9uczoge1xuICAgICAgZmlyZWJhc2U6IEZpcmViYXNlT3B0aW9uc1xuICAgICAgZWxhc3RpY1NlYXJjaDogQXhpb3NFbGFzdGljU2VhcmNoQ29uZmlnXG4gICAgICBoYXN1cmE6IEhhc3VyYUdyYXBoUUxPcHRpb25zXG4gICAgICBiYWNrZW5kVXJsOiBzdHJpbmdcbiAgICAgIG9sZENhdGVnb3J5U3RydWN0dXJlPzogYm9vbGVhblxuICAgICAgc3RvcmFnZUJhc2VVcmw/OiBzdHJpbmdcbiAgICAgIHBlcnNpc3RlbmNlUHJvdmlkZXI/OiBUeXBlPERhdGFQZXJzaXN0ZW5jZT5cbiAgICB9LFxuICAgIG5hbWVPckNvbmZpZz86IHN0cmluZyB8IEZpcmViYXNlQXBwQ29uZmlnLFxuICApOiBNb2R1bGVXaXRoUHJvdmlkZXJzPEFuZ3VsYXJDb25uZWN0TW9kdWxlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBBbmd1bGFyQ29ubmVjdE1vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZTogQ0FURUdPUllfU1RSVUNUVVJFLFxuICAgICAgICAgIHVzZUNsYXNzOlxuICAgICAgICAgICAgaXNOaWwob3B0aW9ucz8ub2xkQ2F0ZWdvcnlTdHJ1Y3R1cmUpIHx8IG9wdGlvbnM/Lm9sZENhdGVnb3J5U3RydWN0dXJlXG4gICAgICAgICAgICAgID8gT2xkQ2F0ZWdvcnlTdHJ1Y3R1cmVBZGFwdGVyXG4gICAgICAgICAgICAgIDogTmV3Q2F0ZWdvcnlTdHJ1Y3R1cmVBZGFwdGVyLFxuICAgICAgICB9LFxuICAgICAgICB7IHByb3ZpZGU6IFBFUlNJU1RFTkNFX1BST1ZJREVSLCB1c2VDbGFzczogb3B0aW9ucz8ucGVyc2lzdGVuY2VQcm92aWRlciB8fCBDb29raWVEYXRhUGVyc2lzdGVuY2UgfSxcbiAgICAgICAgLi4uKGlzTmlsKGRlZmF1bHRTaG9wKSA/IFtdIDogW3sgcHJvdmlkZTogREVGQVVMVF9TSE9QLCB1c2VWYWx1ZTogZGVmYXVsdFNob3AgfV0pLFxuICAgICAgICAuLi4oaXNOaWwob3B0aW9ucz8uZmlyZWJhc2UpID8gW10gOiBbeyBwcm92aWRlOiBGSVJFQkFTRV9PUFRJT05TLCB1c2VWYWx1ZTogb3B0aW9ucz8uZmlyZWJhc2UgfV0pLFxuICAgICAgICAuLi4oaXNOaWwob3B0aW9ucz8uZmlyZWJhc2UpID8gW10gOiBbeyBwcm92aWRlOiBGSVJFQkFTRV9BUFBfTkFNRSwgdXNlVmFsdWU6IG5hbWVPckNvbmZpZyB9XSksXG4gICAgICAgIC4uLihpc05pbChvcHRpb25zPy5lbGFzdGljU2VhcmNoKSA/IFtdIDogW3sgcHJvdmlkZTogRVNfQ09ORklHLCB1c2VWYWx1ZTogb3B0aW9ucy5lbGFzdGljU2VhcmNoIH1dKSxcbiAgICAgICAgLi4uKGlzTmlsKG9wdGlvbnM/Lmhhc3VyYSkgPyBbXSA6IFt7IHByb3ZpZGU6IEhBU1VSQV9PUFRJT05TLCB1c2VWYWx1ZTogb3B0aW9ucy5oYXN1cmEgfV0pLFxuICAgICAgICAuLi4oaXNOaWwob3B0aW9ucz8uYmFja2VuZFVybCkgPyBbXSA6IFt7IHByb3ZpZGU6IEJBQ0tFTkRfVVJMLCB1c2VWYWx1ZTogb3B0aW9ucy5iYWNrZW5kVXJsIH1dKSxcbiAgICAgICAgLi4uKGlzTmlsKG9wdGlvbnM/LnN0b3JhZ2VCYXNlVXJsKSA/IFtdIDogW3sgcHJvdmlkZTogU1RPUkFHRV9CQVNFX1VSTCwgdXNlVmFsdWU6IG9wdGlvbnMuc3RvcmFnZUJhc2VVcmwgfV0pLFxuICAgICAgXSxcbiAgICB9XG4gIH1cbn1cbiJdfQ==