@interop/was-react 0.1.6 → 0.1.8
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/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mui/AdoptDialog.d.ts +12 -0
- package/dist/mui/AdoptDialog.d.ts.map +1 -0
- package/dist/mui/AdoptDialog.js +31 -0
- package/dist/mui/AdoptDialog.js.map +1 -0
- package/dist/mui/index.d.ts +1 -0
- package/dist/mui/index.d.ts.map +1 -1
- package/dist/mui/index.js +1 -0
- package/dist/mui/index.js.map +1 -1
- package/dist/react/documentApp.d.ts +116 -0
- package/dist/react/documentApp.d.ts.map +1 -0
- package/dist/react/documentApp.js +182 -0
- package/dist/react/documentApp.js.map +1 -0
- package/dist/react/hooks.d.ts +15 -2
- package/dist/react/hooks.d.ts.map +1 -1
- package/dist/react/hooks.js +15 -1
- package/dist/react/hooks.js.map +1 -1
- package/dist/react/index.d.ts +2 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +2 -1
- package/dist/react/index.js.map +1 -1
- package/dist/session/authStore.d.ts +32 -6
- package/dist/session/authStore.d.ts.map +1 -1
- package/dist/session/authStore.js +123 -19
- package/dist/session/authStore.js.map +1 -1
- package/dist/storage/adopt.d.ts +20 -0
- package/dist/storage/adopt.d.ts.map +1 -0
- package/dist/storage/adopt.js +78 -0
- package/dist/storage/adopt.js.map +1 -0
- package/dist/storage/entityStore.d.ts +7 -0
- package/dist/storage/entityStore.d.ts.map +1 -1
- package/dist/storage/entityStore.js +9 -15
- package/dist/storage/entityStore.js.map +1 -1
- package/dist/storage/localStore.d.ts +26 -3
- package/dist/storage/localStore.d.ts.map +1 -1
- package/dist/storage/localStore.js +26 -1
- package/dist/storage/localStore.js.map +1 -1
- package/dist/sync/index.d.ts +1 -1
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +1 -1
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/lww.d.ts +12 -0
- package/dist/sync/lww.d.ts.map +1 -1
- package/dist/sync/lww.js +14 -0
- package/dist/sync/lww.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -33,5 +33,5 @@ export { hydrateAll, clearAllEntityStores, patchFromChange, scheduleRehydrate, c
|
|
|
33
33
|
export { isAuthError, SyncController, createSyncController } from './storage/syncController.js';
|
|
34
34
|
export { startWasSync } from './storage/wasSync.js';
|
|
35
35
|
export { createAuthStore, type SessionStatus, type AuthState, type WasAuthStore } from './session/index.js';
|
|
36
|
-
export { WasSessionProvider, WasSessionContext, useAuthStore, useSession, useLogin, useLogout, useClearData, useReconnect, useSyncStatus, type SyncRollup } from './react/index.js';
|
|
36
|
+
export { WasSessionProvider, WasSessionContext, useAuthStore, useSession, useLogin, useLogout, useClearData, useHasLocalData, useReconnect, useSyncStatus, type SyncRollup, defineDocumentApp, DOCUMENT_COLLECTION_KEY, DOCUMENT_EXPORT_FORMAT, type DocumentApp } from './react/index.js';
|
|
37
37
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -42,5 +42,5 @@ export { startWasSync } from './storage/wasSync.js';
|
|
|
42
42
|
// Session lifecycle: the session auth store factory (the four-state machine).
|
|
43
43
|
export { createAuthStore } from './session/index.js';
|
|
44
44
|
// React: the session provider + hooks.
|
|
45
|
-
export { WasSessionProvider, WasSessionContext, useAuthStore, useSession, useLogin, useLogout, useClearData, useReconnect, useSyncStatus } from './react/index.js';
|
|
45
|
+
export { WasSessionProvider, WasSessionContext, useAuthStore, useSession, useLogin, useLogout, useClearData, useHasLocalData, useReconnect, useSyncStatus, defineDocumentApp, DOCUMENT_COLLECTION_KEY, DOCUMENT_EXPORT_FORMAT } from './react/index.js';
|
|
46
46
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;GAQG;AAEH,0BAA0B;AAC1B,OAAO,EACL,eAAe,EACf,0BAA0B,EAC1B,oBAAoB,EACpB,yBAAyB,EACzB,uBAAuB,EACvB,kBAAkB,EAOnB,MAAM,aAAa,CAAA;AAEpB,oCAAoC;AACpC,OAAO,EACL,qBAAqB,EACrB,WAAW,EAEZ,MAAM,aAAa,CAAA;AAEpB,6DAA6D;AAC7D,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,uBAAuB,EACvB,kBAAkB,EAGnB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,oBAAoB,EAErB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,eAAe,EAAkB,MAAM,yBAAyB,CAAA;AACzE,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAGjB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,SAAS,EACT,YAAY,EACZ,cAAc,EAGf,MAAM,0BAA0B,CAAA;AAEjC,2EAA2E;AAC3E,OAAO,EACL,qBAAqB,EACrB,SAAS,EACT,QAAQ,EACR,UAAU,EACX,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,UAAU,EACV,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACf,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACL,uBAAuB,EACvB,QAAQ,EACR,WAAW,EAEZ,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,eAAe,EACf,aAAa,EACb,mBAAmB,EAIpB,MAAM,qBAAqB,CAAA;AAkB5B,qDAAqD;AACrD,cAAc,iBAAiB,CAAA;AAE/B,0EAA0E;AAC1E,gFAAgF;AAChF,0BAA0B;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EACL,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,eAAe,EACf,WAAW,EACZ,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,iBAAiB,EAAoB,MAAM,0BAA0B,CAAA;AAC9E,OAAO,EAAE,cAAc,EAAqB,MAAM,6BAA6B,CAAA;AAC/E,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAEjB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACL,UAAU,EACV,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,yBAAyB,EAC1B,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACL,WAAW,EACX,cAAc,EACd,oBAAoB,EACrB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD,8EAA8E;AAC9E,OAAO,EACL,eAAe,EAIhB,MAAM,oBAAoB,CAAA;AAE3B,uCAAuC;AACvC,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,aAAa,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;GAQG;AAEH,0BAA0B;AAC1B,OAAO,EACL,eAAe,EACf,0BAA0B,EAC1B,oBAAoB,EACpB,yBAAyB,EACzB,uBAAuB,EACvB,kBAAkB,EAOnB,MAAM,aAAa,CAAA;AAEpB,oCAAoC;AACpC,OAAO,EACL,qBAAqB,EACrB,WAAW,EAEZ,MAAM,aAAa,CAAA;AAEpB,6DAA6D;AAC7D,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,uBAAuB,EACvB,kBAAkB,EAGnB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,oBAAoB,EAErB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,eAAe,EAAkB,MAAM,yBAAyB,CAAA;AACzE,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAGjB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,SAAS,EACT,YAAY,EACZ,cAAc,EAGf,MAAM,0BAA0B,CAAA;AAEjC,2EAA2E;AAC3E,OAAO,EACL,qBAAqB,EACrB,SAAS,EACT,QAAQ,EACR,UAAU,EACX,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,UAAU,EACV,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACf,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACL,uBAAuB,EACvB,QAAQ,EACR,WAAW,EAEZ,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,eAAe,EACf,aAAa,EACb,mBAAmB,EAIpB,MAAM,qBAAqB,CAAA;AAkB5B,qDAAqD;AACrD,cAAc,iBAAiB,CAAA;AAE/B,0EAA0E;AAC1E,gFAAgF;AAChF,0BAA0B;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EACL,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,eAAe,EACf,WAAW,EACZ,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,iBAAiB,EAAoB,MAAM,0BAA0B,CAAA;AAC9E,OAAO,EAAE,cAAc,EAAqB,MAAM,6BAA6B,CAAA;AAC/E,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAEjB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACL,UAAU,EACV,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,yBAAyB,EAC1B,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACL,WAAW,EACX,cAAc,EACd,oBAAoB,EACrB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD,8EAA8E;AAC9E,OAAO,EACL,eAAe,EAIhB,MAAM,oBAAoB,CAAA;AAE3B,uCAAuC;AACvC,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,aAAa,EAEb,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EAEvB,MAAM,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param props {object}
|
|
3
|
+
* @param props.open {boolean} whether the dialog is shown
|
|
4
|
+
* @param props.onClose {() => void} called before a chosen login starts and
|
|
5
|
+
* on a dismiss/cancel (which runs no login)
|
|
6
|
+
* @returns {ReactNode}
|
|
7
|
+
*/
|
|
8
|
+
export declare function AdoptDialog({ open, onClose }: {
|
|
9
|
+
open: boolean;
|
|
10
|
+
onClose: () => void;
|
|
11
|
+
}): import("react").JSX.Element;
|
|
12
|
+
//# sourceMappingURL=AdoptDialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdoptDialog.d.ts","sourceRoot":"","sources":["../../src/mui/AdoptDialog.tsx"],"names":[],"mappings":"AAsBA;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,OAAO,EACR,EAAE;IACD,IAAI,EAAE,OAAO,CAAA;IACb,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB,+BA+BA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/*!
|
|
3
|
+
* Copyright (c) 2026 Interop Alliance. All rights reserved.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* The pre-login adoption choice dialog, shown by an app's login affordance when
|
|
7
|
+
* the anonymous `local` replica holds data (see `useHasLocalData`). "Bring my
|
|
8
|
+
* data" runs `login({ adopt: 'merge' })`: the local data is merged into the
|
|
9
|
+
* connected storage and the anonymous replica is then deleted. "Set it aside"
|
|
10
|
+
* runs `login({ adopt: 'leave' })`: the anonymous replica stays untouched on
|
|
11
|
+
* this device and returns after a logout. Dismissing the dialog (backdrop /
|
|
12
|
+
* escape / Cancel) runs no login at all.
|
|
13
|
+
*/
|
|
14
|
+
import { Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle } from '@mui/material';
|
|
15
|
+
import { useLogin } from '../react/hooks.js';
|
|
16
|
+
/**
|
|
17
|
+
* @param props {object}
|
|
18
|
+
* @param props.open {boolean} whether the dialog is shown
|
|
19
|
+
* @param props.onClose {() => void} called before a chosen login starts and
|
|
20
|
+
* on a dismiss/cancel (which runs no login)
|
|
21
|
+
* @returns {ReactNode}
|
|
22
|
+
*/
|
|
23
|
+
export function AdoptDialog({ open, onClose }) {
|
|
24
|
+
const { login } = useLogin();
|
|
25
|
+
function handleLogin(adopt) {
|
|
26
|
+
onClose();
|
|
27
|
+
void login({ adopt });
|
|
28
|
+
}
|
|
29
|
+
return (_jsxs(Dialog, { open: open, onClose: onClose, "data-testid": "adopt-dialog", children: [_jsx(DialogTitle, { children: "Bring your data with you?" }), _jsx(DialogContent, { children: _jsx(DialogContentText, { children: "You created data on this device before logging in. Bring it into your own storage so it syncs everywhere you log in, or set it aside -- it then stays on this device only and comes back if you log out." }) }), _jsxs(DialogActions, { children: [_jsx(Button, { onClick: onClose, "data-testid": "adopt-cancel", children: "Cancel" }), _jsx(Button, { onClick: () => handleLogin('leave'), "data-testid": "adopt-leave", children: "Set it aside" }), _jsx(Button, { onClick: () => handleLogin('merge'), "data-testid": "adopt-merge", children: "Bring my data" })] })] }));
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=AdoptDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdoptDialog.js","sourceRoot":"","sources":["../../src/mui/AdoptDialog.tsx"],"names":[],"mappings":";AAAA;;GAEG;AACH;;;;;;;;GAQG;AACH,OAAO,EACL,MAAM,EACN,MAAM,EACN,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,WAAW,EACZ,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE5C;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,EAC1B,IAAI,EACJ,OAAO,EAIR;IACC,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,CAAA;IAE5B,SAAS,WAAW,CAAC,KAAwB;QAC3C,OAAO,EAAE,CAAA;QACT,KAAK,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;IACvB,CAAC;IAED,OAAO,CACL,MAAC,MAAM,IAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,iBAAc,cAAc,aAC9D,KAAC,WAAW,4CAAwC,EACpD,KAAC,aAAa,cACZ,KAAC,iBAAiB,2NAIE,GACN,EAChB,MAAC,aAAa,eACZ,KAAC,MAAM,IAAC,OAAO,EAAE,OAAO,iBAAc,cAAc,uBAE3C,EACT,KAAC,MAAM,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,iBAAc,aAAa,6BAE7D,EACT,KAAC,MAAM,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,iBAAc,aAAa,8BAE7D,IACK,IACT,CACV,CAAA;AACH,CAAC"}
|
package/dist/mui/index.d.ts
CHANGED
|
@@ -11,4 +11,5 @@ export { ReconnectBanner } from './ReconnectBanner.js';
|
|
|
11
11
|
export { SyncStatusChip } from './SyncStatusChip.js';
|
|
12
12
|
export { LogoutDialog } from './LogoutDialog.js';
|
|
13
13
|
export { ClearDataDialog } from './ClearDataDialog.js';
|
|
14
|
+
export { AdoptDialog } from './AdoptDialog.js';
|
|
14
15
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/mui/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;GAIG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;GAIG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA"}
|
package/dist/mui/index.js
CHANGED
|
@@ -11,4 +11,5 @@ export { ReconnectBanner } from './ReconnectBanner.js';
|
|
|
11
11
|
export { SyncStatusChip } from './SyncStatusChip.js';
|
|
12
12
|
export { LogoutDialog } from './LogoutDialog.js';
|
|
13
13
|
export { ClearDataDialog } from './ClearDataDialog.js';
|
|
14
|
+
export { AdoptDialog } from './AdoptDialog.js';
|
|
14
15
|
//# sourceMappingURL=index.js.map
|
package/dist/mui/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;GAIG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mui/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;GAIG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import type { StoreRegistry, WasAppConfig, WasExpiryConfig, WasSyncConfig } from '../config.js';
|
|
2
|
+
import type { SeedCredentialConfig } from '../identity/seedCredential.js';
|
|
3
|
+
import type { SessionStatus } from '../session/authStore.js';
|
|
4
|
+
import type { SyncRollup } from '../storage/syncStatusStore.js';
|
|
5
|
+
/**
|
|
6
|
+
* The localStore / RxDB collection key the facade's one collection uses.
|
|
7
|
+
*/
|
|
8
|
+
export declare const DOCUMENT_COLLECTION_KEY = "document";
|
|
9
|
+
/**
|
|
10
|
+
* The `format` tag stamped into (and required of) export files.
|
|
11
|
+
*/
|
|
12
|
+
export declare const DOCUMENT_EXPORT_FORMAT = "was-document/v1";
|
|
13
|
+
/**
|
|
14
|
+
* Everything `defineDocumentApp` hands back: the config + registry to spread
|
|
15
|
+
* into `WasSessionProvider`, and the typed document hook for components.
|
|
16
|
+
*/
|
|
17
|
+
export interface DocumentApp<T extends object> {
|
|
18
|
+
/**
|
|
19
|
+
* The app-wide was-react configuration (one sandbox collection,
|
|
20
|
+
* local-first onboarding). Pass to `WasSessionProvider`.
|
|
21
|
+
*/
|
|
22
|
+
config: WasAppConfig;
|
|
23
|
+
/**
|
|
24
|
+
* The singleton-document store registry. Pass to `WasSessionProvider`.
|
|
25
|
+
*/
|
|
26
|
+
registry: StoreRegistry;
|
|
27
|
+
/**
|
|
28
|
+
* The tier-1 document hook. Usable in any component below the provider.
|
|
29
|
+
*/
|
|
30
|
+
useDocument: () => {
|
|
31
|
+
/**
|
|
32
|
+
* The document: `undefined` during boot, then the stored value or the
|
|
33
|
+
* configured `initial` when nothing has been written yet.
|
|
34
|
+
*/
|
|
35
|
+
doc: T | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Merge a partial patch (or apply an updater function) onto the current
|
|
38
|
+
* document and persist it, stamping the LWW fields. The write lands in the
|
|
39
|
+
* encrypted local replica first and replicates in the background when
|
|
40
|
+
* connected.
|
|
41
|
+
*/
|
|
42
|
+
update: (patch: Partial<T> | ((prev: T) => T)) => Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* The session state: `'local'` (no wallet, fully usable) is home for a
|
|
45
|
+
* tier-1 app; `'connected'`/`'reconnect'` mirror the session machine.
|
|
46
|
+
*/
|
|
47
|
+
status: SessionStatus;
|
|
48
|
+
/**
|
|
49
|
+
* The aggregate replication rollup (`'offline'` until connected).
|
|
50
|
+
*/
|
|
51
|
+
sync: SyncRollup;
|
|
52
|
+
/**
|
|
53
|
+
* Serialize the current document to a downloadable JSON blob.
|
|
54
|
+
*/
|
|
55
|
+
exportFile: () => Promise<Blob>;
|
|
56
|
+
/**
|
|
57
|
+
* Replace the document with one previously exported via `exportFile`.
|
|
58
|
+
* Rejects when the file is not a `was-document/v1` export.
|
|
59
|
+
*/
|
|
60
|
+
importFile: (file: File) => Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* "Save to Web Spaces": run the CHAPI wallet login, requesting a grant for
|
|
63
|
+
* exactly this app's one sandbox collection, then adopt (merge) the local
|
|
64
|
+
* document into it and start background sync.
|
|
65
|
+
*/
|
|
66
|
+
connect: () => Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Detach the wallet session (data already synced stays on the server and
|
|
69
|
+
* in the kept device replica) and land back in a fresh `local` state.
|
|
70
|
+
*/
|
|
71
|
+
disconnect: () => Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* True while the CHAPI login is in flight.
|
|
74
|
+
*/
|
|
75
|
+
connecting: boolean;
|
|
76
|
+
/**
|
|
77
|
+
* The last session error (a failed login or boot), or `null`.
|
|
78
|
+
*/
|
|
79
|
+
error: string | null;
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Builds the complete wiring for a one-document app: a `WasAppConfig` with a
|
|
84
|
+
* single sandbox collection and local-first onboarding, the singleton-document
|
|
85
|
+
* store registry, and the typed `useDocument` hook bound to both.
|
|
86
|
+
*
|
|
87
|
+
* @param options {object}
|
|
88
|
+
* @param options.appName {string} human-readable name (consent reason lines)
|
|
89
|
+
* @param options.appOrigin {string} this app's own web origin
|
|
90
|
+
* @param [options.wasServerUrl] {string} expected WAS server URL
|
|
91
|
+
* @param [options.mediatorBase] {string} CHAPI mediator base URL
|
|
92
|
+
* @param options.document {object} `collectionId` (the WAS sandbox
|
|
93
|
+
* collection id) and `initial` (the document value before the first write)
|
|
94
|
+
* @param options.credential {SeedCredentialConfig} seed-credential naming
|
|
95
|
+
* @param [options.dbName] {string} local database base name
|
|
96
|
+
* @param [options.storageKeyPrefix] {string} localStorage key prefix
|
|
97
|
+
* @param [options.sync] {WasSyncConfig} replication tuning
|
|
98
|
+
* @param [options.expiry] {WasExpiryConfig} near-expiry warning tuning
|
|
99
|
+
* @returns {DocumentApp<T>}
|
|
100
|
+
*/
|
|
101
|
+
export declare function defineDocumentApp<T extends object>({ appName, appOrigin, wasServerUrl, mediatorBase, document, credential, dbName, storageKeyPrefix, sync, expiry }: {
|
|
102
|
+
appName: string;
|
|
103
|
+
appOrigin: string;
|
|
104
|
+
wasServerUrl?: string;
|
|
105
|
+
mediatorBase?: string;
|
|
106
|
+
document: {
|
|
107
|
+
collectionId: string;
|
|
108
|
+
initial: T;
|
|
109
|
+
};
|
|
110
|
+
credential: SeedCredentialConfig;
|
|
111
|
+
dbName?: string;
|
|
112
|
+
storageKeyPrefix?: string;
|
|
113
|
+
sync?: WasSyncConfig;
|
|
114
|
+
expiry?: WasExpiryConfig;
|
|
115
|
+
}): DocumentApp<T>;
|
|
116
|
+
//# sourceMappingURL=documentApp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documentApp.d.ts","sourceRoot":"","sources":["../../src/react/documentApp.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,eAAe,EACf,aAAa,EACd,MAAM,cAAc,CAAA;AACrB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAG5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA;AAG/D;;GAEG;AACH,eAAO,MAAM,uBAAuB,aAAa,CAAA;AAOjD;;GAEG;AACH,eAAO,MAAM,sBAAsB,oBAAoB,CAAA;AAavD;;;GAGG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,MAAM;IAC3C;;;OAGG;IACH,MAAM,EAAE,YAAY,CAAA;IACpB;;OAEG;IACH,QAAQ,EAAE,aAAa,CAAA;IACvB;;OAEG;IACH,WAAW,EAAE,MAAM;QACjB;;;WAGG;QACH,GAAG,EAAE,CAAC,GAAG,SAAS,CAAA;QAClB;;;;;WAKG;QACH,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;QAC/D;;;WAGG;QACH,MAAM,EAAE,aAAa,CAAA;QACrB;;WAEG;QACH,IAAI,EAAE,UAAU,CAAA;QAChB;;WAEG;QACH,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;QAC/B;;;WAGG;QACH,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;QACzC;;;;WAIG;QACH,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;QAC5B;;;WAGG;QACH,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;QAC/B;;WAEG;QACH,UAAU,EAAE,OAAO,CAAA;QACnB;;WAEG;QACH,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KACrB,CAAA;CACF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,EAAE,EAClD,OAAO,EACP,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,MAAM,EACN,gBAAgB,EAChB,IAAI,EACJ,MAAM,EACP,EAAE;IACD,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC,CAAA;KAAE,CAAA;IAC9C,UAAU,EAAE,oBAAoB,CAAA;IAChC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,IAAI,CAAC,EAAE,aAAa,CAAA;IACpB,MAAM,CAAC,EAAE,eAAe,CAAA;CACzB,GAAG,WAAW,CAAC,CAAC,CAAC,CAiIjB"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2026 Interop Alliance. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* The tier-1 "one sandbox document" facade: `defineDocumentApp` builds the
|
|
6
|
+
* whole was-react wiring (config, store registry, entity store) for an app
|
|
7
|
+
* whose entire model is a single key-value document -- an Excalidraw-style
|
|
8
|
+
* editor, a browser-game save file -- and returns a typed `useDocument` hook
|
|
9
|
+
* over it. The app never sees `createEntityStore`, grants parsing, or sync
|
|
10
|
+
* internals: it renders `doc`, calls `update`, and optionally offers file
|
|
11
|
+
* export/import and a "Save to Web Spaces" connect button.
|
|
12
|
+
*
|
|
13
|
+
* The facade is a degenerate entity store: one collection (the app-named
|
|
14
|
+
* sandbox collection) holding one logical document under a fixed id. The
|
|
15
|
+
* stored row wraps the app's data (`{ id, updatedAt, deviceId, data }`) so app
|
|
16
|
+
* fields can never collide with the LWW fields the sync layer requires, and
|
|
17
|
+
* the facade stamps `updatedAt`/`deviceId` on every write itself. Hydration
|
|
18
|
+
* goes through `LocalStore.hydrateSingleton`, which LWW-reconciles the
|
|
19
|
+
* duplicate envelope rows two devices can mint for the same logical document.
|
|
20
|
+
*
|
|
21
|
+
* `connect()` is plain `login()`: the config registers exactly one collection,
|
|
22
|
+
* so the wallet consent screen shows a single legible request, and the default
|
|
23
|
+
* adopt-on-login merge carries the local document into the granted collection.
|
|
24
|
+
*
|
|
25
|
+
* Multi-document ("slot") variants are deliberately not supported yet:
|
|
26
|
+
* `hydrateSingleton` reconciles ALL rows of the collection down to one winner,
|
|
27
|
+
* so named slots need a grouped per-id reconciler first. An app that has
|
|
28
|
+
* outgrown one document should move to `createEntityStore`.
|
|
29
|
+
*/
|
|
30
|
+
import { useStore } from 'zustand';
|
|
31
|
+
import { createEntityStore } from '../storage/entityStore.js';
|
|
32
|
+
import { getDeviceId, requireStore } from '../storage/storageManager.js';
|
|
33
|
+
import { useAuthStore, useSession, useSyncStatus } from './hooks.js';
|
|
34
|
+
/**
|
|
35
|
+
* The localStore / RxDB collection key the facade's one collection uses.
|
|
36
|
+
*/
|
|
37
|
+
export const DOCUMENT_COLLECTION_KEY = 'document';
|
|
38
|
+
/**
|
|
39
|
+
* The fixed logical id of the singleton document row.
|
|
40
|
+
*/
|
|
41
|
+
const DOCUMENT_ID = 'main';
|
|
42
|
+
/**
|
|
43
|
+
* The `format` tag stamped into (and required of) export files.
|
|
44
|
+
*/
|
|
45
|
+
export const DOCUMENT_EXPORT_FORMAT = 'was-document/v1';
|
|
46
|
+
/**
|
|
47
|
+
* Builds the complete wiring for a one-document app: a `WasAppConfig` with a
|
|
48
|
+
* single sandbox collection and local-first onboarding, the singleton-document
|
|
49
|
+
* store registry, and the typed `useDocument` hook bound to both.
|
|
50
|
+
*
|
|
51
|
+
* @param options {object}
|
|
52
|
+
* @param options.appName {string} human-readable name (consent reason lines)
|
|
53
|
+
* @param options.appOrigin {string} this app's own web origin
|
|
54
|
+
* @param [options.wasServerUrl] {string} expected WAS server URL
|
|
55
|
+
* @param [options.mediatorBase] {string} CHAPI mediator base URL
|
|
56
|
+
* @param options.document {object} `collectionId` (the WAS sandbox
|
|
57
|
+
* collection id) and `initial` (the document value before the first write)
|
|
58
|
+
* @param options.credential {SeedCredentialConfig} seed-credential naming
|
|
59
|
+
* @param [options.dbName] {string} local database base name
|
|
60
|
+
* @param [options.storageKeyPrefix] {string} localStorage key prefix
|
|
61
|
+
* @param [options.sync] {WasSyncConfig} replication tuning
|
|
62
|
+
* @param [options.expiry] {WasExpiryConfig} near-expiry warning tuning
|
|
63
|
+
* @returns {DocumentApp<T>}
|
|
64
|
+
*/
|
|
65
|
+
export function defineDocumentApp({ appName, appOrigin, wasServerUrl, mediatorBase, document, credential, dbName, storageKeyPrefix, sync, expiry }) {
|
|
66
|
+
const { collectionId, initial } = document;
|
|
67
|
+
const docStore = createEntityStore(DOCUMENT_COLLECTION_KEY);
|
|
68
|
+
const config = {
|
|
69
|
+
appName,
|
|
70
|
+
appOrigin,
|
|
71
|
+
...(wasServerUrl !== undefined && { wasServerUrl }),
|
|
72
|
+
...(mediatorBase !== undefined && { mediatorBase }),
|
|
73
|
+
collections: [{ key: DOCUMENT_COLLECTION_KEY, id: collectionId }],
|
|
74
|
+
onboarding: 'local-first',
|
|
75
|
+
credential,
|
|
76
|
+
...(dbName !== undefined && { dbName }),
|
|
77
|
+
...(storageKeyPrefix !== undefined && { storageKeyPrefix }),
|
|
78
|
+
...(sync !== undefined && { sync }),
|
|
79
|
+
...(expiry !== undefined && { expiry })
|
|
80
|
+
};
|
|
81
|
+
const registry = {
|
|
82
|
+
[DOCUMENT_COLLECTION_KEY]: {
|
|
83
|
+
// Whole-collection hydrate doubles as the duplicate-singleton
|
|
84
|
+
// reconciler: keep the LWW winner, tombstone the losers.
|
|
85
|
+
hydrate: async () => {
|
|
86
|
+
const winner = await requireStore().hydrateSingleton(DOCUMENT_COLLECTION_KEY);
|
|
87
|
+
docStore.getState().replaceAll(winner ? [winner] : []);
|
|
88
|
+
},
|
|
89
|
+
upsert: doc => docStore.getState().patch(doc),
|
|
90
|
+
drop: uuid => docStore.getState().drop(uuid),
|
|
91
|
+
clear: () => docStore.getState().replaceAll([])
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* Merges the patch (or applies the updater) and persists the result under
|
|
96
|
+
* the fixed document id with fresh LWW stamps.
|
|
97
|
+
*
|
|
98
|
+
* @param patch {Partial<T> | ((prev: T) => T)}
|
|
99
|
+
* @returns {Promise<void>}
|
|
100
|
+
*/
|
|
101
|
+
async function update(patch) {
|
|
102
|
+
const held = docStore.getState().byId.get(DOCUMENT_ID);
|
|
103
|
+
const prev = held?.data ?? initial;
|
|
104
|
+
const data = typeof patch === 'function' ? patch(prev) : { ...prev, ...patch };
|
|
105
|
+
await docStore.getState().upsert({
|
|
106
|
+
id: DOCUMENT_ID,
|
|
107
|
+
updatedAt: new Date().toISOString(),
|
|
108
|
+
deviceId: getDeviceId({
|
|
109
|
+
...(storageKeyPrefix !== undefined && { storageKeyPrefix })
|
|
110
|
+
}),
|
|
111
|
+
data
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Serializes the current document (or `initial` before any write) into a
|
|
116
|
+
* tagged, versioned JSON blob.
|
|
117
|
+
*
|
|
118
|
+
* @returns {Promise<Blob>}
|
|
119
|
+
*/
|
|
120
|
+
async function exportFile() {
|
|
121
|
+
const held = docStore.getState().byId.get(DOCUMENT_ID);
|
|
122
|
+
const body = {
|
|
123
|
+
format: DOCUMENT_EXPORT_FORMAT,
|
|
124
|
+
app: appName,
|
|
125
|
+
exportedAt: new Date().toISOString(),
|
|
126
|
+
document: held?.data ?? initial
|
|
127
|
+
};
|
|
128
|
+
return new Blob([JSON.stringify(body, null, 2)], {
|
|
129
|
+
type: 'application/json'
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Parses an export file and replaces the document with its contents (a
|
|
134
|
+
* persisted write with fresh LWW stamps).
|
|
135
|
+
*
|
|
136
|
+
* @param file {File}
|
|
137
|
+
* @returns {Promise<void>}
|
|
138
|
+
*/
|
|
139
|
+
async function importFile(file) {
|
|
140
|
+
let parsed;
|
|
141
|
+
try {
|
|
142
|
+
parsed = JSON.parse(await file.text());
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
throw new Error('Not a valid export file (unreadable JSON).');
|
|
146
|
+
}
|
|
147
|
+
const record = parsed;
|
|
148
|
+
if (record === null ||
|
|
149
|
+
record.format !== DOCUMENT_EXPORT_FORMAT ||
|
|
150
|
+
typeof record.document !== 'object' ||
|
|
151
|
+
record.document === null) {
|
|
152
|
+
throw new Error(`Not a "${DOCUMENT_EXPORT_FORMAT}" export file; nothing imported.`);
|
|
153
|
+
}
|
|
154
|
+
const imported = record.document;
|
|
155
|
+
await update(() => imported);
|
|
156
|
+
}
|
|
157
|
+
function useDocument() {
|
|
158
|
+
const held = docStore(state => state.byId.get(DOCUMENT_ID));
|
|
159
|
+
const { status, authenticating, error } = useSession();
|
|
160
|
+
const { state: syncState } = useSyncStatus();
|
|
161
|
+
const store = useAuthStore();
|
|
162
|
+
const login = useStore(store, state => state.login);
|
|
163
|
+
const logout = useStore(store, state => state.logout);
|
|
164
|
+
// Hydration completes before the machine leaves `boot`, so "left boot" is
|
|
165
|
+
// exactly "the stored document (or its absence) is now known".
|
|
166
|
+
const doc = status === 'boot' ? undefined : (held?.data ?? initial);
|
|
167
|
+
return {
|
|
168
|
+
doc,
|
|
169
|
+
update,
|
|
170
|
+
status,
|
|
171
|
+
sync: syncState,
|
|
172
|
+
exportFile,
|
|
173
|
+
importFile,
|
|
174
|
+
connect: () => login(),
|
|
175
|
+
disconnect: () => logout(),
|
|
176
|
+
connecting: authenticating,
|
|
177
|
+
error
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
return { config, registry, useDocument };
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=documentApp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documentApp.js","sourceRoot":"","sources":["../../src/react/documentApp.ts"],"names":[],"mappings":"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"}
|
package/dist/react/hooks.d.ts
CHANGED
|
@@ -27,12 +27,16 @@ export declare function useSession(): {
|
|
|
27
27
|
/**
|
|
28
28
|
* The login action plus the state the login page renders. `authenticating` is
|
|
29
29
|
* the in-flight flag (the `status` stays `local` during login); `status` is
|
|
30
|
-
* exposed so a login page can redirect once it reads `connected`.
|
|
30
|
+
* exposed so a login page can redirect once it reads `connected`. `login`
|
|
31
|
+
* accepts `{ adopt }` -- `'merge'` (default) migrates data created in `local`
|
|
32
|
+
* into the connected replica, `'leave'` sets it aside untouched.
|
|
31
33
|
*
|
|
32
34
|
* @returns {object}
|
|
33
35
|
*/
|
|
34
36
|
export declare function useLogin(): {
|
|
35
|
-
login: (
|
|
37
|
+
login: (options?: {
|
|
38
|
+
adopt?: 'merge' | 'leave';
|
|
39
|
+
}) => Promise<void>;
|
|
36
40
|
authenticating: boolean;
|
|
37
41
|
status: ReturnType<WasAuthStore['getState']>['status'];
|
|
38
42
|
phase: ReturnType<WasAuthStore['getState']>['phase'];
|
|
@@ -55,6 +59,15 @@ export declare function useLogout(): (options?: {
|
|
|
55
59
|
* @returns {() => Promise<void>}
|
|
56
60
|
*/
|
|
57
61
|
export declare function useClearData(): () => Promise<void>;
|
|
62
|
+
/**
|
|
63
|
+
* Whether the anonymous `local` replica currently holds any documents -- the
|
|
64
|
+
* check a login affordance runs at decision time (e.g. on the login button
|
|
65
|
+
* click) to choose between opening the adoption dialog and calling `login()`
|
|
66
|
+
* directly. Returns the async check, not a subscription.
|
|
67
|
+
*
|
|
68
|
+
* @returns {() => Promise<boolean>}
|
|
69
|
+
*/
|
|
70
|
+
export declare function useHasLocalData(): () => Promise<boolean>;
|
|
58
71
|
/**
|
|
59
72
|
* The expired-access reconnect: the banner flags plus the reconnect action.
|
|
60
73
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/react/hooks.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,+BAA+B,CAAA;AAEtC;;;;;GAKG;AACH,wBAAgB,YAAY,IAAI,YAAY,CAS3C;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI;IAC5B,MAAM,EAAE,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;IACtD,UAAU,EAAE,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAA;IAC9D,cAAc,EAAE,OAAO,CAAA;IACvB,KAAK,EAAE,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;IACpD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,aAAa,EAAE,OAAO,CAAA;IACtB,YAAY,EAAE,OAAO,CAAA;CACtB,CAgBA;AAED
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/react/hooks.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,+BAA+B,CAAA;AAEtC;;;;;GAKG;AACH,wBAAgB,YAAY,IAAI,YAAY,CAS3C;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI;IAC5B,MAAM,EAAE,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;IACtD,UAAU,EAAE,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAA;IAC9D,cAAc,EAAE,OAAO,CAAA;IACvB,KAAK,EAAE,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;IACpD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,aAAa,EAAE,OAAO,CAAA;IACtB,YAAY,EAAE,OAAO,CAAA;CACtB,CAgBA;AAED;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,IAAI;IAC1B,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACjE,cAAc,EAAE,OAAO,CAAA;IACvB,MAAM,EAAE,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;IACtD,KAAK,EAAE,UAAU,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;IACpD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB,CAaA;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,IAAI,CAAC,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAG3E;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,IAAI,MAAM,OAAO,CAAC,IAAI,CAAC,CAGlD;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,IAAI,MAAM,OAAO,CAAC,OAAO,CAAC,CAGxD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,IAAI;IAC9B,aAAa,EAAE,OAAO,CAAA;IACtB,YAAY,EAAE,OAAO,CAAA;IACrB,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC/B,CAWA;AAED;;;GAGG;AACH,YAAY,EAAE,UAAU,EAAE,CAAA;AAE1B;;;;;;;GAOG;AACH,wBAAgB,aAAa,IAAI;IAC/B,KAAK,EAAE,UAAU,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACd,CAKA"}
|
package/dist/react/hooks.js
CHANGED
|
@@ -48,7 +48,9 @@ export function useSession() {
|
|
|
48
48
|
/**
|
|
49
49
|
* The login action plus the state the login page renders. `authenticating` is
|
|
50
50
|
* the in-flight flag (the `status` stays `local` during login); `status` is
|
|
51
|
-
* exposed so a login page can redirect once it reads `connected`.
|
|
51
|
+
* exposed so a login page can redirect once it reads `connected`. `login`
|
|
52
|
+
* accepts `{ adopt }` -- `'merge'` (default) migrates data created in `local`
|
|
53
|
+
* into the connected replica, `'leave'` sets it aside untouched.
|
|
52
54
|
*
|
|
53
55
|
* @returns {object}
|
|
54
56
|
*/
|
|
@@ -84,6 +86,18 @@ export function useClearData() {
|
|
|
84
86
|
const store = useAuthStore();
|
|
85
87
|
return useStore(store, state => state.clearLocalData);
|
|
86
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* Whether the anonymous `local` replica currently holds any documents -- the
|
|
91
|
+
* check a login affordance runs at decision time (e.g. on the login button
|
|
92
|
+
* click) to choose between opening the adoption dialog and calling `login()`
|
|
93
|
+
* directly. Returns the async check, not a subscription.
|
|
94
|
+
*
|
|
95
|
+
* @returns {() => Promise<boolean>}
|
|
96
|
+
*/
|
|
97
|
+
export function useHasLocalData() {
|
|
98
|
+
const store = useAuthStore();
|
|
99
|
+
return useStore(store, state => state.hasLocalData);
|
|
100
|
+
}
|
|
87
101
|
/**
|
|
88
102
|
* The expired-access reconnect: the banner flags plus the reconnect action.
|
|
89
103
|
*
|
package/dist/react/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/react/hooks.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;GAIG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAE3D,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAEjB,MAAM,+BAA+B,CAAA;AAEtC;;;;;GAKG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,KAAK,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAA;IAC3C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,yEAAyE;YACvE,sDAAsD,CACzD,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU;IAWxB,MAAM,KAAK,GAAG,YAAY,EAAE,CAAA;IAC5B,OAAO,QAAQ,CACb,KAAK,EACL,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACnB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,YAAY,EAAE,KAAK,CAAC,YAAY;KACjC,CAAC,CAAC,CACJ,CAAA;AACH,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/react/hooks.ts"],"names":[],"mappings":"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"}
|
package/dist/react/index.d.ts
CHANGED
|
@@ -7,5 +7,6 @@
|
|
|
7
7
|
* `./mui` subpath.
|
|
8
8
|
*/
|
|
9
9
|
export { WasSessionProvider, WasSessionContext } from './WasSessionProvider.js';
|
|
10
|
-
export { useAuthStore, useSession, useLogin, useLogout, useClearData, useReconnect, useSyncStatus, type SyncRollup } from './hooks.js';
|
|
10
|
+
export { useAuthStore, useSession, useLogin, useLogout, useClearData, useHasLocalData, useReconnect, useSyncStatus, type SyncRollup } from './hooks.js';
|
|
11
|
+
export { defineDocumentApp, DOCUMENT_COLLECTION_KEY, DOCUMENT_EXPORT_FORMAT, type DocumentApp } from './documentApp.js';
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;GAIG;AACH,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC/E,OAAO,EACL,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,KAAK,UAAU,EAChB,MAAM,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;GAIG;AACH,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC/E,OAAO,EACL,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,aAAa,EACb,KAAK,UAAU,EAChB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAA"}
|
package/dist/react/index.js
CHANGED
|
@@ -7,5 +7,6 @@
|
|
|
7
7
|
* `./mui` subpath.
|
|
8
8
|
*/
|
|
9
9
|
export { WasSessionProvider, WasSessionContext } from './WasSessionProvider.js';
|
|
10
|
-
export { useAuthStore, useSession, useLogin, useLogout, useClearData, useReconnect, useSyncStatus } from './hooks.js';
|
|
10
|
+
export { useAuthStore, useSession, useLogin, useLogout, useClearData, useHasLocalData, useReconnect, useSyncStatus } from './hooks.js';
|
|
11
|
+
export { defineDocumentApp, DOCUMENT_COLLECTION_KEY, DOCUMENT_EXPORT_FORMAT } from './documentApp.js';
|
|
11
12
|
//# sourceMappingURL=index.js.map
|
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;GAIG;AACH,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC/E,OAAO,EACL,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,aAAa,EAEd,MAAM,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;GAIG;AACH,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC/E,OAAO,EACL,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,aAAa,EAEd,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EAEvB,MAAM,kBAAkB,CAAA"}
|
|
@@ -17,9 +17,14 @@
|
|
|
17
17
|
* `status !== 'boot'`.
|
|
18
18
|
*
|
|
19
19
|
* Login (or `connectWithGrants`) tears the anonymous replica down and opens the
|
|
20
|
-
* connected replica under the wallet-derived seed.
|
|
21
|
-
*
|
|
22
|
-
*
|
|
20
|
+
* connected replica under the wallet-derived seed. By default it ADOPTS the
|
|
21
|
+
* anonymous replica's data first (`adopt: 'merge'`): the decrypted payloads are
|
|
22
|
+
* collected before teardown, LWW-merged into the connected replica before its
|
|
23
|
+
* first hydrate/sync (so they reach the server as ordinary creates), and the
|
|
24
|
+
* anonymous seed + database are deleted once the activation lands. `adopt:
|
|
25
|
+
* 'leave'` sets the anonymous replica aside untouched instead (it returns after
|
|
26
|
+
* a logout). Logout returns to a fresh `local` (optionally wiping the connected
|
|
27
|
+
* replica); `clearLocalData` mints a brand-new anonymous seed and replica.
|
|
23
28
|
*
|
|
24
29
|
* The library cannot bind a module-level store to app config, so this is a
|
|
25
30
|
* FACTORY: {@link createAuthStore} captures the app's {@link WasAppConfig} and
|
|
@@ -81,21 +86,36 @@ export interface AuthState {
|
|
|
81
86
|
boot: () => Promise<void>;
|
|
82
87
|
/**
|
|
83
88
|
* Full Login With Wallet (first-run or returning). On success tears down the
|
|
84
|
-
* anonymous replica and opens the connected one.
|
|
89
|
+
* anonymous replica and opens the connected one. `adopt` decides what happens
|
|
90
|
+
* to data created in `local` before this login: `'merge'` (the default)
|
|
91
|
+
* LWW-merges it into the connected replica and then deletes the anonymous
|
|
92
|
+
* seed + database; `'leave'` sets the anonymous replica aside untouched (it
|
|
93
|
+
* returns after a logout). A cancel or failure leaves `local` intact either
|
|
94
|
+
* way.
|
|
95
|
+
*
|
|
96
|
+
* @param [options] {object}
|
|
97
|
+
* @param [options.adopt] {'merge' | 'leave'}
|
|
98
|
+
* @returns {Promise<void>}
|
|
85
99
|
*/
|
|
86
|
-
login: (
|
|
100
|
+
login: (options?: {
|
|
101
|
+
adopt?: 'merge' | 'leave';
|
|
102
|
+
}) => Promise<void>;
|
|
87
103
|
/**
|
|
88
104
|
* Non-CHAPI connect from an explicit seed + grants (dev/test and provisioned
|
|
89
|
-
* grants). Tears down the current replica and opens the connected one
|
|
105
|
+
* grants). Tears down the current replica and opens the connected one, with
|
|
106
|
+
* the same `adopt` choice (and `'merge'` default) as `login`, so this path
|
|
107
|
+
* exercises adoption exactly as a wallet login does.
|
|
90
108
|
*
|
|
91
109
|
* @param options {object}
|
|
92
110
|
* @param options.seed {Uint8Array}
|
|
93
111
|
* @param options.grants {IZcap[]}
|
|
112
|
+
* @param [options.adopt] {'merge' | 'leave'}
|
|
94
113
|
* @returns {Promise<void>}
|
|
95
114
|
*/
|
|
96
115
|
connectWithGrants: (options: {
|
|
97
116
|
seed: Uint8Array;
|
|
98
117
|
grants: IZcap[];
|
|
118
|
+
adopt?: 'merge' | 'leave';
|
|
99
119
|
}) => Promise<void>;
|
|
100
120
|
/**
|
|
101
121
|
* Re-run the grants flow with the existing seed (expired access).
|
|
@@ -118,6 +138,12 @@ export interface AuthState {
|
|
|
118
138
|
* `local`-mode "Clear data" button.
|
|
119
139
|
*/
|
|
120
140
|
clearLocalData: () => Promise<void>;
|
|
141
|
+
/**
|
|
142
|
+
* Whether the anonymous `local` replica currently holds any documents -- the
|
|
143
|
+
* check a login screen runs to decide whether to offer the adoption choice
|
|
144
|
+
* before `login()`. Always false outside `local`.
|
|
145
|
+
*/
|
|
146
|
+
hasLocalData: () => Promise<boolean>;
|
|
121
147
|
notifyAccessExpired: () => void;
|
|
122
148
|
/**
|
|
123
149
|
* Tears down the live replica (expiry watch, controller, local store) WITHOUT
|