@reorderjs/reorder 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (231) hide show
  1. package/.medusa/server/scripts/reset-reorder-plugin-data.js +175 -0
  2. package/.medusa/server/src/admin/index.js +17889 -0
  3. package/.medusa/server/src/admin/index.mjs +17871 -0
  4. package/.medusa/server/src/admin/types/activity-log.js +10 -0
  5. package/.medusa/server/src/admin/types/analytics.js +17 -0
  6. package/.medusa/server/src/admin/types/cancellation.js +27 -0
  7. package/.medusa/server/src/admin/types/dunning.js +19 -0
  8. package/.medusa/server/src/admin/types/plan-offer.js +25 -0
  9. package/.medusa/server/src/admin/types/renewal.js +23 -0
  10. package/.medusa/server/src/admin/types/subscription.js +22 -0
  11. package/.medusa/server/src/api/admin/cancellations/[id]/apply-offer/route.js +30 -0
  12. package/.medusa/server/src/api/admin/cancellations/[id]/finalize/route.js +31 -0
  13. package/.medusa/server/src/api/admin/cancellations/[id]/reason/route.js +31 -0
  14. package/.medusa/server/src/api/admin/cancellations/[id]/route.js +20 -0
  15. package/.medusa/server/src/api/admin/cancellations/middlewares.js +55 -0
  16. package/.medusa/server/src/api/admin/cancellations/route.js +20 -0
  17. package/.medusa/server/src/api/admin/cancellations/utils.js +116 -0
  18. package/.medusa/server/src/api/admin/cancellations/validators.js +130 -0
  19. package/.medusa/server/src/api/admin/dunning/[id]/mark-recovered/route.js +27 -0
  20. package/.medusa/server/src/api/admin/dunning/[id]/mark-unrecovered/route.js +27 -0
  21. package/.medusa/server/src/api/admin/dunning/[id]/retry-now/route.js +28 -0
  22. package/.medusa/server/src/api/admin/dunning/[id]/retry-schedule/route.js +29 -0
  23. package/.medusa/server/src/api/admin/dunning/[id]/route.js +20 -0
  24. package/.medusa/server/src/api/admin/dunning/middlewares.js +60 -0
  25. package/.medusa/server/src/api/admin/dunning/route.js +20 -0
  26. package/.medusa/server/src/api/admin/dunning/utils.js +70 -0
  27. package/.medusa/server/src/api/admin/dunning/validators.js +81 -0
  28. package/.medusa/server/src/api/admin/orders/[id]/subscription-summary/route.js +10 -0
  29. package/.medusa/server/src/api/admin/orders/utils.js +8 -0
  30. package/.medusa/server/src/api/admin/plugin/route.js +7 -0
  31. package/.medusa/server/src/api/admin/renewals/[id]/approve-changes/route.js +27 -0
  32. package/.medusa/server/src/api/admin/renewals/[id]/force/route.js +30 -0
  33. package/.medusa/server/src/api/admin/renewals/[id]/reject-changes/route.js +27 -0
  34. package/.medusa/server/src/api/admin/renewals/[id]/route.js +10 -0
  35. package/.medusa/server/src/api/admin/renewals/middlewares.js +61 -0
  36. package/.medusa/server/src/api/admin/renewals/route.js +10 -0
  37. package/.medusa/server/src/api/admin/renewals/utils.js +60 -0
  38. package/.medusa/server/src/api/admin/renewals/validators.js +62 -0
  39. package/.medusa/server/src/api/admin/subscription-analytics/export/route.js +20 -0
  40. package/.medusa/server/src/api/admin/subscription-analytics/kpis/route.js +20 -0
  41. package/.medusa/server/src/api/admin/subscription-analytics/middlewares.js +45 -0
  42. package/.medusa/server/src/api/admin/subscription-analytics/rebuild/route.js +75 -0
  43. package/.medusa/server/src/api/admin/subscription-analytics/trends/route.js +20 -0
  44. package/.medusa/server/src/api/admin/subscription-analytics/utils.js +81 -0
  45. package/.medusa/server/src/api/admin/subscription-analytics/validators.js +76 -0
  46. package/.medusa/server/src/api/admin/subscription-logs/[id]/route.js +20 -0
  47. package/.medusa/server/src/api/admin/subscription-logs/middlewares.js +66 -0
  48. package/.medusa/server/src/api/admin/subscription-logs/route.js +20 -0
  49. package/.medusa/server/src/api/admin/subscription-logs/utils.js +84 -0
  50. package/.medusa/server/src/api/admin/subscription-logs/validators.js +32 -0
  51. package/.medusa/server/src/api/admin/subscription-offers/[id]/route.js +22 -0
  52. package/.medusa/server/src/api/admin/subscription-offers/[id]/toggle/route.js +17 -0
  53. package/.medusa/server/src/api/admin/subscription-offers/middlewares.js +58 -0
  54. package/.medusa/server/src/api/admin/subscription-offers/route.js +20 -0
  55. package/.medusa/server/src/api/admin/subscription-offers/utils.js +41 -0
  56. package/.medusa/server/src/api/admin/subscription-offers/validators.js +112 -0
  57. package/.medusa/server/src/api/admin/subscription-settings/middlewares.js +15 -0
  58. package/.medusa/server/src/api/admin/subscription-settings/route.js +33 -0
  59. package/.medusa/server/src/api/admin/subscription-settings/utils.js +109 -0
  60. package/.medusa/server/src/api/admin/subscription-settings/validators.js +74 -0
  61. package/.medusa/server/src/api/admin/subscriptions/[id]/cancel/route.js +18 -0
  62. package/.medusa/server/src/api/admin/subscriptions/[id]/logs/route.js +20 -0
  63. package/.medusa/server/src/api/admin/subscriptions/[id]/pause/route.js +18 -0
  64. package/.medusa/server/src/api/admin/subscriptions/[id]/resume/route.js +18 -0
  65. package/.medusa/server/src/api/admin/subscriptions/[id]/route.js +10 -0
  66. package/.medusa/server/src/api/admin/subscriptions/[id]/schedule-plan-change/route.js +26 -0
  67. package/.medusa/server/src/api/admin/subscriptions/[id]/update-shipping-address/route.js +27 -0
  68. package/.medusa/server/src/api/admin/subscriptions/middlewares.js +79 -0
  69. package/.medusa/server/src/api/admin/subscriptions/route.js +10 -0
  70. package/.medusa/server/src/api/admin/subscriptions/utils.js +42 -0
  71. package/.medusa/server/src/api/admin/subscriptions/validators.js +76 -0
  72. package/.medusa/server/src/api/middlewares.js +32 -0
  73. package/.medusa/server/src/api/store/carts/[id]/subscribe/route.js +18 -0
  74. package/.medusa/server/src/api/store/customers/me/subscriptions/[id]/cancellation/route.js +37 -0
  75. package/.medusa/server/src/api/store/customers/me/subscriptions/route.js +10 -0
  76. package/.medusa/server/src/api/store/customers/me/subscriptions/utils.js +104 -0
  77. package/.medusa/server/src/api/store/customers/me/subscriptions/validators.js +13 -0
  78. package/.medusa/server/src/api/store/plugin/route.js +7 -0
  79. package/.medusa/server/src/jobs/process-analytics-daily-snapshots.js +149 -0
  80. package/.medusa/server/src/jobs/process-cancellation-operational-metrics.js +102 -0
  81. package/.medusa/server/src/jobs/process-dunning-retries.js +249 -0
  82. package/.medusa/server/src/jobs/process-renewal-cycles.js +180 -0
  83. package/.medusa/server/src/links/cancellation-subscription.js +13 -0
  84. package/.medusa/server/src/links/renewal-order.js +12 -0
  85. package/.medusa/server/src/links/renewal-subscription.js +13 -0
  86. package/.medusa/server/src/links/subscription-cart.js +12 -0
  87. package/.medusa/server/src/links/subscription-customer.js +13 -0
  88. package/.medusa/server/src/links/subscription-order.js +13 -0
  89. package/.medusa/server/src/links/subscription-product.js +13 -0
  90. package/.medusa/server/src/links/subscription-variant.js +13 -0
  91. package/.medusa/server/src/modules/activity-log/index.js +13 -0
  92. package/.medusa/server/src/modules/activity-log/migrations/Migration20260401204521.js +24 -0
  93. package/.medusa/server/src/modules/activity-log/migrations/Migration20260405112500.js +16 -0
  94. package/.medusa/server/src/modules/activity-log/models/subscription-log.js +52 -0
  95. package/.medusa/server/src/modules/activity-log/service.js +13 -0
  96. package/.medusa/server/src/modules/activity-log/types/index.js +33 -0
  97. package/.medusa/server/src/modules/activity-log/utils/admin-query.js +261 -0
  98. package/.medusa/server/src/modules/activity-log/utils/normalize-log-event.js +169 -0
  99. package/.medusa/server/src/modules/analytics/constants.js +8 -0
  100. package/.medusa/server/src/modules/analytics/index.js +13 -0
  101. package/.medusa/server/src/modules/analytics/migrations/Migration20260402183116.js +27 -0
  102. package/.medusa/server/src/modules/analytics/models/subscription-metrics-daily.js +65 -0
  103. package/.medusa/server/src/modules/analytics/service.js +13 -0
  104. package/.medusa/server/src/modules/analytics/utils/admin-query.js +632 -0
  105. package/.medusa/server/src/modules/analytics/utils/data-quality.js +101 -0
  106. package/.medusa/server/src/modules/analytics/utils/observability.js +127 -0
  107. package/.medusa/server/src/modules/cancellation/index.js +13 -0
  108. package/.medusa/server/src/modules/cancellation/migrations/Migration20260401143914.js +34 -0
  109. package/.medusa/server/src/modules/cancellation/migrations/Migration20260405112000.js +14 -0
  110. package/.medusa/server/src/modules/cancellation/models/cancellation-case.js +52 -0
  111. package/.medusa/server/src/modules/cancellation/models/retention-offer-event.js +47 -0
  112. package/.medusa/server/src/modules/cancellation/service.js +15 -0
  113. package/.medusa/server/src/modules/cancellation/types/index.js +43 -0
  114. package/.medusa/server/src/modules/cancellation/utils/admin-query.js +530 -0
  115. package/.medusa/server/src/modules/cancellation/utils/audit.js +21 -0
  116. package/.medusa/server/src/modules/cancellation/utils/errors.js +31 -0
  117. package/.medusa/server/src/modules/cancellation/utils/observability.js +77 -0
  118. package/.medusa/server/src/modules/cancellation/utils/operational-metrics.js +131 -0
  119. package/.medusa/server/src/modules/cancellation/utils/retention-offer-policy.js +31 -0
  120. package/.medusa/server/src/modules/dunning/index.js +13 -0
  121. package/.medusa/server/src/modules/dunning/migrations/Migration20260330190157.js +36 -0
  122. package/.medusa/server/src/modules/dunning/models/dunning-attempt.js +48 -0
  123. package/.medusa/server/src/modules/dunning/models/dunning-case.js +61 -0
  124. package/.medusa/server/src/modules/dunning/service.js +15 -0
  125. package/.medusa/server/src/modules/dunning/types/index.js +19 -0
  126. package/.medusa/server/src/modules/dunning/utils/admin-query.js +548 -0
  127. package/.medusa/server/src/modules/dunning/utils/errors.js +40 -0
  128. package/.medusa/server/src/modules/dunning/utils/observability.js +109 -0
  129. package/.medusa/server/src/modules/dunning/utils/retry-schedule.js +47 -0
  130. package/.medusa/server/src/modules/dunning/utils/scheduler-query.js +42 -0
  131. package/.medusa/server/src/modules/plan-offer/index.js +13 -0
  132. package/.medusa/server/src/modules/plan-offer/migrations/Migration20260329104245.js +22 -0
  133. package/.medusa/server/src/modules/plan-offer/migrations/Migration20260329153000.js +25 -0
  134. package/.medusa/server/src/modules/plan-offer/models/plan-offer.js +35 -0
  135. package/.medusa/server/src/modules/plan-offer/service.js +13 -0
  136. package/.medusa/server/src/modules/plan-offer/types/index.js +26 -0
  137. package/.medusa/server/src/modules/plan-offer/utils/admin-query.js +429 -0
  138. package/.medusa/server/src/modules/plan-offer/utils/effective-config.js +84 -0
  139. package/.medusa/server/src/modules/plan-offer/utils/errors.js +55 -0
  140. package/.medusa/server/src/modules/renewal/index.js +13 -0
  141. package/.medusa/server/src/modules/renewal/migrations/Migration20260329185930.js +34 -0
  142. package/.medusa/server/src/modules/renewal/models/renewal-attempt.js +49 -0
  143. package/.medusa/server/src/modules/renewal/models/renewal-cycle.js +56 -0
  144. package/.medusa/server/src/modules/renewal/service.js +15 -0
  145. package/.medusa/server/src/modules/renewal/types/index.js +23 -0
  146. package/.medusa/server/src/modules/renewal/utils/admin-query.js +450 -0
  147. package/.medusa/server/src/modules/renewal/utils/errors.js +39 -0
  148. package/.medusa/server/src/modules/renewal/utils/observability.js +89 -0
  149. package/.medusa/server/src/modules/renewal/utils/scheduler-query.js +48 -0
  150. package/.medusa/server/src/modules/renewal/utils/upcoming-cycle.js +54 -0
  151. package/.medusa/server/src/modules/settings/index.js +13 -0
  152. package/.medusa/server/src/modules/settings/migrations/Migration20260403121004.js +17 -0
  153. package/.medusa/server/src/modules/settings/migrations/Migration20260403132519.js +17 -0
  154. package/.medusa/server/src/modules/settings/models/subscription-settings.js +32 -0
  155. package/.medusa/server/src/modules/settings/service.js +82 -0
  156. package/.medusa/server/src/modules/settings/types.js +15 -0
  157. package/.medusa/server/src/modules/settings/utils/audit.js +43 -0
  158. package/.medusa/server/src/modules/settings/utils/normalize-settings.js +99 -0
  159. package/.medusa/server/src/modules/subscription/index.js +13 -0
  160. package/.medusa/server/src/modules/subscription/migrations/Migration20260327143452.js +24 -0
  161. package/.medusa/server/src/modules/subscription/migrations/Migration20260329194835.js +16 -0
  162. package/.medusa/server/src/modules/subscription/models/subscription.js +64 -0
  163. package/.medusa/server/src/modules/subscription/service.js +13 -0
  164. package/.medusa/server/src/modules/subscription/types/index.js +17 -0
  165. package/.medusa/server/src/modules/subscription/utils/admin-query.js +465 -0
  166. package/.medusa/server/src/modules/subscription/utils/errors.js +28 -0
  167. package/.medusa/server/src/subscription-flows/create-subscription-from-cart.js +178 -0
  168. package/.medusa/server/src/workflows/apply-retention-offer.js +52 -0
  169. package/.medusa/server/src/workflows/approve-renewal-changes.js +61 -0
  170. package/.medusa/server/src/workflows/cancel-subscription.js +64 -0
  171. package/.medusa/server/src/workflows/create-or-upsert-plan-offer.js +11 -0
  172. package/.medusa/server/src/workflows/ensure-next-renewal-cycle.js +11 -0
  173. package/.medusa/server/src/workflows/finalize-cancellation.js +88 -0
  174. package/.medusa/server/src/workflows/force-renewal-cycle.js +11 -0
  175. package/.medusa/server/src/workflows/index.js +79 -0
  176. package/.medusa/server/src/workflows/mark-dunning-recovered.js +11 -0
  177. package/.medusa/server/src/workflows/mark-dunning-unrecovered.js +11 -0
  178. package/.medusa/server/src/workflows/pause-subscription.js +61 -0
  179. package/.medusa/server/src/workflows/process-renewal-cycle.js +43 -0
  180. package/.medusa/server/src/workflows/rebuild-analytics-daily-snapshots.js +13 -0
  181. package/.medusa/server/src/workflows/reject-renewal-changes.js +61 -0
  182. package/.medusa/server/src/workflows/resume-subscription.js +76 -0
  183. package/.medusa/server/src/workflows/run-dunning-retry.js +23 -0
  184. package/.medusa/server/src/workflows/schedule-subscription-plan-change.js +57 -0
  185. package/.medusa/server/src/workflows/start-cancellation-case.js +58 -0
  186. package/.medusa/server/src/workflows/start-dunning.js +11 -0
  187. package/.medusa/server/src/workflows/steps/apply-retention-offer.js +200 -0
  188. package/.medusa/server/src/workflows/steps/approve-renewal-changes.js +48 -0
  189. package/.medusa/server/src/workflows/steps/cancel-subscription.js +48 -0
  190. package/.medusa/server/src/workflows/steps/create-initial-renewal-cycle.js +6 -0
  191. package/.medusa/server/src/workflows/steps/create-subscription-log-event.js +61 -0
  192. package/.medusa/server/src/workflows/steps/create-subscription-record.js +56 -0
  193. package/.medusa/server/src/workflows/steps/ensure-next-renewal-cycle.js +151 -0
  194. package/.medusa/server/src/workflows/steps/finalize-cancellation.js +161 -0
  195. package/.medusa/server/src/workflows/steps/force-renewal-cycle.js +120 -0
  196. package/.medusa/server/src/workflows/steps/link-subscription-commerce-entities.js +44 -0
  197. package/.medusa/server/src/workflows/steps/mark-dunning-recovered.js +72 -0
  198. package/.medusa/server/src/workflows/steps/mark-dunning-unrecovered.js +53 -0
  199. package/.medusa/server/src/workflows/steps/normalize-analytics-rebuild-range.js +59 -0
  200. package/.medusa/server/src/workflows/steps/pause-subscription.js +50 -0
  201. package/.medusa/server/src/workflows/steps/process-renewal-cycle.js +641 -0
  202. package/.medusa/server/src/workflows/steps/rebuild-analytics-daily-snapshots.js +519 -0
  203. package/.medusa/server/src/workflows/steps/reject-renewal-changes.js +48 -0
  204. package/.medusa/server/src/workflows/steps/resume-subscription.js +45 -0
  205. package/.medusa/server/src/workflows/steps/run-dunning-retry.js +592 -0
  206. package/.medusa/server/src/workflows/steps/schedule-subscription-plan-change.js +81 -0
  207. package/.medusa/server/src/workflows/steps/shared-cancellation-log.js +3 -0
  208. package/.medusa/server/src/workflows/steps/shared-plan-offer.js +280 -0
  209. package/.medusa/server/src/workflows/steps/shared-renewal-approval.js +34 -0
  210. package/.medusa/server/src/workflows/steps/start-cancellation-case.js +147 -0
  211. package/.medusa/server/src/workflows/steps/start-dunning.js +237 -0
  212. package/.medusa/server/src/workflows/steps/toggle-plan-offer.js +33 -0
  213. package/.medusa/server/src/workflows/steps/update-cancellation-reason.js +95 -0
  214. package/.medusa/server/src/workflows/steps/update-dunning-retry-schedule.js +91 -0
  215. package/.medusa/server/src/workflows/steps/update-plan-offer.js +51 -0
  216. package/.medusa/server/src/workflows/steps/update-subscription-settings.js +91 -0
  217. package/.medusa/server/src/workflows/steps/update-subscription-shipping-address.js +54 -0
  218. package/.medusa/server/src/workflows/steps/upsert-plan-offer.js +48 -0
  219. package/.medusa/server/src/workflows/steps/validate-subscription-cart.js +280 -0
  220. package/.medusa/server/src/workflows/toggle-plan-offer.js +11 -0
  221. package/.medusa/server/src/workflows/update-cancellation-reason.js +53 -0
  222. package/.medusa/server/src/workflows/update-dunning-retry-schedule.js +11 -0
  223. package/.medusa/server/src/workflows/update-plan-offer.js +11 -0
  224. package/.medusa/server/src/workflows/update-subscription-settings.js +11 -0
  225. package/.medusa/server/src/workflows/update-subscription-shipping-address.js +99 -0
  226. package/.medusa/server/src/workflows/utils/analytics-incremental.js +24 -0
  227. package/.medusa/server/src/workflows/utils/date-output.js +13 -0
  228. package/.medusa/server/src/workflows/utils/subscription-settings.js +13 -0
  229. package/LICENSE +21 -0
  230. package/README.md +200 -0
  231. package/package.json +73 -0
@@ -0,0 +1,530 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.listAdminCancellationCases = listAdminCancellationCases;
4
+ exports.getAdminCancellationDetail = getAdminCancellationDetail;
5
+ const utils_1 = require("@medusajs/framework/utils");
6
+ const cancellation_1 = require("../../../admin/types/cancellation");
7
+ const types_1 = require("../types");
8
+ const errors_1 = require("./errors");
9
+ function toIsoStringOrNull(value) {
10
+ if (!value) {
11
+ return null;
12
+ }
13
+ const parsed = value instanceof Date ? value : new Date(value);
14
+ return Number.isNaN(parsed.getTime()) ? null : parsed.toISOString();
15
+ }
16
+ function toTimestamp(value) {
17
+ if (!value) {
18
+ return Number.POSITIVE_INFINITY;
19
+ }
20
+ const parsed = value instanceof Date ? value : new Date(value);
21
+ return Number.isNaN(parsed.getTime())
22
+ ? Number.POSITIVE_INFINITY
23
+ : parsed.getTime();
24
+ }
25
+ const caseListFields = [
26
+ "id",
27
+ "subscription_id",
28
+ "status",
29
+ "reason",
30
+ "reason_category",
31
+ "final_outcome",
32
+ "finalized_at",
33
+ "created_at",
34
+ "updated_at",
35
+ ];
36
+ const caseDetailFields = [
37
+ ...caseListFields,
38
+ "notes",
39
+ "finalized_by",
40
+ "cancellation_effective_at",
41
+ "metadata",
42
+ ];
43
+ const offerFields = [
44
+ "id",
45
+ "cancellation_case_id",
46
+ "offer_type",
47
+ "offer_payload",
48
+ "decision_status",
49
+ "decision_reason",
50
+ "decided_at",
51
+ "decided_by",
52
+ "applied_at",
53
+ "metadata",
54
+ "created_at",
55
+ "updated_at",
56
+ ];
57
+ const subscriptionFields = [
58
+ "id",
59
+ "reference",
60
+ "status",
61
+ "next_renewal_at",
62
+ "last_renewal_at",
63
+ "paused_at",
64
+ "cancelled_at",
65
+ "cancel_effective_at",
66
+ "customer_snapshot",
67
+ "product_snapshot",
68
+ ];
69
+ const databaseSortableFields = new Set([
70
+ "created_at",
71
+ "updated_at",
72
+ "status",
73
+ "final_outcome",
74
+ "reason_category",
75
+ "finalized_at",
76
+ ]);
77
+ const inMemorySortableFields = new Set([
78
+ "subscription_reference",
79
+ "customer_name",
80
+ "product_title",
81
+ ]);
82
+ function assertSortableField(order) {
83
+ if (!order) {
84
+ return;
85
+ }
86
+ if (!databaseSortableFields.has(order) &&
87
+ !inMemorySortableFields.has(order)) {
88
+ throw errors_1.cancellationErrors.invalidData(`Unsupported sort field '${order}'`);
89
+ }
90
+ }
91
+ function mapCaseStatus(status) {
92
+ switch (status) {
93
+ case types_1.CancellationCaseStatus.REQUESTED:
94
+ return cancellation_1.CancellationCaseAdminStatus.REQUESTED;
95
+ case types_1.CancellationCaseStatus.EVALUATING_RETENTION:
96
+ return cancellation_1.CancellationCaseAdminStatus.EVALUATING_RETENTION;
97
+ case types_1.CancellationCaseStatus.RETENTION_OFFERED:
98
+ return cancellation_1.CancellationCaseAdminStatus.RETENTION_OFFERED;
99
+ case types_1.CancellationCaseStatus.RETAINED:
100
+ return cancellation_1.CancellationCaseAdminStatus.RETAINED;
101
+ case types_1.CancellationCaseStatus.PAUSED:
102
+ return cancellation_1.CancellationCaseAdminStatus.PAUSED;
103
+ case types_1.CancellationCaseStatus.CANCELED:
104
+ return cancellation_1.CancellationCaseAdminStatus.CANCELED;
105
+ }
106
+ throw errors_1.cancellationErrors.invalidData(`Unsupported cancellation case status '${status}'`);
107
+ }
108
+ function mapFinalOutcome(outcome) {
109
+ switch (outcome) {
110
+ case types_1.CancellationFinalOutcome.RETAINED:
111
+ return cancellation_1.CancellationFinalOutcomeAdmin.RETAINED;
112
+ case types_1.CancellationFinalOutcome.PAUSED:
113
+ return cancellation_1.CancellationFinalOutcomeAdmin.PAUSED;
114
+ case types_1.CancellationFinalOutcome.CANCELED:
115
+ return cancellation_1.CancellationFinalOutcomeAdmin.CANCELED;
116
+ default:
117
+ return null;
118
+ }
119
+ }
120
+ function mapOfferDecisionStatus(status) {
121
+ switch (status) {
122
+ case types_1.RetentionOfferDecisionStatus.PROPOSED:
123
+ return cancellation_1.RetentionOfferDecisionAdminStatus.PROPOSED;
124
+ case types_1.RetentionOfferDecisionStatus.ACCEPTED:
125
+ return cancellation_1.RetentionOfferDecisionAdminStatus.ACCEPTED;
126
+ case types_1.RetentionOfferDecisionStatus.REJECTED:
127
+ return cancellation_1.RetentionOfferDecisionAdminStatus.REJECTED;
128
+ case types_1.RetentionOfferDecisionStatus.APPLIED:
129
+ return cancellation_1.RetentionOfferDecisionAdminStatus.APPLIED;
130
+ case types_1.RetentionOfferDecisionStatus.EXPIRED:
131
+ return cancellation_1.RetentionOfferDecisionAdminStatus.EXPIRED;
132
+ }
133
+ throw errors_1.cancellationErrors.invalidData(`Unsupported retention offer decision status '${status}'`);
134
+ }
135
+ function buildFilters(input) {
136
+ const filters = {};
137
+ if (input.status?.length) {
138
+ filters.status = input.status;
139
+ }
140
+ if (input.final_outcome?.length) {
141
+ filters.final_outcome = input.final_outcome;
142
+ }
143
+ if (input.reason_category?.length) {
144
+ filters.reason_category = input.reason_category;
145
+ }
146
+ if (input.subscription_id) {
147
+ filters.subscription_id = input.subscription_id;
148
+ }
149
+ if (input.created_from || input.created_to) {
150
+ filters.created_at = {
151
+ ...(input.created_from ? { $gte: input.created_from } : {}),
152
+ ...(input.created_to ? { $lte: input.created_to } : {}),
153
+ };
154
+ }
155
+ return filters;
156
+ }
157
+ async function getCancellationCaseIdsForOfferTypes(container, offerTypes) {
158
+ if (!offerTypes.length) {
159
+ return [];
160
+ }
161
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
162
+ const { data } = await query.graph({
163
+ entity: "retention_offer_event",
164
+ fields: ["cancellation_case_id"],
165
+ filters: {
166
+ offer_type: offerTypes,
167
+ },
168
+ });
169
+ return [...new Set(data.map((record) => record.cancellation_case_id))];
170
+ }
171
+ async function getSubscriptionSummaryMap(container, subscriptionIds) {
172
+ if (!subscriptionIds.length) {
173
+ return new Map();
174
+ }
175
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
176
+ const { data } = await query.graph({
177
+ entity: "subscription",
178
+ fields: [...subscriptionFields],
179
+ filters: {
180
+ id: [...new Set(subscriptionIds)],
181
+ },
182
+ });
183
+ return new Map(data.map((subscription) => [
184
+ subscription.id,
185
+ {
186
+ subscription_id: subscription.id,
187
+ reference: subscription.reference,
188
+ status: subscription.status,
189
+ customer_name: subscription.customer_snapshot?.full_name ?? "Unknown customer",
190
+ product_title: subscription.product_snapshot?.product_title ?? "Unknown product",
191
+ variant_title: subscription.product_snapshot?.variant_title ?? "Unknown variant",
192
+ sku: subscription.product_snapshot?.sku ?? null,
193
+ next_renewal_at: subscription.next_renewal_at,
194
+ last_renewal_at: subscription.last_renewal_at,
195
+ paused_at: subscription.paused_at,
196
+ cancelled_at: subscription.cancelled_at,
197
+ cancel_effective_at: subscription.cancel_effective_at,
198
+ },
199
+ ]));
200
+ }
201
+ async function getActiveDunningSummaryMap(container, subscriptionIds) {
202
+ if (!subscriptionIds.length) {
203
+ return new Map();
204
+ }
205
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
206
+ const { data } = await query.graph({
207
+ entity: "dunning_case",
208
+ fields: [
209
+ "id",
210
+ "subscription_id",
211
+ "status",
212
+ "attempt_count",
213
+ "next_retry_at",
214
+ "last_payment_error_message",
215
+ ],
216
+ filters: {
217
+ subscription_id: [...new Set(subscriptionIds)],
218
+ },
219
+ });
220
+ const activeStatusOrder = new Map([
221
+ ["retrying", 0],
222
+ ["retry_scheduled", 1],
223
+ ["awaiting_manual_resolution", 2],
224
+ ["open", 3],
225
+ ]);
226
+ const grouped = new Map();
227
+ for (const record of data) {
228
+ const bucket = grouped.get(record.subscription_id) ?? [];
229
+ bucket.push(record);
230
+ grouped.set(record.subscription_id, bucket);
231
+ }
232
+ const result = new Map();
233
+ for (const [subscriptionId, records] of grouped.entries()) {
234
+ const active = records
235
+ .filter((record) => ["open", "retry_scheduled", "retrying", "awaiting_manual_resolution"].includes(record.status))
236
+ .sort((left, right) => {
237
+ const leftRank = activeStatusOrder.get(left.status) ?? 999;
238
+ const rightRank = activeStatusOrder.get(right.status) ?? 999;
239
+ return leftRank - rightRank;
240
+ })[0];
241
+ if (!active) {
242
+ continue;
243
+ }
244
+ result.set(subscriptionId, {
245
+ dunning_case_id: active.id,
246
+ status: active.status,
247
+ attempt_count: active.attempt_count,
248
+ next_retry_at: active.next_retry_at,
249
+ last_payment_error_message: active.last_payment_error_message,
250
+ });
251
+ }
252
+ return result;
253
+ }
254
+ async function getRenewalSummaryMap(container, subscriptionIds) {
255
+ if (!subscriptionIds.length) {
256
+ return new Map();
257
+ }
258
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
259
+ const { data } = await query.graph({
260
+ entity: "renewal_cycle",
261
+ fields: [
262
+ "id",
263
+ "subscription_id",
264
+ "status",
265
+ "scheduled_for",
266
+ "approval_status",
267
+ "generated_order_id",
268
+ ],
269
+ filters: {
270
+ subscription_id: [...new Set(subscriptionIds)],
271
+ },
272
+ });
273
+ const grouped = new Map();
274
+ for (const record of data) {
275
+ const bucket = grouped.get(record.subscription_id) ?? [];
276
+ bucket.push(record);
277
+ grouped.set(record.subscription_id, bucket);
278
+ }
279
+ const result = new Map();
280
+ for (const [subscriptionId, records] of grouped.entries()) {
281
+ const selected = [...records].sort((left, right) => toTimestamp(left.scheduled_for) - toTimestamp(right.scheduled_for))[0];
282
+ if (!selected) {
283
+ continue;
284
+ }
285
+ result.set(subscriptionId, {
286
+ renewal_cycle_id: selected.id,
287
+ status: selected.status,
288
+ scheduled_for: toIsoStringOrNull(selected.scheduled_for) ?? "",
289
+ approval_status: selected.approval_status,
290
+ generated_order_id: selected.generated_order_id,
291
+ });
292
+ }
293
+ return result;
294
+ }
295
+ async function getOfferHistory(container, cancellationCaseId) {
296
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
297
+ const { data } = await query.graph({
298
+ entity: "retention_offer_event",
299
+ fields: [...offerFields],
300
+ filters: {
301
+ cancellation_case_id: [cancellationCaseId],
302
+ },
303
+ pagination: {
304
+ order: {
305
+ created_at: "ASC",
306
+ },
307
+ },
308
+ });
309
+ return data.map((record) => ({
310
+ id: record.id,
311
+ offer_type: record.offer_type,
312
+ offer_payload: record.offer_payload,
313
+ decision_status: mapOfferDecisionStatus(record.decision_status),
314
+ decision_reason: record.decision_reason,
315
+ decided_at: record.decided_at,
316
+ decided_by: record.decided_by,
317
+ applied_at: record.applied_at,
318
+ metadata: record.metadata,
319
+ created_at: record.created_at,
320
+ updated_at: record.updated_at,
321
+ }));
322
+ }
323
+ function mapListItem(record, subscription) {
324
+ return {
325
+ id: record.id,
326
+ status: mapCaseStatus(record.status),
327
+ reason: record.reason,
328
+ reason_category: record.reason_category,
329
+ final_outcome: mapFinalOutcome(record.final_outcome),
330
+ subscription,
331
+ created_at: record.created_at,
332
+ finalized_at: record.finalized_at,
333
+ updated_at: record.updated_at,
334
+ };
335
+ }
336
+ function getSortableValue(item, order) {
337
+ switch (order) {
338
+ case "created_at":
339
+ return item.created_at;
340
+ case "updated_at":
341
+ return item.updated_at;
342
+ case "status":
343
+ return item.status;
344
+ case "final_outcome":
345
+ return item.final_outcome ?? "";
346
+ case "reason_category":
347
+ return item.reason_category ?? "";
348
+ case "finalized_at":
349
+ return item.finalized_at ?? "";
350
+ case "subscription_reference":
351
+ return item.subscription.reference;
352
+ case "customer_name":
353
+ return item.subscription.customer_name;
354
+ case "product_title":
355
+ return item.subscription.product_title;
356
+ default:
357
+ return "";
358
+ }
359
+ }
360
+ function sortItems(items, order, direction) {
361
+ const multiplier = direction === "asc" ? 1 : -1;
362
+ return [...items].sort((left, right) => {
363
+ const leftValue = getSortableValue(left, order);
364
+ const rightValue = getSortableValue(right, order);
365
+ if (leftValue < rightValue) {
366
+ return -1 * multiplier;
367
+ }
368
+ if (leftValue > rightValue) {
369
+ return 1 * multiplier;
370
+ }
371
+ return 0;
372
+ });
373
+ }
374
+ function matchesSearch(item, search) {
375
+ const value = search.trim().toLowerCase();
376
+ if (!value.length) {
377
+ return true;
378
+ }
379
+ return [
380
+ item.subscription.reference,
381
+ item.subscription.customer_name,
382
+ item.subscription.product_title,
383
+ item.subscription.variant_title,
384
+ item.reason ?? "",
385
+ item.reason_category ?? "",
386
+ ]
387
+ .join(" ")
388
+ .toLowerCase()
389
+ .includes(value);
390
+ }
391
+ async function listAdminCancellationCases(container, input) {
392
+ assertSortableField(input.order);
393
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
394
+ const filters = buildFilters(input);
395
+ const limit = input.limit ?? 20;
396
+ const offset = input.offset ?? 0;
397
+ const direction = input.direction ?? "desc";
398
+ const order = input.order;
399
+ const isInMemorySort = typeof order === "string" && inMemorySortableFields.has(order);
400
+ const requiresInMemoryProcessing = Boolean(input.q) || isInMemorySort;
401
+ if (input.offer_type?.length) {
402
+ const cancellationCaseIds = await getCancellationCaseIdsForOfferTypes(container, input.offer_type);
403
+ if (!cancellationCaseIds.length) {
404
+ return {
405
+ cancellations: [],
406
+ count: 0,
407
+ limit,
408
+ offset,
409
+ };
410
+ }
411
+ filters.id = cancellationCaseIds;
412
+ }
413
+ if (!requiresInMemoryProcessing) {
414
+ const { data, metadata: { count = 0, take = limit, skip = offset } = {}, } = await query.graph({
415
+ entity: "cancellation_case",
416
+ fields: [...caseListFields],
417
+ filters,
418
+ pagination: {
419
+ take: limit,
420
+ skip: offset,
421
+ ...(order && databaseSortableFields.has(order)
422
+ ? {
423
+ order: {
424
+ [order]: direction.toUpperCase(),
425
+ },
426
+ }
427
+ : {}),
428
+ },
429
+ });
430
+ const records = data;
431
+ const subscriptionMap = await getSubscriptionSummaryMap(container, records.map((record) => record.subscription_id));
432
+ return {
433
+ cancellations: records.map((record) => mapListItem(record, subscriptionMap.get(record.subscription_id) ?? {
434
+ subscription_id: record.subscription_id,
435
+ reference: "Unknown subscription",
436
+ status: "past_due",
437
+ customer_name: "Unknown customer",
438
+ product_title: "Unknown product",
439
+ variant_title: "Unknown variant",
440
+ sku: null,
441
+ next_renewal_at: null,
442
+ last_renewal_at: null,
443
+ paused_at: null,
444
+ cancelled_at: null,
445
+ cancel_effective_at: null,
446
+ })),
447
+ count,
448
+ limit: take,
449
+ offset: skip,
450
+ };
451
+ }
452
+ const { data } = await query.graph({
453
+ entity: "cancellation_case",
454
+ fields: [...caseListFields],
455
+ filters,
456
+ pagination: order && databaseSortableFields.has(order)
457
+ ? {
458
+ order: {
459
+ [order]: direction.toUpperCase(),
460
+ },
461
+ }
462
+ : undefined,
463
+ });
464
+ const records = data;
465
+ const subscriptionMap = await getSubscriptionSummaryMap(container, records.map((record) => record.subscription_id));
466
+ let items = records.map((record) => mapListItem(record, subscriptionMap.get(record.subscription_id) ?? {
467
+ subscription_id: record.subscription_id,
468
+ reference: "Unknown subscription",
469
+ status: "past_due",
470
+ customer_name: "Unknown customer",
471
+ product_title: "Unknown product",
472
+ variant_title: "Unknown variant",
473
+ sku: null,
474
+ next_renewal_at: null,
475
+ last_renewal_at: null,
476
+ paused_at: null,
477
+ cancelled_at: null,
478
+ cancel_effective_at: null,
479
+ }));
480
+ if (input.q) {
481
+ items = items.filter((item) => matchesSearch(item, input.q));
482
+ }
483
+ if (order && isInMemorySort) {
484
+ items = sortItems(items, order, direction);
485
+ }
486
+ return {
487
+ cancellations: items.slice(offset, offset + limit),
488
+ count: items.length,
489
+ limit,
490
+ offset,
491
+ };
492
+ }
493
+ async function getAdminCancellationDetail(container, id) {
494
+ const query = container.resolve(utils_1.ContainerRegistrationKeys.QUERY);
495
+ const { data } = await query.graph({
496
+ entity: "cancellation_case",
497
+ fields: [...caseDetailFields],
498
+ filters: {
499
+ id: [id],
500
+ },
501
+ });
502
+ const cancellationCase = data[0];
503
+ if (!cancellationCase) {
504
+ throw errors_1.cancellationErrors.notFound("CancellationCase", id);
505
+ }
506
+ const [subscriptionMap, dunningMap, renewalMap, offers] = await Promise.all([
507
+ getSubscriptionSummaryMap(container, [cancellationCase.subscription_id]),
508
+ getActiveDunningSummaryMap(container, [cancellationCase.subscription_id]),
509
+ getRenewalSummaryMap(container, [cancellationCase.subscription_id]),
510
+ getOfferHistory(container, cancellationCase.id),
511
+ ]);
512
+ const subscription = subscriptionMap.get(cancellationCase.subscription_id);
513
+ if (!subscription) {
514
+ throw errors_1.cancellationErrors.notFound("Subscription", cancellationCase.subscription_id);
515
+ }
516
+ const detail = {
517
+ ...mapListItem(cancellationCase, subscription),
518
+ notes: cancellationCase.notes,
519
+ finalized_by: cancellationCase.finalized_by,
520
+ cancellation_effective_at: cancellationCase.cancellation_effective_at,
521
+ dunning: dunningMap.get(cancellationCase.subscription_id) ?? null,
522
+ renewal: renewalMap.get(cancellationCase.subscription_id) ?? null,
523
+ offers,
524
+ metadata: cancellationCase.metadata,
525
+ };
526
+ return {
527
+ cancellation: detail,
528
+ };
529
+ }
530
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4tcXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9jYW5jZWxsYXRpb24vdXRpbHMvYWRtaW4tcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE0bEJBLGdFQTRJQztBQUVELGdFQWtEQztBQTN4QkQscURBQXFFO0FBQ3JFLG9FQVkwQztBQUMxQyxvQ0FLaUI7QUFDakIscUNBQTZDO0FBMkY3QyxTQUFTLGlCQUFpQixDQUFDLEtBQXVDO0lBQ2hFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFOUQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQTtBQUNyRSxDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsS0FBdUM7SUFDMUQsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsT0FBTyxNQUFNLENBQUMsaUJBQWlCLENBQUE7SUFDakMsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLEtBQUssWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFOUQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuQyxDQUFDLENBQUMsTUFBTSxDQUFDLGlCQUFpQjtRQUMxQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFBO0FBQ3RCLENBQUM7QUFFRCxN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
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.appendCancellationManualAction = appendCancellationManualAction;
4
+ function appendCancellationManualAction(metadata, input) {
5
+ const existing = Array.isArray(metadata?.manual_actions)
6
+ ? [...metadata?.manual_actions]
7
+ : [];
8
+ existing.push({
9
+ action: input.action,
10
+ who: input.who ?? null,
11
+ when: input.when,
12
+ why: input.why ?? null,
13
+ ...(input.data ?? {}),
14
+ });
15
+ return {
16
+ ...(metadata ?? {}),
17
+ manual_actions: existing,
18
+ last_manual_action: existing[existing.length - 1],
19
+ };
20
+ }
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbW9kdWxlcy9jYW5jZWxsYXRpb24vdXRpbHMvYXVkaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFlQSx3RUFxQkM7QUFyQkQsU0FBZ0IsOEJBQThCLENBQzVDLFFBQXdDLEVBQ3hDLEtBQTBDO0lBRTFDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQztRQUN0RCxDQUFDLENBQUMsQ0FBQyxHQUFJLFFBQVEsRUFBRSxjQUE0QyxDQUFDO1FBQzlELENBQUMsQ0FBQyxFQUFFLENBQUE7SUFFTixRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ1osTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO1FBQ3BCLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLElBQUk7UUFDdEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1FBQ2hCLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRyxJQUFJLElBQUk7UUFDdEIsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO0tBQ3RCLENBQUMsQ0FBQTtJQUVGLE9BQU87UUFDTCxHQUFHLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUNuQixjQUFjLEVBQUUsUUFBUTtRQUN4QixrQkFBa0IsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7S0FDbEQsQ0FBQTtBQUNILENBQUMifQ==
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cancellationErrors = void 0;
4
+ const utils_1 = require("@medusajs/framework/utils");
5
+ exports.cancellationErrors = {
6
+ notFound(entity, id) {
7
+ return new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `${entity} '${id}' was not found`);
8
+ },
9
+ invalidData(message) {
10
+ return new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, message);
11
+ },
12
+ conflict(message) {
13
+ return new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, message);
14
+ },
15
+ multipleActiveCases(subscriptionId) {
16
+ return new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, `Subscription '${subscriptionId}' has multiple active cancellation cases`);
17
+ },
18
+ invalidCaseState(cancellationCaseId, action, status) {
19
+ return new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, `CancellationCase '${cancellationCaseId}' can't ${action} from status '${status}'`);
20
+ },
21
+ alreadyFinalized(cancellationCaseId, status) {
22
+ return new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, `CancellationCase '${cancellationCaseId}' is already finalized with status '${status}'`);
23
+ },
24
+ missingCancellationReason(cancellationCaseId) {
25
+ return new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `CancellationCase '${cancellationCaseId}' requires a reason before final cancellation`);
26
+ },
27
+ offerOutOfPolicy(cancellationCaseId, offerType) {
28
+ return new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, `Retention offer '${offerType}' is out of policy for CancellationCase '${cancellationCaseId}'`);
29
+ },
30
+ };
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21vZHVsZXMvY2FuY2VsbGF0aW9uL3V0aWxzL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxREFBdUQ7QUFFMUMsUUFBQSxrQkFBa0IsR0FBRztJQUNoQyxRQUFRLENBQUMsTUFBYyxFQUFFLEVBQVU7UUFDakMsT0FBTyxJQUFJLG1CQUFXLENBQ3BCLG1CQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFDM0IsR0FBRyxNQUFNLEtBQUssRUFBRSxpQkFBaUIsQ0FDbEMsQ0FBQTtJQUNILENBQUM7SUFDRCxXQUFXLENBQUMsT0FBZTtRQUN6QixPQUFPLElBQUksbUJBQVcsQ0FBQyxtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDakUsQ0FBQztJQUNELFFBQVEsQ0FBQyxPQUFlO1FBQ3RCLE9BQU8sSUFBSSxtQkFBVyxDQUFDLG1CQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUM3RCxDQUFDO0lBQ0QsbUJBQW1CLENBQUMsY0FBc0I7UUFDeEMsT0FBTyxJQUFJLG1CQUFXLENBQ3BCLG1CQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFDMUIsaUJBQWlCLGNBQWMsMENBQTBDLENBQzFFLENBQUE7SUFDSCxDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsa0JBQTBCLEVBQUUsTUFBYyxFQUFFLE1BQWM7UUFDekUsT0FBTyxJQUFJLG1CQUFXLENBQ3BCLG1CQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFDMUIscUJBQXFCLGtCQUFrQixXQUFXLE1BQU0saUJBQWlCLE1BQU0sR0FBRyxDQUNuRixDQUFBO0lBQ0gsQ0FBQztJQUNELGdCQUFnQixDQUFDLGtCQUEwQixFQUFFLE1BQWM7UUFDekQsT0FBTyxJQUFJLG1CQUFXLENBQ3BCLG1CQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFDMUIscUJBQXFCLGtCQUFrQix1Q0FBdUMsTUFBTSxHQUFHLENBQ3hGLENBQUE7SUFDSCxDQUFDO0lBQ0QseUJBQXlCLENBQUMsa0JBQTBCO1FBQ2xELE9BQU8sSUFBSSxtQkFBVyxDQUNwQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLHFCQUFxQixrQkFBa0IsK0NBQStDLENBQ3ZGLENBQUE7SUFDSCxDQUFDO0lBQ0QsZ0JBQWdCLENBQUMsa0JBQTBCLEVBQUUsU0FBaUI7UUFDNUQsT0FBTyxJQUFJLG1CQUFXLENBQ3BCLG1CQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFDMUIsb0JBQW9CLFNBQVMsNENBQTRDLGtCQUFrQixHQUFHLENBQy9GLENBQUE7SUFDSCxDQUFDO0NBQ0YsQ0FBQSJ9