@multiplatform.one/frappe 6.0.4 → 6.3.0
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 +38 -12
- package/dist/cjs/auth.cjs +1 -1
- package/dist/cjs/auth.native.js.map +1 -1
- package/dist/cjs/call.cjs +1 -1
- package/dist/cjs/call.native.js.map +1 -1
- package/dist/cjs/collection.cjs +18 -4
- package/dist/cjs/collection.native.js +18 -4
- package/dist/cjs/collection.native.js.map +1 -1
- package/dist/cjs/core/http.cjs +92 -9
- package/dist/cjs/core/http.native.js +96 -7
- package/dist/cjs/core/http.native.js.map +1 -1
- package/dist/cjs/db.cjs +7 -7
- package/dist/cjs/db.native.js +4 -4
- package/dist/cjs/db.native.js.map +1 -1
- package/dist/cjs/doctype.cjs +97 -39
- package/dist/cjs/doctype.native.js +116 -46
- package/dist/cjs/doctype.native.js.map +1 -1
- package/dist/cjs/file.cjs +1 -1
- package/dist/cjs/file.native.js.map +1 -1
- package/dist/cjs/fixtureDb.cjs +3 -2
- package/dist/cjs/fixtureDb.native.js +2 -1
- package/dist/cjs/fixtureDb.native.js.map +1 -1
- package/dist/cjs/frappeApp.cjs +15 -14
- package/dist/cjs/frappeApp.native.js +16 -14
- package/dist/cjs/frappeApp.native.js.map +1 -1
- package/dist/cjs/frappeReact.cjs +198 -18
- package/dist/cjs/frappeReact.native.js +241 -18
- package/dist/cjs/frappeReact.native.js.map +1 -1
- package/dist/cjs/index.cjs +9 -4
- package/dist/cjs/index.native.js +9 -4
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/pacer.cjs +2 -2
- package/dist/cjs/pacer.native.js +2 -2
- package/dist/cjs/pacer.native.js.map +1 -1
- package/dist/cjs/realtime.cjs +186 -46
- package/dist/cjs/realtime.native.js +268 -48
- package/dist/cjs/realtime.native.js.map +1 -1
- package/dist/cjs/sync/backfill.cjs +32 -27
- package/dist/cjs/sync/backfill.native.js +49 -43
- package/dist/cjs/sync/backfill.native.js.map +1 -1
- package/dist/cjs/sync/index.cjs +90 -24
- package/dist/cjs/sync/index.native.js +112 -10
- package/dist/cjs/sync/index.native.js.map +1 -1
- package/dist/cjs/sync/merge.cjs +0 -3
- package/dist/cjs/sync/merge.native.js +0 -3
- package/dist/cjs/sync/merge.native.js.map +1 -1
- package/dist/cjs/sync/mutationEngine.cjs +25 -19
- package/dist/cjs/sync/mutationEngine.native.js +16 -13
- package/dist/cjs/sync/mutationEngine.native.js.map +1 -1
- package/dist/cjs/sync/mutationJournal.cjs +9 -4
- package/dist/cjs/sync/mutationJournal.native.js +7 -4
- package/dist/cjs/sync/mutationJournal.native.js.map +1 -1
- package/dist/cjs/sync/normalizedCache.cjs +7 -3
- package/dist/cjs/sync/normalizedCache.native.js +7 -2
- package/dist/cjs/sync/normalizedCache.native.js.map +1 -1
- package/dist/cjs/sync/persistence.cjs +63 -31
- package/dist/cjs/sync/persistence.native.js +120 -63
- package/dist/cjs/sync/persistence.native.js.map +1 -1
- package/dist/cjs/sync/realtime.cjs +124 -13
- package/dist/cjs/sync/realtime.native.js +163 -20
- package/dist/cjs/sync/realtime.native.js.map +1 -1
- package/dist/cjs/sync/rehydration.cjs +16 -10
- package/dist/cjs/sync/rehydration.native.js +16 -14
- package/dist/cjs/sync/rehydration.native.js.map +1 -1
- package/dist/cjs/sync/storage.cjs +3 -3
- package/dist/cjs/sync/storage.native.js +1 -1
- package/dist/cjs/sync/storage.native.js.map +1 -1
- package/dist/cjs/sync/subscriptionManager.cjs +255 -65
- package/dist/cjs/sync/subscriptionManager.native.js +330 -93
- package/dist/cjs/sync/subscriptionManager.native.js.map +1 -1
- package/dist/cjs/sync/types.cjs +2 -0
- package/dist/cjs/sync/types.native.js +2 -0
- package/dist/cjs/sync/types.native.js.map +1 -1
- package/dist/cjs/sync/virtualPageManager.cjs +9 -9
- package/dist/cjs/sync/virtualPageManager.native.js +5 -9
- package/dist/cjs/sync/virtualPageManager.native.js.map +1 -1
- package/dist/cjs/useLiveQuery.cjs +52 -0
- package/dist/cjs/useLiveQuery.native.js +59 -0
- package/dist/cjs/useLiveQuery.native.js.map +1 -0
- package/dist/cjs/util.cjs +11 -2
- package/dist/cjs/util.native.js +16 -2
- package/dist/cjs/util.native.js.map +1 -1
- package/dist/esm/auth.mjs +1 -1
- package/dist/esm/auth.mjs.map +1 -1
- package/dist/esm/auth.native.js.map +1 -1
- package/dist/esm/call.mjs +1 -1
- package/dist/esm/call.mjs.map +1 -1
- package/dist/esm/call.native.js.map +1 -1
- package/dist/esm/collection.mjs +18 -4
- package/dist/esm/collection.mjs.map +1 -1
- package/dist/esm/collection.native.js +18 -4
- package/dist/esm/collection.native.js.map +1 -1
- package/dist/esm/core/http.mjs +93 -10
- package/dist/esm/core/http.mjs.map +1 -1
- package/dist/esm/core/http.native.js +97 -8
- package/dist/esm/core/http.native.js.map +1 -1
- package/dist/esm/db.mjs +7 -7
- package/dist/esm/db.mjs.map +1 -1
- package/dist/esm/db.native.js +4 -4
- package/dist/esm/db.native.js.map +1 -1
- package/dist/esm/doctype.mjs +96 -39
- package/dist/esm/doctype.mjs.map +1 -1
- package/dist/esm/doctype.native.js +115 -46
- package/dist/esm/doctype.native.js.map +1 -1
- package/dist/esm/file.mjs +1 -1
- package/dist/esm/file.mjs.map +1 -1
- package/dist/esm/file.native.js.map +1 -1
- package/dist/esm/fixtureDb.mjs +3 -2
- package/dist/esm/fixtureDb.mjs.map +1 -1
- package/dist/esm/fixtureDb.native.js +2 -1
- package/dist/esm/fixtureDb.native.js.map +1 -1
- package/dist/esm/frappeApp.mjs +15 -14
- package/dist/esm/frappeApp.mjs.map +1 -1
- package/dist/esm/frappeApp.native.js +16 -14
- package/dist/esm/frappeApp.native.js.map +1 -1
- package/dist/esm/frappeReact.mjs +197 -19
- package/dist/esm/frappeReact.mjs.map +1 -1
- package/dist/esm/frappeReact.native.js +240 -19
- package/dist/esm/frappeReact.native.js.map +1 -1
- package/dist/esm/index.mjs +5 -4
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +5 -4
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/pacer.mjs +1 -1
- package/dist/esm/pacer.native.js +1 -1
- package/dist/esm/realtime.mjs +187 -47
- package/dist/esm/realtime.mjs.map +1 -1
- package/dist/esm/realtime.native.js +269 -49
- package/dist/esm/realtime.native.js.map +1 -1
- package/dist/esm/sync/backfill.mjs +32 -27
- package/dist/esm/sync/backfill.mjs.map +1 -1
- package/dist/esm/sync/backfill.native.js +49 -43
- package/dist/esm/sync/backfill.native.js.map +1 -1
- package/dist/esm/sync/index.mjs +90 -24
- package/dist/esm/sync/index.mjs.map +1 -1
- package/dist/esm/sync/index.native.js +112 -10
- package/dist/esm/sync/index.native.js.map +1 -1
- package/dist/esm/sync/merge.mjs +1 -1
- package/dist/esm/sync/merge.mjs.map +1 -1
- package/dist/esm/sync/merge.native.js +1 -1
- package/dist/esm/sync/merge.native.js.map +1 -1
- package/dist/esm/sync/mutationEngine.mjs +25 -19
- package/dist/esm/sync/mutationEngine.mjs.map +1 -1
- package/dist/esm/sync/mutationEngine.native.js +16 -13
- package/dist/esm/sync/mutationEngine.native.js.map +1 -1
- package/dist/esm/sync/mutationJournal.mjs +9 -4
- package/dist/esm/sync/mutationJournal.mjs.map +1 -1
- package/dist/esm/sync/mutationJournal.native.js +7 -4
- package/dist/esm/sync/mutationJournal.native.js.map +1 -1
- package/dist/esm/sync/normalizedCache.mjs +7 -3
- package/dist/esm/sync/normalizedCache.mjs.map +1 -1
- package/dist/esm/sync/normalizedCache.native.js +7 -2
- package/dist/esm/sync/normalizedCache.native.js.map +1 -1
- package/dist/esm/sync/persistence.mjs +64 -32
- package/dist/esm/sync/persistence.mjs.map +1 -1
- package/dist/esm/sync/persistence.native.js +121 -64
- package/dist/esm/sync/persistence.native.js.map +1 -1
- package/dist/esm/sync/realtime.mjs +124 -13
- package/dist/esm/sync/realtime.mjs.map +1 -1
- package/dist/esm/sync/realtime.native.js +163 -20
- package/dist/esm/sync/realtime.native.js.map +1 -1
- package/dist/esm/sync/rehydration.mjs +16 -10
- package/dist/esm/sync/rehydration.mjs.map +1 -1
- package/dist/esm/sync/rehydration.native.js +16 -14
- package/dist/esm/sync/rehydration.native.js.map +1 -1
- package/dist/esm/sync/storage.mjs +3 -3
- package/dist/esm/sync/storage.mjs.map +1 -1
- package/dist/esm/sync/storage.native.js +1 -1
- package/dist/esm/sync/storage.native.js.map +1 -1
- package/dist/esm/sync/subscriptionManager.mjs +255 -65
- package/dist/esm/sync/subscriptionManager.mjs.map +1 -1
- package/dist/esm/sync/subscriptionManager.native.js +330 -93
- package/dist/esm/sync/subscriptionManager.native.js.map +1 -1
- package/dist/esm/sync/types.mjs +2 -0
- package/dist/esm/sync/types.mjs.map +1 -1
- package/dist/esm/sync/types.native.js +2 -0
- package/dist/esm/sync/types.native.js.map +1 -1
- package/dist/esm/sync/virtualPageManager.mjs +9 -9
- package/dist/esm/sync/virtualPageManager.mjs.map +1 -1
- package/dist/esm/sync/virtualPageManager.native.js +5 -9
- package/dist/esm/sync/virtualPageManager.native.js.map +1 -1
- package/dist/esm/useLiveQuery.mjs +26 -0
- package/dist/esm/useLiveQuery.mjs.map +1 -0
- package/dist/esm/useLiveQuery.native.js +30 -0
- package/dist/esm/useLiveQuery.native.js.map +1 -0
- package/dist/esm/util.mjs +11 -3
- package/dist/esm/util.mjs.map +1 -1
- package/dist/esm/util.native.js +16 -3
- package/dist/esm/util.native.js.map +1 -1
- package/dist/jsx/auth.mjs +1 -1
- package/dist/jsx/auth.mjs.map +1 -1
- package/dist/jsx/auth.native.js.map +1 -1
- package/dist/jsx/call.mjs +1 -1
- package/dist/jsx/call.mjs.map +1 -1
- package/dist/jsx/call.native.js.map +1 -1
- package/dist/jsx/collection.mjs +18 -4
- package/dist/jsx/collection.mjs.map +1 -1
- package/dist/jsx/collection.native.js +18 -4
- package/dist/jsx/collection.native.js.map +1 -1
- package/dist/jsx/core/http.mjs +93 -10
- package/dist/jsx/core/http.mjs.map +1 -1
- package/dist/jsx/core/http.native.js +96 -7
- package/dist/jsx/core/http.native.js.map +1 -1
- package/dist/jsx/db.mjs +7 -7
- package/dist/jsx/db.mjs.map +1 -1
- package/dist/jsx/db.native.js +4 -4
- package/dist/jsx/db.native.js.map +1 -1
- package/dist/jsx/doctype.mjs +96 -39
- package/dist/jsx/doctype.mjs.map +1 -1
- package/dist/jsx/doctype.native.js +116 -46
- package/dist/jsx/doctype.native.js.map +1 -1
- package/dist/jsx/file.mjs +1 -1
- package/dist/jsx/file.mjs.map +1 -1
- package/dist/jsx/file.native.js.map +1 -1
- package/dist/jsx/fixtureDb.mjs +3 -2
- package/dist/jsx/fixtureDb.mjs.map +1 -1
- package/dist/jsx/fixtureDb.native.js +2 -1
- package/dist/jsx/fixtureDb.native.js.map +1 -1
- package/dist/jsx/frappeApp.mjs +15 -14
- package/dist/jsx/frappeApp.mjs.map +1 -1
- package/dist/jsx/frappeApp.native.js +16 -14
- package/dist/jsx/frappeApp.native.js.map +1 -1
- package/dist/jsx/frappeReact.mjs +197 -19
- package/dist/jsx/frappeReact.mjs.map +1 -1
- package/dist/jsx/frappeReact.native.js +241 -18
- package/dist/jsx/frappeReact.native.js.map +1 -1
- package/dist/jsx/index.js +5 -4
- package/dist/jsx/index.js.map +1 -1
- package/dist/jsx/index.mjs +5 -4
- package/dist/jsx/index.mjs.map +1 -1
- package/dist/jsx/index.native.js +9 -4
- package/dist/jsx/index.native.js.map +1 -1
- package/dist/jsx/pacer.mjs +1 -1
- package/dist/jsx/pacer.native.js +2 -2
- package/dist/jsx/pacer.native.js.map +1 -1
- package/dist/jsx/realtime.mjs +187 -47
- package/dist/jsx/realtime.mjs.map +1 -1
- package/dist/jsx/realtime.native.js +268 -48
- package/dist/jsx/realtime.native.js.map +1 -1
- package/dist/jsx/sync/backfill.mjs +32 -27
- package/dist/jsx/sync/backfill.mjs.map +1 -1
- package/dist/jsx/sync/backfill.native.js +49 -43
- package/dist/jsx/sync/backfill.native.js.map +1 -1
- package/dist/jsx/sync/index.mjs +90 -24
- package/dist/jsx/sync/index.mjs.map +1 -1
- package/dist/jsx/sync/index.native.js +112 -10
- package/dist/jsx/sync/index.native.js.map +1 -1
- package/dist/jsx/sync/merge.mjs +1 -1
- package/dist/jsx/sync/merge.mjs.map +1 -1
- package/dist/jsx/sync/merge.native.js +0 -3
- package/dist/jsx/sync/merge.native.js.map +1 -1
- package/dist/jsx/sync/mutationEngine.mjs +25 -19
- package/dist/jsx/sync/mutationEngine.mjs.map +1 -1
- package/dist/jsx/sync/mutationEngine.native.js +16 -13
- package/dist/jsx/sync/mutationEngine.native.js.map +1 -1
- package/dist/jsx/sync/mutationJournal.mjs +9 -4
- package/dist/jsx/sync/mutationJournal.mjs.map +1 -1
- package/dist/jsx/sync/mutationJournal.native.js +7 -4
- package/dist/jsx/sync/mutationJournal.native.js.map +1 -1
- package/dist/jsx/sync/normalizedCache.mjs +7 -3
- package/dist/jsx/sync/normalizedCache.mjs.map +1 -1
- package/dist/jsx/sync/normalizedCache.native.js +7 -2
- package/dist/jsx/sync/normalizedCache.native.js.map +1 -1
- package/dist/jsx/sync/persistence.mjs +64 -32
- package/dist/jsx/sync/persistence.mjs.map +1 -1
- package/dist/jsx/sync/persistence.native.js +120 -63
- package/dist/jsx/sync/persistence.native.js.map +1 -1
- package/dist/jsx/sync/realtime.mjs +124 -13
- package/dist/jsx/sync/realtime.mjs.map +1 -1
- package/dist/jsx/sync/realtime.native.js +163 -20
- package/dist/jsx/sync/realtime.native.js.map +1 -1
- package/dist/jsx/sync/rehydration.mjs +16 -10
- package/dist/jsx/sync/rehydration.mjs.map +1 -1
- package/dist/jsx/sync/rehydration.native.js +16 -14
- package/dist/jsx/sync/rehydration.native.js.map +1 -1
- package/dist/jsx/sync/storage.mjs +3 -3
- package/dist/jsx/sync/storage.mjs.map +1 -1
- package/dist/jsx/sync/storage.native.js +1 -1
- package/dist/jsx/sync/storage.native.js.map +1 -1
- package/dist/jsx/sync/subscriptionManager.mjs +255 -65
- package/dist/jsx/sync/subscriptionManager.mjs.map +1 -1
- package/dist/jsx/sync/subscriptionManager.native.js +330 -93
- package/dist/jsx/sync/subscriptionManager.native.js.map +1 -1
- package/dist/jsx/sync/types.mjs +2 -0
- package/dist/jsx/sync/types.mjs.map +1 -1
- package/dist/jsx/sync/types.native.js +2 -0
- package/dist/jsx/sync/types.native.js.map +1 -1
- package/dist/jsx/sync/virtualPageManager.mjs +9 -9
- package/dist/jsx/sync/virtualPageManager.mjs.map +1 -1
- package/dist/jsx/sync/virtualPageManager.native.js +5 -9
- package/dist/jsx/sync/virtualPageManager.native.js.map +1 -1
- package/dist/jsx/useLiveQuery.mjs +26 -0
- package/dist/jsx/useLiveQuery.mjs.map +1 -0
- package/dist/jsx/useLiveQuery.native.js +59 -0
- package/dist/jsx/useLiveQuery.native.js.map +1 -0
- package/dist/jsx/util.mjs +11 -3
- package/dist/jsx/util.mjs.map +1 -1
- package/dist/jsx/util.native.js +16 -2
- package/dist/jsx/util.native.js.map +1 -1
- package/package.json +20 -17
- package/src/auth.ts +5 -1
- package/src/call.ts +5 -1
- package/src/collection.spec.ts +55 -0
- package/src/collection.ts +33 -4
- package/src/core/http.spec.ts +66 -0
- package/src/core/http.ts +115 -9
- package/src/core/httpNative.spec.ts +234 -0
- package/src/core/types.ts +2 -0
- package/src/db.spec.ts +91 -51
- package/src/db.ts +27 -8
- package/src/doctype.spec.ts +247 -39
- package/src/doctype.ts +203 -53
- package/src/file.ts +5 -1
- package/src/fixtureDb.ts +13 -2
- package/src/frappeApp.ts +18 -19
- package/src/frappeReact.spec.ts +565 -1
- package/src/frappeReact.ts +446 -38
- package/src/frappeReactLiveQueryGc.spec.ts +320 -0
- package/src/frappeReactNative.spec.ts +65 -0
- package/src/index.ts +10 -9
- package/src/pacer.ts +2 -2
- package/src/realtime.spec.ts +464 -20
- package/src/realtime.ts +284 -46
- package/src/sync/backfill.spec.ts +43 -0
- package/src/sync/backfill.ts +59 -39
- package/src/sync/debug.spec.ts +36 -0
- package/src/sync/filterValidation.spec.ts +197 -0
- package/src/sync/index.ts +98 -7
- package/src/sync/merge.ts +3 -3
- package/src/sync/mutationEngine.spec.ts +36 -4
- package/src/sync/mutationEngine.ts +30 -11
- package/src/sync/mutationJournal.ts +18 -4
- package/src/sync/normalizedCache.spec.ts +102 -0
- package/src/sync/normalizedCache.ts +19 -3
- package/src/sync/offlineRestore.spec.ts +423 -0
- package/src/sync/persistence.spec.ts +39 -7
- package/src/sync/persistence.ts +90 -18
- package/src/sync/persistenceGjs.spec.ts +143 -0
- package/src/sync/persistenceNative.spec.ts +139 -0
- package/src/sync/realtime.spec.ts +18 -1
- package/src/sync/realtime.ts +161 -13
- package/src/sync/rehydration.ts +23 -5
- package/src/sync/storage.ts +5 -4
- package/src/sync/subscriptionManager.spec.ts +94 -0
- package/src/sync/subscriptionManager.ts +304 -82
- package/src/sync/syncModule.spec.ts +137 -0
- package/src/sync/types.ts +39 -0
- package/src/sync/virtualPageManager.ts +8 -4
- package/src/useLiveQuery.ts +58 -0
- package/src/util.spec.ts +35 -4
- package/src/util.ts +37 -2
- package/types/auth.d.ts +13 -0
- package/types/auth.d.ts.map +1 -0
- package/types/call.d.ts +10 -0
- package/types/call.d.ts.map +1 -0
- package/types/collection.d.ts +127 -0
- package/types/collection.d.ts.map +1 -0
- package/types/common/types.d.ts +35 -0
- package/types/common/types.d.ts.map +1 -0
- package/types/core/http.d.ts +86 -0
- package/types/core/http.d.ts.map +1 -0
- package/types/core/types.d.ts +74 -0
- package/types/core/types.d.ts.map +1 -0
- package/types/core/wire.d.ts +405 -0
- package/types/core/wire.d.ts.map +1 -0
- package/types/db.d.ts +244 -0
- package/types/db.d.ts.map +1 -0
- package/types/devtools/FrappeDevtoolsPanel.d.ts +7 -0
- package/types/devtools/FrappeDevtoolsPanel.d.ts.map +1 -0
- package/types/devtools/index.d.ts +4 -0
- package/types/devtools/index.d.ts.map +1 -0
- package/types/devtools/plugin.d.ts +9 -0
- package/types/devtools/plugin.d.ts.map +1 -0
- package/types/devtools/theme.d.ts +15 -0
- package/types/devtools/theme.d.ts.map +1 -0
- package/types/doctype.d.ts +256 -0
- package/types/doctype.d.ts.map +1 -0
- package/types/file.d.ts +15 -0
- package/types/file.d.ts.map +1 -0
- package/types/fixtureDb.d.ts +76 -0
- package/types/fixtureDb.d.ts.map +1 -0
- package/types/fixtures.d.ts +55 -0
- package/types/fixtures.d.ts.map +1 -0
- package/types/frappeApp.d.ts +45 -0
- package/types/frappeApp.d.ts.map +1 -0
- package/types/frappeReact.d.ts +270 -0
- package/types/frappeReact.d.ts.map +1 -0
- package/types/index.d.ts +44 -0
- package/types/index.d.ts.map +1 -0
- package/types/optimistic.d.ts +38 -0
- package/types/optimistic.d.ts.map +1 -0
- package/types/pacer.d.ts +193 -0
- package/types/pacer.d.ts.map +1 -0
- package/types/plugin/index.d.ts +11 -0
- package/types/plugin/index.d.ts.map +1 -0
- package/types/realtime.d.ts +121 -0
- package/types/realtime.d.ts.map +1 -0
- package/types/sync/backfill.d.ts +60 -0
- package/types/sync/backfill.d.ts.map +1 -0
- package/types/sync/filters.d.ts +101 -0
- package/types/sync/filters.d.ts.map +1 -0
- package/types/sync/index.d.ts +181 -0
- package/types/sync/index.d.ts.map +1 -0
- package/types/sync/merge.d.ts +59 -0
- package/types/sync/merge.d.ts.map +1 -0
- package/types/sync/mutationEngine.d.ts +117 -0
- package/types/sync/mutationEngine.d.ts.map +1 -0
- package/types/sync/mutationJournal.d.ts +60 -0
- package/types/sync/mutationJournal.d.ts.map +1 -0
- package/types/sync/normalizedCache.d.ts +59 -0
- package/types/sync/normalizedCache.d.ts.map +1 -0
- package/types/sync/persistence.d.ts +185 -0
- package/types/sync/persistence.d.ts.map +1 -0
- package/types/sync/realtime.d.ts +121 -0
- package/types/sync/realtime.d.ts.map +1 -0
- package/types/sync/rehydration.d.ts +109 -0
- package/types/sync/rehydration.d.ts.map +1 -0
- package/types/sync/storage.d.ts +65 -0
- package/types/sync/storage.d.ts.map +1 -0
- package/types/sync/subscriptionManager.d.ts +161 -0
- package/types/sync/subscriptionManager.d.ts.map +1 -0
- package/types/sync/types.d.ts +435 -0
- package/types/sync/types.d.ts.map +1 -0
- package/types/sync/virtualPageManager.d.ts +190 -0
- package/types/sync/virtualPageManager.d.ts.map +1 -0
- package/types/useLiveQuery.d.ts +16 -0
- package/types/useLiveQuery.d.ts.map +1 -0
- package/types/util.d.ts +24 -0
- package/types/util.d.ts.map +1 -0
- package/dist/cjs/auth.spec.cjs +0 -322
- package/dist/cjs/auth.spec.native.js +0 -329
- package/dist/cjs/auth.spec.native.js.map +0 -1
- package/dist/cjs/call.spec.cjs +0 -427
- package/dist/cjs/call.spec.native.js +0 -430
- package/dist/cjs/call.spec.native.js.map +0 -1
- package/dist/cjs/collection.spec.cjs +0 -186
- package/dist/cjs/collection.spec.native.js +0 -216
- package/dist/cjs/collection.spec.native.js.map +0 -1
- package/dist/cjs/common/types.spec.cjs +0 -266
- package/dist/cjs/common/types.spec.native.js +0 -271
- package/dist/cjs/common/types.spec.native.js.map +0 -1
- package/dist/cjs/core/http.spec.cjs +0 -1259
- package/dist/cjs/core/http.spec.native.js +0 -1401
- package/dist/cjs/core/http.spec.native.js.map +0 -1
- package/dist/cjs/core/wire.spec.cjs +0 -478
- package/dist/cjs/core/wire.spec.native.js +0 -482
- package/dist/cjs/core/wire.spec.native.js.map +0 -1
- package/dist/cjs/db.spec.cjs +0 -862
- package/dist/cjs/db.spec.native.js +0 -865
- package/dist/cjs/db.spec.native.js.map +0 -1
- package/dist/cjs/doctype.spec.cjs +0 -460
- package/dist/cjs/doctype.spec.native.js +0 -538
- package/dist/cjs/doctype.spec.native.js.map +0 -1
- package/dist/cjs/file.spec.cjs +0 -315
- package/dist/cjs/file.spec.native.js +0 -342
- package/dist/cjs/file.spec.native.js.map +0 -1
- package/dist/cjs/frappeApp.spec.cjs +0 -306
- package/dist/cjs/frappeApp.spec.native.js +0 -308
- package/dist/cjs/frappeApp.spec.native.js.map +0 -1
- package/dist/cjs/frappeReact.spec.cjs +0 -531
- package/dist/cjs/frappeReact.spec.native.js +0 -670
- package/dist/cjs/frappeReact.spec.native.js.map +0 -1
- package/dist/cjs/optimistic.spec.cjs +0 -11
- package/dist/cjs/optimistic.spec.native.js +0 -19
- package/dist/cjs/optimistic.spec.native.js.map +0 -1
- package/dist/cjs/pacer.spec.cjs +0 -470
- package/dist/cjs/pacer.spec.native.js +0 -537
- package/dist/cjs/pacer.spec.native.js.map +0 -1
- package/dist/cjs/realtime.spec.cjs +0 -326
- package/dist/cjs/realtime.spec.native.js +0 -392
- package/dist/cjs/realtime.spec.native.js.map +0 -1
- package/dist/cjs/sync/backfill.spec.cjs +0 -586
- package/dist/cjs/sync/backfill.spec.native.js +0 -712
- package/dist/cjs/sync/backfill.spec.native.js.map +0 -1
- package/dist/cjs/sync/debug.spec.cjs +0 -125
- package/dist/cjs/sync/debug.spec.native.js +0 -133
- package/dist/cjs/sync/debug.spec.native.js.map +0 -1
- package/dist/cjs/sync/filters.spec.cjs +0 -168
- package/dist/cjs/sync/filters.spec.native.js +0 -173
- package/dist/cjs/sync/filters.spec.native.js.map +0 -1
- package/dist/cjs/sync/merge.spec.cjs +0 -908
- package/dist/cjs/sync/merge.spec.native.js +0 -937
- package/dist/cjs/sync/merge.spec.native.js.map +0 -1
- package/dist/cjs/sync/multiOrderBy.spec.cjs +0 -165
- package/dist/cjs/sync/multiOrderBy.spec.native.js +0 -229
- package/dist/cjs/sync/multiOrderBy.spec.native.js.map +0 -1
- package/dist/cjs/sync/mutationEngine.spec.cjs +0 -1158
- package/dist/cjs/sync/mutationEngine.spec.native.js +0 -1173
- package/dist/cjs/sync/mutationEngine.spec.native.js.map +0 -1
- package/dist/cjs/sync/mutationJournal.spec.cjs +0 -330
- package/dist/cjs/sync/mutationJournal.spec.native.js +0 -333
- package/dist/cjs/sync/mutationJournal.spec.native.js.map +0 -1
- package/dist/cjs/sync/mutations.spec.cjs +0 -327
- package/dist/cjs/sync/mutations.spec.native.js +0 -330
- package/dist/cjs/sync/mutations.spec.native.js.map +0 -1
- package/dist/cjs/sync/normalizedCache.spec.cjs +0 -302
- package/dist/cjs/sync/normalizedCache.spec.native.js +0 -311
- package/dist/cjs/sync/normalizedCache.spec.native.js.map +0 -1
- package/dist/cjs/sync/persistence.spec.cjs +0 -562
- package/dist/cjs/sync/persistence.spec.native.js +0 -572
- package/dist/cjs/sync/persistence.spec.native.js.map +0 -1
- package/dist/cjs/sync/realtime.spec.cjs +0 -499
- package/dist/cjs/sync/realtime.spec.native.js +0 -512
- package/dist/cjs/sync/realtime.spec.native.js.map +0 -1
- package/dist/cjs/sync/rehydration.spec.cjs +0 -731
- package/dist/cjs/sync/rehydration.spec.native.js +0 -736
- package/dist/cjs/sync/rehydration.spec.native.js.map +0 -1
- package/dist/cjs/sync/storage.spec.cjs +0 -446
- package/dist/cjs/sync/storage.spec.native.js +0 -470
- package/dist/cjs/sync/storage.spec.native.js.map +0 -1
- package/dist/cjs/sync/subscriptionManager.spec.cjs +0 -1102
- package/dist/cjs/sync/subscriptionManager.spec.native.js +0 -1136
- package/dist/cjs/sync/subscriptionManager.spec.native.js.map +0 -1
- package/dist/cjs/sync/subscriptions.spec.cjs +0 -937
- package/dist/cjs/sync/subscriptions.spec.native.js +0 -969
- package/dist/cjs/sync/subscriptions.spec.native.js.map +0 -1
- package/dist/cjs/sync/syncModule.spec.cjs +0 -206
- package/dist/cjs/sync/syncModule.spec.native.js +0 -222
- package/dist/cjs/sync/syncModule.spec.native.js.map +0 -1
- package/dist/cjs/sync/types.spec.cjs +0 -246
- package/dist/cjs/sync/types.spec.native.js +0 -256
- package/dist/cjs/sync/types.spec.native.js.map +0 -1
- package/dist/cjs/sync/virtualPageManager.spec.cjs +0 -801
- package/dist/cjs/sync/virtualPageManager.spec.native.js +0 -873
- package/dist/cjs/sync/virtualPageManager.spec.native.js.map +0 -1
- package/dist/cjs/util.spec.cjs +0 -43
- package/dist/cjs/util.spec.native.js +0 -48
- package/dist/cjs/util.spec.native.js.map +0 -1
- package/dist/esm/auth.spec.mjs +0 -323
- package/dist/esm/auth.spec.mjs.map +0 -1
- package/dist/esm/auth.spec.native.js +0 -327
- package/dist/esm/auth.spec.native.js.map +0 -1
- package/dist/esm/call.spec.mjs +0 -428
- package/dist/esm/call.spec.mjs.map +0 -1
- package/dist/esm/call.spec.native.js +0 -428
- package/dist/esm/call.spec.native.js.map +0 -1
- package/dist/esm/collection.spec.mjs +0 -187
- package/dist/esm/collection.spec.mjs.map +0 -1
- package/dist/esm/collection.spec.native.js +0 -214
- package/dist/esm/collection.spec.native.js.map +0 -1
- package/dist/esm/common/types.spec.mjs +0 -267
- package/dist/esm/common/types.spec.mjs.map +0 -1
- package/dist/esm/common/types.spec.native.js +0 -269
- package/dist/esm/common/types.spec.native.js.map +0 -1
- package/dist/esm/core/http.spec.mjs +0 -1260
- package/dist/esm/core/http.spec.mjs.map +0 -1
- package/dist/esm/core/http.spec.native.js +0 -1399
- package/dist/esm/core/http.spec.native.js.map +0 -1
- package/dist/esm/core/wire.spec.mjs +0 -479
- package/dist/esm/core/wire.spec.mjs.map +0 -1
- package/dist/esm/core/wire.spec.native.js +0 -480
- package/dist/esm/core/wire.spec.native.js.map +0 -1
- package/dist/esm/db.spec.mjs +0 -863
- package/dist/esm/db.spec.mjs.map +0 -1
- package/dist/esm/db.spec.native.js +0 -863
- package/dist/esm/db.spec.native.js.map +0 -1
- package/dist/esm/doctype.spec.mjs +0 -461
- package/dist/esm/doctype.spec.mjs.map +0 -1
- package/dist/esm/doctype.spec.native.js +0 -536
- package/dist/esm/doctype.spec.native.js.map +0 -1
- package/dist/esm/file.spec.mjs +0 -316
- package/dist/esm/file.spec.mjs.map +0 -1
- package/dist/esm/file.spec.native.js +0 -340
- package/dist/esm/file.spec.native.js.map +0 -1
- package/dist/esm/frappeApp.spec.mjs +0 -307
- package/dist/esm/frappeApp.spec.mjs.map +0 -1
- package/dist/esm/frappeApp.spec.native.js +0 -306
- package/dist/esm/frappeApp.spec.native.js.map +0 -1
- package/dist/esm/frappeReact.spec.mjs +0 -532
- package/dist/esm/frappeReact.spec.mjs.map +0 -1
- package/dist/esm/frappeReact.spec.native.js +0 -668
- package/dist/esm/frappeReact.spec.native.js.map +0 -1
- package/dist/esm/optimistic.spec.mjs +0 -12
- package/dist/esm/optimistic.spec.mjs.map +0 -1
- package/dist/esm/optimistic.spec.native.js +0 -17
- package/dist/esm/optimistic.spec.native.js.map +0 -1
- package/dist/esm/pacer.spec.mjs +0 -447
- package/dist/esm/pacer.spec.mjs.map +0 -1
- package/dist/esm/pacer.spec.native.js +0 -511
- package/dist/esm/pacer.spec.native.js.map +0 -1
- package/dist/esm/realtime.spec.mjs +0 -327
- package/dist/esm/realtime.spec.mjs.map +0 -1
- package/dist/esm/realtime.spec.native.js +0 -390
- package/dist/esm/realtime.spec.native.js.map +0 -1
- package/dist/esm/sync/backfill.spec.mjs +0 -563
- package/dist/esm/sync/backfill.spec.mjs.map +0 -1
- package/dist/esm/sync/backfill.spec.native.js +0 -686
- package/dist/esm/sync/backfill.spec.native.js.map +0 -1
- package/dist/esm/sync/debug.spec.mjs +0 -102
- package/dist/esm/sync/debug.spec.mjs.map +0 -1
- package/dist/esm/sync/debug.spec.native.js +0 -107
- package/dist/esm/sync/debug.spec.native.js.map +0 -1
- package/dist/esm/sync/filters.spec.mjs +0 -169
- package/dist/esm/sync/filters.spec.mjs.map +0 -1
- package/dist/esm/sync/filters.spec.native.js +0 -171
- package/dist/esm/sync/filters.spec.native.js.map +0 -1
- package/dist/esm/sync/merge.spec.mjs +0 -909
- package/dist/esm/sync/merge.spec.mjs.map +0 -1
- package/dist/esm/sync/merge.spec.native.js +0 -935
- package/dist/esm/sync/merge.spec.native.js.map +0 -1
- package/dist/esm/sync/multiOrderBy.spec.mjs +0 -166
- package/dist/esm/sync/multiOrderBy.spec.mjs.map +0 -1
- package/dist/esm/sync/multiOrderBy.spec.native.js +0 -227
- package/dist/esm/sync/multiOrderBy.spec.native.js.map +0 -1
- package/dist/esm/sync/mutationEngine.spec.mjs +0 -1159
- package/dist/esm/sync/mutationEngine.spec.mjs.map +0 -1
- package/dist/esm/sync/mutationEngine.spec.native.js +0 -1171
- package/dist/esm/sync/mutationEngine.spec.native.js.map +0 -1
- package/dist/esm/sync/mutationJournal.spec.mjs +0 -331
- package/dist/esm/sync/mutationJournal.spec.mjs.map +0 -1
- package/dist/esm/sync/mutationJournal.spec.native.js +0 -331
- package/dist/esm/sync/mutationJournal.spec.native.js.map +0 -1
- package/dist/esm/sync/mutations.spec.mjs +0 -328
- package/dist/esm/sync/mutations.spec.mjs.map +0 -1
- package/dist/esm/sync/mutations.spec.native.js +0 -328
- package/dist/esm/sync/mutations.spec.native.js.map +0 -1
- package/dist/esm/sync/normalizedCache.spec.mjs +0 -303
- package/dist/esm/sync/normalizedCache.spec.mjs.map +0 -1
- package/dist/esm/sync/normalizedCache.spec.native.js +0 -309
- package/dist/esm/sync/normalizedCache.spec.native.js.map +0 -1
- package/dist/esm/sync/persistence.spec.mjs +0 -563
- package/dist/esm/sync/persistence.spec.mjs.map +0 -1
- package/dist/esm/sync/persistence.spec.native.js +0 -570
- package/dist/esm/sync/persistence.spec.native.js.map +0 -1
- package/dist/esm/sync/realtime.spec.mjs +0 -500
- package/dist/esm/sync/realtime.spec.mjs.map +0 -1
- package/dist/esm/sync/realtime.spec.native.js +0 -510
- package/dist/esm/sync/realtime.spec.native.js.map +0 -1
- package/dist/esm/sync/rehydration.spec.mjs +0 -732
- package/dist/esm/sync/rehydration.spec.mjs.map +0 -1
- package/dist/esm/sync/rehydration.spec.native.js +0 -734
- package/dist/esm/sync/rehydration.spec.native.js.map +0 -1
- package/dist/esm/sync/storage.spec.mjs +0 -423
- package/dist/esm/sync/storage.spec.mjs.map +0 -1
- package/dist/esm/sync/storage.spec.native.js +0 -444
- package/dist/esm/sync/storage.spec.native.js.map +0 -1
- package/dist/esm/sync/subscriptionManager.spec.mjs +0 -1079
- package/dist/esm/sync/subscriptionManager.spec.mjs.map +0 -1
- package/dist/esm/sync/subscriptionManager.spec.native.js +0 -1110
- package/dist/esm/sync/subscriptionManager.spec.native.js.map +0 -1
- package/dist/esm/sync/subscriptions.spec.mjs +0 -914
- package/dist/esm/sync/subscriptions.spec.mjs.map +0 -1
- package/dist/esm/sync/subscriptions.spec.native.js +0 -943
- package/dist/esm/sync/subscriptions.spec.native.js.map +0 -1
- package/dist/esm/sync/syncModule.spec.mjs +0 -207
- package/dist/esm/sync/syncModule.spec.mjs.map +0 -1
- package/dist/esm/sync/syncModule.spec.native.js +0 -220
- package/dist/esm/sync/syncModule.spec.native.js.map +0 -1
- package/dist/esm/sync/types.spec.mjs +0 -247
- package/dist/esm/sync/types.spec.mjs.map +0 -1
- package/dist/esm/sync/types.spec.native.js +0 -254
- package/dist/esm/sync/types.spec.native.js.map +0 -1
- package/dist/esm/sync/virtualPageManager.spec.mjs +0 -802
- package/dist/esm/sync/virtualPageManager.spec.mjs.map +0 -1
- package/dist/esm/sync/virtualPageManager.spec.native.js +0 -871
- package/dist/esm/sync/virtualPageManager.spec.native.js.map +0 -1
- package/dist/esm/util.spec.mjs +0 -20
- package/dist/esm/util.spec.mjs.map +0 -1
- package/dist/esm/util.spec.native.js +0 -22
- package/dist/esm/util.spec.native.js.map +0 -1
- package/dist/jsx/auth.spec.mjs +0 -323
- package/dist/jsx/auth.spec.mjs.map +0 -1
- package/dist/jsx/auth.spec.native.js +0 -329
- package/dist/jsx/auth.spec.native.js.map +0 -1
- package/dist/jsx/call.spec.mjs +0 -428
- package/dist/jsx/call.spec.mjs.map +0 -1
- package/dist/jsx/call.spec.native.js +0 -430
- package/dist/jsx/call.spec.native.js.map +0 -1
- package/dist/jsx/collection.spec.mjs +0 -187
- package/dist/jsx/collection.spec.mjs.map +0 -1
- package/dist/jsx/collection.spec.native.js +0 -216
- package/dist/jsx/collection.spec.native.js.map +0 -1
- package/dist/jsx/common/types.spec.mjs +0 -267
- package/dist/jsx/common/types.spec.mjs.map +0 -1
- package/dist/jsx/common/types.spec.native.js +0 -271
- package/dist/jsx/common/types.spec.native.js.map +0 -1
- package/dist/jsx/core/http.spec.mjs +0 -1260
- package/dist/jsx/core/http.spec.mjs.map +0 -1
- package/dist/jsx/core/http.spec.native.js +0 -1401
- package/dist/jsx/core/http.spec.native.js.map +0 -1
- package/dist/jsx/core/wire.spec.mjs +0 -479
- package/dist/jsx/core/wire.spec.mjs.map +0 -1
- package/dist/jsx/core/wire.spec.native.js +0 -482
- package/dist/jsx/core/wire.spec.native.js.map +0 -1
- package/dist/jsx/db.spec.mjs +0 -863
- package/dist/jsx/db.spec.mjs.map +0 -1
- package/dist/jsx/db.spec.native.js +0 -865
- package/dist/jsx/db.spec.native.js.map +0 -1
- package/dist/jsx/doctype.spec.mjs +0 -461
- package/dist/jsx/doctype.spec.mjs.map +0 -1
- package/dist/jsx/doctype.spec.native.js +0 -538
- package/dist/jsx/doctype.spec.native.js.map +0 -1
- package/dist/jsx/file.spec.mjs +0 -316
- package/dist/jsx/file.spec.mjs.map +0 -1
- package/dist/jsx/file.spec.native.js +0 -342
- package/dist/jsx/file.spec.native.js.map +0 -1
- package/dist/jsx/frappeApp.spec.mjs +0 -307
- package/dist/jsx/frappeApp.spec.mjs.map +0 -1
- package/dist/jsx/frappeApp.spec.native.js +0 -308
- package/dist/jsx/frappeApp.spec.native.js.map +0 -1
- package/dist/jsx/frappeReact.spec.mjs +0 -532
- package/dist/jsx/frappeReact.spec.mjs.map +0 -1
- package/dist/jsx/frappeReact.spec.native.js +0 -670
- package/dist/jsx/frappeReact.spec.native.js.map +0 -1
- package/dist/jsx/optimistic.spec.mjs +0 -12
- package/dist/jsx/optimistic.spec.mjs.map +0 -1
- package/dist/jsx/optimistic.spec.native.js +0 -19
- package/dist/jsx/optimistic.spec.native.js.map +0 -1
- package/dist/jsx/pacer.spec.mjs +0 -447
- package/dist/jsx/pacer.spec.mjs.map +0 -1
- package/dist/jsx/pacer.spec.native.js +0 -537
- package/dist/jsx/pacer.spec.native.js.map +0 -1
- package/dist/jsx/realtime.spec.mjs +0 -327
- package/dist/jsx/realtime.spec.mjs.map +0 -1
- package/dist/jsx/realtime.spec.native.js +0 -392
- package/dist/jsx/realtime.spec.native.js.map +0 -1
- package/dist/jsx/sync/backfill.spec.mjs +0 -563
- package/dist/jsx/sync/backfill.spec.mjs.map +0 -1
- package/dist/jsx/sync/backfill.spec.native.js +0 -712
- package/dist/jsx/sync/backfill.spec.native.js.map +0 -1
- package/dist/jsx/sync/debug.spec.mjs +0 -102
- package/dist/jsx/sync/debug.spec.mjs.map +0 -1
- package/dist/jsx/sync/debug.spec.native.js +0 -133
- package/dist/jsx/sync/debug.spec.native.js.map +0 -1
- package/dist/jsx/sync/filters.spec.mjs +0 -169
- package/dist/jsx/sync/filters.spec.mjs.map +0 -1
- package/dist/jsx/sync/filters.spec.native.js +0 -173
- package/dist/jsx/sync/filters.spec.native.js.map +0 -1
- package/dist/jsx/sync/merge.spec.mjs +0 -909
- package/dist/jsx/sync/merge.spec.mjs.map +0 -1
- package/dist/jsx/sync/merge.spec.native.js +0 -937
- package/dist/jsx/sync/merge.spec.native.js.map +0 -1
- package/dist/jsx/sync/multiOrderBy.spec.mjs +0 -166
- package/dist/jsx/sync/multiOrderBy.spec.mjs.map +0 -1
- package/dist/jsx/sync/multiOrderBy.spec.native.js +0 -229
- package/dist/jsx/sync/multiOrderBy.spec.native.js.map +0 -1
- package/dist/jsx/sync/mutationEngine.spec.mjs +0 -1159
- package/dist/jsx/sync/mutationEngine.spec.mjs.map +0 -1
- package/dist/jsx/sync/mutationEngine.spec.native.js +0 -1173
- package/dist/jsx/sync/mutationEngine.spec.native.js.map +0 -1
- package/dist/jsx/sync/mutationJournal.spec.mjs +0 -331
- package/dist/jsx/sync/mutationJournal.spec.mjs.map +0 -1
- package/dist/jsx/sync/mutationJournal.spec.native.js +0 -333
- package/dist/jsx/sync/mutationJournal.spec.native.js.map +0 -1
- package/dist/jsx/sync/mutations.spec.mjs +0 -328
- package/dist/jsx/sync/mutations.spec.mjs.map +0 -1
- package/dist/jsx/sync/mutations.spec.native.js +0 -330
- package/dist/jsx/sync/mutations.spec.native.js.map +0 -1
- package/dist/jsx/sync/normalizedCache.spec.mjs +0 -303
- package/dist/jsx/sync/normalizedCache.spec.mjs.map +0 -1
- package/dist/jsx/sync/normalizedCache.spec.native.js +0 -311
- package/dist/jsx/sync/normalizedCache.spec.native.js.map +0 -1
- package/dist/jsx/sync/persistence.spec.mjs +0 -563
- package/dist/jsx/sync/persistence.spec.mjs.map +0 -1
- package/dist/jsx/sync/persistence.spec.native.js +0 -572
- package/dist/jsx/sync/persistence.spec.native.js.map +0 -1
- package/dist/jsx/sync/realtime.spec.mjs +0 -500
- package/dist/jsx/sync/realtime.spec.mjs.map +0 -1
- package/dist/jsx/sync/realtime.spec.native.js +0 -512
- package/dist/jsx/sync/realtime.spec.native.js.map +0 -1
- package/dist/jsx/sync/rehydration.spec.mjs +0 -732
- package/dist/jsx/sync/rehydration.spec.mjs.map +0 -1
- package/dist/jsx/sync/rehydration.spec.native.js +0 -736
- package/dist/jsx/sync/rehydration.spec.native.js.map +0 -1
- package/dist/jsx/sync/storage.spec.mjs +0 -423
- package/dist/jsx/sync/storage.spec.mjs.map +0 -1
- package/dist/jsx/sync/storage.spec.native.js +0 -470
- package/dist/jsx/sync/storage.spec.native.js.map +0 -1
- package/dist/jsx/sync/subscriptionManager.spec.mjs +0 -1079
- package/dist/jsx/sync/subscriptionManager.spec.mjs.map +0 -1
- package/dist/jsx/sync/subscriptionManager.spec.native.js +0 -1136
- package/dist/jsx/sync/subscriptionManager.spec.native.js.map +0 -1
- package/dist/jsx/sync/subscriptions.spec.mjs +0 -914
- package/dist/jsx/sync/subscriptions.spec.mjs.map +0 -1
- package/dist/jsx/sync/subscriptions.spec.native.js +0 -969
- package/dist/jsx/sync/subscriptions.spec.native.js.map +0 -1
- package/dist/jsx/sync/syncModule.spec.mjs +0 -207
- package/dist/jsx/sync/syncModule.spec.mjs.map +0 -1
- package/dist/jsx/sync/syncModule.spec.native.js +0 -222
- package/dist/jsx/sync/syncModule.spec.native.js.map +0 -1
- package/dist/jsx/sync/types.spec.mjs +0 -247
- package/dist/jsx/sync/types.spec.mjs.map +0 -1
- package/dist/jsx/sync/types.spec.native.js +0 -256
- package/dist/jsx/sync/types.spec.native.js.map +0 -1
- package/dist/jsx/sync/virtualPageManager.spec.mjs +0 -802
- package/dist/jsx/sync/virtualPageManager.spec.mjs.map +0 -1
- package/dist/jsx/sync/virtualPageManager.spec.native.js +0 -873
- package/dist/jsx/sync/virtualPageManager.spec.native.js.map +0 -1
- package/dist/jsx/util.spec.mjs +0 -20
- package/dist/jsx/util.spec.mjs.map +0 -1
- package/dist/jsx/util.spec.native.js +0 -48
- package/dist/jsx/util.spec.native.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames"],"sources":["../../src/util.ts"],"sourcesContent":[null],"mappings":"AAAA,YAAS;;
|
|
1
|
+
{"version":3,"names":["__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key"],"sources":["../../src/util.ts"],"sourcesContent":[null],"mappings":"AAAA,YAAS;;AAYF,IAAAA,SAAS,GAAAC,MAAiB,CAAAC,cAAA;AAC/B,IAAAC,gBAAI,GAAAF,MAAA,CAAAG,wBAAA;AACF,IAAAC,iBAAM,GAAcJ,MAAA,CAAAK,mBAA8C;AAClE,IAAAC,YACE,GAAON,MAAA,CAAAO,SAAe,CAAAC,cACtB;AAEkB,IAEtBC,QAAQ,GAAAA,CAAAC,MAAA,EAAAC,GAAA;EACN,SAAOC,IAAA,IAAAD,GAAA,EACTZ,SAAA,CAAAW,MAAA,EAAAE,IAAA;IAAAC,GAAA,EAAAF,GAAA,CAAAC,IAAA;IAAAE,UAAA;EAAA;AACF;AAaO,IAAAC,WAAS,GAAAA,CAAAC,EAAqB,EAAAC,IAAA,EAAAC,MAAA,EAAAC,IAAA;EACnC,IAAAF,IAAO,WAAYA,IAAA,iBAAmB,OAAMA,IAAA;IAC9C,SAAAG,GAAA,IAAAhB,iBAAA,CAAAa,IAAA,G","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@multiplatform.one/frappe",
|
|
3
|
-
"version": "6.0
|
|
3
|
+
"version": "6.3.0",
|
|
4
4
|
"description": "frappe client for multiplatform.one ecosystem",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"auth",
|
|
@@ -19,37 +19,40 @@
|
|
|
19
19
|
"author": "BitSpur",
|
|
20
20
|
"repository": {
|
|
21
21
|
"type": "git",
|
|
22
|
-
"url": "https://gitlab.com/bitspur/multiplatform.one
|
|
22
|
+
"url": "git+https://gitlab.com/bitspur/frappe/multiplatform.one.git",
|
|
23
|
+
"directory": "public/frappe"
|
|
23
24
|
},
|
|
24
25
|
"source": "src/index.ts",
|
|
25
26
|
"files": [
|
|
26
27
|
"dist",
|
|
27
28
|
"src",
|
|
28
|
-
"types"
|
|
29
|
+
"types",
|
|
30
|
+
"!types/.tsbuildinfo"
|
|
29
31
|
],
|
|
30
32
|
"sideEffects": false,
|
|
31
33
|
"main": "src/index.ts",
|
|
32
34
|
"module": "src/index.ts",
|
|
33
|
-
"types": "
|
|
35
|
+
"types": "types/index.d.ts",
|
|
34
36
|
"exports": {
|
|
35
37
|
"./package.json": "./package.json",
|
|
36
38
|
".": {
|
|
37
39
|
"source": "./src/index.ts",
|
|
38
40
|
"react-native": {
|
|
41
|
+
"types": "./types/index.d.ts",
|
|
39
42
|
"import": "./dist/esm/index.native.js",
|
|
40
43
|
"require": "./dist/cjs/index.native.js",
|
|
41
44
|
"default": "./dist/esm/index.native.js"
|
|
42
45
|
},
|
|
43
|
-
"types": "./
|
|
44
|
-
"import": "./dist/esm/index.
|
|
45
|
-
"require": "./dist/cjs/index.
|
|
46
|
-
"default": "./dist/cjs/index.
|
|
46
|
+
"types": "./types/index.d.ts",
|
|
47
|
+
"import": "./dist/esm/index.mjs",
|
|
48
|
+
"require": "./dist/cjs/index.cjs",
|
|
49
|
+
"default": "./dist/cjs/index.cjs"
|
|
47
50
|
},
|
|
48
51
|
"./devtools": {
|
|
49
52
|
"source": "./src/devtools/index.ts",
|
|
50
|
-
"types": "./
|
|
51
|
-
"import": "./dist/esm/devtools/index.
|
|
52
|
-
"require": "./dist/cjs/devtools/index.
|
|
53
|
+
"types": "./types/devtools/index.d.ts",
|
|
54
|
+
"import": "./dist/esm/devtools/index.mjs",
|
|
55
|
+
"require": "./dist/cjs/devtools/index.cjs",
|
|
53
56
|
"default": "./src/devtools/index.ts"
|
|
54
57
|
}
|
|
55
58
|
},
|
|
@@ -63,7 +66,7 @@
|
|
|
63
66
|
"@tanstack/react-pacer": "0.22.0",
|
|
64
67
|
"broadcast-channel": "^7.3.0",
|
|
65
68
|
"socket.io-client": "^4.8.3",
|
|
66
|
-
"@multiplatform.one/store": "6.0
|
|
69
|
+
"@multiplatform.one/store": "6.3.0"
|
|
67
70
|
},
|
|
68
71
|
"devDependencies": {
|
|
69
72
|
"@tamagui/build": "2.0.0-rc.41",
|
|
@@ -76,13 +79,13 @@
|
|
|
76
79
|
"react": "19.2.5",
|
|
77
80
|
"typescript": "~5.9.3",
|
|
78
81
|
"vitest": "^4.1.5",
|
|
79
|
-
"@multiplatform.one/
|
|
80
|
-
"@multiplatform.one/
|
|
81
|
-
"@multiplatform.one/test-utils": "6.0
|
|
82
|
+
"@multiplatform.one/config": "6.3.0",
|
|
83
|
+
"@multiplatform.one/platform": "6.3.0",
|
|
84
|
+
"@multiplatform.one/test-utils": "6.3.0"
|
|
82
85
|
},
|
|
83
86
|
"peerDependencies": {
|
|
84
87
|
"react": "^19.1.0",
|
|
85
|
-
"@multiplatform.one/platform": "6.0
|
|
88
|
+
"@multiplatform.one/platform": "^6.3.0"
|
|
86
89
|
},
|
|
87
90
|
"engines": {
|
|
88
91
|
"node": ">=6.0.0"
|
|
@@ -90,7 +93,7 @@
|
|
|
90
93
|
"module:jsx": "dist/jsx",
|
|
91
94
|
"scripts": {
|
|
92
95
|
"typecheck": "tsc --noEmit",
|
|
93
|
-
"build": "rm -rf dist types 2>/dev/null && tamagui-build --ts-project ./tsconfig.build.json",
|
|
96
|
+
"build": "rm -rf dist types 2>/dev/null && tamagui-build --ts-project ./tsconfig.build.json --exclude '\\.spec\\.|\\.test\\.|\\.stories\\.'",
|
|
94
97
|
"test": "vitest run"
|
|
95
98
|
}
|
|
96
99
|
}
|
package/src/auth.ts
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import type { HttpClient } from "./core/http";
|
|
2
2
|
|
|
3
3
|
export class AuthModule {
|
|
4
|
-
|
|
4
|
+
private readonly http: HttpClient;
|
|
5
|
+
|
|
6
|
+
constructor(http: HttpClient) {
|
|
7
|
+
this.http = http;
|
|
8
|
+
}
|
|
5
9
|
|
|
6
10
|
async loginWithUsernamePassword(input: { username: string; password: string }) {
|
|
7
11
|
return this.http.post("/api/method/login", {
|
package/src/call.ts
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import type { HttpClient } from "./core/http";
|
|
2
2
|
|
|
3
3
|
export class CallModule {
|
|
4
|
-
|
|
4
|
+
private readonly http: HttpClient;
|
|
5
|
+
|
|
6
|
+
constructor(http: HttpClient) {
|
|
7
|
+
this.http = http;
|
|
8
|
+
}
|
|
5
9
|
|
|
6
10
|
get<T>(method: string, params?: Record<string, any>) {
|
|
7
11
|
return this.http.get<T>(`/api/method/${method}`, params);
|
package/src/collection.spec.ts
CHANGED
|
@@ -198,6 +198,61 @@ describe("frappeCollectionOptions", () => {
|
|
|
198
198
|
// Cleanup
|
|
199
199
|
if (typeof cleanup === "function") cleanup();
|
|
200
200
|
});
|
|
201
|
+
|
|
202
|
+
it("calls onSyncError when the initial subscription fetch fails", async () => {
|
|
203
|
+
const error = new Error("PermissionError: not permitted");
|
|
204
|
+
(mockSync.subscribe as ReturnType<typeof vi.fn>).mockRejectedValueOnce(error);
|
|
205
|
+
const onSyncError = vi.fn();
|
|
206
|
+
const consoleError = vi.spyOn(console, "error").mockImplementation(() => {});
|
|
207
|
+
|
|
208
|
+
const options = frappeCollectionOptions<TestDoc>("Task", {
|
|
209
|
+
sync: mockSync,
|
|
210
|
+
onSyncError,
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
const markReady = vi.fn();
|
|
214
|
+
const syncFn = options.sync!.sync;
|
|
215
|
+
const cleanup = syncFn({
|
|
216
|
+
begin: vi.fn(),
|
|
217
|
+
write: vi.fn(),
|
|
218
|
+
commit: vi.fn(),
|
|
219
|
+
markReady,
|
|
220
|
+
truncate: vi.fn(),
|
|
221
|
+
collection: {} as any,
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
225
|
+
|
|
226
|
+
expect(onSyncError).toHaveBeenCalledWith(error);
|
|
227
|
+
// Collection still marks ready so consumers are never stuck loading
|
|
228
|
+
expect(markReady).toHaveBeenCalled();
|
|
229
|
+
|
|
230
|
+
consoleError.mockRestore();
|
|
231
|
+
if (typeof cleanup === "function") cleanup();
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
it("does not call onSyncError on a successful initial sync", async () => {
|
|
235
|
+
const onSyncError = vi.fn();
|
|
236
|
+
const options = frappeCollectionOptions<TestDoc>("Task", {
|
|
237
|
+
sync: mockSync,
|
|
238
|
+
onSyncError,
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
const syncFn = options.sync!.sync;
|
|
242
|
+
const cleanup = syncFn({
|
|
243
|
+
begin: vi.fn(),
|
|
244
|
+
write: vi.fn(),
|
|
245
|
+
commit: vi.fn(),
|
|
246
|
+
markReady: vi.fn(),
|
|
247
|
+
truncate: vi.fn(),
|
|
248
|
+
collection: {} as any,
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
252
|
+
|
|
253
|
+
expect(onSyncError).not.toHaveBeenCalled();
|
|
254
|
+
if (typeof cleanup === "function") cleanup();
|
|
255
|
+
});
|
|
201
256
|
});
|
|
202
257
|
|
|
203
258
|
describe("createFrappeCollection", () => {
|
package/src/collection.ts
CHANGED
|
@@ -26,6 +26,12 @@ export interface FrappeCollectionOptionsConfig<
|
|
|
26
26
|
orderBy?: SubscriptionQuery["orderBy"];
|
|
27
27
|
/** Limit for the subscription */
|
|
28
28
|
limit?: number;
|
|
29
|
+
/**
|
|
30
|
+
* Called when the initial subscription fetch fails (network down,
|
|
31
|
+
* PermissionError/403, bad doctype). Without this the collection just
|
|
32
|
+
* looks empty — consumers should surface an honest error state instead.
|
|
33
|
+
*/
|
|
34
|
+
onSyncError?: (error: unknown) => void;
|
|
29
35
|
}
|
|
30
36
|
|
|
31
37
|
/**
|
|
@@ -53,7 +59,7 @@ export function frappeCollectionOptions<TDoc extends object & { name: string; do
|
|
|
53
59
|
doctype: string,
|
|
54
60
|
config: FrappeCollectionOptionsConfig<TDoc>,
|
|
55
61
|
): CollectionConfig<TDoc, string> {
|
|
56
|
-
const { sync: syncModule, fields, filters, orderBy, limit } = config;
|
|
62
|
+
const { sync: syncModule, fields, filters, orderBy, limit, onSyncError } = config;
|
|
57
63
|
|
|
58
64
|
const syncFn: SyncConfig<TDoc, string>["sync"] = (params) => {
|
|
59
65
|
const { begin, write, commit, markReady } = params;
|
|
@@ -61,6 +67,12 @@ export function frappeCollectionOptions<TDoc extends object & { name: string; do
|
|
|
61
67
|
let subscriptionId: string | undefined;
|
|
62
68
|
let storeUnsubscribe: (() => void) | undefined;
|
|
63
69
|
let lastKnownNames = new Set<string>();
|
|
70
|
+
// Set when the collection is cleaned up while the initial subscribe is
|
|
71
|
+
// still in flight. Without it the continuation would orphan a live
|
|
72
|
+
// SyncModule subscription (nothing left to unsubscribe it) and the
|
|
73
|
+
// trailing markReady() would throw on the cleaned-up collection
|
|
74
|
+
// (invalid "cleaned-up" → "ready" status transition).
|
|
75
|
+
let cancelled = false;
|
|
64
76
|
|
|
65
77
|
async function initSync() {
|
|
66
78
|
try {
|
|
@@ -74,6 +86,10 @@ export function frappeCollectionOptions<TDoc extends object & { name: string; do
|
|
|
74
86
|
};
|
|
75
87
|
|
|
76
88
|
const result = await syncModule.subscribe<TDoc>(query);
|
|
89
|
+
if (cancelled) {
|
|
90
|
+
syncModule.unsubscribe(result.subscriptionId);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
77
93
|
subscriptionId = result.subscriptionId;
|
|
78
94
|
|
|
79
95
|
// Seed initial data from the subscription
|
|
@@ -119,9 +135,11 @@ export function frappeCollectionOptions<TDoc extends object & { name: string; do
|
|
|
119
135
|
lastKnownNames = currentNames;
|
|
120
136
|
});
|
|
121
137
|
} catch (error) {
|
|
138
|
+
if (cancelled) return;
|
|
122
139
|
console.error(`[frappe-collection] Initial sync failed for ${doctype}:`, error);
|
|
140
|
+
onSyncError?.(error);
|
|
123
141
|
} finally {
|
|
124
|
-
markReady();
|
|
142
|
+
if (!cancelled) markReady();
|
|
125
143
|
}
|
|
126
144
|
}
|
|
127
145
|
|
|
@@ -129,6 +147,7 @@ export function frappeCollectionOptions<TDoc extends object & { name: string; do
|
|
|
129
147
|
|
|
130
148
|
// Return cleanup function
|
|
131
149
|
return () => {
|
|
150
|
+
cancelled = true;
|
|
132
151
|
if (storeUnsubscribe) {
|
|
133
152
|
storeUnsubscribe();
|
|
134
153
|
storeUnsubscribe = undefined;
|
|
@@ -250,6 +269,12 @@ export function fixtureCollectionOptions<TDoc extends object & { name: string; d
|
|
|
250
269
|
const syncFn: SyncConfig<TDoc, string>["sync"] = (params) => {
|
|
251
270
|
const { begin, write, commit, markReady } = params;
|
|
252
271
|
|
|
272
|
+
// Same guard as the SyncModule-backed syncFn above: cleanup while the
|
|
273
|
+
// fixture fetch is in flight must skip the trailing writes + markReady()
|
|
274
|
+
// — markReady() on a cleaned-up collection throws (invalid
|
|
275
|
+
// "cleaned-up" → "ready" status transition) as an unhandled rejection.
|
|
276
|
+
let cancelled = false;
|
|
277
|
+
|
|
253
278
|
async function initSync() {
|
|
254
279
|
try {
|
|
255
280
|
const orderByForFixture =
|
|
@@ -267,6 +292,7 @@ export function fixtureCollectionOptions<TDoc extends object & { name: string; d
|
|
|
267
292
|
limit,
|
|
268
293
|
});
|
|
269
294
|
|
|
295
|
+
if (cancelled) return;
|
|
270
296
|
if (docs.length > 0) {
|
|
271
297
|
begin();
|
|
272
298
|
for (const doc of docs) {
|
|
@@ -276,15 +302,18 @@ export function fixtureCollectionOptions<TDoc extends object & { name: string; d
|
|
|
276
302
|
commit();
|
|
277
303
|
}
|
|
278
304
|
} catch (error) {
|
|
305
|
+
if (cancelled) return;
|
|
279
306
|
console.error(`[frappe-collection] Fixture sync failed for ${doctype}:`, error);
|
|
280
307
|
} finally {
|
|
281
|
-
markReady();
|
|
308
|
+
if (!cancelled) markReady();
|
|
282
309
|
}
|
|
283
310
|
}
|
|
284
311
|
|
|
285
312
|
initSync();
|
|
286
313
|
|
|
287
|
-
return () => {
|
|
314
|
+
return () => {
|
|
315
|
+
cancelled = true;
|
|
316
|
+
};
|
|
288
317
|
};
|
|
289
318
|
|
|
290
319
|
return {
|
package/src/core/http.spec.ts
CHANGED
|
@@ -544,6 +544,72 @@ describe("HttpClient", () => {
|
|
|
544
544
|
});
|
|
545
545
|
});
|
|
546
546
|
|
|
547
|
+
describe("abort", () => {
|
|
548
|
+
it("passes the AbortSignal through to fetch", async () => {
|
|
549
|
+
const mockRes = {
|
|
550
|
+
ok: true,
|
|
551
|
+
headers: new Headers({ "Content-Type": "application/json" }),
|
|
552
|
+
status: 200,
|
|
553
|
+
json: async () => ({ success: true }),
|
|
554
|
+
};
|
|
555
|
+
global.fetch = vi.fn().mockResolvedValue(mockRes);
|
|
556
|
+
const controller = new AbortController();
|
|
557
|
+
await client.request(HttpMethod.Get, "/test", { signal: controller.signal });
|
|
558
|
+
expect(fetch).toHaveBeenCalledWith(
|
|
559
|
+
`${baseURL}/test`,
|
|
560
|
+
expect.objectContaining({ signal: controller.signal }),
|
|
561
|
+
);
|
|
562
|
+
});
|
|
563
|
+
|
|
564
|
+
it("get() forwards the signal", async () => {
|
|
565
|
+
const mockRes = {
|
|
566
|
+
ok: true,
|
|
567
|
+
headers: new Headers({ "Content-Type": "application/json" }),
|
|
568
|
+
status: 200,
|
|
569
|
+
json: async () => ({ success: true }),
|
|
570
|
+
};
|
|
571
|
+
global.fetch = vi.fn().mockResolvedValue(mockRes);
|
|
572
|
+
const controller = new AbortController();
|
|
573
|
+
await client.get("/test", { a: 1 }, undefined, controller.signal);
|
|
574
|
+
expect(fetch).toHaveBeenCalledWith(
|
|
575
|
+
`${baseURL}/test?a=1`,
|
|
576
|
+
expect.objectContaining({ signal: controller.signal }),
|
|
577
|
+
);
|
|
578
|
+
});
|
|
579
|
+
|
|
580
|
+
it("rejects without retrying when the request is aborted", async () => {
|
|
581
|
+
// retryOnNetworkError would normally re-issue a rejected fetch — an
|
|
582
|
+
// abort is a deliberate cancellation and must bypass the retry loop.
|
|
583
|
+
const retryClient = new HttpClient(baseURL, undefined, {
|
|
584
|
+
maxRetries: 3,
|
|
585
|
+
baseDelayMs: 1,
|
|
586
|
+
retryOnNetworkError: true,
|
|
587
|
+
});
|
|
588
|
+
const controller = new AbortController();
|
|
589
|
+
global.fetch = vi.fn().mockImplementation(async () => {
|
|
590
|
+
controller.abort();
|
|
591
|
+
throw new DOMException("The operation was aborted.", "AbortError");
|
|
592
|
+
});
|
|
593
|
+
await expect(
|
|
594
|
+
retryClient.request(HttpMethod.Get, "/test", { signal: controller.signal }),
|
|
595
|
+
).rejects.toThrow(/aborted/i);
|
|
596
|
+
expect(fetch).toHaveBeenCalledTimes(1);
|
|
597
|
+
});
|
|
598
|
+
|
|
599
|
+
it("does not retry an AbortError even without a signal reference", async () => {
|
|
600
|
+
const retryClient = new HttpClient(baseURL, undefined, {
|
|
601
|
+
maxRetries: 3,
|
|
602
|
+
baseDelayMs: 1,
|
|
603
|
+
retryOnNetworkError: true,
|
|
604
|
+
});
|
|
605
|
+
global.fetch = vi
|
|
606
|
+
.fn()
|
|
607
|
+
.mockRejectedValue(new DOMException("The operation was aborted.", "AbortError"));
|
|
608
|
+
await expect(retryClient.request(HttpMethod.Get, "/test", {})).rejects.toThrow(/aborted/i);
|
|
609
|
+
expect(fetch).toHaveBeenCalledTimes(1);
|
|
610
|
+
});
|
|
611
|
+
});
|
|
612
|
+
|
|
547
613
|
describe("convenience methods", () => {
|
|
548
614
|
beforeEach(() => {
|
|
549
615
|
const mockRes = {
|
package/src/core/http.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getCookie, setCookie, deleteCookie } from "@multiplatform.one/platform";
|
|
1
|
+
import { getCookie, setCookie, deleteCookie, isNative } from "@multiplatform.one/platform";
|
|
2
2
|
import { isBrowser } from "../util";
|
|
3
3
|
import { FrappeError, HttpMethod } from "./types";
|
|
4
4
|
import type { AuthConfig, RetryConfig } from "./types";
|
|
@@ -13,6 +13,16 @@ const defaultRetryConfig: RetryConfig = {
|
|
|
13
13
|
retryOnNetworkError: true,
|
|
14
14
|
retryStatusCodes: [408, 429, 500, 502, 503, 504],
|
|
15
15
|
};
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* An aborted request is a deliberate caller cancellation, not a transient
|
|
19
|
+
* network failure — it must bypass the retry loop entirely (retrying would
|
|
20
|
+
* re-issue a request the caller explicitly gave up on).
|
|
21
|
+
*/
|
|
22
|
+
function isAbortError(err: unknown, signal?: AbortSignal): boolean {
|
|
23
|
+
if (signal?.aborted) return true;
|
|
24
|
+
return err instanceof Error && err.name === "AbortError";
|
|
25
|
+
}
|
|
16
26
|
export type RequestBody = BodyInit | Record<string, unknown> | unknown[] | ArrayBufferView;
|
|
17
27
|
|
|
18
28
|
export interface HttpResponse<T> {
|
|
@@ -26,12 +36,18 @@ export class HttpClient {
|
|
|
26
36
|
private readonly retryConfig: RetryConfig;
|
|
27
37
|
// Language preference for Accept-Language header (used in SSR / React Native)
|
|
28
38
|
private _language?: string;
|
|
39
|
+
/** Server-bootstrapped CSRF token for React Native cookie auth (see ensureNativeCsrfToken). */
|
|
40
|
+
private csrfToken?: string;
|
|
41
|
+
/** True once a native CSRF bootstrap attempt completed (even if it yielded no token). */
|
|
42
|
+
private csrfBootstrapDone = false;
|
|
43
|
+
/** In-flight CSRF bootstrap, deduped across concurrent mutating requests. */
|
|
44
|
+
private csrfBootstrap?: Promise<void>;
|
|
45
|
+
private readonly baseURL: string;
|
|
46
|
+
private auth?: AuthConfig;
|
|
29
47
|
|
|
30
|
-
constructor(
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
retryConfig?: RetryConfig,
|
|
34
|
-
) {
|
|
48
|
+
constructor(baseURL: string, auth?: AuthConfig, retryConfig?: RetryConfig) {
|
|
49
|
+
this.baseURL = baseURL;
|
|
50
|
+
this.auth = auth;
|
|
35
51
|
this.retryConfig = { ...defaultRetryConfig, ...retryConfig };
|
|
36
52
|
}
|
|
37
53
|
|
|
@@ -58,6 +74,74 @@ export class HttpClient {
|
|
|
58
74
|
});
|
|
59
75
|
}
|
|
60
76
|
|
|
77
|
+
/**
|
|
78
|
+
* React Native cookie-auth CSRF bootstrap.
|
|
79
|
+
*
|
|
80
|
+
* RN's fetch sends the OS cookie jar (so cookie-auth sessions work), but
|
|
81
|
+
* JS cannot READ those cookies — the platform `getCookie` shim is an
|
|
82
|
+
* in-memory map that never sees the `sid`/CSRF cookies — so mutating
|
|
83
|
+
* requests would 400 once the session has a CSRF token. Fetch the token
|
|
84
|
+
* from the server instead and cache it per client:
|
|
85
|
+
*
|
|
86
|
+
* 1. `GET /api/method/frappe.sessions.get_csrf_token` — whitelisted on
|
|
87
|
+
* newer frappe versions; cheap JSON round-trip.
|
|
88
|
+
* 2. Fallback: `GET /app` and parse the `frappe.csrf_token = "…"` boot
|
|
89
|
+
* script — works on every frappe (this repo's bench does NOT
|
|
90
|
+
* whitelist the RPC above) and also generates the token server-side
|
|
91
|
+
* when the session lacks one.
|
|
92
|
+
*
|
|
93
|
+
* Resolves undefined when neither source works (e.g. website-only session
|
|
94
|
+
* without desk access); requests then proceed without the header, which
|
|
95
|
+
* frappe accepts for sessions that have no CSRF token yet. The cache is
|
|
96
|
+
* dropped on auth change and on a 400 from a mutating request so a
|
|
97
|
+
* rotated session re-bootstraps.
|
|
98
|
+
*/
|
|
99
|
+
private async ensureNativeCsrfToken(): Promise<string | undefined> {
|
|
100
|
+
if (this.csrfBootstrapDone) return this.csrfToken;
|
|
101
|
+
if (!this.csrfBootstrap) {
|
|
102
|
+
this.csrfBootstrap = this.fetchNativeCsrfToken()
|
|
103
|
+
.then((token) => {
|
|
104
|
+
this.csrfToken = token;
|
|
105
|
+
this.csrfBootstrapDone = true;
|
|
106
|
+
})
|
|
107
|
+
.finally(() => {
|
|
108
|
+
this.csrfBootstrap = undefined;
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
await this.csrfBootstrap;
|
|
112
|
+
return this.csrfToken;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
private async fetchNativeCsrfToken(): Promise<string | undefined> {
|
|
116
|
+
try {
|
|
117
|
+
const rpcUrl = new URL("/api/method/frappe.sessions.get_csrf_token", this.baseURL).toString();
|
|
118
|
+
const res = await fetch(rpcUrl, { method: "GET", credentials: "include" });
|
|
119
|
+
if (res.ok) {
|
|
120
|
+
const payload = (await res.json()) as { message?: unknown };
|
|
121
|
+
if (typeof payload?.message === "string" && payload.message) return payload.message;
|
|
122
|
+
}
|
|
123
|
+
} catch {
|
|
124
|
+
// Fall through to the HTML fallback.
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
const appUrl = new URL("/app", this.baseURL).toString();
|
|
128
|
+
const res = await fetch(appUrl, { method: "GET", credentials: "include" });
|
|
129
|
+
if (res.ok) {
|
|
130
|
+
const html = await res.text();
|
|
131
|
+
const match = html.match(/frappe\.csrf_token\s*=\s*"([^"]+)"/);
|
|
132
|
+
if (match?.[1]) return match[1];
|
|
133
|
+
}
|
|
134
|
+
} catch {
|
|
135
|
+
// No token available — proceed without the header.
|
|
136
|
+
}
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
private invalidateNativeCsrfToken(): void {
|
|
141
|
+
this.csrfToken = undefined;
|
|
142
|
+
this.csrfBootstrapDone = false;
|
|
143
|
+
}
|
|
144
|
+
|
|
61
145
|
private async getAuthHeaders(): Promise<Record<string, string>> {
|
|
62
146
|
if (!this.auth?.useToken) return {};
|
|
63
147
|
const raw = typeof this.auth.token === "function" ? await this.auth.token() : this.auth?.token;
|
|
@@ -97,6 +181,8 @@ export class HttpClient {
|
|
|
97
181
|
request: {
|
|
98
182
|
body?: RequestBody;
|
|
99
183
|
headers?: Record<string, string>;
|
|
184
|
+
/** Cancels the request (and any pending retry) when aborted. */
|
|
185
|
+
signal?: AbortSignal;
|
|
100
186
|
},
|
|
101
187
|
): Promise<HttpResponse<T>> {
|
|
102
188
|
const url = new URL(path, this.baseURL).toString();
|
|
@@ -177,8 +263,12 @@ export class HttpClient {
|
|
|
177
263
|
headers.set("Accept-Language", lang);
|
|
178
264
|
}
|
|
179
265
|
if (!this.auth?.useToken && isBrowser() && method !== HttpMethod.Get) {
|
|
180
|
-
|
|
266
|
+
let csrf =
|
|
181
267
|
getCookie("frappe-csrf-token") || getCookie("csrf_token") || globalThis.frappe?.csrf_token;
|
|
268
|
+
// React Native cannot read the OS cookie jar — bootstrap the token
|
|
269
|
+
// from the server before the first mutating request (native only;
|
|
270
|
+
// web keeps the cookie-read path above unchanged).
|
|
271
|
+
if (!csrf && isNative) csrf = await this.ensureNativeCsrfToken();
|
|
182
272
|
if (csrf) headers.set("X-Frappe-CSRF-Token", csrf);
|
|
183
273
|
}
|
|
184
274
|
const makeRequest = (): Promise<Response> => {
|
|
@@ -187,6 +277,7 @@ export class HttpClient {
|
|
|
187
277
|
headers,
|
|
188
278
|
credentials: this.auth?.useToken ? "omit" : "include",
|
|
189
279
|
body,
|
|
280
|
+
signal: request?.signal,
|
|
190
281
|
});
|
|
191
282
|
};
|
|
192
283
|
let lastError: unknown;
|
|
@@ -203,6 +294,12 @@ export class HttpClient {
|
|
|
203
294
|
(payload && (payload.message || payload.exc || payload._server_messages)) ||
|
|
204
295
|
res.statusText;
|
|
205
296
|
const err = new FrappeError(message, res.status, payload);
|
|
297
|
+
// Native cookie-auth: a 400 on a mutating request may be frappe's
|
|
298
|
+
// CSRFTokenError from a rotated session — drop the cached token so
|
|
299
|
+
// the next mutation re-bootstraps.
|
|
300
|
+
if (isNative && res.status === 400 && !this.auth?.useToken && method !== HttpMethod.Get) {
|
|
301
|
+
this.invalidateNativeCsrfToken();
|
|
302
|
+
}
|
|
206
303
|
if (this.shouldRetryError(err, attempt)) {
|
|
207
304
|
lastError = err;
|
|
208
305
|
attempt++;
|
|
@@ -224,6 +321,7 @@ export class HttpClient {
|
|
|
224
321
|
_res: res,
|
|
225
322
|
};
|
|
226
323
|
} catch (err) {
|
|
324
|
+
if (isAbortError(err, request?.signal)) throw err;
|
|
227
325
|
if (this.shouldRetryError(err, attempt)) {
|
|
228
326
|
lastError = err;
|
|
229
327
|
attempt++;
|
|
@@ -238,9 +336,14 @@ export class HttpClient {
|
|
|
238
336
|
throw lastError;
|
|
239
337
|
}
|
|
240
338
|
|
|
241
|
-
get<T>(
|
|
339
|
+
get<T>(
|
|
340
|
+
path: string,
|
|
341
|
+
params?: Record<string, unknown>,
|
|
342
|
+
headers?: Record<string, string>,
|
|
343
|
+
signal?: AbortSignal,
|
|
344
|
+
) {
|
|
242
345
|
const qs = params ? `?${new URLSearchParams(normalizeParams(params)).toString()}` : "";
|
|
243
|
-
return this.request<T>(HttpMethod.Get, `${path}${qs}`, { headers });
|
|
346
|
+
return this.request<T>(HttpMethod.Get, `${path}${qs}`, { headers, signal });
|
|
244
347
|
}
|
|
245
348
|
|
|
246
349
|
post<T>(path: string, body?: RequestBody, headers?: Record<string, string>) {
|
|
@@ -266,6 +369,9 @@ export class HttpClient {
|
|
|
266
369
|
|
|
267
370
|
updateAuth(auth: AuthConfig) {
|
|
268
371
|
this.auth = auth;
|
|
372
|
+
// Auth change usually means session change — the cached native CSRF
|
|
373
|
+
// token belongs to the old session.
|
|
374
|
+
this.invalidateNativeCsrfToken();
|
|
269
375
|
}
|
|
270
376
|
}
|
|
271
377
|
|