@memberstack/dom 2.0.1 → 2.0.2

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 (86) hide show
  1. package/README.md +356 -3
  2. package/lib/index.d.mts +1912 -64
  3. package/lib/index.d.ts +1912 -64
  4. package/lib/index.js +2316 -30656
  5. package/lib/index.mjs +2302 -30656
  6. package/lib/{types/utils/payloads.d.mts → models-CFT_ABd5.d.ts} +194 -6
  7. package/lib/testing/index.d.mts +295 -0
  8. package/lib/testing/index.d.ts +295 -0
  9. package/lib/testing/index.js +335 -0
  10. package/lib/testing/index.mjs +305 -0
  11. package/package.json +23 -12
  12. package/lib/auth/index.d.mts +0 -9
  13. package/lib/auth/index.d.ts +0 -9
  14. package/lib/auth/index.global.js +0 -244
  15. package/lib/auth/index.js +0 -158
  16. package/lib/auth/index.mjs +0 -121
  17. package/lib/constants/endpoints.d.mts +0 -5
  18. package/lib/constants/endpoints.d.ts +0 -5
  19. package/lib/constants/endpoints.global.js +0 -29
  20. package/lib/constants/endpoints.js +0 -31
  21. package/lib/constants/endpoints.mjs +0 -7
  22. package/lib/index.global.js +0 -46364
  23. package/lib/methods/dom/index.d.mts +0 -2
  24. package/lib/methods/dom/index.d.ts +0 -2
  25. package/lib/methods/dom/index.global.js +0 -2
  26. package/lib/methods/dom/index.js +0 -0
  27. package/lib/methods/dom/index.mjs +0 -0
  28. package/lib/methods/dom/main-dom.d.mts +0 -14
  29. package/lib/methods/dom/main-dom.d.ts +0 -14
  30. package/lib/methods/dom/main-dom.global.js +0 -30620
  31. package/lib/methods/dom/main-dom.js +0 -30618
  32. package/lib/methods/dom/main-dom.mjs +0 -30601
  33. package/lib/methods/dom/methods.d.mts +0 -18
  34. package/lib/methods/dom/methods.d.ts +0 -18
  35. package/lib/methods/dom/methods.global.js +0 -30827
  36. package/lib/methods/dom/methods.js +0 -30835
  37. package/lib/methods/dom/methods.mjs +0 -30806
  38. package/lib/methods/index.d.mts +0 -103
  39. package/lib/methods/index.d.ts +0 -103
  40. package/lib/methods/index.global.js +0 -46361
  41. package/lib/methods/index.js +0 -32125
  42. package/lib/methods/index.mjs +0 -32096
  43. package/lib/methods/requests/index.d.mts +0 -92
  44. package/lib/methods/requests/index.d.ts +0 -92
  45. package/lib/methods/requests/index.global.js +0 -15553
  46. package/lib/methods/requests/index.js +0 -1322
  47. package/lib/methods/requests/index.mjs +0 -1288
  48. package/lib/methods/requests/requests.d.mts +0 -42
  49. package/lib/methods/requests/requests.d.ts +0 -42
  50. package/lib/methods/requests/requests.global.js +0 -14528
  51. package/lib/methods/requests/requests.js +0 -242
  52. package/lib/methods/requests/requests.mjs +0 -209
  53. package/lib/types/index.d.mts +0 -4
  54. package/lib/types/index.d.ts +0 -4
  55. package/lib/types/index.global.js +0 -19
  56. package/lib/types/index.js +0 -17
  57. package/lib/types/index.mjs +0 -0
  58. package/lib/types/params.d.mts +0 -322
  59. package/lib/types/params.d.ts +0 -322
  60. package/lib/types/params.global.js +0 -19
  61. package/lib/types/params.js +0 -17
  62. package/lib/types/params.mjs +0 -0
  63. package/lib/types/payloads.d.mts +0 -143
  64. package/lib/types/payloads.d.ts +0 -143
  65. package/lib/types/payloads.global.js +0 -19
  66. package/lib/types/payloads.js +0 -17
  67. package/lib/types/payloads.mjs +0 -0
  68. package/lib/types/translations.d.mts +0 -43
  69. package/lib/types/translations.d.ts +0 -43
  70. package/lib/types/translations.global.js +0 -19
  71. package/lib/types/translations.js +0 -17
  72. package/lib/types/translations.mjs +0 -0
  73. package/lib/types/utils/payloads.d.ts +0 -299
  74. package/lib/types/utils/payloads.global.js +0 -19
  75. package/lib/types/utils/payloads.js +0 -17
  76. package/lib/types/utils/payloads.mjs +0 -0
  77. package/lib/utils/cookies.d.mts +0 -13
  78. package/lib/utils/cookies.d.ts +0 -13
  79. package/lib/utils/cookies.global.js +0 -261
  80. package/lib/utils/cookies.js +0 -179
  81. package/lib/utils/cookies.mjs +0 -138
  82. package/lib/utils/defaultMessageBox.d.mts +0 -5
  83. package/lib/utils/defaultMessageBox.d.ts +0 -5
  84. package/lib/utils/defaultMessageBox.global.js +0 -125
  85. package/lib/utils/defaultMessageBox.js +0 -129
  86. package/lib/utils/defaultMessageBox.mjs +0 -103
@@ -0,0 +1,295 @@
1
+ import { M as Member, a as Plan, c as PlanConnection, g as MemberCard, b as Price, A as App, C as ContentGroup } from '../models-CFT_ABd5.js';
2
+
3
+ /**
4
+ * @fileoverview Test utilities for Memberstack SDK.
5
+ * Provides mock factories and helpers for testing applications that use Memberstack.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { createMockMemberstack, mockMember, mockPlan } from '@memberstack/dom/testing';
10
+ *
11
+ * // Create a mock SDK instance
12
+ * const mockMs = createMockMemberstack({
13
+ * member: mockMember({ email: 'test@example.com' }),
14
+ * plans: [mockPlan({ name: 'Pro' })]
15
+ * });
16
+ *
17
+ * // Use in tests
18
+ * const { data: member } = await mockMs.getCurrentMember();
19
+ * expect(member?.auth.email).toBe('test@example.com');
20
+ * ```
21
+ *
22
+ * @packageDocumentation
23
+ */
24
+
25
+ /**
26
+ * Creates a mock member object with sensible defaults.
27
+ * Override any property by passing it in the options.
28
+ *
29
+ * @param overrides - Partial member data to override defaults
30
+ * @returns A complete mock Member object
31
+ *
32
+ * @example
33
+ * ```typescript
34
+ * // Basic usage
35
+ * const member = mockMember();
36
+ *
37
+ * // With custom email
38
+ * const member = mockMember({ auth: { email: 'custom@test.com' } });
39
+ *
40
+ * // With plans
41
+ * const member = mockMember({
42
+ * planConnections: [mockPlanConnection({ planId: 'pln_abc123' })]
43
+ * });
44
+ * ```
45
+ */
46
+ declare function mockMember(overrides?: DeepPartial<Member>): Member;
47
+ /**
48
+ * Creates a mock plan object.
49
+ *
50
+ * @param overrides - Partial plan data to override defaults
51
+ * @returns A complete mock Plan object
52
+ *
53
+ * @example
54
+ * ```typescript
55
+ * const freePlan = mockPlan({ name: 'Free', prices: [] });
56
+ * const proPlan = mockPlan({
57
+ * name: 'Pro',
58
+ * prices: [mockPrice({ amount: '9.99' })]
59
+ * });
60
+ * ```
61
+ */
62
+ declare function mockPlan(overrides?: DeepPartial<Plan>): Plan;
63
+ /**
64
+ * Creates a mock plan connection (member's subscription to a plan).
65
+ *
66
+ * @param overrides - Partial connection data to override defaults
67
+ * @returns A complete mock PlanConnection object
68
+ *
69
+ * @example
70
+ * ```typescript
71
+ * // Active subscription
72
+ * const conn = mockPlanConnection({ active: true, status: 'ACTIVE' });
73
+ *
74
+ * // Canceled subscription
75
+ * const conn = mockPlanConnection({
76
+ * active: false,
77
+ * status: 'CANCELED',
78
+ * payment: { cancelAtDate: Date.now() + 86400000 }
79
+ * });
80
+ * ```
81
+ */
82
+ declare function mockPlanConnection(overrides?: DeepPartial<PlanConnection>): PlanConnection;
83
+ /**
84
+ * Creates a mock payment card.
85
+ *
86
+ * @param overrides - Partial card data to override defaults
87
+ * @returns A complete mock MemberCard object
88
+ */
89
+ declare function mockCard(overrides?: DeepPartial<MemberCard>): MemberCard;
90
+ /**
91
+ * Creates a mock price object for a plan.
92
+ *
93
+ * @param overrides - Partial price data to override defaults
94
+ * @returns A complete mock Price object
95
+ *
96
+ * @example
97
+ * ```typescript
98
+ * const monthlyPrice = mockPrice({ amount: '9.99', name: 'Monthly' });
99
+ * const yearlyPrice = mockPrice({
100
+ * amount: '99.99',
101
+ * name: 'Yearly',
102
+ * interval: { type: 'year', count: 1 }
103
+ * });
104
+ * ```
105
+ */
106
+ declare function mockPrice(overrides?: DeepPartial<Price>): Price;
107
+ /**
108
+ * Creates a mock app configuration.
109
+ *
110
+ * @param overrides - Partial app data to override defaults
111
+ * @returns A complete mock App object
112
+ */
113
+ declare function mockApp(overrides?: DeepPartial<App>): App;
114
+ /**
115
+ * Creates a mock content group (restricted URL group).
116
+ *
117
+ * @param overrides - Partial group data to override defaults
118
+ * @returns A complete mock ContentGroup object
119
+ */
120
+ declare function mockContentGroup(overrides?: DeepPartial<ContentGroup>): ContentGroup;
121
+ /**
122
+ * Options for creating a mock Memberstack instance.
123
+ */
124
+ interface MockMemberstackOptions {
125
+ /** The currently logged-in member, or null if logged out */
126
+ member?: Member | null;
127
+ /** Available plans in the app */
128
+ plans?: Plan[];
129
+ /** App configuration */
130
+ app?: App;
131
+ /** Content groups */
132
+ contentGroups?: ContentGroup[];
133
+ /** Member's saved cards */
134
+ cards?: MemberCard[];
135
+ /** Custom method overrides */
136
+ overrides?: Partial<MockMemberstackInstance>;
137
+ }
138
+ /**
139
+ * Mock implementation of the Memberstack SDK.
140
+ * Implements the most commonly used methods for testing.
141
+ */
142
+ interface MockMemberstackInstance {
143
+ getCurrentMember: () => Promise<{
144
+ data: Member | null;
145
+ }>;
146
+ getPlans: () => Promise<{
147
+ data: Plan[];
148
+ }>;
149
+ getPlan: (params: {
150
+ planId: string;
151
+ }) => Promise<{
152
+ data: Plan | null;
153
+ }>;
154
+ getApp: () => Promise<{
155
+ data: App;
156
+ }>;
157
+ getRestrictedUrlGroups: () => Promise<{
158
+ data: ContentGroup[];
159
+ }>;
160
+ getMemberCards: () => Promise<{
161
+ data: MemberCard[];
162
+ }>;
163
+ loginMemberEmailPassword: (params: {
164
+ email: string;
165
+ password: string;
166
+ }) => Promise<{
167
+ data: {
168
+ member: Member;
169
+ tokens: {
170
+ accessToken: string;
171
+ expires: number;
172
+ type: string;
173
+ };
174
+ redirect: string;
175
+ };
176
+ }>;
177
+ signupMemberEmailPassword: (params: {
178
+ email: string;
179
+ password: string;
180
+ }) => Promise<{
181
+ data: {
182
+ member: Member;
183
+ tokens: {
184
+ accessToken: string;
185
+ expires: number;
186
+ type: string;
187
+ };
188
+ redirect: string;
189
+ };
190
+ }>;
191
+ logout: () => Promise<{
192
+ data: {
193
+ redirect?: string;
194
+ };
195
+ }>;
196
+ updateMember: (params: {
197
+ customFields?: object;
198
+ }) => Promise<{
199
+ data: Member;
200
+ }>;
201
+ onAuthChange: (callback: (payload: {
202
+ member: Member | null;
203
+ }) => void) => () => void;
204
+ _setMember: (member: Member | null) => void;
205
+ _getMockState: () => {
206
+ member: Member | null;
207
+ plans: Plan[];
208
+ app: App;
209
+ };
210
+ }
211
+ /**
212
+ * Creates a mock Memberstack SDK instance for testing.
213
+ * All methods return promises with mock data based on the provided options.
214
+ *
215
+ * @param options - Configuration for the mock instance
216
+ * @returns A mock Memberstack instance with common methods
217
+ *
218
+ * @example
219
+ * ```typescript
220
+ * // Basic setup
221
+ * const mockMs = createMockMemberstack({
222
+ * member: mockMember({ auth: { email: 'test@test.com' } }),
223
+ * plans: [mockPlan({ name: 'Free' }), mockPlan({ name: 'Pro' })]
224
+ * });
225
+ *
226
+ * // Use in component tests
227
+ * const { data: member } = await mockMs.getCurrentMember();
228
+ * expect(member).not.toBeNull();
229
+ *
230
+ * // Test logout flow
231
+ * await mockMs.logout();
232
+ * const { data: afterLogout } = await mockMs.getCurrentMember();
233
+ * expect(afterLogout).toBeNull();
234
+ *
235
+ * // Subscribe to auth changes
236
+ * const authCallback = jest.fn();
237
+ * mockMs.onAuthChange(authCallback);
238
+ * mockMs._setMember(null); // Simulate logout
239
+ * expect(authCallback).toHaveBeenCalledWith({ member: null });
240
+ * ```
241
+ */
242
+ declare function createMockMemberstack(options?: MockMemberstackOptions): MockMemberstackInstance;
243
+ /** Deep partial type for nested object overrides */
244
+ type DeepPartial<T> = {
245
+ [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
246
+ };
247
+ /**
248
+ * Custom matchers for testing Memberstack data.
249
+ * These can be extended with Jest's expect.extend() or Vitest's expect.extend().
250
+ *
251
+ * @example
252
+ * ```typescript
253
+ * // In your test setup file:
254
+ * import { memberstackMatchers } from '@memberstack/dom/testing';
255
+ * expect.extend(memberstackMatchers);
256
+ *
257
+ * // In tests:
258
+ * expect(member).toBeLoggedIn();
259
+ * expect(member).toHavePlan('pln_abc123');
260
+ * ```
261
+ */
262
+ declare const memberstackMatchers: {
263
+ /**
264
+ * Assert that a member is logged in (not null and has an email).
265
+ */
266
+ toBeLoggedIn(received: Member | null): {
267
+ pass: boolean;
268
+ message: () => string;
269
+ };
270
+ /**
271
+ * Assert that a member has a specific plan.
272
+ */
273
+ toHavePlan(received: Member | null, planId: string): {
274
+ pass: boolean;
275
+ message: () => string;
276
+ };
277
+ /**
278
+ * Assert that a member's email is verified.
279
+ */
280
+ toBeVerified(received: Member | null): {
281
+ pass: boolean;
282
+ message: () => "Expected member not to be verified" | "Expected member to be verified";
283
+ };
284
+ };
285
+ declare global {
286
+ namespace jest {
287
+ interface Matchers<R> {
288
+ toBeLoggedIn(): R;
289
+ toHavePlan(planId: string): R;
290
+ toBeVerified(): R;
291
+ }
292
+ }
293
+ }
294
+
295
+ export { type MockMemberstackInstance, type MockMemberstackOptions, createMockMemberstack, memberstackMatchers, mockApp, mockCard, mockContentGroup, mockMember, mockPlan, mockPlanConnection, mockPrice };
@@ -0,0 +1,335 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __defProps = Object.defineProperties;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
10
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
11
+ var __spreadValues = (a, b) => {
12
+ for (var prop in b || (b = {}))
13
+ if (__hasOwnProp.call(b, prop))
14
+ __defNormalProp(a, prop, b[prop]);
15
+ if (__getOwnPropSymbols)
16
+ for (var prop of __getOwnPropSymbols(b)) {
17
+ if (__propIsEnum.call(b, prop))
18
+ __defNormalProp(a, prop, b[prop]);
19
+ }
20
+ return a;
21
+ };
22
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
23
+ var __export = (target, all) => {
24
+ for (var name in all)
25
+ __defProp(target, name, { get: all[name], enumerable: true });
26
+ };
27
+ var __copyProps = (to, from, except, desc) => {
28
+ if (from && typeof from === "object" || typeof from === "function") {
29
+ for (let key of __getOwnPropNames(from))
30
+ if (!__hasOwnProp.call(to, key) && key !== except)
31
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
32
+ }
33
+ return to;
34
+ };
35
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
36
+ var __async = (__this, __arguments, generator) => {
37
+ return new Promise((resolve, reject) => {
38
+ var fulfilled = (value) => {
39
+ try {
40
+ step(generator.next(value));
41
+ } catch (e) {
42
+ reject(e);
43
+ }
44
+ };
45
+ var rejected = (value) => {
46
+ try {
47
+ step(generator.throw(value));
48
+ } catch (e) {
49
+ reject(e);
50
+ }
51
+ };
52
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
53
+ step((generator = generator.apply(__this, __arguments)).next());
54
+ });
55
+ };
56
+
57
+ // src/testing/index.ts
58
+ var testing_exports = {};
59
+ __export(testing_exports, {
60
+ createMockMemberstack: () => createMockMemberstack,
61
+ memberstackMatchers: () => memberstackMatchers,
62
+ mockApp: () => mockApp,
63
+ mockCard: () => mockCard,
64
+ mockContentGroup: () => mockContentGroup,
65
+ mockMember: () => mockMember,
66
+ mockPlan: () => mockPlan,
67
+ mockPlanConnection: () => mockPlanConnection,
68
+ mockPrice: () => mockPrice
69
+ });
70
+ module.exports = __toCommonJS(testing_exports);
71
+ function mockMember(overrides = {}) {
72
+ const defaults = {
73
+ id: `mem_${randomId()}`,
74
+ verified: true,
75
+ profileImage: "",
76
+ auth: {
77
+ email: "test@example.com",
78
+ hasPassword: true,
79
+ providers: []
80
+ },
81
+ loginRedirect: "/",
82
+ stripeCustomerId: "",
83
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
84
+ metaData: {},
85
+ customFields: {},
86
+ permissions: [],
87
+ planConnections: []
88
+ };
89
+ return deepMerge(defaults, overrides);
90
+ }
91
+ function mockPlan(overrides = {}) {
92
+ const defaults = {
93
+ id: `pln_${randomId()}`,
94
+ name: "Test Plan",
95
+ description: "A test plan",
96
+ status: "PUBLISHED",
97
+ redirects: {
98
+ afterLogin: "/",
99
+ afterLogout: "/",
100
+ afterSignup: "/"
101
+ },
102
+ prices: []
103
+ };
104
+ return deepMerge(defaults, overrides);
105
+ }
106
+ function mockPlanConnection(overrides = {}) {
107
+ const defaults = {
108
+ id: `conn_${randomId()}`,
109
+ active: true,
110
+ status: "ACTIVE",
111
+ planId: `pln_${randomId()}`,
112
+ type: "FREE",
113
+ payment: null
114
+ };
115
+ return deepMerge(defaults, overrides);
116
+ }
117
+ function mockCard(overrides = {}) {
118
+ const defaults = {
119
+ id: `card_${randomId()}`,
120
+ brand: "visa",
121
+ expMonth: "12",
122
+ expYear: String((/* @__PURE__ */ new Date()).getFullYear() + 3),
123
+ last4: "4242",
124
+ default: true
125
+ };
126
+ return deepMerge(defaults, overrides);
127
+ }
128
+ function mockPrice(overrides = {}) {
129
+ const defaults = {
130
+ id: `prc_${randomId()}`,
131
+ amount: "0",
132
+ interval: {
133
+ type: "month",
134
+ count: 1
135
+ },
136
+ name: "Monthly",
137
+ type: "SUBSCRIPTION",
138
+ status: "ACTIVE",
139
+ currency: "usd"
140
+ };
141
+ return deepMerge(defaults, overrides);
142
+ }
143
+ function mockApp(overrides = {}) {
144
+ const defaults = {
145
+ id: `app_${randomId()}`,
146
+ name: "Test App",
147
+ mode: "sandbox",
148
+ plans: [],
149
+ contentGroups: [],
150
+ emailVerificationEnabled: false,
151
+ requireEmailVerification: false,
152
+ customField: [],
153
+ branding: {
154
+ logo: "",
155
+ colors: {
156
+ lightMode: {
157
+ primaryButton: "#6366f1"
158
+ }
159
+ }
160
+ },
161
+ authProviders: []
162
+ };
163
+ return deepMerge(defaults, overrides);
164
+ }
165
+ function mockContentGroup(overrides = {}) {
166
+ const defaults = {
167
+ id: `grp_${randomId()}`,
168
+ name: "Test Group",
169
+ key: "test-group",
170
+ allowAllMembers: false,
171
+ activeMemberHasAccess: false,
172
+ redirect: "/login",
173
+ urls: [],
174
+ plans: []
175
+ };
176
+ return deepMerge(defaults, overrides);
177
+ }
178
+ function createMockMemberstack(options = {}) {
179
+ var _a, _b, _c, _d, _e;
180
+ let currentMember = (_a = options.member) != null ? _a : null;
181
+ const plans = (_b = options.plans) != null ? _b : [];
182
+ const app = (_c = options.app) != null ? _c : mockApp();
183
+ const contentGroups = (_d = options.contentGroups) != null ? _d : [];
184
+ const cards = (_e = options.cards) != null ? _e : [];
185
+ const authListeners = [];
186
+ const notifyAuthChange = () => {
187
+ authListeners.forEach((cb) => cb({ member: currentMember }));
188
+ };
189
+ const instance = {
190
+ getCurrentMember: () => __async(this, null, function* () {
191
+ return { data: currentMember };
192
+ }),
193
+ getPlans: () => __async(this, null, function* () {
194
+ return { data: plans };
195
+ }),
196
+ getPlan: (_0) => __async(this, [_0], function* ({ planId }) {
197
+ var _a2;
198
+ return {
199
+ data: (_a2 = plans.find((p) => p.id === planId)) != null ? _a2 : null
200
+ };
201
+ }),
202
+ getApp: () => __async(this, null, function* () {
203
+ return { data: app };
204
+ }),
205
+ getRestrictedUrlGroups: () => __async(this, null, function* () {
206
+ return { data: contentGroups };
207
+ }),
208
+ getMemberCards: () => __async(this, null, function* () {
209
+ return { data: cards };
210
+ }),
211
+ loginMemberEmailPassword: (_0) => __async(this, [_0], function* ({ email }) {
212
+ currentMember = mockMember({ auth: { email, hasPassword: true, providers: [] } });
213
+ notifyAuthChange();
214
+ return {
215
+ data: {
216
+ member: currentMember,
217
+ tokens: { accessToken: `mock_token_${randomId()}`, expires: Date.now() + 36e5, type: "bearer" },
218
+ redirect: "/"
219
+ }
220
+ };
221
+ }),
222
+ signupMemberEmailPassword: (_0) => __async(this, [_0], function* ({ email }) {
223
+ currentMember = mockMember({ auth: { email, hasPassword: true, providers: [] } });
224
+ notifyAuthChange();
225
+ return {
226
+ data: {
227
+ member: currentMember,
228
+ tokens: { accessToken: `mock_token_${randomId()}`, expires: Date.now() + 36e5, type: "bearer" },
229
+ redirect: "/"
230
+ }
231
+ };
232
+ }),
233
+ logout: () => __async(this, null, function* () {
234
+ currentMember = null;
235
+ notifyAuthChange();
236
+ return { data: {} };
237
+ }),
238
+ updateMember: (_0) => __async(this, [_0], function* ({ customFields }) {
239
+ if (!currentMember) {
240
+ throw new Error("Not logged in");
241
+ }
242
+ if (customFields) {
243
+ currentMember = __spreadProps(__spreadValues({}, currentMember), {
244
+ customFields: __spreadValues(__spreadValues({}, currentMember.customFields), customFields)
245
+ });
246
+ }
247
+ return { data: currentMember };
248
+ }),
249
+ onAuthChange: (callback) => {
250
+ authListeners.push(callback);
251
+ callback({ member: currentMember });
252
+ return () => {
253
+ const index = authListeners.indexOf(callback);
254
+ if (index > -1)
255
+ authListeners.splice(index, 1);
256
+ };
257
+ },
258
+ // Test helpers
259
+ _setMember: (member) => {
260
+ currentMember = member;
261
+ notifyAuthChange();
262
+ },
263
+ _getMockState: () => ({ member: currentMember, plans, app })
264
+ };
265
+ if (options.overrides) {
266
+ Object.assign(instance, options.overrides);
267
+ }
268
+ return instance;
269
+ }
270
+ function randomId() {
271
+ return Math.random().toString(36).substring(2, 10);
272
+ }
273
+ function deepMerge(target, source) {
274
+ const result = __spreadValues({}, target);
275
+ for (const key in source) {
276
+ if (Object.prototype.hasOwnProperty.call(source, key)) {
277
+ const sourceValue = source[key];
278
+ const targetValue = result[key];
279
+ if (sourceValue !== void 0 && typeof sourceValue === "object" && sourceValue !== null && !Array.isArray(sourceValue) && typeof targetValue === "object" && targetValue !== null && !Array.isArray(targetValue)) {
280
+ result[key] = deepMerge(targetValue, sourceValue);
281
+ } else if (sourceValue !== void 0) {
282
+ result[key] = sourceValue;
283
+ }
284
+ }
285
+ }
286
+ return result;
287
+ }
288
+ var memberstackMatchers = {
289
+ /**
290
+ * Assert that a member is logged in (not null and has an email).
291
+ */
292
+ toBeLoggedIn(received) {
293
+ var _a;
294
+ const pass = received !== null && typeof ((_a = received.auth) == null ? void 0 : _a.email) === "string";
295
+ return {
296
+ pass,
297
+ message: () => pass ? `Expected member not to be logged in` : `Expected member to be logged in, but got ${received === null ? "null" : "invalid member object"}`
298
+ };
299
+ },
300
+ /**
301
+ * Assert that a member has a specific plan.
302
+ */
303
+ toHavePlan(received, planId) {
304
+ var _a, _b;
305
+ const hasPlan = (_b = (_a = received == null ? void 0 : received.planConnections) == null ? void 0 : _a.some(
306
+ (conn) => conn.planId === planId && conn.active
307
+ )) != null ? _b : false;
308
+ return {
309
+ pass: hasPlan,
310
+ message: () => hasPlan ? `Expected member not to have plan ${planId}` : `Expected member to have plan ${planId}, but they don't`
311
+ };
312
+ },
313
+ /**
314
+ * Assert that a member's email is verified.
315
+ */
316
+ toBeVerified(received) {
317
+ const pass = (received == null ? void 0 : received.verified) === true;
318
+ return {
319
+ pass,
320
+ message: () => pass ? `Expected member not to be verified` : `Expected member to be verified`
321
+ };
322
+ }
323
+ };
324
+ // Annotate the CommonJS export names for ESM import in node:
325
+ 0 && (module.exports = {
326
+ createMockMemberstack,
327
+ memberstackMatchers,
328
+ mockApp,
329
+ mockCard,
330
+ mockContentGroup,
331
+ mockMember,
332
+ mockPlan,
333
+ mockPlanConnection,
334
+ mockPrice
335
+ });