@bash-app/bash-common 30.186.0 → 30.193.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 (53) hide show
  1. package/dist/__tests__/stripeListingSubscriptionMessages.test.d.ts +2 -0
  2. package/dist/__tests__/stripeListingSubscriptionMessages.test.d.ts.map +1 -0
  3. package/dist/__tests__/stripeListingSubscriptionMessages.test.js +10 -0
  4. package/dist/__tests__/stripeListingSubscriptionMessages.test.js.map +1 -0
  5. package/dist/index.d.ts +3 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +3 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/stripeListingSubscriptionMessages.d.ts +7 -0
  10. package/dist/stripeListingSubscriptionMessages.d.ts.map +1 -0
  11. package/dist/stripeListingSubscriptionMessages.js +13 -0
  12. package/dist/stripeListingSubscriptionMessages.js.map +1 -0
  13. package/dist/utils/__tests__/cancellationPolicyRefundResolver.test.d.ts +6 -0
  14. package/dist/utils/__tests__/cancellationPolicyRefundResolver.test.d.ts.map +1 -0
  15. package/dist/utils/__tests__/cancellationPolicyRefundResolver.test.js +104 -0
  16. package/dist/utils/__tests__/cancellationPolicyRefundResolver.test.js.map +1 -0
  17. package/dist/utils/addressUtils.d.ts.map +1 -1
  18. package/dist/utils/addressUtils.js +157 -54
  19. package/dist/utils/addressUtils.js.map +1 -1
  20. package/dist/utils/discountEngine/__tests__/eligibilityValidator.test.js +6 -2
  21. package/dist/utils/discountEngine/__tests__/eligibilityValidator.test.js.map +1 -1
  22. package/dist/utils/mediaClientDefaults.d.ts +7 -0
  23. package/dist/utils/mediaClientDefaults.d.ts.map +1 -0
  24. package/dist/utils/mediaClientDefaults.js +7 -0
  25. package/dist/utils/mediaClientDefaults.js.map +1 -0
  26. package/dist/utils/service/__tests__/partnerServiceProfileWizardPaymentMethod.test.d.ts +2 -0
  27. package/dist/utils/service/__tests__/partnerServiceProfileWizardPaymentMethod.test.d.ts.map +1 -0
  28. package/dist/utils/service/__tests__/partnerServiceProfileWizardPaymentMethod.test.js +18 -0
  29. package/dist/utils/service/__tests__/partnerServiceProfileWizardPaymentMethod.test.js.map +1 -0
  30. package/dist/utils/service/cancellationPolicyRefundResolver.d.ts +30 -0
  31. package/dist/utils/service/cancellationPolicyRefundResolver.d.ts.map +1 -0
  32. package/dist/utils/service/cancellationPolicyRefundResolver.js +82 -0
  33. package/dist/utils/service/cancellationPolicyRefundResolver.js.map +1 -0
  34. package/dist/utils/service/serviceUtils.d.ts +7 -0
  35. package/dist/utils/service/serviceUtils.d.ts.map +1 -1
  36. package/dist/utils/service/serviceUtils.js +173 -11
  37. package/dist/utils/service/serviceUtils.js.map +1 -1
  38. package/dist/utils/slugUtils.d.ts +5 -0
  39. package/dist/utils/slugUtils.d.ts.map +1 -1
  40. package/dist/utils/slugUtils.js +12 -0
  41. package/dist/utils/slugUtils.js.map +1 -1
  42. package/package.json +3 -2
  43. package/prisma/schema.prisma +6 -0
  44. package/src/__tests__/stripeListingSubscriptionMessages.test.ts +20 -0
  45. package/src/index.ts +3 -0
  46. package/src/stripeListingSubscriptionMessages.ts +18 -0
  47. package/src/utils/addressUtils.ts +175 -59
  48. package/src/utils/discountEngine/__tests__/eligibilityValidator.test.ts +6 -2
  49. package/src/utils/mediaClientDefaults.ts +6 -0
  50. package/src/utils/service/__tests__/partnerServiceProfileWizardPaymentMethod.test.ts +29 -0
  51. package/src/utils/service/cancellationPolicyRefundResolver.ts +112 -0
  52. package/src/utils/service/serviceUtils.ts +215 -15
  53. package/src/utils/slugUtils.ts +16 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stripeListingSubscriptionMessages.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripeListingSubscriptionMessages.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/stripeListingSubscriptionMessages.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import { LISTING_SUBSCRIPTION_PAYMENT_ALREADY_LINKING_USER_MESSAGE, userFacingMessageForListingSubscriptionStripeError, } from "../stripeListingSubscriptionMessages";
2
+ describe("userFacingMessageForListingSubscriptionStripeError", () => {
3
+ it("maps Stripe already-attached wording to actionable copy", () => {
4
+ expect(userFacingMessageForListingSubscriptionStripeError("The payment method has already been attached to a customer.")).toBe(LISTING_SUBSCRIPTION_PAYMENT_ALREADY_LINKING_USER_MESSAGE);
5
+ });
6
+ it("passes through other messages", () => {
7
+ expect(userFacingMessageForListingSubscriptionStripeError("Something else went wrong.")).toBe("Something else went wrong.");
8
+ });
9
+ });
10
+ //# sourceMappingURL=stripeListingSubscriptionMessages.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripeListingSubscriptionMessages.test.js","sourceRoot":"","sources":["../../src/__tests__/stripeListingSubscriptionMessages.test.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yDAAyD,EACzD,kDAAkD,GACnD,MAAM,sCAAsC,CAAC;AAE9C,QAAQ,CAAC,oDAAoD,EAAE,GAAG,EAAE;IAClE,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,CACJ,kDAAkD,CAChD,6DAA6D,CAC9D,CACF,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CACJ,kDAAkD,CAAC,4BAA4B,CAAC,CACjF,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from "./definitions.js";
2
+ export * from "./stripeListingSubscriptionMessages.js";
2
3
  export * from "./extendedSchemas.js";
3
4
  export * from "./bashFeedTypes.js";
4
5
  export * from "./membershipDefinitions.js";
@@ -21,6 +22,7 @@ export * from "./utils/recurrenceUtils.js";
21
22
  export * from "./utils/service/attendeeOptionUtils.js";
22
23
  export * from "./utils/service/regexUtils.js";
23
24
  export * from "./utils/service/serviceUtils.js";
25
+ export * from "./utils/service/cancellationPolicyRefundResolver.js";
24
26
  export * from "./utils/slugUtils.js";
25
27
  export * from "./utils/sortUtils.js";
26
28
  export * from "./utils/stringUtils.js";
@@ -33,6 +35,7 @@ export * from "./utils/blogUtils.js";
33
35
  export * from "./utils/entityUtils.js";
34
36
  export * from "./utils/generalDateTimeUtils.js";
35
37
  export * from "./utils/luxonUtils.js";
38
+ export * from "./utils/mediaClientDefaults.js";
36
39
  export * from "./utils/mathUtils.js";
37
40
  export * from "./utils/birthdayExperienceQuality.js";
38
41
  export * from "./utils/service/apiServiceBookingApiUtils.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAG3C,YAAY,EACV,OAAO,EACP,YAAY,EACZ,IAAI,EACJ,SAAS,EACT,YAAY,EACZ,mBAAmB,EACnB,OAAO,GACR,MAAM,gBAAgB,CAAC;AAExB,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6CAA6C,CAAC;AAC5D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wCAAwC,CAAC;AACvD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAEhD,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iCAAiC,CAAC;AAChD,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sCAAsC,CAAC;AACrD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC;AAG9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EACR,WAAW,EAAE,YAAY,EACzB,YAAY,EAAE,QAAQ,EAAE,sBAAsB,EAAE,cAAc,EACjE,MAAM,sBAAsB,CAAC;AAG9B,cAAc,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,wCAAwC,CAAC;AACvD,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAG3C,YAAY,EACV,OAAO,EACP,YAAY,EACZ,IAAI,EACJ,SAAS,EACT,YAAY,EACZ,mBAAmB,EACnB,OAAO,GACR,MAAM,gBAAgB,CAAC;AAExB,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6CAA6C,CAAC;AAC5D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wCAAwC,CAAC;AACvD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qDAAqD,CAAC;AAEpE,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iCAAiC,CAAC;AAChD,cAAc,uBAAuB,CAAC;AACtC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sCAAsC,CAAC;AACrD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC;AAG9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EACR,WAAW,EAAE,YAAY,EACzB,YAAY,EAAE,QAAQ,EAAE,sBAAsB,EAAE,cAAc,EACjE,MAAM,sBAAsB,CAAC;AAG9B,cAAc,+BAA+B,CAAC"}
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from "./definitions.js";
2
+ export * from "./stripeListingSubscriptionMessages.js";
2
3
  export * from "./extendedSchemas.js";
3
4
  export * from "./bashFeedTypes.js";
4
5
  export * from "./membershipDefinitions.js";
@@ -20,6 +21,7 @@ export * from "./utils/recurrenceUtils.js";
20
21
  export * from "./utils/service/attendeeOptionUtils.js";
21
22
  export * from "./utils/service/regexUtils.js";
22
23
  export * from "./utils/service/serviceUtils.js";
24
+ export * from "./utils/service/cancellationPolicyRefundResolver.js";
23
25
  // Venue utils moved to paymentUtils.ts for better organization
24
26
  export * from "./utils/slugUtils.js";
25
27
  export * from "./utils/sortUtils.js";
@@ -33,6 +35,7 @@ export * from "./utils/blogUtils.js";
33
35
  export * from "./utils/entityUtils.js";
34
36
  export * from "./utils/generalDateTimeUtils.js";
35
37
  export * from "./utils/luxonUtils.js";
38
+ export * from "./utils/mediaClientDefaults.js";
36
39
  export * from "./utils/mathUtils.js";
37
40
  export * from "./utils/birthdayExperienceQuality.js";
38
41
  export * from "./utils/service/apiServiceBookingApiUtils.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAa3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6CAA6C,CAAC;AAC5D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wCAAwC,CAAC;AACvD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,+DAA+D;AAC/D,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iCAAiC,CAAC;AAChD,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sCAAsC,CAAC;AACrD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC;AAE9C,iFAAiF;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAM3D,kBAAkB;AAClB,cAAc,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,wCAAwC,CAAC;AACvD,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,4BAA4B,CAAC;AAa3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6CAA6C,CAAC;AAC5D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,wCAAwC,CAAC;AACvD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,qDAAqD,CAAC;AACpE,+DAA+D;AAC/D,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,qBAAqB,CAAC;AACpC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,kCAAkC,CAAC;AACjD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iCAAiC,CAAC;AAChD,cAAc,uBAAuB,CAAC;AACtC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sCAAsC,CAAC;AACrD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,sBAAsB,CAAC;AACrC,cAAc,+BAA+B,CAAC;AAE9C,iFAAiF;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAM3D,kBAAkB;AAClB,cAAc,+BAA+B,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * User-facing copy for listing-subscription (Connect billing customer) payment flows.
3
+ * Kept in bash-common so api and bash-app stay aligned without casts.
4
+ */
5
+ export declare const LISTING_SUBSCRIPTION_PAYMENT_ALREADY_LINKING_USER_MESSAGE = "Your card is still linking to billing. Wait a few seconds and tap Confirm again.";
6
+ export declare function userFacingMessageForListingSubscriptionStripeError(raw: string): string;
7
+ //# sourceMappingURL=stripeListingSubscriptionMessages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripeListingSubscriptionMessages.d.ts","sourceRoot":"","sources":["../src/stripeListingSubscriptionMessages.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,eAAO,MAAM,yDAAyD,qFACc,CAAC;AAErF,wBAAgB,kDAAkD,CAChE,GAAG,EAAE,MAAM,GACV,MAAM,CAKR"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * User-facing copy for listing-subscription (Connect billing customer) payment flows.
3
+ * Kept in bash-common so api and bash-app stay aligned without casts.
4
+ */
5
+ const STRIPE_ALREADY_ATTACHED_SUBSTR = /already been attached to a customer/i;
6
+ export const LISTING_SUBSCRIPTION_PAYMENT_ALREADY_LINKING_USER_MESSAGE = "Your card is still linking to billing. Wait a few seconds and tap Confirm again.";
7
+ export function userFacingMessageForListingSubscriptionStripeError(raw) {
8
+ if (STRIPE_ALREADY_ATTACHED_SUBSTR.test(raw)) {
9
+ return LISTING_SUBSCRIPTION_PAYMENT_ALREADY_LINKING_USER_MESSAGE;
10
+ }
11
+ return raw;
12
+ }
13
+ //# sourceMappingURL=stripeListingSubscriptionMessages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stripeListingSubscriptionMessages.js","sourceRoot":"","sources":["../src/stripeListingSubscriptionMessages.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,8BAA8B,GAAG,sCAAsC,CAAC;AAE9E,MAAM,CAAC,MAAM,yDAAyD,GACpE,kFAAkF,CAAC;AAErF,MAAM,UAAU,kDAAkD,CAChE,GAAW;IAEX,IAAI,8BAA8B,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7C,OAAO,yDAAyD,CAAC;IACnE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Tests for cancellation refund resolution (single source of truth:
3
+ * SERVICE_CANCELLATION_POLICY_DATA).
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=cancellationPolicyRefundResolver.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancellationPolicyRefundResolver.test.d.ts","sourceRoot":"","sources":["../../../src/utils/__tests__/cancellationPolicyRefundResolver.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Tests for cancellation refund resolution (single source of truth:
3
+ * SERVICE_CANCELLATION_POLICY_DATA).
4
+ */
5
+ import { ServiceCancellationPolicy } from "@prisma/client";
6
+ import { cancellationRuleThresholdHours, getMatchingCancellationRefundRule, hoursUntilEventStart, resolveCancellationRefundFraction, } from "../service/cancellationPolicyRefundResolver.js";
7
+ describe("cancellationPolicyRefundResolver", () => {
8
+ const fixedNow = new Date("2026-01-01T12:00:00.000Z");
9
+ describe("hoursUntilEventStart", () => {
10
+ test("returns 0 when event is in the past", () => {
11
+ expect(hoursUntilEventStart(new Date("2025-12-01T12:00:00.000Z"), fixedNow)).toBe(0);
12
+ });
13
+ test("returns positive hours until start", () => {
14
+ const start = new Date("2026-01-03T12:00:00.000Z");
15
+ expect(hoursUntilEventStart(start, fixedNow)).toBe(48);
16
+ });
17
+ });
18
+ describe("cancellationRuleThresholdHours", () => {
19
+ test("converts days to hours", () => {
20
+ expect(cancellationRuleThresholdHours({ days: 7, refundPercentage: 100 })).toBe(168);
21
+ });
22
+ test("uses hours when set", () => {
23
+ expect(cancellationRuleThresholdHours({ hours: 24, refundPercentage: 50 })).toBe(24);
24
+ });
25
+ });
26
+ describe("VendorStandard (14d full, 3d partial)", () => {
27
+ test("20 days before: 100%", () => {
28
+ const eventStart = new Date("2026-01-21T12:00:00.000Z");
29
+ expect(resolveCancellationRefundFraction(ServiceCancellationPolicy.VendorStandard, {
30
+ eventStart,
31
+ now: fixedNow,
32
+ })).toBe(1);
33
+ });
34
+ test("10 days before: 50%", () => {
35
+ const eventStart = new Date("2026-01-11T12:00:00.000Z");
36
+ expect(resolveCancellationRefundFraction(ServiceCancellationPolicy.VendorStandard, {
37
+ eventStart,
38
+ now: fixedNow,
39
+ })).toBe(0.5);
40
+ });
41
+ test("2 days before: 0%", () => {
42
+ const eventStart = new Date("2026-01-03T12:00:00.000Z");
43
+ expect(resolveCancellationRefundFraction(ServiceCancellationPolicy.VendorStandard, {
44
+ eventStart,
45
+ now: fixedNow,
46
+ })).toBe(0);
47
+ });
48
+ });
49
+ describe("VendorFlexible (7d full, 24h partial)", () => {
50
+ test("8 days before: 100%", () => {
51
+ const eventStart = new Date("2026-01-09T12:00:00.000Z");
52
+ expect(resolveCancellationRefundFraction(ServiceCancellationPolicy.VendorFlexible, {
53
+ eventStart,
54
+ now: fixedNow,
55
+ })).toBe(1);
56
+ });
57
+ test("5 days before: 50%", () => {
58
+ const eventStart = new Date("2026-01-06T12:00:00.000Z");
59
+ expect(resolveCancellationRefundFraction(ServiceCancellationPolicy.VendorFlexible, {
60
+ eventStart,
61
+ now: fixedNow,
62
+ })).toBe(0.5);
63
+ });
64
+ test("12 hours before: 0%", () => {
65
+ const eventStart = new Date("2026-01-02T00:00:00.000Z");
66
+ expect(resolveCancellationRefundFraction(ServiceCancellationPolicy.VendorFlexible, {
67
+ eventStart,
68
+ now: fixedNow,
69
+ })).toBe(0);
70
+ });
71
+ test("6d 23h before (~167h): still 50% tier, not full 7d", () => {
72
+ const eventStart = new Date("2026-01-08T11:00:00.000Z");
73
+ expect(hoursUntilEventStart(eventStart, fixedNow)).toBeCloseTo(167, 0);
74
+ expect(resolveCancellationRefundFraction(ServiceCancellationPolicy.VendorFlexible, {
75
+ eventStart,
76
+ now: fixedNow,
77
+ })).toBe(0.5);
78
+ });
79
+ });
80
+ describe("VeryFlexible (24h full only)", () => {
81
+ test("2 days before: 100%", () => {
82
+ const eventStart = new Date("2026-01-03T12:00:00.000Z");
83
+ expect(resolveCancellationRefundFraction(ServiceCancellationPolicy.VeryFlexible, {
84
+ eventStart,
85
+ now: fixedNow,
86
+ })).toBe(1);
87
+ });
88
+ test("12 hours before: 0%", () => {
89
+ const eventStart = new Date("2026-01-02T00:00:00.000Z");
90
+ expect(resolveCancellationRefundFraction(ServiceCancellationPolicy.VeryFlexible, {
91
+ eventStart,
92
+ now: fixedNow,
93
+ })).toBe(0);
94
+ });
95
+ });
96
+ describe("getMatchingCancellationRefundRule", () => {
97
+ test("returns the winning tier rule object", () => {
98
+ const eventStart = new Date("2026-01-11T12:00:00.000Z");
99
+ const rule = getMatchingCancellationRefundRule(ServiceCancellationPolicy.VendorStandard, { eventStart, now: fixedNow });
100
+ expect(rule).toEqual({ days: 3, refundPercentage: 50 });
101
+ });
102
+ });
103
+ });
104
+ //# sourceMappingURL=cancellationPolicyRefundResolver.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancellationPolicyRefundResolver.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/cancellationPolicyRefundResolver.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"addressUtils.d.ts","sourceRoot":"","sources":["../../src/utils/addressUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAO7C,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAE7E;AAED,wBAAgB,oCAAoC,CAAC,aAAa,EAAE,QAAQ,GAAG,MAAM,CAGpF;AAED,wBAAgB,oCAAoC,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,QAAQ,CAavG;AAGD;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,EACpB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,EACrB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GACtB,MAAM,CAKR;AAED,wBAAgB,oCAAoC,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAgCrG;AAED,wBAAgB,oCAAoC,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAerG;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM,CAKhE;AAGD,wBAAsB,yBAAyB,CAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAI,OAAO,CAAC,QAAQ,CAAC,CAwC7F;AAED,UAAU,sBAAsB;IAC9B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,iBAAiB;IACzB,kBAAkB,CAAC,EAAE,sBAAsB,EAAE,CAAC;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,iBAAiB,GAAG,QAAQ,CA0C3E;AAGD,wBAAsB,4BAA4B,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAC,GAAG,SAAS,CAAC,CAuBrH"}
1
+ {"version":3,"file":"addressUtils.d.ts","sourceRoot":"","sources":["../../src/utils/addressUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAO7C,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAE7E;AAED,wBAAgB,oCAAoC,CAAC,aAAa,EAAE,QAAQ,GAAG,MAAM,CAGpF;AAoED,wBAAgB,oCAAoC,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,QAAQ,CA4BvG;AAGD;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,EACpB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,EACrB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GACtB,MAAM,CAKR;AAED,wBAAgB,oCAAoC,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CA2BrG;AAED,wBAAgB,oCAAoC,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAWrG;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,QAAQ,GAAG,MAAM,CAKhE;AA0BD,wBAAsB,yBAAyB,CAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAI,OAAO,CAAC,QAAQ,CAAC,CA6D7F;AAED,UAAU,sBAAsB;IAC9B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,iBAAiB;IACzB,kBAAkB,CAAC,EAAE,sBAAsB,EAAE,CAAC;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,iBAAiB,GAAG,QAAQ,CA0C3E;AAGD,wBAAsB,4BAA4B,CAAC,OAAO,EAAE,QAAQ,GAAG,OAAO,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAC,GAAG,SAAS,CAAC,CAuBrH"}
@@ -7,16 +7,89 @@ export function addressValuesToDatabaseAddressString(addressValues) {
7
7
  const { place = '', street, city, state, zipCode, country } = addressValues;
8
8
  return [place, street, city, state, zipCode, country].join(ADDRESS_DELIM);
9
9
  }
10
+ /**
11
+ * Older Where step saved locations with a " • " join and dropped empty segments,
12
+ * so the value no longer contained `|` and the full address was mis-parsed as `place`.
13
+ */
14
+ function parseLegacyBulletDelimitedAddress(trimmed) {
15
+ if (!trimmed.includes(' • ')) {
16
+ return null;
17
+ }
18
+ const parts = trimmed.split(' • ').map((p) => p.trim()).filter((p) => p.length > 0);
19
+ const zipLike = (s) => /^\d{5}(-\d{4})?$/.test(s);
20
+ if (parts.length === 6) {
21
+ return {
22
+ place: parts[0] ?? '',
23
+ street: parts[1] ?? '',
24
+ city: parts[2] ?? '',
25
+ state: parts[3] ?? '',
26
+ zipCode: parts[4] ?? '',
27
+ country: parts[5] ?? 'USA',
28
+ };
29
+ }
30
+ const zip3 = parts[3] ?? '';
31
+ const zip4 = parts[4] ?? '';
32
+ // Typical corruption: empty place dropped → "street • city • state • zip • USA"
33
+ if (parts.length === 5 &&
34
+ zipLike(zip3) &&
35
+ /^(USA|United States)$/i.test(zip4)) {
36
+ return {
37
+ place: '',
38
+ street: parts[0] ?? '',
39
+ city: parts[1] ?? '',
40
+ state: parts[2] ?? '',
41
+ zipCode: parts[3] ?? '',
42
+ country: 'USA',
43
+ };
44
+ }
45
+ // "place • street • city • state • zip" (no country segment)
46
+ if (parts.length === 5 && zipLike(zip4)) {
47
+ return {
48
+ place: parts[0] ?? '',
49
+ street: parts[1] ?? '',
50
+ city: parts[2] ?? '',
51
+ state: parts[3] ?? '',
52
+ zipCode: parts[4] ?? '',
53
+ country: 'USA',
54
+ };
55
+ }
56
+ if (parts.length === 4 && zipLike(parts[3] ?? '')) {
57
+ return {
58
+ place: '',
59
+ street: parts[0] ?? '',
60
+ city: parts[1] ?? '',
61
+ state: parts[2] ?? '',
62
+ zipCode: parts[3] ?? '',
63
+ country: 'USA',
64
+ };
65
+ }
66
+ return null;
67
+ }
10
68
  export function databaseAddressStringToAddressValues(addressString) {
11
69
  if (addressString) {
12
- const addressArray = addressString.split(ADDRESS_DELIM);
70
+ const trimmed = addressString.trim();
71
+ if (trimmed.includes(ADDRESS_DELIM)) {
72
+ const addressArray = trimmed.split(ADDRESS_DELIM);
73
+ return {
74
+ place: addressArray[0] ?? '',
75
+ street: addressArray[1] ?? '',
76
+ city: addressArray[2] ?? '',
77
+ state: addressArray[3] ?? '',
78
+ zipCode: addressArray[4] ?? '',
79
+ country: addressArray[5]?.trim() || 'USA',
80
+ };
81
+ }
82
+ const legacyBullet = parseLegacyBulletDelimitedAddress(trimmed);
83
+ if (legacyBullet) {
84
+ return legacyBullet;
85
+ }
13
86
  return {
14
- place: addressArray[0],
15
- street: addressArray[1],
16
- city: addressArray[2],
17
- state: addressArray[3],
18
- zipCode: addressArray[4],
19
- country: 'USA'
87
+ place: trimmed,
88
+ street: '',
89
+ city: '',
90
+ state: '',
91
+ zipCode: '',
92
+ country: '',
20
93
  };
21
94
  }
22
95
  return { place: '', street: '', city: '', state: '', zipCode: '', country: '' };
@@ -30,49 +103,40 @@ export function formatLocalityForCardDisplay(city, state, country) {
30
103
  return parts.join(", ");
31
104
  }
32
105
  export function databaseAddressStringToOneLineString(addressString) {
33
- if (addressString) {
34
- // Special handling for place-only addresses
35
- if (!addressString.includes(ADDRESS_DELIM)) {
36
- return addressString.trim();
37
- }
38
- const address = databaseAddressStringToAddressValues(addressString);
39
- // If only place exists, just return it
40
- if (address.place &&
41
- (!address.street || address.street === 'undefined') &&
42
- (!address.city || address.city === 'undefined') &&
43
- (!address.state || address.state === 'undefined')) {
44
- return address.place.trim();
45
- }
46
- let addressArr = address.place ? [address.place] : [];
47
- // Add non-empty and non-undefined parts
48
- if (address.street && address.street !== 'undefined')
49
- addressArr.push(address.street);
50
- if (address.city && address.city !== 'undefined')
51
- addressArr.push(address.city);
52
- if (address.state && address.state !== 'undefined')
53
- addressArr.push(address.state);
54
- const addressStr = addressArr.filter(str => !!str && str !== 'undefined').join(', ');
55
- // Only add zip code if it exists and isn't 'undefined'
56
- return address.zipCode && address.zipCode !== 'undefined'
57
- ? `${addressStr} ${address.zipCode}`
58
- : addressStr;
106
+ if (!addressString) {
107
+ return '';
59
108
  }
60
- return '';
109
+ const address = databaseAddressStringToAddressValues(addressString);
110
+ // If only place exists, just return it (includes place-only strings with no delimiters)
111
+ if (address.place &&
112
+ (!address.street || address.street === 'undefined') &&
113
+ (!address.city || address.city === 'undefined') &&
114
+ (!address.state || address.state === 'undefined')) {
115
+ return address.place.trim();
116
+ }
117
+ let addressArr = address.place ? [address.place] : [];
118
+ if (address.street && address.street !== 'undefined')
119
+ addressArr.push(address.street);
120
+ if (address.city && address.city !== 'undefined')
121
+ addressArr.push(address.city);
122
+ if (address.state && address.state !== 'undefined')
123
+ addressArr.push(address.state);
124
+ const addressStr = addressArr.filter((str) => !!str && str !== 'undefined').join(', ');
125
+ return address.zipCode && address.zipCode !== 'undefined'
126
+ ? `${addressStr} ${address.zipCode}`
127
+ : addressStr;
61
128
  }
62
129
  export function databaseAddressStringToDisplayString(addressString) {
63
- if (addressString) {
64
- // Special handling for place-only addresses (no delimiters)
65
- if (!addressString.includes(ADDRESS_DELIM)) {
66
- return addressString.trim();
67
- }
68
- const oneLineString = databaseAddressStringToOneLineString(addressString);
69
- const formatted = oneLineString.replace(/([A-Z])(?=[A-Z][a-z])/g, "$1 ") // Add space between a single uppercase letter and a capitalized word
70
- .replace(/(\d)(?=[A-Z])/g, "$1 ") // Add space between numbers and letters
71
- .replace(/,/g, ", ") // Add space after commas
72
- .replace(/undefined/g, ""); // Remove any "undefined" strings
73
- return formatted;
130
+ if (!addressString) {
131
+ return '';
74
132
  }
75
- return '';
133
+ const oneLineString = databaseAddressStringToOneLineString(addressString);
134
+ const formatted = oneLineString
135
+ .replace(/([A-Z])(?=[A-Z][a-z])/g, '$1 ') // Add space between a single uppercase letter and a capitalized word
136
+ .replace(/(\d)(?=[A-Z])/g, '$1 ') // Add space between numbers and letters
137
+ .replace(/,/g, ', ') // Add space after commas
138
+ .replace(/undefined/g, ''); // Remove any "undefined" strings
139
+ return formatted;
76
140
  }
77
141
  export function addressToDisplayString(address) {
78
142
  let addressArr = address.place ? [address.place] : [];
@@ -80,32 +144,71 @@ export function addressToDisplayString(address) {
80
144
  const addressStr = addressArr.filter((str) => !!str).join(', ');
81
145
  return `${addressStr} ${address.zipCode}`;
82
146
  }
147
+ /** Prefer a precise street-level result; `results[0]` is often a coarse area (wrong street line). */
148
+ function pickBestGeocodeResult(results) {
149
+ if (!results?.length)
150
+ return undefined;
151
+ const streetAddress = results.find((r) => r.types?.includes("street_address"));
152
+ if (streetAddress)
153
+ return streetAddress;
154
+ const premise = results.find((r) => r.types?.includes("premise"));
155
+ if (premise)
156
+ return premise;
157
+ const rooftop = results.find((r) => r.geometry?.location_type === "ROOFTOP");
158
+ if (rooftop)
159
+ return rooftop;
160
+ const interpolated = results.find((r) => r.geometry?.location_type === "RANGE_INTERPOLATED");
161
+ if (interpolated)
162
+ return interpolated;
163
+ return results[0];
164
+ }
83
165
  export async function getAddressFromCoordinates(lat, lng) {
84
166
  const apiUrl = `https://maps.googleapis.com/maps/api/geocode/json?latlng=${lat},${lng}&key=${googleMapsApiKey}&loading=async`;
85
167
  try {
86
168
  const response = await fetch(apiUrl);
87
169
  const data = await response.json();
88
170
  if (data.results.length > 0) {
89
- const addressComponents = data.results[0].address_components;
90
- let street = "";
171
+ const firstResult = pickBestGeocodeResult(data.results);
172
+ if (!firstResult?.address_components) {
173
+ throw new Error("No address found");
174
+ }
175
+ const addressComponents = firstResult.address_components;
176
+ let streetNumber = "";
177
+ let route = "";
91
178
  let city = "";
92
179
  let state = "";
93
180
  let zipCode = "";
94
181
  addressComponents.forEach((component) => {
95
- if (component.types.includes("route")) {
96
- street = component.long_name;
182
+ const types = component.types;
183
+ if (types.includes("street_number")) {
184
+ streetNumber = component.long_name;
185
+ }
186
+ if (types.includes("route")) {
187
+ route = component.long_name;
97
188
  }
98
- else if (component.types.includes("locality")) {
189
+ else if (types.includes("locality")) {
99
190
  city = component.long_name;
100
191
  }
101
- else if (component.types.includes("administrative_area_level_1")) {
192
+ else if (types.includes("administrative_area_level_1")) {
102
193
  state = component.short_name;
103
194
  }
104
- else if (component.types.includes("postal_code")) {
195
+ else if (types.includes("postal_code")) {
105
196
  zipCode = component.long_name;
106
197
  }
107
198
  });
108
- return { place: '', street, city, state, zipCode, country: 'USA' };
199
+ // Match extractAddressComponents: US addresses split street across street_number + route.
200
+ let street = `${streetNumber} ${route}`.trim();
201
+ if (!street && firstResult.formatted_address) {
202
+ const firstSeg = firstResult.formatted_address.split(",")[0]?.trim() ?? "";
203
+ if (firstSeg && city && !firstSeg.toLowerCase().includes(city.toLowerCase())) {
204
+ street = firstSeg;
205
+ }
206
+ else if (firstSeg && !city) {
207
+ street = firstSeg;
208
+ }
209
+ }
210
+ // Place is intentionally empty here — only filled when user picks a Place in Maps UI or types it.
211
+ return { place: "", street, city, state, zipCode, country: "USA" };
109
212
  }
110
213
  else {
111
214
  throw new Error("No address found");
@@ -1 +1 @@
1
- {"version":3,"file":"addressUtils.js","sourceRoot":"","sources":["../../src/utils/addressUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"addressUtils.js","sourceRoot":"","sources":["../../src/utils/addressUtils.ts"],"names":[],"mappings":"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"}
@@ -471,9 +471,13 @@ describe("eligibilityValidator", () => {
471
471
  it("should handle timezone differences in dates", () => {
472
472
  const currentDate = new Date("2024-07-15T23:59:59Z");
473
473
  const expiryDate = new Date("2024-07-16T00:00:01Z");
474
- const offer = { id: "offer-1", endDate: expiryDate };
474
+ const offer = {
475
+ id: "offer-1",
476
+ isActive: true,
477
+ endDate: expiryDate,
478
+ };
475
479
  const result = validateOfferEligibility(offer, "user-1", 2, currentDate, 0);
476
- expect(result.eligible).toBe(true); // Still valid by 2 seconds
480
+ expect(result.eligible).toBe(true); // Still valid by 2 seconds (UTC)
477
481
  });
478
482
  });
479
483
  });