@multiplatform.one/frappe 6.0.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/LICENSE +201 -0
- package/README.md +241 -0
- package/dist/cjs/auth.cjs +50 -0
- package/dist/cjs/auth.native.js +100 -0
- package/dist/cjs/auth.native.js.map +1 -0
- package/dist/cjs/auth.spec.cjs +322 -0
- package/dist/cjs/auth.spec.native.js +329 -0
- package/dist/cjs/auth.spec.native.js.map +1 -0
- package/dist/cjs/call.cjs +45 -0
- package/dist/cjs/call.native.js +93 -0
- package/dist/cjs/call.native.js.map +1 -0
- package/dist/cjs/call.spec.cjs +427 -0
- package/dist/cjs/call.spec.native.js +430 -0
- package/dist/cjs/call.spec.native.js.map +1 -0
- package/dist/cjs/collection.cjs +278 -0
- package/dist/cjs/collection.native.js +494 -0
- package/dist/cjs/collection.native.js.map +1 -0
- package/dist/cjs/collection.spec.cjs +186 -0
- package/dist/cjs/collection.spec.native.js +216 -0
- package/dist/cjs/collection.spec.native.js.map +1 -0
- package/dist/cjs/common/types.cjs +18 -0
- package/dist/cjs/common/types.native.js +21 -0
- package/dist/cjs/common/types.native.js.map +1 -0
- package/dist/cjs/common/types.spec.cjs +266 -0
- package/dist/cjs/common/types.spec.native.js +271 -0
- package/dist/cjs/common/types.spec.native.js.map +1 -0
- package/dist/cjs/core/http.cjs +289 -0
- package/dist/cjs/core/http.native.js +484 -0
- package/dist/cjs/core/http.native.js.map +1 -0
- package/dist/cjs/core/http.spec.cjs +1259 -0
- package/dist/cjs/core/http.spec.native.js +1401 -0
- package/dist/cjs/core/http.spec.native.js.map +1 -0
- package/dist/cjs/core/types.cjs +53 -0
- package/dist/cjs/core/types.native.js +178 -0
- package/dist/cjs/core/types.native.js.map +1 -0
- package/dist/cjs/core/wire.cjs +53 -0
- package/dist/cjs/core/wire.native.js +56 -0
- package/dist/cjs/core/wire.native.js.map +1 -0
- package/dist/cjs/core/wire.spec.cjs +478 -0
- package/dist/cjs/core/wire.spec.native.js +482 -0
- package/dist/cjs/core/wire.spec.native.js.map +1 -0
- package/dist/cjs/db.cjs +355 -0
- package/dist/cjs/db.native.js +469 -0
- package/dist/cjs/db.native.js.map +1 -0
- package/dist/cjs/db.spec.cjs +862 -0
- package/dist/cjs/db.spec.native.js +865 -0
- package/dist/cjs/db.spec.native.js.map +1 -0
- package/dist/cjs/devtools/FrappeDevtoolsPanel.cjs +838 -0
- package/dist/cjs/devtools/FrappeDevtoolsPanel.native.js +919 -0
- package/dist/cjs/devtools/FrappeDevtoolsPanel.native.js.map +1 -0
- package/dist/cjs/devtools/index.cjs +30 -0
- package/dist/cjs/devtools/index.native.js +33 -0
- package/dist/cjs/devtools/index.native.js.map +1 -0
- package/dist/cjs/devtools/plugin.cjs +39 -0
- package/dist/cjs/devtools/plugin.native.js +56 -0
- package/dist/cjs/devtools/plugin.native.js.map +1 -0
- package/dist/cjs/devtools/theme.cjs +55 -0
- package/dist/cjs/devtools/theme.native.js +58 -0
- package/dist/cjs/devtools/theme.native.js.map +1 -0
- package/dist/cjs/doctype.cjs +410 -0
- package/dist/cjs/doctype.native.js +521 -0
- package/dist/cjs/doctype.native.js.map +1 -0
- package/dist/cjs/doctype.spec.cjs +460 -0
- package/dist/cjs/doctype.spec.native.js +538 -0
- package/dist/cjs/doctype.spec.native.js.map +1 -0
- package/dist/cjs/file.cjs +41 -0
- package/dist/cjs/file.native.js +84 -0
- package/dist/cjs/file.native.js.map +1 -0
- package/dist/cjs/file.spec.cjs +315 -0
- package/dist/cjs/file.spec.native.js +342 -0
- package/dist/cjs/file.spec.native.js.map +1 -0
- package/dist/cjs/fixtureDb.cjs +212 -0
- package/dist/cjs/fixtureDb.native.js +313 -0
- package/dist/cjs/fixtureDb.native.js.map +1 -0
- package/dist/cjs/fixtures.cjs +199 -0
- package/dist/cjs/fixtures.native.js +400 -0
- package/dist/cjs/fixtures.native.js.map +1 -0
- package/dist/cjs/frappeApp.cjs +117 -0
- package/dist/cjs/frappeApp.native.js +179 -0
- package/dist/cjs/frappeApp.native.js.map +1 -0
- package/dist/cjs/frappeApp.spec.cjs +306 -0
- package/dist/cjs/frappeApp.spec.native.js +308 -0
- package/dist/cjs/frappeApp.spec.native.js.map +1 -0
- package/dist/cjs/frappeReact.cjs +314 -0
- package/dist/cjs/frappeReact.native.js +351 -0
- package/dist/cjs/frappeReact.native.js.map +1 -0
- package/dist/cjs/frappeReact.spec.cjs +531 -0
- package/dist/cjs/frappeReact.spec.native.js +670 -0
- package/dist/cjs/frappeReact.spec.native.js.map +1 -0
- package/dist/cjs/index.cjs +149 -0
- package/dist/cjs/index.native.js +152 -0
- package/dist/cjs/index.native.js.map +1 -0
- package/dist/cjs/optimistic.cjs +28 -0
- package/dist/cjs/optimistic.native.js +31 -0
- package/dist/cjs/optimistic.native.js.map +1 -0
- package/dist/cjs/optimistic.spec.cjs +11 -0
- package/dist/cjs/optimistic.spec.native.js +19 -0
- package/dist/cjs/optimistic.spec.native.js.map +1 -0
- package/dist/cjs/pacer.cjs +200 -0
- package/dist/cjs/pacer.native.js +274 -0
- package/dist/cjs/pacer.native.js.map +1 -0
- package/dist/cjs/pacer.spec.cjs +470 -0
- package/dist/cjs/pacer.spec.native.js +537 -0
- package/dist/cjs/pacer.spec.native.js.map +1 -0
- package/dist/cjs/plugin/index.cjs +124 -0
- package/dist/cjs/plugin/index.native.js +193 -0
- package/dist/cjs/plugin/index.native.js.map +1 -0
- package/dist/cjs/realtime.cjs +265 -0
- package/dist/cjs/realtime.native.js +387 -0
- package/dist/cjs/realtime.native.js.map +1 -0
- package/dist/cjs/realtime.spec.cjs +326 -0
- package/dist/cjs/realtime.spec.native.js +392 -0
- package/dist/cjs/realtime.spec.native.js.map +1 -0
- package/dist/cjs/sync/backfill.cjs +314 -0
- package/dist/cjs/sync/backfill.native.js +487 -0
- package/dist/cjs/sync/backfill.native.js.map +1 -0
- package/dist/cjs/sync/backfill.spec.cjs +586 -0
- package/dist/cjs/sync/backfill.spec.native.js +712 -0
- package/dist/cjs/sync/backfill.spec.native.js.map +1 -0
- package/dist/cjs/sync/debug.spec.cjs +125 -0
- package/dist/cjs/sync/debug.spec.native.js +133 -0
- package/dist/cjs/sync/debug.spec.native.js.map +1 -0
- package/dist/cjs/sync/filters.cjs +311 -0
- package/dist/cjs/sync/filters.native.js +446 -0
- package/dist/cjs/sync/filters.native.js.map +1 -0
- package/dist/cjs/sync/filters.spec.cjs +168 -0
- package/dist/cjs/sync/filters.spec.native.js +173 -0
- package/dist/cjs/sync/filters.spec.native.js.map +1 -0
- package/dist/cjs/sync/index.cjs +303 -0
- package/dist/cjs/sync/index.native.js +462 -0
- package/dist/cjs/sync/index.native.js.map +1 -0
- package/dist/cjs/sync/merge.cjs +435 -0
- package/dist/cjs/sync/merge.native.js +717 -0
- package/dist/cjs/sync/merge.native.js.map +1 -0
- package/dist/cjs/sync/merge.spec.cjs +908 -0
- package/dist/cjs/sync/merge.spec.native.js +937 -0
- package/dist/cjs/sync/merge.spec.native.js.map +1 -0
- package/dist/cjs/sync/multiOrderBy.spec.cjs +165 -0
- package/dist/cjs/sync/multiOrderBy.spec.native.js +229 -0
- package/dist/cjs/sync/multiOrderBy.spec.native.js.map +1 -0
- package/dist/cjs/sync/mutationEngine.cjs +781 -0
- package/dist/cjs/sync/mutationEngine.native.js +1159 -0
- package/dist/cjs/sync/mutationEngine.native.js.map +1 -0
- package/dist/cjs/sync/mutationEngine.spec.cjs +1158 -0
- package/dist/cjs/sync/mutationEngine.spec.native.js +1173 -0
- package/dist/cjs/sync/mutationEngine.spec.native.js.map +1 -0
- package/dist/cjs/sync/mutationJournal.cjs +150 -0
- package/dist/cjs/sync/mutationJournal.native.js +282 -0
- package/dist/cjs/sync/mutationJournal.native.js.map +1 -0
- package/dist/cjs/sync/mutationJournal.spec.cjs +330 -0
- package/dist/cjs/sync/mutationJournal.spec.native.js +333 -0
- package/dist/cjs/sync/mutationJournal.spec.native.js.map +1 -0
- package/dist/cjs/sync/mutations.spec.cjs +327 -0
- package/dist/cjs/sync/mutations.spec.native.js +330 -0
- package/dist/cjs/sync/mutations.spec.native.js.map +1 -0
- package/dist/cjs/sync/normalizedCache.cjs +140 -0
- package/dist/cjs/sync/normalizedCache.native.js +229 -0
- package/dist/cjs/sync/normalizedCache.native.js.map +1 -0
- package/dist/cjs/sync/normalizedCache.spec.cjs +302 -0
- package/dist/cjs/sync/normalizedCache.spec.native.js +311 -0
- package/dist/cjs/sync/normalizedCache.spec.native.js.map +1 -0
- package/dist/cjs/sync/persistence.cjs +627 -0
- package/dist/cjs/sync/persistence.native.js +911 -0
- package/dist/cjs/sync/persistence.native.js.map +1 -0
- package/dist/cjs/sync/persistence.spec.cjs +562 -0
- package/dist/cjs/sync/persistence.spec.native.js +572 -0
- package/dist/cjs/sync/persistence.spec.native.js.map +1 -0
- package/dist/cjs/sync/realtime.cjs +214 -0
- package/dist/cjs/sync/realtime.native.js +340 -0
- package/dist/cjs/sync/realtime.native.js.map +1 -0
- package/dist/cjs/sync/realtime.spec.cjs +499 -0
- package/dist/cjs/sync/realtime.spec.native.js +512 -0
- package/dist/cjs/sync/realtime.spec.native.js.map +1 -0
- package/dist/cjs/sync/rehydration.cjs +323 -0
- package/dist/cjs/sync/rehydration.native.js +531 -0
- package/dist/cjs/sync/rehydration.native.js.map +1 -0
- package/dist/cjs/sync/rehydration.spec.cjs +731 -0
- package/dist/cjs/sync/rehydration.spec.native.js +736 -0
- package/dist/cjs/sync/rehydration.spec.native.js.map +1 -0
- package/dist/cjs/sync/storage.cjs +142 -0
- package/dist/cjs/sync/storage.native.js +209 -0
- package/dist/cjs/sync/storage.native.js.map +1 -0
- package/dist/cjs/sync/storage.spec.cjs +446 -0
- package/dist/cjs/sync/storage.spec.native.js +470 -0
- package/dist/cjs/sync/storage.spec.native.js.map +1 -0
- package/dist/cjs/sync/subscriptionManager.cjs +487 -0
- package/dist/cjs/sync/subscriptionManager.native.js +948 -0
- package/dist/cjs/sync/subscriptionManager.native.js.map +1 -0
- package/dist/cjs/sync/subscriptionManager.spec.cjs +1102 -0
- package/dist/cjs/sync/subscriptionManager.spec.native.js +1136 -0
- package/dist/cjs/sync/subscriptionManager.spec.native.js.map +1 -0
- package/dist/cjs/sync/subscriptions.spec.cjs +937 -0
- package/dist/cjs/sync/subscriptions.spec.native.js +969 -0
- package/dist/cjs/sync/subscriptions.spec.native.js.map +1 -0
- package/dist/cjs/sync/syncModule.spec.cjs +206 -0
- package/dist/cjs/sync/syncModule.spec.native.js +222 -0
- package/dist/cjs/sync/syncModule.spec.native.js.map +1 -0
- package/dist/cjs/sync/types.cjs +99 -0
- package/dist/cjs/sync/types.native.js +102 -0
- package/dist/cjs/sync/types.native.js.map +1 -0
- package/dist/cjs/sync/types.spec.cjs +246 -0
- package/dist/cjs/sync/types.spec.native.js +256 -0
- package/dist/cjs/sync/types.spec.native.js.map +1 -0
- package/dist/cjs/sync/virtualPageManager.cjs +821 -0
- package/dist/cjs/sync/virtualPageManager.native.js +1125 -0
- package/dist/cjs/sync/virtualPageManager.native.js.map +1 -0
- package/dist/cjs/sync/virtualPageManager.spec.cjs +801 -0
- package/dist/cjs/sync/virtualPageManager.spec.native.js +873 -0
- package/dist/cjs/sync/virtualPageManager.spec.native.js.map +1 -0
- package/dist/cjs/util.cjs +31 -0
- package/dist/cjs/util.native.js +34 -0
- package/dist/cjs/util.native.js.map +1 -0
- package/dist/cjs/util.spec.cjs +43 -0
- package/dist/cjs/util.spec.native.js +48 -0
- package/dist/cjs/util.spec.native.js.map +1 -0
- package/dist/esm/auth.mjs +25 -0
- package/dist/esm/auth.mjs.map +1 -0
- package/dist/esm/auth.native.js +72 -0
- package/dist/esm/auth.native.js.map +1 -0
- package/dist/esm/auth.spec.mjs +323 -0
- package/dist/esm/auth.spec.mjs.map +1 -0
- package/dist/esm/auth.spec.native.js +327 -0
- package/dist/esm/auth.spec.native.js.map +1 -0
- package/dist/esm/call.mjs +20 -0
- package/dist/esm/call.mjs.map +1 -0
- package/dist/esm/call.native.js +65 -0
- package/dist/esm/call.native.js.map +1 -0
- package/dist/esm/call.spec.mjs +428 -0
- package/dist/esm/call.spec.mjs.map +1 -0
- package/dist/esm/call.spec.native.js +428 -0
- package/dist/esm/call.spec.native.js.map +1 -0
- package/dist/esm/collection.mjs +250 -0
- package/dist/esm/collection.mjs.map +1 -0
- package/dist/esm/collection.native.js +463 -0
- package/dist/esm/collection.native.js.map +1 -0
- package/dist/esm/collection.spec.mjs +187 -0
- package/dist/esm/collection.spec.mjs.map +1 -0
- package/dist/esm/collection.spec.native.js +214 -0
- package/dist/esm/collection.spec.native.js.map +1 -0
- package/dist/esm/common/types.mjs +2 -0
- package/dist/esm/common/types.mjs.map +1 -0
- package/dist/esm/common/types.native.js +2 -0
- package/dist/esm/common/types.native.js.map +1 -0
- package/dist/esm/common/types.spec.mjs +267 -0
- package/dist/esm/common/types.spec.mjs.map +1 -0
- package/dist/esm/common/types.spec.native.js +269 -0
- package/dist/esm/common/types.spec.native.js.map +1 -0
- package/dist/esm/core/http.mjs +258 -0
- package/dist/esm/core/http.mjs.map +1 -0
- package/dist/esm/core/http.native.js +450 -0
- package/dist/esm/core/http.native.js.map +1 -0
- package/dist/esm/core/http.spec.mjs +1260 -0
- package/dist/esm/core/http.spec.mjs.map +1 -0
- package/dist/esm/core/http.spec.native.js +1399 -0
- package/dist/esm/core/http.spec.native.js.map +1 -0
- package/dist/esm/core/types.mjs +26 -0
- package/dist/esm/core/types.mjs.map +1 -0
- package/dist/esm/core/types.native.js +148 -0
- package/dist/esm/core/types.native.js.map +1 -0
- package/dist/esm/core/wire.mjs +23 -0
- package/dist/esm/core/wire.mjs.map +1 -0
- package/dist/esm/core/wire.native.js +23 -0
- package/dist/esm/core/wire.native.js.map +1 -0
- package/dist/esm/core/wire.spec.mjs +479 -0
- package/dist/esm/core/wire.spec.mjs.map +1 -0
- package/dist/esm/core/wire.spec.native.js +480 -0
- package/dist/esm/core/wire.spec.native.js.map +1 -0
- package/dist/esm/db.mjs +329 -0
- package/dist/esm/db.mjs.map +1 -0
- package/dist/esm/db.native.js +440 -0
- package/dist/esm/db.native.js.map +1 -0
- package/dist/esm/db.spec.mjs +863 -0
- package/dist/esm/db.spec.mjs.map +1 -0
- package/dist/esm/db.spec.native.js +863 -0
- package/dist/esm/db.spec.native.js.map +1 -0
- package/dist/esm/devtools/FrappeDevtoolsPanel.mjs +813 -0
- package/dist/esm/devtools/FrappeDevtoolsPanel.mjs.map +1 -0
- package/dist/esm/devtools/FrappeDevtoolsPanel.native.js +880 -0
- package/dist/esm/devtools/FrappeDevtoolsPanel.native.js.map +1 -0
- package/dist/esm/devtools/index.mjs +4 -0
- package/dist/esm/devtools/index.mjs.map +1 -0
- package/dist/esm/devtools/index.native.js +4 -0
- package/dist/esm/devtools/index.native.js.map +1 -0
- package/dist/esm/devtools/plugin.mjs +14 -0
- package/dist/esm/devtools/plugin.mjs.map +1 -0
- package/dist/esm/devtools/plugin.native.js +17 -0
- package/dist/esm/devtools/plugin.native.js.map +1 -0
- package/dist/esm/devtools/theme.mjs +30 -0
- package/dist/esm/devtools/theme.mjs.map +1 -0
- package/dist/esm/devtools/theme.native.js +30 -0
- package/dist/esm/devtools/theme.native.js.map +1 -0
- package/dist/esm/doctype.mjs +381 -0
- package/dist/esm/doctype.mjs.map +1 -0
- package/dist/esm/doctype.native.js +489 -0
- package/dist/esm/doctype.native.js.map +1 -0
- package/dist/esm/doctype.spec.mjs +461 -0
- package/dist/esm/doctype.spec.mjs.map +1 -0
- package/dist/esm/doctype.spec.native.js +536 -0
- package/dist/esm/doctype.spec.native.js.map +1 -0
- package/dist/esm/file.mjs +16 -0
- package/dist/esm/file.mjs.map +1 -0
- package/dist/esm/file.native.js +56 -0
- package/dist/esm/file.native.js.map +1 -0
- package/dist/esm/file.spec.mjs +316 -0
- package/dist/esm/file.spec.mjs.map +1 -0
- package/dist/esm/file.spec.native.js +340 -0
- package/dist/esm/file.spec.native.js.map +1 -0
- package/dist/esm/fixtureDb.mjs +187 -0
- package/dist/esm/fixtureDb.mjs.map +1 -0
- package/dist/esm/fixtureDb.native.js +285 -0
- package/dist/esm/fixtureDb.native.js.map +1 -0
- package/dist/esm/fixtures.mjs +174 -0
- package/dist/esm/fixtures.mjs.map +1 -0
- package/dist/esm/fixtures.native.js +372 -0
- package/dist/esm/fixtures.native.js.map +1 -0
- package/dist/esm/frappeApp.mjs +92 -0
- package/dist/esm/frappeApp.mjs.map +1 -0
- package/dist/esm/frappeApp.native.js +151 -0
- package/dist/esm/frappeApp.native.js.map +1 -0
- package/dist/esm/frappeApp.spec.mjs +307 -0
- package/dist/esm/frappeApp.spec.mjs.map +1 -0
- package/dist/esm/frappeApp.spec.native.js +306 -0
- package/dist/esm/frappeApp.spec.native.js.map +1 -0
- package/dist/esm/frappeReact.mjs +286 -0
- package/dist/esm/frappeReact.mjs.map +1 -0
- package/dist/esm/frappeReact.native.js +320 -0
- package/dist/esm/frappeReact.native.js.map +1 -0
- package/dist/esm/frappeReact.spec.mjs +532 -0
- package/dist/esm/frappeReact.spec.mjs.map +1 -0
- package/dist/esm/frappeReact.spec.native.js +668 -0
- package/dist/esm/frappeReact.spec.native.js.map +1 -0
- package/dist/esm/index.mjs +25 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/index.native.js +25 -0
- package/dist/esm/index.native.js.map +1 -0
- package/dist/esm/optimistic.mjs +3 -0
- package/dist/esm/optimistic.mjs.map +1 -0
- package/dist/esm/optimistic.native.js +3 -0
- package/dist/esm/optimistic.native.js.map +1 -0
- package/dist/esm/optimistic.spec.mjs +12 -0
- package/dist/esm/optimistic.spec.mjs.map +1 -0
- package/dist/esm/optimistic.spec.native.js +17 -0
- package/dist/esm/optimistic.spec.native.js.map +1 -0
- package/dist/esm/pacer.mjs +173 -0
- package/dist/esm/pacer.mjs.map +1 -0
- package/dist/esm/pacer.native.js +244 -0
- package/dist/esm/pacer.native.js.map +1 -0
- package/dist/esm/pacer.spec.mjs +447 -0
- package/dist/esm/pacer.spec.mjs.map +1 -0
- package/dist/esm/pacer.spec.native.js +511 -0
- package/dist/esm/pacer.spec.native.js.map +1 -0
- package/dist/esm/plugin/index.mjs +99 -0
- package/dist/esm/plugin/index.mjs.map +1 -0
- package/dist/esm/plugin/index.native.js +165 -0
- package/dist/esm/plugin/index.native.js.map +1 -0
- package/dist/esm/realtime.mjs +239 -0
- package/dist/esm/realtime.mjs.map +1 -0
- package/dist/esm/realtime.native.js +358 -0
- package/dist/esm/realtime.native.js.map +1 -0
- package/dist/esm/realtime.spec.mjs +327 -0
- package/dist/esm/realtime.spec.mjs.map +1 -0
- package/dist/esm/realtime.spec.native.js +390 -0
- package/dist/esm/realtime.spec.native.js.map +1 -0
- package/dist/esm/sync/backfill.mjs +287 -0
- package/dist/esm/sync/backfill.mjs.map +1 -0
- package/dist/esm/sync/backfill.native.js +457 -0
- package/dist/esm/sync/backfill.native.js.map +1 -0
- package/dist/esm/sync/backfill.spec.mjs +563 -0
- package/dist/esm/sync/backfill.spec.mjs.map +1 -0
- package/dist/esm/sync/backfill.spec.native.js +686 -0
- package/dist/esm/sync/backfill.spec.native.js.map +1 -0
- package/dist/esm/sync/debug.spec.mjs +102 -0
- package/dist/esm/sync/debug.spec.mjs.map +1 -0
- package/dist/esm/sync/debug.spec.native.js +107 -0
- package/dist/esm/sync/debug.spec.native.js.map +1 -0
- package/dist/esm/sync/filters.mjs +276 -0
- package/dist/esm/sync/filters.mjs.map +1 -0
- package/dist/esm/sync/filters.native.js +408 -0
- package/dist/esm/sync/filters.native.js.map +1 -0
- package/dist/esm/sync/filters.spec.mjs +169 -0
- package/dist/esm/sync/filters.spec.mjs.map +1 -0
- package/dist/esm/sync/filters.spec.native.js +171 -0
- package/dist/esm/sync/filters.spec.native.js.map +1 -0
- package/dist/esm/sync/index.mjs +278 -0
- package/dist/esm/sync/index.mjs.map +1 -0
- package/dist/esm/sync/index.native.js +434 -0
- package/dist/esm/sync/index.native.js.map +1 -0
- package/dist/esm/sync/merge.mjs +396 -0
- package/dist/esm/sync/merge.mjs.map +1 -0
- package/dist/esm/sync/merge.native.js +675 -0
- package/dist/esm/sync/merge.native.js.map +1 -0
- package/dist/esm/sync/merge.spec.mjs +909 -0
- package/dist/esm/sync/merge.spec.mjs.map +1 -0
- package/dist/esm/sync/merge.spec.native.js +935 -0
- package/dist/esm/sync/merge.spec.native.js.map +1 -0
- package/dist/esm/sync/multiOrderBy.spec.mjs +166 -0
- package/dist/esm/sync/multiOrderBy.spec.mjs.map +1 -0
- package/dist/esm/sync/multiOrderBy.spec.native.js +227 -0
- package/dist/esm/sync/multiOrderBy.spec.native.js.map +1 -0
- package/dist/esm/sync/mutationEngine.mjs +756 -0
- package/dist/esm/sync/mutationEngine.mjs.map +1 -0
- package/dist/esm/sync/mutationEngine.native.js +1131 -0
- package/dist/esm/sync/mutationEngine.native.js.map +1 -0
- package/dist/esm/sync/mutationEngine.spec.mjs +1159 -0
- package/dist/esm/sync/mutationEngine.spec.mjs.map +1 -0
- package/dist/esm/sync/mutationEngine.spec.native.js +1171 -0
- package/dist/esm/sync/mutationEngine.spec.native.js.map +1 -0
- package/dist/esm/sync/mutationJournal.mjs +124 -0
- package/dist/esm/sync/mutationJournal.mjs.map +1 -0
- package/dist/esm/sync/mutationJournal.native.js +253 -0
- package/dist/esm/sync/mutationJournal.native.js.map +1 -0
- package/dist/esm/sync/mutationJournal.spec.mjs +331 -0
- package/dist/esm/sync/mutationJournal.spec.mjs.map +1 -0
- package/dist/esm/sync/mutationJournal.spec.native.js +331 -0
- package/dist/esm/sync/mutationJournal.spec.native.js.map +1 -0
- package/dist/esm/sync/mutations.spec.mjs +328 -0
- package/dist/esm/sync/mutations.spec.mjs.map +1 -0
- package/dist/esm/sync/mutations.spec.native.js +328 -0
- package/dist/esm/sync/mutations.spec.native.js.map +1 -0
- package/dist/esm/sync/normalizedCache.mjs +115 -0
- package/dist/esm/sync/normalizedCache.mjs.map +1 -0
- package/dist/esm/sync/normalizedCache.native.js +201 -0
- package/dist/esm/sync/normalizedCache.native.js.map +1 -0
- package/dist/esm/sync/normalizedCache.spec.mjs +303 -0
- package/dist/esm/sync/normalizedCache.spec.mjs.map +1 -0
- package/dist/esm/sync/normalizedCache.spec.native.js +309 -0
- package/dist/esm/sync/normalizedCache.spec.native.js.map +1 -0
- package/dist/esm/sync/persistence.mjs +602 -0
- package/dist/esm/sync/persistence.mjs.map +1 -0
- package/dist/esm/sync/persistence.native.js +883 -0
- package/dist/esm/sync/persistence.native.js.map +1 -0
- package/dist/esm/sync/persistence.spec.mjs +563 -0
- package/dist/esm/sync/persistence.spec.mjs.map +1 -0
- package/dist/esm/sync/persistence.spec.native.js +570 -0
- package/dist/esm/sync/persistence.spec.native.js.map +1 -0
- package/dist/esm/sync/realtime.mjs +189 -0
- package/dist/esm/sync/realtime.mjs.map +1 -0
- package/dist/esm/sync/realtime.native.js +312 -0
- package/dist/esm/sync/realtime.native.js.map +1 -0
- package/dist/esm/sync/realtime.spec.mjs +500 -0
- package/dist/esm/sync/realtime.spec.mjs.map +1 -0
- package/dist/esm/sync/realtime.spec.native.js +510 -0
- package/dist/esm/sync/realtime.spec.native.js.map +1 -0
- package/dist/esm/sync/rehydration.mjs +298 -0
- package/dist/esm/sync/rehydration.mjs.map +1 -0
- package/dist/esm/sync/rehydration.native.js +503 -0
- package/dist/esm/sync/rehydration.native.js.map +1 -0
- package/dist/esm/sync/rehydration.spec.mjs +732 -0
- package/dist/esm/sync/rehydration.spec.mjs.map +1 -0
- package/dist/esm/sync/rehydration.spec.native.js +734 -0
- package/dist/esm/sync/rehydration.spec.native.js.map +1 -0
- package/dist/esm/sync/storage.mjs +116 -0
- package/dist/esm/sync/storage.mjs.map +1 -0
- package/dist/esm/sync/storage.native.js +180 -0
- package/dist/esm/sync/storage.native.js.map +1 -0
- package/dist/esm/sync/storage.spec.mjs +423 -0
- package/dist/esm/sync/storage.spec.mjs.map +1 -0
- package/dist/esm/sync/storage.spec.native.js +444 -0
- package/dist/esm/sync/storage.spec.native.js.map +1 -0
- package/dist/esm/sync/subscriptionManager.mjs +462 -0
- package/dist/esm/sync/subscriptionManager.mjs.map +1 -0
- package/dist/esm/sync/subscriptionManager.native.js +920 -0
- package/dist/esm/sync/subscriptionManager.native.js.map +1 -0
- package/dist/esm/sync/subscriptionManager.spec.mjs +1079 -0
- package/dist/esm/sync/subscriptionManager.spec.mjs.map +1 -0
- package/dist/esm/sync/subscriptionManager.spec.native.js +1110 -0
- package/dist/esm/sync/subscriptionManager.spec.native.js.map +1 -0
- package/dist/esm/sync/subscriptions.spec.mjs +914 -0
- package/dist/esm/sync/subscriptions.spec.mjs.map +1 -0
- package/dist/esm/sync/subscriptions.spec.native.js +943 -0
- package/dist/esm/sync/subscriptions.spec.native.js.map +1 -0
- package/dist/esm/sync/syncModule.spec.mjs +207 -0
- package/dist/esm/sync/syncModule.spec.mjs.map +1 -0
- package/dist/esm/sync/syncModule.spec.native.js +220 -0
- package/dist/esm/sync/syncModule.spec.native.js.map +1 -0
- package/dist/esm/sync/types.mjs +65 -0
- package/dist/esm/sync/types.mjs.map +1 -0
- package/dist/esm/sync/types.native.js +65 -0
- package/dist/esm/sync/types.native.js.map +1 -0
- package/dist/esm/sync/types.spec.mjs +247 -0
- package/dist/esm/sync/types.spec.mjs.map +1 -0
- package/dist/esm/sync/types.spec.native.js +254 -0
- package/dist/esm/sync/types.spec.native.js.map +1 -0
- package/dist/esm/sync/virtualPageManager.mjs +794 -0
- package/dist/esm/sync/virtualPageManager.mjs.map +1 -0
- package/dist/esm/sync/virtualPageManager.native.js +1095 -0
- package/dist/esm/sync/virtualPageManager.native.js.map +1 -0
- package/dist/esm/sync/virtualPageManager.spec.mjs +802 -0
- package/dist/esm/sync/virtualPageManager.spec.mjs.map +1 -0
- package/dist/esm/sync/virtualPageManager.spec.native.js +871 -0
- package/dist/esm/sync/virtualPageManager.spec.native.js.map +1 -0
- package/dist/esm/util.mjs +6 -0
- package/dist/esm/util.mjs.map +1 -0
- package/dist/esm/util.native.js +6 -0
- package/dist/esm/util.native.js.map +1 -0
- package/dist/esm/util.spec.mjs +20 -0
- package/dist/esm/util.spec.mjs.map +1 -0
- package/dist/esm/util.spec.native.js +22 -0
- package/dist/esm/util.spec.native.js.map +1 -0
- package/dist/jsx/auth.mjs +25 -0
- package/dist/jsx/auth.mjs.map +1 -0
- package/dist/jsx/auth.native.js +100 -0
- package/dist/jsx/auth.native.js.map +1 -0
- package/dist/jsx/auth.spec.mjs +323 -0
- package/dist/jsx/auth.spec.mjs.map +1 -0
- package/dist/jsx/auth.spec.native.js +329 -0
- package/dist/jsx/auth.spec.native.js.map +1 -0
- package/dist/jsx/call.mjs +20 -0
- package/dist/jsx/call.mjs.map +1 -0
- package/dist/jsx/call.native.js +93 -0
- package/dist/jsx/call.native.js.map +1 -0
- package/dist/jsx/call.spec.mjs +428 -0
- package/dist/jsx/call.spec.mjs.map +1 -0
- package/dist/jsx/call.spec.native.js +430 -0
- package/dist/jsx/call.spec.native.js.map +1 -0
- package/dist/jsx/collection.mjs +250 -0
- package/dist/jsx/collection.mjs.map +1 -0
- package/dist/jsx/collection.native.js +494 -0
- package/dist/jsx/collection.native.js.map +1 -0
- package/dist/jsx/collection.spec.mjs +187 -0
- package/dist/jsx/collection.spec.mjs.map +1 -0
- package/dist/jsx/collection.spec.native.js +216 -0
- package/dist/jsx/collection.spec.native.js.map +1 -0
- package/dist/jsx/common/types.mjs +2 -0
- package/dist/jsx/common/types.mjs.map +1 -0
- package/dist/jsx/common/types.native.js +21 -0
- package/dist/jsx/common/types.native.js.map +1 -0
- package/dist/jsx/common/types.spec.mjs +267 -0
- package/dist/jsx/common/types.spec.mjs.map +1 -0
- package/dist/jsx/common/types.spec.native.js +271 -0
- package/dist/jsx/common/types.spec.native.js.map +1 -0
- package/dist/jsx/core/http.mjs +258 -0
- package/dist/jsx/core/http.mjs.map +1 -0
- package/dist/jsx/core/http.native.js +484 -0
- package/dist/jsx/core/http.native.js.map +1 -0
- package/dist/jsx/core/http.spec.mjs +1260 -0
- package/dist/jsx/core/http.spec.mjs.map +1 -0
- package/dist/jsx/core/http.spec.native.js +1401 -0
- package/dist/jsx/core/http.spec.native.js.map +1 -0
- package/dist/jsx/core/types.mjs +26 -0
- package/dist/jsx/core/types.mjs.map +1 -0
- package/dist/jsx/core/types.native.js +178 -0
- package/dist/jsx/core/types.native.js.map +1 -0
- package/dist/jsx/core/wire.mjs +23 -0
- package/dist/jsx/core/wire.mjs.map +1 -0
- package/dist/jsx/core/wire.native.js +56 -0
- package/dist/jsx/core/wire.native.js.map +1 -0
- package/dist/jsx/core/wire.spec.mjs +479 -0
- package/dist/jsx/core/wire.spec.mjs.map +1 -0
- package/dist/jsx/core/wire.spec.native.js +482 -0
- package/dist/jsx/core/wire.spec.native.js.map +1 -0
- package/dist/jsx/db.mjs +329 -0
- package/dist/jsx/db.mjs.map +1 -0
- package/dist/jsx/db.native.js +469 -0
- package/dist/jsx/db.native.js.map +1 -0
- package/dist/jsx/db.spec.mjs +863 -0
- package/dist/jsx/db.spec.mjs.map +1 -0
- package/dist/jsx/db.spec.native.js +865 -0
- package/dist/jsx/db.spec.native.js.map +1 -0
- package/dist/jsx/devtools/FrappeDevtoolsPanel.mjs +813 -0
- package/dist/jsx/devtools/FrappeDevtoolsPanel.mjs.map +1 -0
- package/dist/jsx/devtools/FrappeDevtoolsPanel.native.js +919 -0
- package/dist/jsx/devtools/FrappeDevtoolsPanel.native.js.map +1 -0
- package/dist/jsx/devtools/index.mjs +4 -0
- package/dist/jsx/devtools/index.mjs.map +1 -0
- package/dist/jsx/devtools/index.native.js +33 -0
- package/dist/jsx/devtools/index.native.js.map +1 -0
- package/dist/jsx/devtools/plugin.mjs +14 -0
- package/dist/jsx/devtools/plugin.mjs.map +1 -0
- package/dist/jsx/devtools/plugin.native.js +56 -0
- package/dist/jsx/devtools/plugin.native.js.map +1 -0
- package/dist/jsx/devtools/theme.mjs +30 -0
- package/dist/jsx/devtools/theme.mjs.map +1 -0
- package/dist/jsx/devtools/theme.native.js +58 -0
- package/dist/jsx/devtools/theme.native.js.map +1 -0
- package/dist/jsx/doctype.mjs +381 -0
- package/dist/jsx/doctype.mjs.map +1 -0
- package/dist/jsx/doctype.native.js +521 -0
- package/dist/jsx/doctype.native.js.map +1 -0
- package/dist/jsx/doctype.spec.mjs +461 -0
- package/dist/jsx/doctype.spec.mjs.map +1 -0
- package/dist/jsx/doctype.spec.native.js +538 -0
- package/dist/jsx/doctype.spec.native.js.map +1 -0
- package/dist/jsx/file.mjs +16 -0
- package/dist/jsx/file.mjs.map +1 -0
- package/dist/jsx/file.native.js +84 -0
- package/dist/jsx/file.native.js.map +1 -0
- package/dist/jsx/file.spec.mjs +316 -0
- package/dist/jsx/file.spec.mjs.map +1 -0
- package/dist/jsx/file.spec.native.js +342 -0
- package/dist/jsx/file.spec.native.js.map +1 -0
- package/dist/jsx/fixtureDb.mjs +187 -0
- package/dist/jsx/fixtureDb.mjs.map +1 -0
- package/dist/jsx/fixtureDb.native.js +313 -0
- package/dist/jsx/fixtureDb.native.js.map +1 -0
- package/dist/jsx/fixtures.mjs +174 -0
- package/dist/jsx/fixtures.mjs.map +1 -0
- package/dist/jsx/fixtures.native.js +400 -0
- package/dist/jsx/fixtures.native.js.map +1 -0
- package/dist/jsx/frappeApp.mjs +92 -0
- package/dist/jsx/frappeApp.mjs.map +1 -0
- package/dist/jsx/frappeApp.native.js +179 -0
- package/dist/jsx/frappeApp.native.js.map +1 -0
- package/dist/jsx/frappeApp.spec.mjs +307 -0
- package/dist/jsx/frappeApp.spec.mjs.map +1 -0
- package/dist/jsx/frappeApp.spec.native.js +308 -0
- package/dist/jsx/frappeApp.spec.native.js.map +1 -0
- package/dist/jsx/frappeReact.mjs +286 -0
- package/dist/jsx/frappeReact.mjs.map +1 -0
- package/dist/jsx/frappeReact.native.js +351 -0
- package/dist/jsx/frappeReact.native.js.map +1 -0
- package/dist/jsx/frappeReact.spec.mjs +532 -0
- package/dist/jsx/frappeReact.spec.mjs.map +1 -0
- package/dist/jsx/frappeReact.spec.native.js +670 -0
- package/dist/jsx/frappeReact.spec.native.js.map +1 -0
- package/dist/jsx/index.js +25 -0
- package/dist/jsx/index.js.map +1 -0
- package/dist/jsx/index.mjs +25 -0
- package/dist/jsx/index.mjs.map +1 -0
- package/dist/jsx/index.native.js +152 -0
- package/dist/jsx/index.native.js.map +1 -0
- package/dist/jsx/optimistic.mjs +3 -0
- package/dist/jsx/optimistic.mjs.map +1 -0
- package/dist/jsx/optimistic.native.js +31 -0
- package/dist/jsx/optimistic.native.js.map +1 -0
- package/dist/jsx/optimistic.spec.mjs +12 -0
- package/dist/jsx/optimistic.spec.mjs.map +1 -0
- package/dist/jsx/optimistic.spec.native.js +19 -0
- package/dist/jsx/optimistic.spec.native.js.map +1 -0
- package/dist/jsx/pacer.mjs +173 -0
- package/dist/jsx/pacer.mjs.map +1 -0
- package/dist/jsx/pacer.native.js +274 -0
- package/dist/jsx/pacer.native.js.map +1 -0
- package/dist/jsx/pacer.spec.mjs +447 -0
- package/dist/jsx/pacer.spec.mjs.map +1 -0
- package/dist/jsx/pacer.spec.native.js +537 -0
- package/dist/jsx/pacer.spec.native.js.map +1 -0
- package/dist/jsx/plugin/index.mjs +99 -0
- package/dist/jsx/plugin/index.mjs.map +1 -0
- package/dist/jsx/plugin/index.native.js +193 -0
- package/dist/jsx/plugin/index.native.js.map +1 -0
- package/dist/jsx/realtime.mjs +239 -0
- package/dist/jsx/realtime.mjs.map +1 -0
- package/dist/jsx/realtime.native.js +387 -0
- package/dist/jsx/realtime.native.js.map +1 -0
- package/dist/jsx/realtime.spec.mjs +327 -0
- package/dist/jsx/realtime.spec.mjs.map +1 -0
- package/dist/jsx/realtime.spec.native.js +392 -0
- package/dist/jsx/realtime.spec.native.js.map +1 -0
- package/dist/jsx/sync/backfill.mjs +287 -0
- package/dist/jsx/sync/backfill.mjs.map +1 -0
- package/dist/jsx/sync/backfill.native.js +487 -0
- package/dist/jsx/sync/backfill.native.js.map +1 -0
- package/dist/jsx/sync/backfill.spec.mjs +563 -0
- package/dist/jsx/sync/backfill.spec.mjs.map +1 -0
- package/dist/jsx/sync/backfill.spec.native.js +712 -0
- package/dist/jsx/sync/backfill.spec.native.js.map +1 -0
- package/dist/jsx/sync/debug.spec.mjs +102 -0
- package/dist/jsx/sync/debug.spec.mjs.map +1 -0
- package/dist/jsx/sync/debug.spec.native.js +133 -0
- package/dist/jsx/sync/debug.spec.native.js.map +1 -0
- package/dist/jsx/sync/filters.mjs +276 -0
- package/dist/jsx/sync/filters.mjs.map +1 -0
- package/dist/jsx/sync/filters.native.js +446 -0
- package/dist/jsx/sync/filters.native.js.map +1 -0
- package/dist/jsx/sync/filters.spec.mjs +169 -0
- package/dist/jsx/sync/filters.spec.mjs.map +1 -0
- package/dist/jsx/sync/filters.spec.native.js +173 -0
- package/dist/jsx/sync/filters.spec.native.js.map +1 -0
- package/dist/jsx/sync/index.mjs +278 -0
- package/dist/jsx/sync/index.mjs.map +1 -0
- package/dist/jsx/sync/index.native.js +462 -0
- package/dist/jsx/sync/index.native.js.map +1 -0
- package/dist/jsx/sync/merge.mjs +396 -0
- package/dist/jsx/sync/merge.mjs.map +1 -0
- package/dist/jsx/sync/merge.native.js +717 -0
- package/dist/jsx/sync/merge.native.js.map +1 -0
- package/dist/jsx/sync/merge.spec.mjs +909 -0
- package/dist/jsx/sync/merge.spec.mjs.map +1 -0
- package/dist/jsx/sync/merge.spec.native.js +937 -0
- package/dist/jsx/sync/merge.spec.native.js.map +1 -0
- package/dist/jsx/sync/multiOrderBy.spec.mjs +166 -0
- package/dist/jsx/sync/multiOrderBy.spec.mjs.map +1 -0
- package/dist/jsx/sync/multiOrderBy.spec.native.js +229 -0
- package/dist/jsx/sync/multiOrderBy.spec.native.js.map +1 -0
- package/dist/jsx/sync/mutationEngine.mjs +756 -0
- package/dist/jsx/sync/mutationEngine.mjs.map +1 -0
- package/dist/jsx/sync/mutationEngine.native.js +1159 -0
- package/dist/jsx/sync/mutationEngine.native.js.map +1 -0
- package/dist/jsx/sync/mutationEngine.spec.mjs +1159 -0
- package/dist/jsx/sync/mutationEngine.spec.mjs.map +1 -0
- package/dist/jsx/sync/mutationEngine.spec.native.js +1173 -0
- package/dist/jsx/sync/mutationEngine.spec.native.js.map +1 -0
- package/dist/jsx/sync/mutationJournal.mjs +124 -0
- package/dist/jsx/sync/mutationJournal.mjs.map +1 -0
- package/dist/jsx/sync/mutationJournal.native.js +282 -0
- package/dist/jsx/sync/mutationJournal.native.js.map +1 -0
- package/dist/jsx/sync/mutationJournal.spec.mjs +331 -0
- package/dist/jsx/sync/mutationJournal.spec.mjs.map +1 -0
- package/dist/jsx/sync/mutationJournal.spec.native.js +333 -0
- package/dist/jsx/sync/mutationJournal.spec.native.js.map +1 -0
- package/dist/jsx/sync/mutations.spec.mjs +328 -0
- package/dist/jsx/sync/mutations.spec.mjs.map +1 -0
- package/dist/jsx/sync/mutations.spec.native.js +330 -0
- package/dist/jsx/sync/mutations.spec.native.js.map +1 -0
- package/dist/jsx/sync/normalizedCache.mjs +115 -0
- package/dist/jsx/sync/normalizedCache.mjs.map +1 -0
- package/dist/jsx/sync/normalizedCache.native.js +229 -0
- package/dist/jsx/sync/normalizedCache.native.js.map +1 -0
- package/dist/jsx/sync/normalizedCache.spec.mjs +303 -0
- package/dist/jsx/sync/normalizedCache.spec.mjs.map +1 -0
- package/dist/jsx/sync/normalizedCache.spec.native.js +311 -0
- package/dist/jsx/sync/normalizedCache.spec.native.js.map +1 -0
- package/dist/jsx/sync/persistence.mjs +602 -0
- package/dist/jsx/sync/persistence.mjs.map +1 -0
- package/dist/jsx/sync/persistence.native.js +911 -0
- package/dist/jsx/sync/persistence.native.js.map +1 -0
- package/dist/jsx/sync/persistence.spec.mjs +563 -0
- package/dist/jsx/sync/persistence.spec.mjs.map +1 -0
- package/dist/jsx/sync/persistence.spec.native.js +572 -0
- package/dist/jsx/sync/persistence.spec.native.js.map +1 -0
- package/dist/jsx/sync/realtime.mjs +189 -0
- package/dist/jsx/sync/realtime.mjs.map +1 -0
- package/dist/jsx/sync/realtime.native.js +340 -0
- package/dist/jsx/sync/realtime.native.js.map +1 -0
- package/dist/jsx/sync/realtime.spec.mjs +500 -0
- package/dist/jsx/sync/realtime.spec.mjs.map +1 -0
- package/dist/jsx/sync/realtime.spec.native.js +512 -0
- package/dist/jsx/sync/realtime.spec.native.js.map +1 -0
- package/dist/jsx/sync/rehydration.mjs +298 -0
- package/dist/jsx/sync/rehydration.mjs.map +1 -0
- package/dist/jsx/sync/rehydration.native.js +531 -0
- package/dist/jsx/sync/rehydration.native.js.map +1 -0
- package/dist/jsx/sync/rehydration.spec.mjs +732 -0
- package/dist/jsx/sync/rehydration.spec.mjs.map +1 -0
- package/dist/jsx/sync/rehydration.spec.native.js +736 -0
- package/dist/jsx/sync/rehydration.spec.native.js.map +1 -0
- package/dist/jsx/sync/storage.mjs +116 -0
- package/dist/jsx/sync/storage.mjs.map +1 -0
- package/dist/jsx/sync/storage.native.js +209 -0
- package/dist/jsx/sync/storage.native.js.map +1 -0
- package/dist/jsx/sync/storage.spec.mjs +423 -0
- package/dist/jsx/sync/storage.spec.mjs.map +1 -0
- package/dist/jsx/sync/storage.spec.native.js +470 -0
- package/dist/jsx/sync/storage.spec.native.js.map +1 -0
- package/dist/jsx/sync/subscriptionManager.mjs +462 -0
- package/dist/jsx/sync/subscriptionManager.mjs.map +1 -0
- package/dist/jsx/sync/subscriptionManager.native.js +948 -0
- package/dist/jsx/sync/subscriptionManager.native.js.map +1 -0
- package/dist/jsx/sync/subscriptionManager.spec.mjs +1079 -0
- package/dist/jsx/sync/subscriptionManager.spec.mjs.map +1 -0
- package/dist/jsx/sync/subscriptionManager.spec.native.js +1136 -0
- package/dist/jsx/sync/subscriptionManager.spec.native.js.map +1 -0
- package/dist/jsx/sync/subscriptions.spec.mjs +914 -0
- package/dist/jsx/sync/subscriptions.spec.mjs.map +1 -0
- package/dist/jsx/sync/subscriptions.spec.native.js +969 -0
- package/dist/jsx/sync/subscriptions.spec.native.js.map +1 -0
- package/dist/jsx/sync/syncModule.spec.mjs +207 -0
- package/dist/jsx/sync/syncModule.spec.mjs.map +1 -0
- package/dist/jsx/sync/syncModule.spec.native.js +222 -0
- package/dist/jsx/sync/syncModule.spec.native.js.map +1 -0
- package/dist/jsx/sync/types.mjs +65 -0
- package/dist/jsx/sync/types.mjs.map +1 -0
- package/dist/jsx/sync/types.native.js +102 -0
- package/dist/jsx/sync/types.native.js.map +1 -0
- package/dist/jsx/sync/types.spec.mjs +247 -0
- package/dist/jsx/sync/types.spec.mjs.map +1 -0
- package/dist/jsx/sync/types.spec.native.js +256 -0
- package/dist/jsx/sync/types.spec.native.js.map +1 -0
- package/dist/jsx/sync/virtualPageManager.mjs +794 -0
- package/dist/jsx/sync/virtualPageManager.mjs.map +1 -0
- package/dist/jsx/sync/virtualPageManager.native.js +1125 -0
- package/dist/jsx/sync/virtualPageManager.native.js.map +1 -0
- package/dist/jsx/sync/virtualPageManager.spec.mjs +802 -0
- package/dist/jsx/sync/virtualPageManager.spec.mjs.map +1 -0
- package/dist/jsx/sync/virtualPageManager.spec.native.js +873 -0
- package/dist/jsx/sync/virtualPageManager.spec.native.js.map +1 -0
- package/dist/jsx/util.mjs +6 -0
- package/dist/jsx/util.mjs.map +1 -0
- package/dist/jsx/util.native.js +34 -0
- package/dist/jsx/util.native.js.map +1 -0
- package/dist/jsx/util.spec.mjs +20 -0
- package/dist/jsx/util.spec.mjs.map +1 -0
- package/dist/jsx/util.spec.native.js +48 -0
- package/dist/jsx/util.spec.native.js.map +1 -0
- package/package.json +96 -0
- package/src/auth.spec.ts +363 -0
- package/src/auth.ts +29 -0
- package/src/call.spec.ts +541 -0
- package/src/call.ts +21 -0
- package/src/collection.spec.ts +213 -0
- package/src/collection.ts +328 -0
- package/src/common/types.spec.ts +294 -0
- package/src/common/types.ts +41 -0
- package/src/core/http.spec.ts +1128 -0
- package/src/core/http.ts +324 -0
- package/src/core/types.ts +85 -0
- package/src/core/wire.spec.ts +570 -0
- package/src/core/wire.ts +487 -0
- package/src/db.spec.ts +1004 -0
- package/src/db.ts +589 -0
- package/src/devtools/FrappeDevtoolsPanel.tsx +873 -0
- package/src/devtools/index.ts +3 -0
- package/src/devtools/plugin.tsx +13 -0
- package/src/devtools/theme.ts +42 -0
- package/src/doctype.spec.ts +451 -0
- package/src/doctype.ts +828 -0
- package/src/file.spec.ts +347 -0
- package/src/file.ts +27 -0
- package/src/fixtureDb.ts +208 -0
- package/src/fixtures.ts +268 -0
- package/src/frappeApp.spec.ts +382 -0
- package/src/frappeApp.ts +125 -0
- package/src/frappeReact.spec.ts +505 -0
- package/src/frappeReact.ts +598 -0
- package/src/index.ts +215 -0
- package/src/optimistic.spec.ts +13 -0
- package/src/optimistic.ts +39 -0
- package/src/pacer.spec.ts +493 -0
- package/src/pacer.ts +426 -0
- package/src/plugin/README.md +162 -0
- package/src/plugin/index.ts +141 -0
- package/src/realtime.spec.ts +453 -0
- package/src/realtime.ts +279 -0
- package/src/sync/backfill.spec.ts +714 -0
- package/src/sync/backfill.ts +378 -0
- package/src/sync/debug.spec.ts +110 -0
- package/src/sync/filters.spec.ts +223 -0
- package/src/sync/filters.ts +513 -0
- package/src/sync/index.ts +412 -0
- package/src/sync/merge.spec.ts +812 -0
- package/src/sync/merge.ts +532 -0
- package/src/sync/multiOrderBy.spec.ts +187 -0
- package/src/sync/mutationEngine.spec.ts +1418 -0
- package/src/sync/mutationEngine.ts +957 -0
- package/src/sync/mutationJournal.spec.ts +337 -0
- package/src/sync/mutationJournal.ts +157 -0
- package/src/sync/mutations.spec.ts +358 -0
- package/src/sync/normalizedCache.spec.ts +262 -0
- package/src/sync/normalizedCache.ts +152 -0
- package/src/sync/persistence.spec.ts +908 -0
- package/src/sync/persistence.ts +802 -0
- package/src/sync/realtime.spec.ts +769 -0
- package/src/sync/realtime.ts +259 -0
- package/src/sync/rehydration.spec.ts +923 -0
- package/src/sync/rehydration.ts +362 -0
- package/src/sync/storage.spec.ts +473 -0
- package/src/sync/storage.ts +174 -0
- package/src/sync/subscriptionManager.spec.ts +1226 -0
- package/src/sync/subscriptionManager.ts +577 -0
- package/src/sync/subscriptions.spec.ts +1048 -0
- package/src/sync/syncModule.spec.ts +217 -0
- package/src/sync/types.spec.ts +276 -0
- package/src/sync/types.ts +384 -0
- package/src/sync/virtualPageManager.spec.ts +825 -0
- package/src/sync/virtualPageManager.ts +1069 -0
- package/src/util.spec.ts +17 -0
- package/src/util.ts +5 -0
|
@@ -0,0 +1,577 @@
|
|
|
1
|
+
import type { FrappeDoc, FrappeDocData } from "../common/types";
|
|
2
|
+
import type { ListOptions } from "../core/types";
|
|
3
|
+
import type { DbModule } from "../db";
|
|
4
|
+
import { BackfillManager } from "./backfill";
|
|
5
|
+
import { extractSingleName, matchesFilters } from "./filters";
|
|
6
|
+
import type { NormalizedCache } from "./normalizedCache";
|
|
7
|
+
import { BackfillScope, Order } from "./types";
|
|
8
|
+
import type {
|
|
9
|
+
BackfillArgs,
|
|
10
|
+
OrderByField,
|
|
11
|
+
Subscription,
|
|
12
|
+
SubscriptionQuery,
|
|
13
|
+
SyncOptions,
|
|
14
|
+
} from "./types";
|
|
15
|
+
import { VirtualPageManager } from "./virtualPageManager";
|
|
16
|
+
|
|
17
|
+
export class SubscriptionManager {
|
|
18
|
+
private subscriptions = new Map<string, Subscription>();
|
|
19
|
+
private virtualPageManager: VirtualPageManager;
|
|
20
|
+
private backfillManager: BackfillManager;
|
|
21
|
+
/** Maps a stable query key to an existing subscriptionId for dedup */
|
|
22
|
+
private queryKeyToSubId = new Map<string, string>();
|
|
23
|
+
/** Reference counts per subscriptionId for shared subscription lifecycle */
|
|
24
|
+
private subRefCounts = new Map<string, number>();
|
|
25
|
+
|
|
26
|
+
constructor(
|
|
27
|
+
private readonly db: DbModule,
|
|
28
|
+
private readonly normalizedCache: NormalizedCache,
|
|
29
|
+
private readonly options: SyncOptions = {},
|
|
30
|
+
) {
|
|
31
|
+
this.virtualPageManager = new VirtualPageManager(this.normalizedCache, this.db, {
|
|
32
|
+
batchSize: this.options.batchSize,
|
|
33
|
+
});
|
|
34
|
+
this.backfillManager = new BackfillManager(this.db, this.normalizedCache, {
|
|
35
|
+
pageSize: this.options.pageSize,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async subscribe<Data extends FrappeDocData>(query: SubscriptionQuery) {
|
|
40
|
+
// Dedup: if an identical query is already active, reuse it
|
|
41
|
+
const queryKey = JSON.stringify(query);
|
|
42
|
+
const existingId = this.queryKeyToSubId.get(queryKey);
|
|
43
|
+
if (existingId && this.subscriptions.has(existingId)) {
|
|
44
|
+
this.subRefCounts.set(existingId, (this.subRefCounts.get(existingId) || 1) + 1);
|
|
45
|
+
const rows = this.getDocsForSubscription<Data>(existingId);
|
|
46
|
+
const checkpoint = this.subscriptions.get(existingId)!.checkpoint;
|
|
47
|
+
return { subscriptionId: existingId, rows, checkpoint };
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const subscriptionId = cryptoRandomId();
|
|
51
|
+
// Only restrict fields when the caller explicitly specifies them.
|
|
52
|
+
// When fields is undefined/empty, pass undefined so all fields are returned.
|
|
53
|
+
const queryFields = query.fields?.length
|
|
54
|
+
? Array.from(new Set([...query.fields, "modified", "name"]))
|
|
55
|
+
: undefined;
|
|
56
|
+
let rows: FrappeDoc<Data>[] = [];
|
|
57
|
+
let cursor: string | undefined;
|
|
58
|
+
const singleName = extractSingleName(query.filters);
|
|
59
|
+
if (singleName) {
|
|
60
|
+
try {
|
|
61
|
+
const document = await this.db.getDoc<Data>(query.doctype, singleName);
|
|
62
|
+
rows = document ? [document] : [];
|
|
63
|
+
} catch (error) {
|
|
64
|
+
// Check if this is a 404 (document not found) vs other errors
|
|
65
|
+
const errorWithStatus = error as { status?: number };
|
|
66
|
+
if (errorWithStatus?.status === 404) {
|
|
67
|
+
// Document not found - return empty rows
|
|
68
|
+
rows = [];
|
|
69
|
+
} else {
|
|
70
|
+
// Re-throw other errors (network issues, permission errors, etc.)
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
} else {
|
|
75
|
+
const listOptions: ListOptions = {
|
|
76
|
+
fields: queryFields,
|
|
77
|
+
filters: query.filters,
|
|
78
|
+
orderBy: query.orderBy,
|
|
79
|
+
};
|
|
80
|
+
if (this.options.useCursorPagination) listOptions.cursor = undefined;
|
|
81
|
+
const response = await this.db.getDocList<Data>(query.doctype, listOptions);
|
|
82
|
+
|
|
83
|
+
// Handle response based on whether it includes cursor
|
|
84
|
+
if (typeof response === "object" && response !== null && "data" in response) {
|
|
85
|
+
rows = (response as any).data as FrappeDoc<Data>[];
|
|
86
|
+
cursor = (response as any).cursor;
|
|
87
|
+
} else {
|
|
88
|
+
rows = response;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Seed the normalized cache with every returned row for instant local reads.
|
|
92
|
+
// Frappe's standard get_list API omits `doctype` from each row, so inject
|
|
93
|
+
// it from the subscription query to ensure the cache keys correctly.
|
|
94
|
+
for (const row of rows) {
|
|
95
|
+
if (!row.doctype) row.doctype = query.doctype;
|
|
96
|
+
this.normalizedCache.upsert(row);
|
|
97
|
+
}
|
|
98
|
+
// Compute checkpoint for CDC as the max `modified` across returned rows (robust to server ordering)
|
|
99
|
+
let checkpoint: string | undefined = undefined;
|
|
100
|
+
for (const row of rows) {
|
|
101
|
+
if (!row.modified) continue;
|
|
102
|
+
if (!checkpoint || row.modified > checkpoint) checkpoint = row.modified;
|
|
103
|
+
}
|
|
104
|
+
// Materialize the in-memory subscription record with initial membership
|
|
105
|
+
const subscription: Subscription = {
|
|
106
|
+
id: subscriptionId,
|
|
107
|
+
query,
|
|
108
|
+
checkpoint, // For CDC backfill
|
|
109
|
+
cursor, // For stable pagination
|
|
110
|
+
docIds: rows.map((row) => row.name),
|
|
111
|
+
tombstones: new Map<string, number>(),
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
// Track page boundaries for optimistic placement
|
|
115
|
+
if (rows.length > 0) {
|
|
116
|
+
subscription.boundaries = {
|
|
117
|
+
firstItem: rows[0] as unknown as FrappeDoc<Data>,
|
|
118
|
+
lastItem: rows[rows.length - 1] as unknown as FrappeDoc<Data>,
|
|
119
|
+
offset: query.limitStart || 0,
|
|
120
|
+
pageSize: query.limit || 20,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Initialize metadata for tracking items outside current page
|
|
125
|
+
subscription.metadata = {
|
|
126
|
+
itemsBeforePage: 0,
|
|
127
|
+
itemsAfterPage: 0,
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
// Activate it
|
|
131
|
+
this.subscriptions.set(subscriptionId, subscription);
|
|
132
|
+
this.queryKeyToSubId.set(queryKey, subscriptionId);
|
|
133
|
+
this.subRefCounts.set(subscriptionId, 1);
|
|
134
|
+
|
|
135
|
+
// Register with VirtualPageManager for progressive pagination if requested
|
|
136
|
+
if (query.progressive) {
|
|
137
|
+
this.virtualPageManager.registerSubscription(
|
|
138
|
+
subscriptionId,
|
|
139
|
+
subscription,
|
|
140
|
+
subscription.docIds,
|
|
141
|
+
cursor,
|
|
142
|
+
);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Provide the caller with the seeded rows and computed checkpoint
|
|
146
|
+
return { subscriptionId: subscriptionId, rows, checkpoint };
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Removes a subscription by id. Cached docs remain until evicted by
|
|
151
|
+
* realtime/backfill or explicit resets. This keeps other subs fast if they
|
|
152
|
+
* share the same doctypes.
|
|
153
|
+
*/
|
|
154
|
+
unsubscribe(subscriptionId: string) {
|
|
155
|
+
const refCount = (this.subRefCounts.get(subscriptionId) || 1) - 1;
|
|
156
|
+
if (refCount > 0) {
|
|
157
|
+
this.subRefCounts.set(subscriptionId, refCount);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
// Last consumer released — clean up
|
|
161
|
+
this.subRefCounts.delete(subscriptionId);
|
|
162
|
+
for (const [key, id] of this.queryKeyToSubId) {
|
|
163
|
+
if (id === subscriptionId) {
|
|
164
|
+
this.queryKeyToSubId.delete(key);
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
this.subscriptions.delete(subscriptionId);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/** Returns subscription metadata by id. */
|
|
172
|
+
getSubscription(id: string) {
|
|
173
|
+
// Retrieve an active subscription record by its identifier
|
|
174
|
+
return this.subscriptions.get(id);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Returns current rows for a subscription from the cache.
|
|
179
|
+
* Note: This is local-only; authoritative refresh happens via backfill/realtime.
|
|
180
|
+
*/
|
|
181
|
+
getDocsForSubscription<Data extends FrappeDocData>(id: string): FrappeDoc<Data>[] {
|
|
182
|
+
// Try to get from virtual page system first
|
|
183
|
+
const virtualSub = this.virtualPageManager.getSubscription(id);
|
|
184
|
+
if (virtualSub) {
|
|
185
|
+
// Use virtual page system for progressive cache
|
|
186
|
+
const docIds = virtualSub.getProgressiveCache().docIds.filter((id: string) => id !== "");
|
|
187
|
+
const out: FrappeDoc<Data>[] = [];
|
|
188
|
+
for (const name of docIds) {
|
|
189
|
+
const document = this.normalizedCache.get({
|
|
190
|
+
doctype: virtualSub.query.doctype,
|
|
191
|
+
name,
|
|
192
|
+
});
|
|
193
|
+
if (document) out.push(document as FrappeDoc<Data>);
|
|
194
|
+
}
|
|
195
|
+
return out;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Fall back to standard subscription lookup
|
|
199
|
+
const subscription = this.subscriptions.get(id);
|
|
200
|
+
if (!subscription) return [];
|
|
201
|
+
const out: FrappeDoc<Data>[] = [];
|
|
202
|
+
for (const name of subscription.docIds) {
|
|
203
|
+
const document = this.normalizedCache.get({
|
|
204
|
+
doctype: subscription.query.doctype,
|
|
205
|
+
name,
|
|
206
|
+
});
|
|
207
|
+
if (document) out.push(document as FrappeDoc<Data>);
|
|
208
|
+
}
|
|
209
|
+
return out;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Get a specific page of documents using virtual pagination
|
|
214
|
+
*/
|
|
215
|
+
async getPage<Data extends FrappeDocData>(
|
|
216
|
+
subscriptionId: string,
|
|
217
|
+
page: number,
|
|
218
|
+
): Promise<FrappeDoc<Data>[]> {
|
|
219
|
+
return this.virtualPageManager.getPage(subscriptionId, page) as Promise<FrappeDoc<Data>[]>;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Get documents after a cursor (for infinite scroll)
|
|
224
|
+
*/
|
|
225
|
+
async getNextBatch<Data extends FrappeDocData>(
|
|
226
|
+
subscriptionId: string,
|
|
227
|
+
cursorDocId: string,
|
|
228
|
+
limit: number,
|
|
229
|
+
): Promise<FrappeDoc<Data>[]> {
|
|
230
|
+
return this.virtualPageManager.getNextBatch(subscriptionId, cursorDocId, limit) as Promise<
|
|
231
|
+
FrappeDoc<Data>[]
|
|
232
|
+
>;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Get page information
|
|
237
|
+
*/
|
|
238
|
+
getPageInfo(subscriptionId: string) {
|
|
239
|
+
return this.virtualPageManager.getPageInfo(subscriptionId);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Reconciles local state by fetching changes since stored cursors.
|
|
244
|
+
*
|
|
245
|
+
* Scopes
|
|
246
|
+
* - all: iterate all subscriptions
|
|
247
|
+
* - subscriptions: selected subscription ids
|
|
248
|
+
* - doctypes: all subscriptions matching any of these doctypes
|
|
249
|
+
* - docs: refetch specific documents (authority refresh)
|
|
250
|
+
*/
|
|
251
|
+
async backfill<Data extends FrappeDocData>(args: BackfillArgs) {
|
|
252
|
+
if (args.scope === BackfillScope.All) {
|
|
253
|
+
for (const subscription of this.subscriptions.values())
|
|
254
|
+
await this.backfillSub(subscription, args.pageSize);
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
if (args.scope === BackfillScope.Subscriptions) {
|
|
258
|
+
for (const subscriptionId of args.subscriptions || []) {
|
|
259
|
+
const subscription = this.subscriptions.get(subscriptionId);
|
|
260
|
+
if (subscription) await this.backfillSub(subscription, args.pageSize);
|
|
261
|
+
}
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
if (args.scope === BackfillScope.Doctypes) {
|
|
265
|
+
const set = new Set(args.doctypes || []);
|
|
266
|
+
for (const subscription of this.subscriptions.values())
|
|
267
|
+
if (set.has(subscription.query.doctype))
|
|
268
|
+
await this.backfillSub(subscription, args.pageSize);
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
if (args.scope === BackfillScope.Docs) {
|
|
272
|
+
for (const docTarget of args.docs || []) {
|
|
273
|
+
const document = await this.db.getDoc<Data>(docTarget.doctype, docTarget.name);
|
|
274
|
+
this.normalizedCache.upsert(document);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Backfills one subscription using CDC checkpoint and updates membership.
|
|
281
|
+
*
|
|
282
|
+
* Algorithm
|
|
283
|
+
* - Query backfill using checkpoint for CDC (Change Data Capture)
|
|
284
|
+
* - Upsert each row to cache
|
|
285
|
+
* - For each row: test client-side filters; add/remove membership accordingly
|
|
286
|
+
* - Track tombstones for deleted documents
|
|
287
|
+
* - Advance checkpoint to response checkpoint
|
|
288
|
+
* - If no filters were specified, derive membership directly from returned rows
|
|
289
|
+
*/
|
|
290
|
+
async backfillSub<Data extends FrappeDocData>(
|
|
291
|
+
subscription: Subscription,
|
|
292
|
+
pageSize = this.options.pageSize ?? 200,
|
|
293
|
+
) {
|
|
294
|
+
// Request changes since the last known checkpoint using CDC backfill API
|
|
295
|
+
const response = await this.db.backfill<Data>({
|
|
296
|
+
doctype: subscription.query.doctype,
|
|
297
|
+
fields: subscription.query.fields,
|
|
298
|
+
filters: subscription.query.filters,
|
|
299
|
+
modifiedAfter: subscription.checkpoint, // CDC checkpoint
|
|
300
|
+
limit: pageSize,
|
|
301
|
+
});
|
|
302
|
+
// Apply authoritative deletes first if backend returns tombstones.
|
|
303
|
+
// The backfill endpoint returns {name: string} objects (no doctype),
|
|
304
|
+
// so we fall back to the subscription's doctype when not provided.
|
|
305
|
+
if ((response as any).deleted && Array.isArray((response as any).deleted)) {
|
|
306
|
+
for (const deleted of (response as any).deleted as {
|
|
307
|
+
doctype?: string;
|
|
308
|
+
name: string;
|
|
309
|
+
}[]) {
|
|
310
|
+
if (!deleted?.name) continue;
|
|
311
|
+
const deletedDoctype = deleted.doctype || subscription.query.doctype;
|
|
312
|
+
|
|
313
|
+
// Track in tombstones map for this subscription with timestamp
|
|
314
|
+
if (deletedDoctype === subscription.query.doctype && subscription.tombstones) {
|
|
315
|
+
subscription.tombstones.set(deleted.name, Date.now());
|
|
316
|
+
}
|
|
317
|
+
// Evict from cache and any list memberships for this doctype
|
|
318
|
+
this.normalizedCache.remove({
|
|
319
|
+
doctype: deletedDoctype,
|
|
320
|
+
name: deleted.name,
|
|
321
|
+
});
|
|
322
|
+
if (deletedDoctype === subscription.query.doctype)
|
|
323
|
+
subscription.docIds = subscription.docIds.filter(
|
|
324
|
+
(currentName) => currentName !== deleted.name,
|
|
325
|
+
);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
// Upsert each changed/inserted row, then reconcile membership using client filters
|
|
329
|
+
for (const row of response.rows) {
|
|
330
|
+
if (!row.doctype) row.doctype = subscription.query.doctype;
|
|
331
|
+
this.normalizedCache.upsert(row);
|
|
332
|
+
const name = row.name;
|
|
333
|
+
if (!name) continue;
|
|
334
|
+
const match = matchesFilters(row as FrappeDoc<Data>, subscription.query.filters);
|
|
335
|
+
if (match && !subscription.docIds.includes(name)) subscription.docIds.push(name);
|
|
336
|
+
if (!match)
|
|
337
|
+
subscription.docIds = subscription.docIds.filter((currentName) => currentName !== name);
|
|
338
|
+
}
|
|
339
|
+
// Advance the checkpoint to the server-provided checkpoint for next cycle
|
|
340
|
+
if (response.checkpoint) subscription.checkpoint = response.checkpoint;
|
|
341
|
+
// If no filters, the rows represent the full page; maintain membership directly
|
|
342
|
+
if (response.rows.length && !subscription.query.filters)
|
|
343
|
+
subscription.docIds = response.rows.map((row: any) => row.name);
|
|
344
|
+
|
|
345
|
+
// Update page boundaries after backfill
|
|
346
|
+
if (subscription.docIds.length > 0) {
|
|
347
|
+
const firstDoc = this.normalizedCache.get({
|
|
348
|
+
doctype: subscription.query.doctype,
|
|
349
|
+
name: subscription.docIds[0],
|
|
350
|
+
});
|
|
351
|
+
const lastDoc = this.normalizedCache.get({
|
|
352
|
+
doctype: subscription.query.doctype,
|
|
353
|
+
name: subscription.docIds[subscription.docIds.length - 1],
|
|
354
|
+
});
|
|
355
|
+
|
|
356
|
+
if (firstDoc && lastDoc) {
|
|
357
|
+
subscription.boundaries = {
|
|
358
|
+
firstItem: firstDoc,
|
|
359
|
+
lastItem: lastDoc,
|
|
360
|
+
offset: subscription.boundaries?.offset || 0,
|
|
361
|
+
pageSize: subscription.boundaries?.pageSize || subscription.query.limit || 20,
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
// Maintain ordering when an orderBy is present for stable UX
|
|
367
|
+
this.resortSubscriptionDocIds(subscription);
|
|
368
|
+
|
|
369
|
+
// Cleanup expired tombstones to prevent memory leaks
|
|
370
|
+
this.cleanupTombstones(subscription.id);
|
|
371
|
+
|
|
372
|
+
if (this.options.onBackfill)
|
|
373
|
+
this.options.onBackfill({
|
|
374
|
+
doctype: subscription.query.doctype,
|
|
375
|
+
fetched: response.rows.length,
|
|
376
|
+
checkpoint: subscription.checkpoint,
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
resortSubscriptionDocIds(subscription: Subscription) {
|
|
381
|
+
const { orderBy, doctype } = subscription.query;
|
|
382
|
+
if (!orderBy) return;
|
|
383
|
+
const orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];
|
|
384
|
+
subscription.docIds.sort((firstId, secondId) => {
|
|
385
|
+
const firstDoc = this.normalizedCache.get({ doctype, name: firstId });
|
|
386
|
+
const secondDoc = this.normalizedCache.get({ doctype, name: secondId });
|
|
387
|
+
for (const orderByField of orderByArray) {
|
|
388
|
+
const field = orderByField.field;
|
|
389
|
+
const ascending = orderByField.order !== Order.Desc;
|
|
390
|
+
const firstValue = firstDoc?.[field];
|
|
391
|
+
const secondValue = secondDoc?.[field];
|
|
392
|
+
const firstIsNullish = firstValue === null || firstValue === undefined;
|
|
393
|
+
const secondIsNullish = secondValue === null || secondValue === undefined;
|
|
394
|
+
if (firstIsNullish && !secondIsNullish) return ascending ? -1 : 1;
|
|
395
|
+
if (secondIsNullish && !firstIsNullish) return ascending ? 1 : -1;
|
|
396
|
+
if (firstIsNullish && secondIsNullish) continue;
|
|
397
|
+
if (firstIsNullish || secondIsNullish) continue;
|
|
398
|
+
if (firstValue < secondValue) return ascending ? -1 : 1;
|
|
399
|
+
if (firstValue > secondValue) return ascending ? 1 : -1;
|
|
400
|
+
}
|
|
401
|
+
return firstId < secondId ? -1 : firstId > secondId ? 1 : 0;
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
updateSubscriptionMembership<Data extends FrappeDocData>(doc: FrappeDoc<Data>): Subscription[] {
|
|
406
|
+
const subscriptionsNeedingRehydration: Subscription[] = [];
|
|
407
|
+
for (const subscription of this.subscriptions.values()) {
|
|
408
|
+
if (subscription.query.doctype !== doc.doctype) continue;
|
|
409
|
+
const match = matchesFilters(doc, subscription.query.filters);
|
|
410
|
+
const isExisting = subscription.docIds.includes(doc.name);
|
|
411
|
+
if (match && !isExisting) {
|
|
412
|
+
subscriptionsNeedingRehydration.push(subscription);
|
|
413
|
+
// Also update VPM progressive cache for remote creates
|
|
414
|
+
this.virtualPageManager.handleRemoteCreate(
|
|
415
|
+
subscription.id,
|
|
416
|
+
doc as FrappeDoc<FrappeDocData>,
|
|
417
|
+
);
|
|
418
|
+
} else if (isExisting) {
|
|
419
|
+
if (!match) {
|
|
420
|
+
subscription.docIds = subscription.docIds.filter((docId) => docId !== doc.name);
|
|
421
|
+
this.virtualPageManager.handleRemoteDelete(subscription.id, doc.name);
|
|
422
|
+
} else {
|
|
423
|
+
this.virtualPageManager.handleRemoteUpdate(
|
|
424
|
+
subscription.id,
|
|
425
|
+
doc as FrappeDoc<FrappeDocData>,
|
|
426
|
+
);
|
|
427
|
+
}
|
|
428
|
+
this.resortSubscriptionDocIds(subscription);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
return subscriptionsNeedingRehydration;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/**
|
|
435
|
+
* Removes a document from all subscription memberships.
|
|
436
|
+
* Returns subscriptions that had the document removed (for potential backfill).
|
|
437
|
+
*/
|
|
438
|
+
removeFromAllSubscriptions<_Data extends FrappeDocData>(
|
|
439
|
+
doctype: string,
|
|
440
|
+
name: string,
|
|
441
|
+
): Subscription[] {
|
|
442
|
+
const affectedSubscriptions: Subscription[] = [];
|
|
443
|
+
|
|
444
|
+
for (const subscription of this.subscriptions.values()) {
|
|
445
|
+
if (subscription.query.doctype !== doctype) continue;
|
|
446
|
+
|
|
447
|
+
const hadDocument = subscription.docIds.includes(name as string);
|
|
448
|
+
if (hadDocument) {
|
|
449
|
+
subscription.docIds = subscription.docIds.filter((docId) => docId !== name);
|
|
450
|
+
this.virtualPageManager.handleRemoteDelete(subscription.id, name);
|
|
451
|
+
affectedSubscriptions.push(subscription);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
return affectedSubscriptions;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
/** Gets all active subscriptions. */
|
|
459
|
+
getAllSubscriptions(): Map<string, Subscription> {
|
|
460
|
+
return this.subscriptions;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
getVirtualPageManager(): VirtualPageManager {
|
|
464
|
+
return this.virtualPageManager;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
insertDocumentIntoSubscription<Data extends FrappeDocData>(
|
|
468
|
+
subscription: Subscription,
|
|
469
|
+
doc: FrappeDoc<Data>,
|
|
470
|
+
) {
|
|
471
|
+
if (subscription.docIds.includes(doc.name)) return;
|
|
472
|
+
if (!subscription.query.orderBy || subscription.docIds.length === 0) {
|
|
473
|
+
return subscription.docIds.push(doc.name);
|
|
474
|
+
}
|
|
475
|
+
const insertIndex = this.findInsertionIndex(subscription, doc);
|
|
476
|
+
subscription.docIds.splice(insertIndex, 0, doc.name);
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
private findInsertionIndex<Data extends FrappeDocData>(
|
|
480
|
+
subscription: Subscription,
|
|
481
|
+
doc: FrappeDoc<Data>,
|
|
482
|
+
): number {
|
|
483
|
+
const { docIds, query } = subscription;
|
|
484
|
+
const orderByArray = Array.isArray(query.orderBy) ? query.orderBy : [query.orderBy!];
|
|
485
|
+
let left = 0;
|
|
486
|
+
let right = docIds.length - 1;
|
|
487
|
+
while (left <= right) {
|
|
488
|
+
const mid = Math.floor((left + right) / 2);
|
|
489
|
+
const midDoc = this.normalizedCache.get({
|
|
490
|
+
doctype: query.doctype,
|
|
491
|
+
name: docIds[mid],
|
|
492
|
+
});
|
|
493
|
+
if (!midDoc) {
|
|
494
|
+
return docIds.length;
|
|
495
|
+
}
|
|
496
|
+
const comparison = this.compareDocuments(doc, midDoc, orderByArray);
|
|
497
|
+
if (comparison <= 0) {
|
|
498
|
+
right = mid - 1;
|
|
499
|
+
} else {
|
|
500
|
+
left = mid + 1;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
return left;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
private compareDocuments<Data extends FrappeDocData>(
|
|
507
|
+
doc1: FrappeDoc<Data>,
|
|
508
|
+
doc2: FrappeDoc<Data>,
|
|
509
|
+
orderByArray: OrderByField[],
|
|
510
|
+
): number {
|
|
511
|
+
for (const { field, order } of orderByArray) {
|
|
512
|
+
const value1 = doc1[field];
|
|
513
|
+
const value2 = doc2[field];
|
|
514
|
+
const isAsc = order !== Order.Desc;
|
|
515
|
+
const isNull1 = value1 == null;
|
|
516
|
+
const isNull2 = value2 == null;
|
|
517
|
+
if (isNull1 && !isNull2) return isAsc ? -1 : 1;
|
|
518
|
+
if (!isNull1 && isNull2) return isAsc ? 1 : -1;
|
|
519
|
+
if (isNull1 && isNull2) continue;
|
|
520
|
+
if (value1! < value2!) return isAsc ? -1 : 1;
|
|
521
|
+
if (value1! > value2!) return isAsc ? 1 : -1;
|
|
522
|
+
}
|
|
523
|
+
const name1 = doc1.name || "";
|
|
524
|
+
const name2 = doc2.name || "";
|
|
525
|
+
return name1 < name2 ? -1 : name1 > name2 ? 1 : 0;
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
clear() {
|
|
529
|
+
this.subscriptions.clear();
|
|
530
|
+
this.queryKeyToSubId.clear();
|
|
531
|
+
this.subRefCounts.clear();
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
/**
|
|
535
|
+
* Cleans up expired tombstones based on age and count limits.
|
|
536
|
+
* Should be called periodically or after backfill operations.
|
|
537
|
+
*/
|
|
538
|
+
cleanupTombstones(subscriptionId?: string) {
|
|
539
|
+
const maxAge = this.options.tombstoneMaxAge ?? 30 * 60 * 1000; // Default 30 minutes
|
|
540
|
+
const maxCount = this.options.tombstoneMaxCount ?? 1000; // Default 1000 per subscription
|
|
541
|
+
const now = Date.now();
|
|
542
|
+
|
|
543
|
+
const subscriptionsToClean = subscriptionId
|
|
544
|
+
? [this.subscriptions.get(subscriptionId)].filter(Boolean)
|
|
545
|
+
: [...this.subscriptions.values()];
|
|
546
|
+
|
|
547
|
+
for (const subscription of subscriptionsToClean) {
|
|
548
|
+
if (!subscription?.tombstones || subscription.tombstones.size === 0) continue;
|
|
549
|
+
|
|
550
|
+
// First pass: remove expired tombstones by age
|
|
551
|
+
for (const [name, timestamp] of subscription.tombstones) {
|
|
552
|
+
if (now - timestamp > maxAge) {
|
|
553
|
+
subscription.tombstones.delete(name);
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
// Second pass: if still over max count, remove oldest tombstones
|
|
558
|
+
if (subscription.tombstones.size > maxCount) {
|
|
559
|
+
const entries = [...subscription.tombstones.entries()];
|
|
560
|
+
// Sort by timestamp ascending (oldest first)
|
|
561
|
+
entries.sort((a, b) => a[1] - b[1]);
|
|
562
|
+
// Remove oldest entries to get under limit
|
|
563
|
+
const toRemove = entries.slice(0, subscription.tombstones.size - maxCount);
|
|
564
|
+
for (const [name] of toRemove) {
|
|
565
|
+
subscription.tombstones.delete(name);
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
function cryptoRandomId() {
|
|
573
|
+
if (typeof crypto !== "undefined" && "randomUUID" in crypto) {
|
|
574
|
+
return crypto.randomUUID();
|
|
575
|
+
}
|
|
576
|
+
return Math.random().toString(36).slice(2);
|
|
577
|
+
}
|