@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.
- package/README.md +356 -3
- package/lib/index.d.mts +1912 -64
- package/lib/index.d.ts +1912 -64
- package/lib/index.js +2316 -30656
- package/lib/index.mjs +2302 -30656
- package/lib/{types/utils/payloads.d.mts → models-CFT_ABd5.d.ts} +194 -6
- package/lib/testing/index.d.mts +295 -0
- package/lib/testing/index.d.ts +295 -0
- package/lib/testing/index.js +335 -0
- package/lib/testing/index.mjs +305 -0
- package/package.json +23 -12
- package/lib/auth/index.d.mts +0 -9
- package/lib/auth/index.d.ts +0 -9
- package/lib/auth/index.global.js +0 -244
- package/lib/auth/index.js +0 -158
- package/lib/auth/index.mjs +0 -121
- package/lib/constants/endpoints.d.mts +0 -5
- package/lib/constants/endpoints.d.ts +0 -5
- package/lib/constants/endpoints.global.js +0 -29
- package/lib/constants/endpoints.js +0 -31
- package/lib/constants/endpoints.mjs +0 -7
- package/lib/index.global.js +0 -46364
- package/lib/methods/dom/index.d.mts +0 -2
- package/lib/methods/dom/index.d.ts +0 -2
- package/lib/methods/dom/index.global.js +0 -2
- package/lib/methods/dom/index.js +0 -0
- package/lib/methods/dom/index.mjs +0 -0
- package/lib/methods/dom/main-dom.d.mts +0 -14
- package/lib/methods/dom/main-dom.d.ts +0 -14
- package/lib/methods/dom/main-dom.global.js +0 -30620
- package/lib/methods/dom/main-dom.js +0 -30618
- package/lib/methods/dom/main-dom.mjs +0 -30601
- package/lib/methods/dom/methods.d.mts +0 -18
- package/lib/methods/dom/methods.d.ts +0 -18
- package/lib/methods/dom/methods.global.js +0 -30827
- package/lib/methods/dom/methods.js +0 -30835
- package/lib/methods/dom/methods.mjs +0 -30806
- package/lib/methods/index.d.mts +0 -103
- package/lib/methods/index.d.ts +0 -103
- package/lib/methods/index.global.js +0 -46361
- package/lib/methods/index.js +0 -32125
- package/lib/methods/index.mjs +0 -32096
- package/lib/methods/requests/index.d.mts +0 -92
- package/lib/methods/requests/index.d.ts +0 -92
- package/lib/methods/requests/index.global.js +0 -15553
- package/lib/methods/requests/index.js +0 -1322
- package/lib/methods/requests/index.mjs +0 -1288
- package/lib/methods/requests/requests.d.mts +0 -42
- package/lib/methods/requests/requests.d.ts +0 -42
- package/lib/methods/requests/requests.global.js +0 -14528
- package/lib/methods/requests/requests.js +0 -242
- package/lib/methods/requests/requests.mjs +0 -209
- package/lib/types/index.d.mts +0 -4
- package/lib/types/index.d.ts +0 -4
- package/lib/types/index.global.js +0 -19
- package/lib/types/index.js +0 -17
- package/lib/types/index.mjs +0 -0
- package/lib/types/params.d.mts +0 -322
- package/lib/types/params.d.ts +0 -322
- package/lib/types/params.global.js +0 -19
- package/lib/types/params.js +0 -17
- package/lib/types/params.mjs +0 -0
- package/lib/types/payloads.d.mts +0 -143
- package/lib/types/payloads.d.ts +0 -143
- package/lib/types/payloads.global.js +0 -19
- package/lib/types/payloads.js +0 -17
- package/lib/types/payloads.mjs +0 -0
- package/lib/types/translations.d.mts +0 -43
- package/lib/types/translations.d.ts +0 -43
- package/lib/types/translations.global.js +0 -19
- package/lib/types/translations.js +0 -17
- package/lib/types/translations.mjs +0 -0
- package/lib/types/utils/payloads.d.ts +0 -299
- package/lib/types/utils/payloads.global.js +0 -19
- package/lib/types/utils/payloads.js +0 -17
- package/lib/types/utils/payloads.mjs +0 -0
- package/lib/utils/cookies.d.mts +0 -13
- package/lib/utils/cookies.d.ts +0 -13
- package/lib/utils/cookies.global.js +0 -261
- package/lib/utils/cookies.js +0 -179
- package/lib/utils/cookies.mjs +0 -138
- package/lib/utils/defaultMessageBox.d.mts +0 -5
- package/lib/utils/defaultMessageBox.d.ts +0 -5
- package/lib/utils/defaultMessageBox.global.js +0 -125
- package/lib/utils/defaultMessageBox.js +0 -129
- 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
|
+
});
|