@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
package/README.md
CHANGED
|
@@ -1,5 +1,358 @@
|
|
|
1
|
-
memberstack
|
|
1
|
+
# @memberstack/dom
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
The official Memberstack JavaScript SDK for authentication and membership management. Works with **any JavaScript framework** - React, Vue, Svelte, Next.js, Nuxt, SvelteKit, or vanilla JS.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @memberstack/dom
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import MemberstackDOM from '@memberstack/dom';
|
|
15
|
+
|
|
16
|
+
// Initialize with your public key (find it in your Memberstack dashboard)
|
|
17
|
+
const memberstack = MemberstackDOM.init({
|
|
18
|
+
publicKey: 'pk_sb_...' // Use pk_sb_ for sandbox, pk_ for live
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
// Check if a user is logged in
|
|
22
|
+
const { data: member } = await memberstack.getCurrentMember();
|
|
23
|
+
|
|
24
|
+
if (member) {
|
|
25
|
+
console.log('Logged in as:', member.auth.email);
|
|
26
|
+
} else {
|
|
27
|
+
console.log('Not logged in');
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Core Concepts
|
|
32
|
+
|
|
33
|
+
### Authentication State
|
|
34
|
+
|
|
35
|
+
Listen for authentication changes reactively:
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
const { unsubscribe } = memberstack.onAuthChange((member) => {
|
|
39
|
+
if (member) {
|
|
40
|
+
// User is logged in
|
|
41
|
+
console.log('Welcome,', member.auth.email);
|
|
42
|
+
console.log('Plans:', member.planConnections);
|
|
43
|
+
} else {
|
|
44
|
+
// User is logged out
|
|
45
|
+
console.log('Not authenticated');
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// Clean up when done (e.g., component unmount)
|
|
50
|
+
unsubscribe();
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### Prebuilt UI Modals
|
|
54
|
+
|
|
55
|
+
Launch beautiful, pre-styled authentication modals with a single function call:
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
// Open login modal
|
|
59
|
+
await memberstack.openModal('LOGIN');
|
|
60
|
+
|
|
61
|
+
// Open signup modal
|
|
62
|
+
await memberstack.openModal('SIGNUP');
|
|
63
|
+
|
|
64
|
+
// Open profile modal (for logged-in users)
|
|
65
|
+
await memberstack.openModal('PROFILE');
|
|
66
|
+
|
|
67
|
+
// Open forgot password modal
|
|
68
|
+
await memberstack.openModal('FORGOT_PASSWORD');
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Modals are fully customizable through your Memberstack dashboard and support translations.
|
|
72
|
+
|
|
73
|
+
### Programmatic Authentication
|
|
74
|
+
|
|
75
|
+
For custom UI, use the authentication methods directly:
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
// Sign up a new member
|
|
79
|
+
const { data } = await memberstack.signupMemberEmailPassword({
|
|
80
|
+
email: 'user@example.com',
|
|
81
|
+
password: 'securePassword123',
|
|
82
|
+
customFields: {
|
|
83
|
+
firstName: 'Jane',
|
|
84
|
+
lastName: 'Doe'
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
// Log in an existing member
|
|
89
|
+
const { data } = await memberstack.loginMemberEmailPassword({
|
|
90
|
+
email: 'user@example.com',
|
|
91
|
+
password: 'securePassword123'
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
// Log out
|
|
95
|
+
await memberstack.logout();
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## API Reference
|
|
99
|
+
|
|
100
|
+
### Initialization
|
|
101
|
+
|
|
102
|
+
#### `init(config)`
|
|
103
|
+
|
|
104
|
+
Initialize the Memberstack SDK. Call this once when your app loads.
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
const memberstack = MemberstackDOM.init({
|
|
108
|
+
publicKey: 'pk_...', // Required: Your public API key
|
|
109
|
+
useCookies: true, // Optional: Enable cookie-based sessions
|
|
110
|
+
domain: 'https://...' // Optional: Custom API domain
|
|
111
|
+
});
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Authentication Methods
|
|
115
|
+
|
|
116
|
+
| Method | Description |
|
|
117
|
+
|--------|-------------|
|
|
118
|
+
| `loginMemberEmailPassword({ email, password })` | Log in with email and password |
|
|
119
|
+
| `signupMemberEmailPassword({ email, password, customFields?, plans? })` | Create a new member account |
|
|
120
|
+
| `logout()` | Sign out the current member |
|
|
121
|
+
| `getCurrentMember()` | Get the currently authenticated member |
|
|
122
|
+
| `onAuthChange(callback)` | Subscribe to authentication state changes |
|
|
123
|
+
|
|
124
|
+
### Passwordless Authentication
|
|
125
|
+
|
|
126
|
+
| Method | Description |
|
|
127
|
+
|--------|-------------|
|
|
128
|
+
| `sendMemberLoginPasswordlessEmail({ email })` | Send a login code to an existing member |
|
|
129
|
+
| `sendMemberSignupPasswordlessEmail({ email })` | Send a signup code to a new member |
|
|
130
|
+
| `loginMemberPasswordless({ email, passwordlessToken })` | Complete passwordless login |
|
|
131
|
+
| `signupMemberPasswordless({ email, passwordlessToken, customFields? })` | Complete passwordless signup |
|
|
132
|
+
|
|
133
|
+
### OAuth / Social Login
|
|
134
|
+
|
|
135
|
+
| Method | Description |
|
|
136
|
+
|--------|-------------|
|
|
137
|
+
| `loginWithProvider({ provider })` | Log in via OAuth (e.g., Google, Facebook) |
|
|
138
|
+
| `signupWithProvider({ provider, customFields?, plans? })` | Sign up via OAuth |
|
|
139
|
+
| `connectProvider({ provider })` | Connect an OAuth provider to existing account |
|
|
140
|
+
| `disconnectProvider({ provider })` | Disconnect an OAuth provider |
|
|
141
|
+
|
|
142
|
+
### Member Management
|
|
143
|
+
|
|
144
|
+
| Method | Description |
|
|
145
|
+
|--------|-------------|
|
|
146
|
+
| `updateMember({ customFields })` | Update member's custom fields |
|
|
147
|
+
| `updateMemberAuth({ email?, oldPassword?, newPassword? })` | Update email or password |
|
|
148
|
+
| `updateMemberProfileImage({ profileImage })` | Upload a new profile image |
|
|
149
|
+
| `deleteMember()` | Delete the current member's account |
|
|
150
|
+
| `getMemberJSON()` | Get member's JSON data store |
|
|
151
|
+
| `updateMemberJSON({ json })` | Update member's JSON data store |
|
|
152
|
+
|
|
153
|
+
### Password Reset
|
|
154
|
+
|
|
155
|
+
| Method | Description |
|
|
156
|
+
|--------|-------------|
|
|
157
|
+
| `sendMemberResetPasswordEmail({ email })` | Send password reset email |
|
|
158
|
+
| `resetMemberPassword({ token, newPassword })` | Complete password reset |
|
|
159
|
+
| `setPassword({ password })` | Set password (for passwordless members) |
|
|
160
|
+
|
|
161
|
+
### Plans & Payments
|
|
162
|
+
|
|
163
|
+
| Method | Description |
|
|
164
|
+
|--------|-------------|
|
|
165
|
+
| `getPlans()` | Get all available plans |
|
|
166
|
+
| `getPlan({ planId })` | Get a specific plan |
|
|
167
|
+
| `addPlan({ planId })` | Add a free plan to member |
|
|
168
|
+
| `removePlan({ planId })` | Remove a plan from member |
|
|
169
|
+
| `purchasePlansWithCheckout({ priceId, successUrl?, cancelUrl? })` | Start Stripe checkout |
|
|
170
|
+
| `launchStripeCustomerPortal({ returnUrl? })` | Open Stripe billing portal |
|
|
171
|
+
|
|
172
|
+
### Prebuilt UI
|
|
173
|
+
|
|
174
|
+
| Method | Description |
|
|
175
|
+
|--------|-------------|
|
|
176
|
+
| `openModal(type, params?)` | Open a prebuilt modal |
|
|
177
|
+
| `hideModal()` | Close the current modal |
|
|
178
|
+
|
|
179
|
+
Modal types: `'LOGIN'`, `'SIGNUP'`, `'PROFILE'`, `'FORGOT_PASSWORD'`, `'RESET_PASSWORD'`
|
|
180
|
+
|
|
181
|
+
### Data Tables
|
|
182
|
+
|
|
183
|
+
| Method | Description |
|
|
184
|
+
|--------|-------------|
|
|
185
|
+
| `getDataTables()` | List all data tables |
|
|
186
|
+
| `getDataTable({ table })` | Get a data table schema |
|
|
187
|
+
| `getDataRecords({ table, limit?, after? })` | List records from a table |
|
|
188
|
+
| `getDataRecord({ table, recordId })` | Get a single record |
|
|
189
|
+
| `createDataRecord({ table, data })` | Create a new record |
|
|
190
|
+
| `updateDataRecord({ recordId, data })` | Update a record |
|
|
191
|
+
| `deleteDataRecord({ recordId })` | Delete a record |
|
|
192
|
+
| `queryDataRecords({ table, query })` | Advanced query with filters |
|
|
193
|
+
|
|
194
|
+
### Content & App Info
|
|
195
|
+
|
|
196
|
+
| Method | Description |
|
|
197
|
+
|--------|-------------|
|
|
198
|
+
| `getApp()` | Get app configuration |
|
|
199
|
+
| `getSecureContent({ contentId })` | Fetch gated content |
|
|
200
|
+
| `getRestrictedUrlGroups()` | Get content access groups |
|
|
201
|
+
| `sendMemberVerificationEmail()` | Send email verification |
|
|
202
|
+
|
|
203
|
+
## Common Patterns
|
|
204
|
+
|
|
205
|
+
### Protected Routes
|
|
206
|
+
|
|
207
|
+
```typescript
|
|
208
|
+
// Check access before rendering protected content
|
|
209
|
+
const { data: member } = await memberstack.getCurrentMember();
|
|
210
|
+
|
|
211
|
+
if (!member) {
|
|
212
|
+
window.location.href = '/login';
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Check for specific plan
|
|
217
|
+
const hasPro = member.planConnections.some(
|
|
218
|
+
pc => pc.planId === 'pln_pro123' && pc.active
|
|
219
|
+
);
|
|
220
|
+
|
|
221
|
+
if (!hasPro) {
|
|
222
|
+
window.location.href = '/upgrade';
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### Reactive Auth State (React Example)
|
|
228
|
+
|
|
229
|
+
```typescript
|
|
230
|
+
import { useEffect, useState } from 'react';
|
|
231
|
+
import MemberstackDOM from '@memberstack/dom';
|
|
232
|
+
|
|
233
|
+
const memberstack = MemberstackDOM.init({ publicKey: 'pk_...' });
|
|
234
|
+
|
|
235
|
+
function useAuth() {
|
|
236
|
+
const [member, setMember] = useState(null);
|
|
237
|
+
const [loading, setLoading] = useState(true);
|
|
238
|
+
|
|
239
|
+
useEffect(() => {
|
|
240
|
+
const { unsubscribe } = memberstack.onAuthChange((m) => {
|
|
241
|
+
setMember(m);
|
|
242
|
+
setLoading(false);
|
|
243
|
+
});
|
|
244
|
+
return () => unsubscribe();
|
|
245
|
+
}, []);
|
|
246
|
+
|
|
247
|
+
return { member, loading, memberstack };
|
|
248
|
+
}
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### Sign Up with Plan
|
|
252
|
+
|
|
253
|
+
```typescript
|
|
254
|
+
// Sign up and assign a plan in one step
|
|
255
|
+
const { data } = await memberstack.signupMemberEmailPassword({
|
|
256
|
+
email: 'user@example.com',
|
|
257
|
+
password: 'securePassword123',
|
|
258
|
+
plans: [{ planId: 'pln_free_tier' }]
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
// Or redirect to Stripe checkout for paid plans
|
|
262
|
+
await memberstack.purchasePlansWithCheckout({
|
|
263
|
+
priceId: 'prc_monthly_pro',
|
|
264
|
+
successUrl: '/welcome',
|
|
265
|
+
cancelUrl: '/pricing'
|
|
266
|
+
});
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### Custom Fields
|
|
270
|
+
|
|
271
|
+
```typescript
|
|
272
|
+
// Set custom fields during signup
|
|
273
|
+
await memberstack.signupMemberEmailPassword({
|
|
274
|
+
email: 'user@example.com',
|
|
275
|
+
password: 'password123',
|
|
276
|
+
customFields: {
|
|
277
|
+
firstName: 'Jane',
|
|
278
|
+
company: 'Acme Inc',
|
|
279
|
+
role: 'developer'
|
|
280
|
+
}
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
// Update custom fields later
|
|
284
|
+
await memberstack.updateMember({
|
|
285
|
+
customFields: {
|
|
286
|
+
company: 'New Company'
|
|
287
|
+
}
|
|
288
|
+
});
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
## TypeScript Support
|
|
292
|
+
|
|
293
|
+
This package includes full TypeScript definitions. Import types directly:
|
|
294
|
+
|
|
295
|
+
```typescript
|
|
296
|
+
import MemberstackDOM from '@memberstack/dom';
|
|
297
|
+
import type {
|
|
298
|
+
Member,
|
|
299
|
+
Plan,
|
|
300
|
+
LoginMemberEmailPasswordPayload,
|
|
301
|
+
SignupMemberEmailPasswordPayload
|
|
302
|
+
} from '@memberstack/dom';
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
## Error Handling
|
|
306
|
+
|
|
307
|
+
All methods return promises that may reject on error:
|
|
308
|
+
|
|
309
|
+
```typescript
|
|
310
|
+
try {
|
|
311
|
+
const { data } = await memberstack.loginMemberEmailPassword({
|
|
312
|
+
email: 'user@example.com',
|
|
313
|
+
password: 'wrongpassword'
|
|
314
|
+
});
|
|
315
|
+
} catch (error) {
|
|
316
|
+
// Handle authentication error
|
|
317
|
+
console.error('Login failed:', error.message);
|
|
318
|
+
}
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
## Environment Setup
|
|
322
|
+
|
|
323
|
+
Store your public key in environment variables:
|
|
324
|
+
|
|
325
|
+
```bash
|
|
326
|
+
# .env
|
|
327
|
+
NEXT_PUBLIC_MEMBERSTACK_PUBLIC_KEY=pk_sb_xxx # Next.js
|
|
328
|
+
VITE_MEMBERSTACK_PUBLIC_KEY=pk_sb_xxx # Vite
|
|
329
|
+
REACT_APP_MEMBERSTACK_PUBLIC_KEY=pk_sb_xxx # Create React App
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
```typescript
|
|
333
|
+
const memberstack = MemberstackDOM.init({
|
|
334
|
+
publicKey: process.env.NEXT_PUBLIC_MEMBERSTACK_PUBLIC_KEY
|
|
335
|
+
});
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
## Sandbox vs Live
|
|
339
|
+
|
|
340
|
+
- **Sandbox keys** (`pk_sb_...`): Use for development and testing. Data is separate from production.
|
|
341
|
+
- **Live keys** (`pk_...`): Use for production. Real member data and Stripe transactions.
|
|
342
|
+
|
|
343
|
+
## Resources
|
|
344
|
+
|
|
345
|
+
- [Full Documentation](https://docs.memberstack.com)
|
|
346
|
+
- [Dashboard](https://app.memberstack.com)
|
|
347
|
+
- [API Reference](https://developers.memberstack.com)
|
|
348
|
+
- [Data Tables Guide](https://docs.memberstack.com/data-tables)
|
|
349
|
+
|
|
350
|
+
## Support
|
|
351
|
+
|
|
352
|
+
- [Help Center](https://help.memberstack.com)
|
|
353
|
+
- [Community](https://community.memberstack.com)
|
|
354
|
+
- [Contact Support](https://memberstack.com/support)
|
|
355
|
+
|
|
356
|
+
## License
|
|
357
|
+
|
|
358
|
+
MIT
|