woodsportal-client-sdk 1.1.4-dev.63 → 1.1.4-dev.64

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/CHANGELOG.md CHANGED
@@ -9,6 +9,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9
9
 
10
10
  ### Added
11
11
 
12
+ - **Client-lane MFA APIs:** `verifyOtp`, `sendMfaOtp`, pending passkey MFA step, enrollment (TOTP, phone verify, WebAuthn/passkeys), passwordless passkey login, and `getMfaStatus` / `setMfaPreferences`.
13
+ - **Client-lane security settings APIs:** `getSecurityOverview`, `getSecurityLoginActivity`, `getSecuritySessions`, `revokeSecuritySession`, `revokeOtherSecuritySessions`.
14
+ - **MFA-aware login:** `api.login()` stores only the temp access JWT when `twoFactorRequired` is true (no refresh token until MFA completes).
15
+ - Exported TypeScript types for MFA and security DTOs (`MfaMethod`, `SecurityOverview`, `ActiveSession`, etc.).
16
+ - **Docs:** [`docs/MFA-SECURITY-SDK.md`](docs/MFA-SECURITY-SDK.md) — full SDK method → API reference with examples; JSDoc on all MFA/security facades for IDE hover.
17
+
18
+ ### Changed
19
+
20
+ - **Source layout:** production code under `src/main/`, unit tests under `src/test/` (Spring Boot / Maven mirror). Update local imports or docs that referenced `src/` directly.
21
+
22
+ ### Added
23
+
12
24
  - **`formatHubSpotActivityDateTime`**, **`formatHubSpotActivityDateTimeParts`**, **`formatGmtOffset`**, **`normalizeToTimestamp`**, and **`DEFAULT_HUBSPOT_TIMEZONE`** (`Asia/Kolkata`) for HubSpot-style activity timestamps (e.g. `May 27, 2026 at 11:31 PM GMT+5:30`).
13
25
 
14
26
  ### Added
package/README.md CHANGED
@@ -12,6 +12,21 @@ TypeScript/JavaScript **ESM** client for the **WoodsPortal** HTTP API: authentic
12
12
 
13
13
  ---
14
14
 
15
+ ## Project layout (Spring Boot–style)
16
+
17
+ Production and test sources are split like WoodsPortal Java services:
18
+
19
+ | Path | Role |
20
+ |------|------|
21
+ | `src/main/` | Library source (published via `dist/`) |
22
+ | `src/test/` | Unit tests mirroring `src/main/` package paths |
23
+
24
+ Example: `src/main/client/auth-headers.ts` ↔ `src/test/client/login-session.test.ts`.
25
+
26
+ See [`src/test/README.md`](src/test/README.md). Run tests with `npm test`.
27
+
28
+ ---
29
+
15
30
  ## Production checklist
16
31
 
17
32
  1. **Pin the major version** in `package.json` (e.g. `^1.1.0`) and read [`CHANGELOG.md`](./CHANGELOG.md) before upgrades.
@@ -60,7 +75,7 @@ initializeHttpClient({
60
75
  });
61
76
  ```
62
77
 
63
- Hub and dev-portal identifiers are **also** read from browser storage in `src/utils/config.ts`. Keep that storage in sync with your HubSpot / portal shell so authenticated routes resolve the correct tenant context.
78
+ Hub and dev-portal identifiers are **also** read from browser storage in `src/main/utils/config.ts`. Keep that storage in sync with your HubSpot / portal shell so authenticated routes resolve the correct tenant context.
64
79
 
65
80
  ---
66
81
 
@@ -241,6 +256,64 @@ API guide: `woodsportal-api/docs/CACHE-PURGE-API.md` in the monorepo. Types: `sr
241
256
 
242
257
  ---
243
258
 
259
+ ## MFA & login (client lane)
260
+
261
+ When `POST /api/auth/login` returns `twoFactorRequired: true`, the SDK stores **only** the temporary access JWT — **not** the refresh token. Complete MFA with `api.verifyOtp()` (or pending passkey verify); on success the SDK persists the full session.
262
+
263
+ **Full guide:** [`docs/MFA-SECURITY-SDK.md`](docs/MFA-SECURITY-SDK.md) (every method, payload, and example).
264
+
265
+ Backend reference: `woodsportal-api/docs/MFA-FRONTEND-DEVELOPER-GUIDE.md`.
266
+
267
+ ### Login & MFA step (unauthenticated)
268
+
269
+ | SDK method | HTTP | Purpose |
270
+ |------------|------|---------|
271
+ | `login({ username, password })` | `POST /api/auth/login?hubId=` | Password login; may return `twoFactorRequired` |
272
+ | `verifyOtp({ token, otp, method })` | `POST /api/auth/verify-otp?hubId=` | Complete OTP/TOTP/backup MFA step; full session on success |
273
+ | `sendMfaOtp({ token, method })` | `POST /api/auth/mfa/pending/otp/send` | Resend OTP or switch to email/SMS on MFA gate |
274
+ | `pendingPasskeyOptions({ token, portalId? })` | `POST /api/auth/mfa/pending/passkey/authenticate/options` | Start passkey MFA-step ceremony |
275
+ | `pendingPasskeyVerify({ token, challengeId, credential, portalId? })` | `POST /api/auth/mfa/pending/passkey/authenticate/verify?hubId=` | Finish passkey MFA step; full session on success |
276
+ | `passkeyLoginOptions({ email, hubId?, portalId? })` | `POST /api/auth/passkey/login/options?hubId=` | Passwordless passkey login start |
277
+ | `passkeyLoginVerify({ challengeId, credential, portalId? })` | `POST /api/auth/passkey/login/verify?hubId=` | Passwordless login finish; may still require MFA |
278
+
279
+ ### MFA enrollment (authenticated)
280
+
281
+ | SDK method | HTTP | Purpose |
282
+ |------------|------|---------|
283
+ | `getMfaStatus({ portalId? })` | `GET /api/auth/mfa/status?portalId=` | Enrollment + policy snapshot |
284
+ | `setMfaPreferences({ defaultMethod, portalId? })` | `PUT /api/auth/mfa/preferences?portalId=` | Set scoped default MFA method |
285
+ | `startPhoneVerify({ phone })` | `POST /api/auth/mfa/phone/verify/start` | Send phone verification OTP (E.164) |
286
+ | `confirmPhoneVerify({ phone, code })` | `POST /api/auth/mfa/phone/verify/confirm` | Confirm phone; enables SMS at login |
287
+ | `totpEnrollStart({ portalId? })` | `POST /api/auth/mfa/totp/enroll/start?portalId=` | Start TOTP; returns QR/`otpauthUri` |
288
+ | `totpEnrollVerify({ code, portalId? })` | `POST /api/auth/mfa/totp/enroll/verify?portalId=` | Confirm TOTP; backup codes returned once |
289
+ | `totpDisable({ password })` | `POST /api/auth/mfa/totp/disable` | Disable TOTP for current scope |
290
+ | `webauthnRegisterOptions({ portalId? })` | `POST /api/auth/mfa/webauthn/register/options?portalId=` | Passkey registration ceremony |
291
+ | `webauthnRegisterVerify({ challengeId, credential, nickname?, portalId? })` | `POST /api/auth/mfa/webauthn/register/verify?portalId=` | Complete passkey registration |
292
+ | `webauthnAuthOptions({ portalId? })` | `POST /api/auth/mfa/webauthn/authenticate/options?portalId=` | Logged-in passkey re-verify |
293
+ | `webauthnAuthVerify({ challengeId, credential, portalId? })` | `POST /api/auth/mfa/webauthn/authenticate/verify?portalId=` | Complete logged-in passkey verify |
294
+ | `listWebauthnCredentials({ portalId? })` | `GET /api/auth/mfa/webauthn/credentials?portalId=` | List passkeys |
295
+ | `deleteWebauthnCredential({ credentialRecordId, portalId? })` | `DELETE /api/auth/mfa/webauthn/credentials/{id}?portalId=` | Remove a passkey |
296
+
297
+ WebAuthn ceremonies use `@simplewebauthn/browser` in the host app; the SDK transports credential JSON only.
298
+
299
+ ---
300
+
301
+ ## Security settings (client lane)
302
+
303
+ Use dedicated security endpoints for the account Security page — **not** `GET /me` + `GET /mfa/status`. Full contract: `woodsportal-api/docs/SECURITY-FRONTEND-DEVELOPER-GUIDE.md`. **Examples:** [`docs/MFA-SECURITY-SDK.md`](docs/MFA-SECURITY-SDK.md).
304
+
305
+ | SDK method | HTTP | Purpose |
306
+ |------------|------|---------|
307
+ | `getSecurityOverview({ portalId? })` | `GET /api/auth/security/overview?portalId=` | Password age, MFA methods, policy flags |
308
+ | `getSecurityLoginActivity({ page?, limit?, sort? })` | `GET /api/auth/security/login-activity` | Paginated login history |
309
+ | `getSecuritySessions({ currentFamilyId?, refreshToken? })` | `GET /api/auth/security/sessions` | Active sessions; pass refresh to mark current |
310
+ | `revokeSecuritySession({ familyId, refreshToken? })` | `POST /api/auth/security/sessions/{familyId}/revoke` | Sign out one device |
311
+ | `revokeOtherSecuritySessions({ refreshToken? })` | `POST /api/auth/security/sessions/revoke-others` | Sign out all other devices |
312
+
313
+ Pass `refreshToken` (or use `getRefreshToken()` from SDK cookies) so the API can mark the current session when listing or revoking others.
314
+
315
+ ---
316
+
244
317
  ## Security & privacy
245
318
 
246
319
  - Send credentials and tokens **only over HTTPS** in production.
@@ -1,7 +1,7 @@
1
- import { bindStoreWithActions } from '../../chunk-Y5MRAAGK.js';
2
- import { createAdapterHooks } from '../../chunk-ALQCX7KV.js';
3
- import '../../chunk-YEHZZGAU.js';
4
- import '../../chunk-UGSUUZLT.js';
1
+ import { bindStoreWithActions } from '../../chunk-HBHT637F.js';
2
+ import { createAdapterHooks } from '../../chunk-K3YKUUNS.js';
3
+ import '../../chunk-C76BHDO4.js';
4
+ import '../../chunk-S2NB4AXQ.js';
5
5
  import { inject, DestroyRef, signal } from '@angular/core';
6
6
 
7
7
  function createAngularStoreComposable(store, actions) {
@@ -26,7 +26,7 @@ function createAngularStoreComposable(store, actions) {
26
26
  };
27
27
  }
28
28
 
29
- // src/adapters/angular/index.ts
29
+ // src/main/adapters/angular/index.ts
30
30
  var { useTable, useMultiObjectActions, useNote, useEmail, useUser, useSync, useUploader } = createAdapterHooks(createAngularStoreComposable);
31
31
 
32
32
  export { useEmail, useMultiObjectActions, useNote, useSync, useTable, useUploader, useUser };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/adapters/shared/createAngularComposable.ts","../../../src/adapters/angular/index.ts"],"names":[],"mappings":";;;;;;AAGO,SAAS,4BAAA,CAGd,OAAkC,OAAA,EAAmB;AACnD,EAAA,OAAO,SAAS,QAAA,GAA8B;AAC1C,IAAA,MAAM,UAAA,GAAa,OAAO,UAAU,CAAA;AACpC,IAAA,MAAM,OAAA,GAAU,oBAAA,CAAqB,KAAA,EAAO,OAAO,CAAA;AACnD,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,WAAA,EAAa,CAAA;AAE7C,IAAA,UAAA,CAAW,SAAA;AAAA,MACP,OAAA,CAAQ,UAAU,MAAM;AACpB,QAAA,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,WAAA,EAAa,CAAA;AAAA,MACtC,CAAC;AAAA,KACL;AAEA,IAAA,OAAO,IAAI,KAAA,CAAM,EAAC,EAAwB;AAAA,MACtC,GAAA,CAAI,SAAS,IAAA,EAAM;AACf,QAAA,MAAM,GAAA,GAAM,OAAO,IAAI,CAAA;AACvB,QAAA,IAAI,OAAO,OAAA,EAAS;AAChB,UAAA,OAAQ,QAAoC,GAAG,CAAA;AAAA,QACnD;AACA,QAAA,OAAO,QAAA,GAAW,GAAmB,CAAA;AAAA,MACzC;AAAA,KACH,CAAA;AAAA,EACL,CAAA;AACJ;;;ACzBO,IAAM,EAAE,QAAA,EAAU,qBAAA,EAAuB,OAAA,EAAS,QAAA,EAAU,SAAS,OAAA,EAAS,WAAA,EAAY,GAAI,kBAAA,CAAmB,4BAA4B","file":"index.js","sourcesContent":["import { DestroyRef, inject, signal } from \"@angular/core\";\nimport { bindStoreWithActions, type SubscribableStore } from \"./bindStoreWithActions\";\n\nexport function createAngularStoreComposable<\n TState extends object,\n TActions extends object,\n>(store: SubscribableStore<TState>, actions: TActions) {\n return function useStore(): TState & TActions {\n const destroyRef = inject(DestroyRef);\n const binding = bindStoreWithActions(store, actions);\n const snapshot = signal(binding.getSnapshot());\n\n destroyRef.onDestroy(\n binding.subscribe(() => {\n snapshot.set(binding.getSnapshot());\n }),\n );\n\n return new Proxy({} as TState & TActions, {\n get(_target, prop) {\n const key = String(prop);\n if (key in actions) {\n return (actions as Record<string, unknown>)[key];\n }\n return snapshot()[key as keyof TState];\n },\n });\n };\n}\n","import { createAdapterHooks } from \"../shared/createAdapterHooks\";\nimport { createAngularStoreComposable } from \"../shared/createAngularComposable\";\n\nexport const { useTable, useMultiObjectActions, useNote, useEmail, useUser, useSync, useUploader } = createAdapterHooks(createAngularStoreComposable);\n"]}
1
+ {"version":3,"sources":["../../../src/main/adapters/shared/createAngularComposable.ts","../../../src/main/adapters/angular/index.ts"],"names":[],"mappings":";;;;;;AAGO,SAAS,4BAAA,CAGd,OAAkC,OAAA,EAAmB;AACnD,EAAA,OAAO,SAAS,QAAA,GAA8B;AAC1C,IAAA,MAAM,UAAA,GAAa,OAAO,UAAU,CAAA;AACpC,IAAA,MAAM,OAAA,GAAU,oBAAA,CAAqB,KAAA,EAAO,OAAO,CAAA;AACnD,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,WAAA,EAAa,CAAA;AAE7C,IAAA,UAAA,CAAW,SAAA;AAAA,MACP,OAAA,CAAQ,UAAU,MAAM;AACpB,QAAA,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,WAAA,EAAa,CAAA;AAAA,MACtC,CAAC;AAAA,KACL;AAEA,IAAA,OAAO,IAAI,KAAA,CAAM,EAAC,EAAwB;AAAA,MACtC,GAAA,CAAI,SAAS,IAAA,EAAM;AACf,QAAA,MAAM,GAAA,GAAM,OAAO,IAAI,CAAA;AACvB,QAAA,IAAI,OAAO,OAAA,EAAS;AAChB,UAAA,OAAQ,QAAoC,GAAG,CAAA;AAAA,QACnD;AACA,QAAA,OAAO,QAAA,GAAW,GAAmB,CAAA;AAAA,MACzC;AAAA,KACH,CAAA;AAAA,EACL,CAAA;AACJ;;;ACzBO,IAAM,EAAE,QAAA,EAAU,qBAAA,EAAuB,OAAA,EAAS,QAAA,EAAU,SAAS,OAAA,EAAS,WAAA,EAAY,GAAI,kBAAA,CAAmB,4BAA4B","file":"index.js","sourcesContent":["import { DestroyRef, inject, signal } from \"@angular/core\";\nimport { bindStoreWithActions, type SubscribableStore } from \"./bindStoreWithActions\";\n\nexport function createAngularStoreComposable<\n TState extends object,\n TActions extends object,\n>(store: SubscribableStore<TState>, actions: TActions) {\n return function useStore(): TState & TActions {\n const destroyRef = inject(DestroyRef);\n const binding = bindStoreWithActions(store, actions);\n const snapshot = signal(binding.getSnapshot());\n\n destroyRef.onDestroy(\n binding.subscribe(() => {\n snapshot.set(binding.getSnapshot());\n }),\n );\n\n return new Proxy({} as TState & TActions, {\n get(_target, prop) {\n const key = String(prop);\n if (key in actions) {\n return (actions as Record<string, unknown>)[key];\n }\n return snapshot()[key as keyof TState];\n },\n });\n };\n}\n","import { createAdapterHooks } from \"../shared/createAdapterHooks\";\nimport { createAngularStoreComposable } from \"../shared/createAngularComposable\";\n\nexport const { useTable, useMultiObjectActions, useNote, useEmail, useUser, useSync, useUploader } = createAdapterHooks(createAngularStoreComposable);\n"]}
@@ -1,6 +1,6 @@
1
- import { createAdapterHooks } from '../../chunk-ALQCX7KV.js';
2
- import '../../chunk-YEHZZGAU.js';
3
- import '../../chunk-UGSUUZLT.js';
1
+ import { createAdapterHooks } from '../../chunk-K3YKUUNS.js';
2
+ import '../../chunk-C76BHDO4.js';
3
+ import '../../chunk-S2NB4AXQ.js';
4
4
  import { useSyncExternalStore } from 'react';
5
5
 
6
6
  function createReactStoreComposable(store, actions) {
@@ -10,7 +10,7 @@ function createReactStoreComposable(store, actions) {
10
10
  };
11
11
  }
12
12
 
13
- // src/adapters/react/index.ts
13
+ // src/main/adapters/react/index.ts
14
14
  var { useTable, useMultiObjectActions, useNote, useEmail, useUser, useSync, useUploader } = createAdapterHooks(createReactStoreComposable);
15
15
 
16
16
  export { useEmail, useMultiObjectActions, useNote, useSync, useTable, useUploader, useUser };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/adapters/shared/createReactComposable.ts","../../../src/adapters/react/index.ts"],"names":[],"mappings":";;;;;AAGO,SAAS,0BAAA,CAGd,OAAkC,OAAA,EAAmB;AACnD,EAAA,OAAO,SAAS,QAAA,GAA8B;AAC1C,IAAA,MAAM,QAAQ,oBAAA,CAAqB,KAAA,CAAM,WAAW,KAAA,CAAM,QAAA,EAAU,MAAM,QAAQ,CAAA;AAClF,IAAA,OAAO,EAAE,GAAG,KAAA,EAAO,GAAG,OAAA,EAAQ;AAAA,EAClC,CAAA;AACJ;;;ACRO,IAAM,EAAE,QAAA,EAAU,qBAAA,EAAuB,OAAA,EAAS,QAAA,EAAU,SAAS,OAAA,EAAS,WAAA,EAAY,GAAI,kBAAA,CAAmB,0BAA0B","file":"index.js","sourcesContent":["import { useSyncExternalStore } from \"react\";\nimport type { SubscribableStore } from \"./bindStoreWithActions\";\n\nexport function createReactStoreComposable<\n TState extends object,\n TActions extends object,\n>(store: SubscribableStore<TState>, actions: TActions) {\n return function useStore(): TState & TActions {\n const state = useSyncExternalStore(store.subscribe, store.getState, store.getState);\n return { ...state, ...actions };\n };\n}\n","import { createAdapterHooks } from \"../shared/createAdapterHooks\";\nimport { createReactStoreComposable } from \"../shared/createReactComposable\";\n\nexport const { useTable, useMultiObjectActions, useNote, useEmail, useUser, useSync, useUploader } = createAdapterHooks(createReactStoreComposable);\n"]}
1
+ {"version":3,"sources":["../../../src/main/adapters/shared/createReactComposable.ts","../../../src/main/adapters/react/index.ts"],"names":[],"mappings":";;;;;AAGO,SAAS,0BAAA,CAGd,OAAkC,OAAA,EAAmB;AACnD,EAAA,OAAO,SAAS,QAAA,GAA8B;AAC1C,IAAA,MAAM,QAAQ,oBAAA,CAAqB,KAAA,CAAM,WAAW,KAAA,CAAM,QAAA,EAAU,MAAM,QAAQ,CAAA;AAClF,IAAA,OAAO,EAAE,GAAG,KAAA,EAAO,GAAG,OAAA,EAAQ;AAAA,EAClC,CAAA;AACJ;;;ACRO,IAAM,EAAE,QAAA,EAAU,qBAAA,EAAuB,OAAA,EAAS,QAAA,EAAU,SAAS,OAAA,EAAS,WAAA,EAAY,GAAI,kBAAA,CAAmB,0BAA0B","file":"index.js","sourcesContent":["import { useSyncExternalStore } from \"react\";\nimport type { SubscribableStore } from \"./bindStoreWithActions\";\n\nexport function createReactStoreComposable<\n TState extends object,\n TActions extends object,\n>(store: SubscribableStore<TState>, actions: TActions) {\n return function useStore(): TState & TActions {\n const state = useSyncExternalStore(store.subscribe, store.getState, store.getState);\n return { ...state, ...actions };\n };\n}\n","import { createAdapterHooks } from \"../shared/createAdapterHooks\";\nimport { createReactStoreComposable } from \"../shared/createReactComposable\";\n\nexport const { useTable, useMultiObjectActions, useNote, useEmail, useUser, useSync, useUploader } = createAdapterHooks(createReactStoreComposable);\n"]}
@@ -1,7 +1,7 @@
1
- import { bindStoreWithActions } from '../../chunk-Y5MRAAGK.js';
2
- import { createAdapterHooks } from '../../chunk-ALQCX7KV.js';
3
- import '../../chunk-YEHZZGAU.js';
4
- import '../../chunk-UGSUUZLT.js';
1
+ import { bindStoreWithActions } from '../../chunk-HBHT637F.js';
2
+ import { createAdapterHooks } from '../../chunk-K3YKUUNS.js';
3
+ import '../../chunk-C76BHDO4.js';
4
+ import '../../chunk-S2NB4AXQ.js';
5
5
  import { reactive, onScopeDispose } from 'vue';
6
6
 
7
7
  function createVueStoreComposable(store, actions) {
@@ -17,7 +17,7 @@ function createVueStoreComposable(store, actions) {
17
17
  };
18
18
  }
19
19
 
20
- // src/adapters/vue/index.ts
20
+ // src/main/adapters/vue/index.ts
21
21
  var { useTable, useMultiObjectActions, useNote, useEmail, useUser, useSync, useUploader } = createAdapterHooks(createVueStoreComposable);
22
22
 
23
23
  export { useEmail, useMultiObjectActions, useNote, useSync, useTable, useUploader, useUser };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/adapters/shared/createVueComposable.ts","../../../src/adapters/vue/index.ts"],"names":[],"mappings":";;;;;;AAGO,SAAS,wBAAA,CAGd,OAAkC,OAAA,EAAmB;AACnD,EAAA,OAAO,SAAS,QAAA,GAA8B;AAC1C,IAAA,MAAM,OAAA,GAAU,oBAAA,CAAqB,KAAA,EAAO,OAAO,CAAA;AACnD,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,WAAA,EAAa,CAAA;AAE5C,IAAA,cAAA;AAAA,MACI,OAAA,CAAQ,UAAU,MAAM;AACpB,QAAA,MAAA,CAAO,MAAA,CAAO,KAAA,EAAO,OAAA,CAAQ,WAAA,EAAa,CAAA;AAAA,MAC9C,CAAC;AAAA,KACL;AAEA,IAAA,OAAO,KAAA;AAAA,EACX,CAAA;AACJ;;;AChBO,IAAM,EAAE,QAAA,EAAU,qBAAA,EAAuB,OAAA,EAAS,QAAA,EAAU,SAAS,OAAA,EAAS,WAAA,EAAY,GAAI,kBAAA,CAAmB,wBAAwB","file":"index.js","sourcesContent":["import { onScopeDispose, reactive } from \"vue\";\nimport { bindStoreWithActions, type SubscribableStore } from \"./bindStoreWithActions\";\n\nexport function createVueStoreComposable<\n TState extends object,\n TActions extends object,\n>(store: SubscribableStore<TState>, actions: TActions) {\n return function useStore(): TState & TActions {\n const binding = bindStoreWithActions(store, actions);\n const state = reactive(binding.getSnapshot()) as TState & TActions;\n\n onScopeDispose(\n binding.subscribe(() => {\n Object.assign(state, binding.getSnapshot());\n }),\n );\n\n return state;\n };\n}\n","import { createAdapterHooks } from \"../shared/createAdapterHooks\";\nimport { createVueStoreComposable } from \"../shared/createVueComposable\";\n\nexport const { useTable, useMultiObjectActions, useNote, useEmail, useUser, useSync, useUploader } = createAdapterHooks(createVueStoreComposable);\n"]}
1
+ {"version":3,"sources":["../../../src/main/adapters/shared/createVueComposable.ts","../../../src/main/adapters/vue/index.ts"],"names":[],"mappings":";;;;;;AAGO,SAAS,wBAAA,CAGd,OAAkC,OAAA,EAAmB;AACnD,EAAA,OAAO,SAAS,QAAA,GAA8B;AAC1C,IAAA,MAAM,OAAA,GAAU,oBAAA,CAAqB,KAAA,EAAO,OAAO,CAAA;AACnD,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,OAAA,CAAQ,WAAA,EAAa,CAAA;AAE5C,IAAA,cAAA;AAAA,MACI,OAAA,CAAQ,UAAU,MAAM;AACpB,QAAA,MAAA,CAAO,MAAA,CAAO,KAAA,EAAO,OAAA,CAAQ,WAAA,EAAa,CAAA;AAAA,MAC9C,CAAC;AAAA,KACL;AAEA,IAAA,OAAO,KAAA;AAAA,EACX,CAAA;AACJ;;;AChBO,IAAM,EAAE,QAAA,EAAU,qBAAA,EAAuB,OAAA,EAAS,QAAA,EAAU,SAAS,OAAA,EAAS,WAAA,EAAY,GAAI,kBAAA,CAAmB,wBAAwB","file":"index.js","sourcesContent":["import { onScopeDispose, reactive } from \"vue\";\nimport { bindStoreWithActions, type SubscribableStore } from \"./bindStoreWithActions\";\n\nexport function createVueStoreComposable<\n TState extends object,\n TActions extends object,\n>(store: SubscribableStore<TState>, actions: TActions) {\n return function useStore(): TState & TActions {\n const binding = bindStoreWithActions(store, actions);\n const state = reactive(binding.getSnapshot()) as TState & TActions;\n\n onScopeDispose(\n binding.subscribe(() => {\n Object.assign(state, binding.getSnapshot());\n }),\n );\n\n return state;\n };\n}\n","import { createAdapterHooks } from \"../shared/createAdapterHooks\";\nimport { createVueStoreComposable } from \"../shared/createVueComposable\";\n\nexport const { useTable, useMultiObjectActions, useNote, useEmail, useUser, useSync, useUploader } = createAdapterHooks(createVueStoreComposable);\n"]}
@@ -0,0 +1,3 @@
1
+ export { getPortal, getProfile, getRefreshToken, getSubscriptionType, setAccessToken, setLoggedInDetails, setPortal, setProfileDetails, setRefreshToken, setSubscriptionType } from './chunk-S2NB4AXQ.js';
2
+ //# sourceMappingURL=auth-utils-UU5PVRPL.js.map
3
+ //# sourceMappingURL=auth-utils-UU5PVRPL.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"auth-utils-BPOQZCAA.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"auth-utils-UU5PVRPL.js"}