@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
package/README.md CHANGED
@@ -1,5 +1,358 @@
1
- memberstack-dom
1
+ # @memberstack/dom
2
2
 
3
- See docs for Data Tables usage and API details:
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