@churchapps/apphelper 0.12.0 → 0.14.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 (65) hide show
  1. package/dist/donations/components/MultiGatewayDonationForm.d.ts.map +1 -1
  2. package/dist/donations/components/MultiGatewayDonationForm.js +88 -184
  3. package/dist/donations/components/MultiGatewayDonationForm.js.map +1 -1
  4. package/dist/donations/components/NonAuthDonation.d.ts.map +1 -1
  5. package/dist/donations/components/NonAuthDonation.js +16 -74
  6. package/dist/donations/components/NonAuthDonation.js.map +1 -1
  7. package/dist/donations/components/PayPalNonAuthDonationInner.d.ts.map +1 -1
  8. package/dist/donations/components/PayPalNonAuthDonationInner.js +9 -5
  9. package/dist/donations/components/PayPalNonAuthDonationInner.js.map +1 -1
  10. package/dist/donations/components/PaymentMethods.d.ts.map +1 -1
  11. package/dist/donations/components/PaymentMethods.js +33 -31
  12. package/dist/donations/components/PaymentMethods.js.map +1 -1
  13. package/dist/donations/components/RecurringDonations.js +6 -6
  14. package/dist/donations/components/RecurringDonations.js.map +1 -1
  15. package/dist/donations/components/index.d.ts +0 -2
  16. package/dist/donations/components/index.d.ts.map +1 -1
  17. package/dist/donations/components/index.js +0 -1
  18. package/dist/donations/components/index.js.map +1 -1
  19. package/dist/donations/helpers/DonationHelper.d.ts +3 -3
  20. package/dist/donations/helpers/DonationHelper.d.ts.map +1 -1
  21. package/dist/donations/helpers/DonationHelper.js +6 -3
  22. package/dist/donations/helpers/DonationHelper.js.map +1 -1
  23. package/dist/donations/helpers/DonationInterface.d.ts +1 -1
  24. package/dist/donations/helpers/DonationInterface.d.ts.map +1 -1
  25. package/dist/donations/helpers/PaymentMethod.d.ts +2 -2
  26. package/dist/donations/helpers/PaymentMethod.d.ts.map +1 -1
  27. package/dist/donations/helpers/StripePaymentMethod.d.ts +1 -1
  28. package/dist/donations/helpers/StripePaymentMethod.d.ts.map +1 -1
  29. package/dist/donations/index.d.ts +1 -0
  30. package/dist/donations/index.d.ts.map +1 -1
  31. package/dist/donations/index.js +1 -0
  32. package/dist/donations/index.js.map +1 -1
  33. package/dist/donations/providers/KingdomFundingProvider.d.ts +3 -0
  34. package/dist/donations/providers/KingdomFundingProvider.d.ts.map +1 -0
  35. package/dist/donations/providers/KingdomFundingProvider.js +86 -0
  36. package/dist/donations/providers/KingdomFundingProvider.js.map +1 -0
  37. package/dist/donations/providers/PayPalProvider.d.ts +3 -0
  38. package/dist/donations/providers/PayPalProvider.d.ts.map +1 -0
  39. package/dist/donations/providers/PayPalProvider.js +84 -0
  40. package/dist/donations/providers/PayPalProvider.js.map +1 -0
  41. package/dist/donations/providers/StripeProvider.d.ts +34 -0
  42. package/dist/donations/providers/StripeProvider.d.ts.map +1 -0
  43. package/dist/donations/providers/StripeProvider.js +74 -0
  44. package/dist/donations/providers/StripeProvider.js.map +1 -0
  45. package/dist/donations/providers/index.d.ts +3 -0
  46. package/dist/donations/providers/index.d.ts.map +1 -0
  47. package/dist/donations/providers/index.js +6 -0
  48. package/dist/donations/providers/index.js.map +1 -0
  49. package/dist/donations/providers/registry.d.ts +6 -0
  50. package/dist/donations/providers/registry.d.ts.map +1 -0
  51. package/dist/donations/providers/registry.js +36 -0
  52. package/dist/donations/providers/registry.js.map +1 -0
  53. package/dist/donations/providers/types.d.ts +113 -0
  54. package/dist/donations/providers/types.d.ts.map +1 -0
  55. package/dist/donations/providers/types.js +2 -0
  56. package/dist/donations/providers/types.js.map +1 -0
  57. package/package.json +1 -1
  58. package/dist/donations/components/PayPalCardForm.d.ts +0 -17
  59. package/dist/donations/components/PayPalCardForm.d.ts.map +0 -1
  60. package/dist/donations/components/PayPalCardForm.js +0 -118
  61. package/dist/donations/components/PayPalCardForm.js.map +0 -1
  62. package/dist/helpers/__tests__/WebPushHelper.test.d.ts +0 -13
  63. package/dist/helpers/__tests__/WebPushHelper.test.d.ts.map +0 -1
  64. package/dist/helpers/__tests__/WebPushHelper.test.js +0 -99
  65. package/dist/helpers/__tests__/WebPushHelper.test.js.map +0 -1
@@ -0,0 +1,113 @@
1
+ import type { ReactNode, FC, ForwardRefExoticComponent, RefAttributes } from "react";
2
+ import type { Stripe } from "@stripe/stripe-js";
3
+ import type { PaymentGateway } from "../helpers";
4
+ import type { PaperProps } from "@mui/material/Paper";
5
+ export interface PaymentToken {
6
+ id: string;
7
+ type: "card" | "bank" | "paypal";
8
+ saved?: boolean;
9
+ brand?: string;
10
+ last4?: string;
11
+ expMonth?: string;
12
+ expYear?: string;
13
+ }
14
+ export interface ChargeContext {
15
+ provider: string;
16
+ gatewayId?: string;
17
+ churchId: string;
18
+ amount: number;
19
+ funds: {
20
+ id: string;
21
+ amount: number;
22
+ }[];
23
+ person: {
24
+ id: string;
25
+ email: string;
26
+ name: string;
27
+ };
28
+ notes?: string;
29
+ church: {
30
+ name: string;
31
+ subDomain: string;
32
+ churchURL: string;
33
+ logo: string;
34
+ };
35
+ recurring: boolean;
36
+ interval?: {
37
+ interval_count: number;
38
+ interval: string;
39
+ };
40
+ billingCycleAnchor?: number;
41
+ saveCard?: boolean;
42
+ customerId?: string;
43
+ currency?: string;
44
+ }
45
+ export interface ChargeRequest {
46
+ endpoint: "/donate/charge" | "/donate/subscribe";
47
+ body: any;
48
+ }
49
+ export interface FinalizeResult {
50
+ result: any;
51
+ requiresAction?: boolean;
52
+ success?: boolean;
53
+ error?: string;
54
+ }
55
+ export interface ProviderCapabilities {
56
+ savedCard: boolean;
57
+ savedBank: boolean;
58
+ guestAch: boolean;
59
+ memberNewCard: boolean;
60
+ recurring: boolean;
61
+ editRecurring: boolean;
62
+ }
63
+ export interface ProviderDescriptor {
64
+ adminValue: string;
65
+ label: string;
66
+ keyLabels: {
67
+ public: string;
68
+ private: string;
69
+ webhook?: string;
70
+ };
71
+ feeFields: ("card" | "ach" | "paypal" | "kf")[];
72
+ currencies: string[] | "all";
73
+ selectableInAdmin: boolean;
74
+ betaOnly?: boolean;
75
+ setupInstructionsKey?: string;
76
+ signupUrl?: (church: any, user: any) => string;
77
+ }
78
+ export interface MemberEntryHandle {
79
+ tokenize(): Promise<PaymentToken>;
80
+ }
81
+ export interface MemberEntryProps {
82
+ gateway: PaymentGateway;
83
+ getContext?: () => ChargeContext;
84
+ }
85
+ export interface GuestFormProps {
86
+ churchId: string;
87
+ gateway: PaymentGateway;
88
+ recaptchaSiteKey: string;
89
+ mainContainerCssProps?: PaperProps;
90
+ showHeader?: boolean;
91
+ churchLogo?: string;
92
+ allowSingleGift?: boolean;
93
+ allowRecurring?: boolean;
94
+ showFundSelector?: boolean;
95
+ allowedFundIds?: string[];
96
+ defaultFundId?: string;
97
+ }
98
+ export interface PaymentProvider {
99
+ readonly key: string;
100
+ readonly descriptor: ProviderDescriptor;
101
+ readonly capabilities: ProviderCapabilities;
102
+ MemberWrapper?: FC<{
103
+ stripePromise?: Promise<Stripe | null> | null;
104
+ children: ReactNode;
105
+ }>;
106
+ MemberEntry?: ForwardRefExoticComponent<MemberEntryProps & RefAttributes<MemberEntryHandle>>;
107
+ buildChargeRequest(ctx: ChargeContext, token: PaymentToken): ChargeRequest;
108
+ finalizeResult?(result: any, deps: {
109
+ stripe?: Stripe | null;
110
+ }): Promise<FinalizeResult>;
111
+ GuestForm: FC<GuestFormProps>;
112
+ }
113
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/donations/providers/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/donations/providers/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@churchapps/apphelper",
3
- "version": "0.12.0",
3
+ "version": "0.14.0",
4
4
  "description": "Library of helper functions, components, and feature modules (donations/forms/login/markdown/website) for React and NextJS ChurchApps",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -1,17 +0,0 @@
1
- import React from "react";
2
- interface PayPalCardFormProps {
3
- onCardDataChange?: (cardData: PayPalCardData) => void;
4
- style?: React.CSSProperties;
5
- }
6
- export interface PayPalCardData {
7
- cardNumber: string;
8
- expiryMonth: string;
9
- expiryYear: string;
10
- cvv: string;
11
- holderName: string;
12
- isValid: boolean;
13
- errors: string[];
14
- }
15
- export declare const PayPalCardForm: React.FC<PayPalCardFormProps>;
16
- export {};
17
- //# sourceMappingURL=PayPalCardForm.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PayPalCardForm.d.ts","sourceRoot":"","sources":["../../../src/donations/components/PayPalCardForm.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAgC,MAAM,OAAO,CAAC;AAGrD,UAAU,mBAAmB;IAC3B,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAC;IACtD,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAuDD,eAAO,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,mBAAmB,CAqJxD,CAAC"}
@@ -1,118 +0,0 @@
1
- "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useState, useCallback } from "react";
4
- import { Grid, TextField, Box } from "@mui/material";
5
- const validateCardNumber = (number) => {
6
- // Remove spaces and non-numeric characters
7
- const cleanNumber = number.replace(/\D/g, "");
8
- // Check length (13-19 digits for most cards)
9
- if (cleanNumber.length < 13 || cleanNumber.length > 19) {
10
- return false;
11
- }
12
- // Luhn algorithm
13
- let sum = 0;
14
- let isEven = false;
15
- for (let i = cleanNumber.length - 1; i >= 0; i--) {
16
- let digit = parseInt(cleanNumber.charAt(i));
17
- if (isEven) {
18
- digit *= 2;
19
- if (digit > 9) {
20
- digit -= 9;
21
- }
22
- }
23
- sum += digit;
24
- isEven = !isEven;
25
- }
26
- return sum % 10 === 0;
27
- };
28
- const validateExpiryDate = (month, year) => {
29
- const currentDate = new Date();
30
- const currentMonth = currentDate.getMonth() + 1;
31
- const currentYear = currentDate.getFullYear();
32
- const expMonth = parseInt(month);
33
- let expYear = parseInt(year);
34
- // Support 2-digit year inputs by converting to full year (e.g., 25 => 2025)
35
- if (!isNaN(expYear) && expYear < 100)
36
- expYear = 2000 + expYear;
37
- if (isNaN(expMonth) || expMonth < 1 || expMonth > 12)
38
- return false;
39
- if (isNaN(expYear))
40
- return false;
41
- if (expYear < currentYear)
42
- return false;
43
- if (expYear === currentYear && expMonth < currentMonth)
44
- return false;
45
- return true;
46
- };
47
- const validateCVV = (cvv) => {
48
- return /^\d{3,4}$/.test(cvv);
49
- };
50
- export const PayPalCardForm = ({ onCardDataChange, style }) => {
51
- const [cardNumber, setCardNumber] = useState("");
52
- const [expiryMonth, setExpiryMonth] = useState("");
53
- const [expiryYear, setExpiryYear] = useState("");
54
- const [cvv, setCvv] = useState("");
55
- const [holderName, setHolderName] = useState("");
56
- const formatCardNumber = (value) => {
57
- // Remove all non-numeric characters
58
- const numericOnly = value.replace(/\D/g, "");
59
- // Add spaces every 4 digits
60
- const formatted = numericOnly.replace(/(\d{4})(?=\d)/g, "$1 ");
61
- // Limit to 19 digits (including spaces)
62
- return formatted.substring(0, 23);
63
- };
64
- const validateAndNotify = useCallback((cardNum, expMonth, expYear, cvvValue, name) => {
65
- const errors = [];
66
- const cleanCardNumber = cardNum.replace(/\D/g, "");
67
- if (!name.trim()) {
68
- errors.push("Card holder name is required");
69
- }
70
- if (!validateCardNumber(cleanCardNumber)) {
71
- errors.push("Invalid card number");
72
- }
73
- if (!validateExpiryDate(expMonth, expYear)) {
74
- errors.push("Invalid expiry date");
75
- }
76
- if (!validateCVV(cvvValue)) {
77
- errors.push("Invalid CVV");
78
- }
79
- const cardData = {
80
- cardNumber: cleanCardNumber,
81
- expiryMonth: expMonth.padStart(2, "0"),
82
- expiryYear: expYear,
83
- cvv: cvvValue,
84
- holderName: name,
85
- isValid: errors.length === 0,
86
- errors
87
- };
88
- onCardDataChange?.(cardData);
89
- }, [onCardDataChange]);
90
- const handleCardNumberChange = (e) => {
91
- const formatted = formatCardNumber(e.target.value);
92
- setCardNumber(formatted);
93
- validateAndNotify(formatted, expiryMonth, expiryYear, cvv, holderName);
94
- };
95
- const handleExpiryMonthChange = (e) => {
96
- const value = e.target.value.replace(/\D/g, "").substring(0, 2);
97
- setExpiryMonth(value);
98
- validateAndNotify(cardNumber, value, expiryYear, cvv, holderName);
99
- };
100
- const handleExpiryYearChange = (e) => {
101
- const value = e.target.value.replace(/\D/g, "").substring(0, 4);
102
- setExpiryYear(value);
103
- validateAndNotify(cardNumber, expiryMonth, value, cvv, holderName);
104
- };
105
- const handleCvvChange = (e) => {
106
- const value = e.target.value.replace(/\D/g, "").substring(0, 4);
107
- setCvv(value);
108
- validateAndNotify(cardNumber, expiryMonth, expiryYear, value, holderName);
109
- };
110
- const handleHolderNameChange = (e) => {
111
- const value = e.target.value;
112
- setHolderName(value);
113
- validateAndNotify(cardNumber, expiryMonth, expiryYear, cvv, value);
114
- };
115
- // Note: years and months arrays could be used for dropdown selects if needed in the future
116
- return (_jsx(Box, { style: { ...style }, sx: { p: 1.5, backgroundColor: "white", border: "1px solid #ccc", borderRadius: 1 }, children: _jsxs(Grid, { container: true, spacing: 2, children: [_jsx(Grid, { size: 12, children: _jsx(TextField, { fullWidth: true, label: "Card Holder Name", value: holderName, onChange: handleHolderNameChange, placeholder: "John Doe", size: "small" }) }), _jsx(Grid, { size: 12, children: _jsx(TextField, { fullWidth: true, label: "Card Number", value: cardNumber, onChange: handleCardNumberChange, placeholder: "1234 5678 9012 3456", inputProps: { maxLength: 23 }, size: "small" }) }), _jsx(Grid, { size: { xs: 6, sm: 3 }, children: _jsx(TextField, { fullWidth: true, label: "Month", value: expiryMonth, onChange: handleExpiryMonthChange, placeholder: "MM", inputProps: { maxLength: 2 }, size: "small" }) }), _jsx(Grid, { size: { xs: 6, sm: 3 }, children: _jsx(TextField, { fullWidth: true, label: "Year", value: expiryYear, onChange: handleExpiryYearChange, placeholder: "YYYY", inputProps: { maxLength: 4 }, size: "small" }) }), _jsx(Grid, { size: { xs: 12, sm: 6 }, children: _jsx(TextField, { fullWidth: true, label: "CVV", value: cvv, onChange: handleCvvChange, placeholder: "123", inputProps: { maxLength: 4 }, size: "small" }) })] }) }));
117
- };
118
- //# sourceMappingURL=PayPalCardForm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PayPalCardForm.js","sourceRoot":"","sources":["../../../src/donations/components/PayPalCardForm.tsx"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- /**
2
- * @vitest-environment jsdom
3
- *
4
- * Unit test for the consolidated apphelper WebPushHelper.subscribe() flow.
5
- * Stubs the browser push APIs + the underlying ApiHelper, then runs subscribe()
6
- * end-to-end and asserts:
7
- * - the right VAPID public key is fetched from the server
8
- * - pushManager.subscribe is called with userVisibleOnly + the decoded VAPID key
9
- * - POST /webpush/subscribe is called with the right body shape (the same shape
10
- * the server's `webpush:` token decoder expects)
11
- */
12
- export {};
13
- //# sourceMappingURL=WebPushHelper.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"WebPushHelper.test.d.ts","sourceRoot":"","sources":["../../../src/helpers/__tests__/WebPushHelper.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
@@ -1,99 +0,0 @@
1
- /**
2
- * @vitest-environment jsdom
3
- *
4
- * Unit test for the consolidated apphelper WebPushHelper.subscribe() flow.
5
- * Stubs the browser push APIs + the underlying ApiHelper, then runs subscribe()
6
- * end-to-end and asserts:
7
- * - the right VAPID public key is fetched from the server
8
- * - pushManager.subscribe is called with userVisibleOnly + the decoded VAPID key
9
- * - POST /webpush/subscribe is called with the right body shape (the same shape
10
- * the server's `webpush:` token decoder expects)
11
- */
12
- import { describe, it, expect, vi, beforeEach } from "vitest";
13
- // Mock @churchapps/helpers — WebPushHelper imports ApiHelper + UserHelper from there.
14
- const apiPostMock = vi.fn().mockResolvedValue(undefined);
15
- const apiGetMock = vi.fn().mockResolvedValue({ publicKey: "BNcRdreALRFXTkOOUHK1EtK2wtaz5Ry4YfYCA_0QTpQtUbVlUls0VJXg7A8u-Ts1XbjhazAkj7I99e8QcYP7DkM", enabled: true });
16
- vi.mock("@churchapps/helpers", () => ({
17
- ApiHelper: { get: apiGetMock, post: apiPostMock },
18
- UserHelper: { user: { id: "USR00000001" } },
19
- }));
20
- const { WebPushHelper } = await import("../WebPushHelper");
21
- describe("WebPushHelper.subscribe", () => {
22
- let fakeSubscription;
23
- let pushManagerSubscribeMock;
24
- let pushManagerGetSubscriptionMock;
25
- beforeEach(() => {
26
- apiPostMock.mockClear();
27
- apiGetMock.mockClear();
28
- fakeSubscription = {
29
- endpoint: `https://example-push.test/endpoint/${Date.now()}`,
30
- toJSON() {
31
- return {
32
- endpoint: this.endpoint,
33
- keys: { p256dh: "p256dh-fake", auth: "auth-fake" },
34
- };
35
- },
36
- };
37
- pushManagerSubscribeMock = vi.fn().mockResolvedValue(fakeSubscription);
38
- pushManagerGetSubscriptionMock = vi.fn().mockResolvedValue(null);
39
- const fakeRegistration = {
40
- scope: "/mobile",
41
- pushManager: {
42
- subscribe: pushManagerSubscribeMock,
43
- getSubscription: pushManagerGetSubscriptionMock,
44
- },
45
- };
46
- Object.defineProperty(navigator, "serviceWorker", {
47
- configurable: true,
48
- value: {
49
- getRegistration: vi.fn().mockResolvedValue(fakeRegistration),
50
- register: vi.fn().mockResolvedValue(fakeRegistration),
51
- ready: Promise.resolve(fakeRegistration),
52
- },
53
- });
54
- // PushManager presence is what isSupported() checks for
55
- window.PushManager = function () { };
56
- // Notification API
57
- window.Notification = function () { };
58
- window.Notification.permission = "default";
59
- window.Notification.requestPermission = vi.fn().mockResolvedValue("granted");
60
- // Clear any prior opt-out / cooldown state in the jsdom localStorage
61
- window.localStorage.clear();
62
- });
63
- it("posts a webpush subscription to the server when the user grants permission", async () => {
64
- WebPushHelper.configure({ scope: "/mobile", appName: "B1AppPwa" });
65
- const sub = await WebPushHelper.subscribe();
66
- expect(sub).toBeTruthy();
67
- expect(sub?.endpoint).toBe(fakeSubscription.endpoint);
68
- // VAPID public key request to the server
69
- expect(apiGetMock).toHaveBeenCalledWith("/webpush/publicKey", "MessagingApi");
70
- // pushManager.subscribe was called with userVisibleOnly + the decoded key bytes
71
- expect(pushManagerSubscribeMock).toHaveBeenCalledTimes(1);
72
- const args = pushManagerSubscribeMock.mock.calls[0][0];
73
- expect(args.userVisibleOnly).toBe(true);
74
- expect(args.applicationServerKey).toBeInstanceOf(Uint8Array);
75
- // The subscription POST carries the right body shape
76
- expect(apiPostMock).toHaveBeenCalledWith("/webpush/subscribe", expect.objectContaining({
77
- appName: "B1AppPwa",
78
- subscription: expect.objectContaining({
79
- endpoint: fakeSubscription.endpoint,
80
- keys: expect.objectContaining({ p256dh: "p256dh-fake", auth: "auth-fake" }),
81
- }),
82
- }), "MessagingApi");
83
- });
84
- it("returns null and does not POST if permission is denied", async () => {
85
- window.Notification.requestPermission = vi.fn().mockResolvedValue("denied");
86
- const sub = await WebPushHelper.subscribe();
87
- expect(sub).toBeNull();
88
- expect(apiPostMock).not.toHaveBeenCalled();
89
- expect(pushManagerSubscribeMock).not.toHaveBeenCalled();
90
- });
91
- it("re-posts an existing subscription instead of subscribing again", async () => {
92
- pushManagerGetSubscriptionMock.mockResolvedValue(fakeSubscription);
93
- const sub = await WebPushHelper.subscribe();
94
- expect(sub).toBeTruthy();
95
- expect(pushManagerSubscribeMock).not.toHaveBeenCalled();
96
- expect(apiPostMock).toHaveBeenCalledTimes(1);
97
- });
98
- });
99
- //# sourceMappingURL=WebPushHelper.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"WebPushHelper.test.js","sourceRoot":"","sources":["../../../src/helpers/__tests__/WebPushHelper.test.ts"],"names":[],"mappings":"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"}