tinybase 8.0.1 → 8.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/index.js +1 -1
  2. package/mergeable-store/index.js +1 -1
  3. package/mergeable-store/with-schemas/index.js +1 -1
  4. package/min/index.js +1 -1
  5. package/min/index.js.gz +0 -0
  6. package/min/mergeable-store/index.js +1 -1
  7. package/min/mergeable-store/index.js.gz +0 -0
  8. package/min/mergeable-store/with-schemas/index.js +1 -1
  9. package/min/mergeable-store/with-schemas/index.js.gz +0 -0
  10. package/min/omni/index.js +1 -1
  11. package/min/omni/index.js.gz +0 -0
  12. package/min/omni/with-schemas/index.js +1 -1
  13. package/min/omni/with-schemas/index.js.gz +0 -0
  14. package/min/queries/index.js +1 -1
  15. package/min/queries/index.js.gz +0 -0
  16. package/min/queries/with-schemas/index.js +1 -1
  17. package/min/queries/with-schemas/index.js.gz +0 -0
  18. package/min/store/index.js +1 -1
  19. package/min/store/index.js.gz +0 -0
  20. package/min/store/with-schemas/index.js +1 -1
  21. package/min/store/with-schemas/index.js.gz +0 -0
  22. package/min/ui-react/index.js +1 -1
  23. package/min/ui-react/index.js.gz +0 -0
  24. package/min/ui-react/with-schemas/index.js +1 -1
  25. package/min/ui-react/with-schemas/index.js.gz +0 -0
  26. package/min/ui-react-dom/index.js +1 -1
  27. package/min/ui-react-dom/index.js.gz +0 -0
  28. package/min/ui-react-dom/with-schemas/index.js +1 -1
  29. package/min/ui-react-dom/with-schemas/index.js.gz +0 -0
  30. package/min/ui-react-inspector/index.js +1 -1
  31. package/min/ui-react-inspector/index.js.gz +0 -0
  32. package/min/ui-react-inspector/with-schemas/index.js +1 -1
  33. package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
  34. package/min/with-schemas/index.js +1 -1
  35. package/min/with-schemas/index.js.gz +0 -0
  36. package/omni/index.js +29 -21
  37. package/omni/with-schemas/index.js +29 -21
  38. package/package.json +1 -1
  39. package/queries/index.js +1 -1
  40. package/queries/with-schemas/index.js +1 -1
  41. package/readme.md +2 -2
  42. package/store/index.js +1 -1
  43. package/store/with-schemas/index.js +1 -1
  44. package/ui-react/index.js +7 -6
  45. package/ui-react/with-schemas/index.js +7 -6
  46. package/ui-react-dom/index.js +7 -6
  47. package/ui-react-dom/with-schemas/index.js +7 -6
  48. package/ui-react-inspector/index.js +29 -21
  49. package/ui-react-inspector/with-schemas/index.js +29 -21
  50. package/with-schemas/index.js +1 -1
package/readme.md CHANGED
@@ -6,7 +6,7 @@
6
6
  📦 Creating your project...
7
7
  ```
8
8
 
9
- <hr><section><h2 id="it-s-reactive">It&#x27;s <em>Reactive</em></h2><p>TinyBase lets you <a href="#register-granular-listeners">listen to changes</a> made to any part of your data. This means your app will be fast, since you only spend rendering cycles on things that change. The optional <a href="#call-hooks-to-bind-to-data">bindings to React</a> and <a href="#pre-built-reactive-components">pre-built components</a> let you easily build fully reactive UIs on top of TinyBase. You even get a built-in <a href="#set-checkpoints-for-an-undo-stack">undo stack</a>, and <a href="#an-inspector-for-your-data">developer tools</a>!</p></section><section><h2 id="it-s-database-like">It&#x27;s <em>Database-Like</em></h2><p>Consumer app? Enterprise app? Or even a game? Model <a href="#start-with-a-simple-key-value-store">key-value data</a> and <a href="#level-up-to-use-tabular-data">tabular data</a> with optional typed <a href="#apply-schemas-to-tables-values">schematization</a>, whatever its data structures. There are built-in <a href="#create-indexes-for-fast-lookups">indexing</a>, <a href="#define-metrics-and-aggregations">metric aggregation</a>, and tabular <a href="#model-table-relationships">relationships</a> APIs - and a powerful <a href="#build-complex-queries-with-tinyql">query engine</a> to select, join, filter, and group data (reactively!) without SQL.</p></section><section><h2 id="it-synchronizes">It <em>Synchronizes</em></h2><p>TinyBase has <a href="#synchronize-between-devices">native CRDT</a> support, meaning that you can deterministically <a href="https://tinybase.org/guides/synchronization/">synchronize</a> and merge data across multiple sources, clients, and servers. And although TinyBase is an in-memory data store, you can easily <a href="#persist-to-storage-databases-more">persist</a> your data to file, <a href="https://tinybase.org/api/persister-browser">browser storage</a>, <a href="https://tinybase.org/api/persister-indexed-db">IndexedDB</a>, <a href="https://tinybase.org/guides/persistence/database-persistence/">SQLite or PostgreSQL databases</a>, and <a href="https://tinybase.org/guides/persistence/third-party-crdt-persistence/">more</a>.</p></section><section><h2 id="it-s-built-for-a-local-first-world">It&#x27;s Built For A <em>Local-First</em> World</h2><p>TinyBase works anywhere that JavaScript does, but it&#x27;s especially great for local-first apps: where data is stored locally on the user&#x27;s device and that can be run offline. It&#x27;s tiny by name, tiny by nature: just <a href="#did-we-say-tiny">6.2kB - 13.2kB</a> and with no dependencies - yet <a href="#well-tested-and-documented">100% tested</a>, <a href="https://tinybase.org/guides/the-basics/getting-started/">fully documented</a>, and of course, <a href="https://github.com/tinyplex/tinybase">open source</a>!</p></section><hr><section id="friends"><h2 id="tinybase-works-great-on-its-own-but-also-plays-well-with-friends">TinyBase works great on its own, but also plays well with friends.</h2><div><a href="https://tinybase.org/guides/building-uis/getting-started-with-ui-react"><img src="https://tinybase.org/react.svg?asImg" width="48"> React</a></div><div><a href="https://tinybase.org/api/persister-indexed-db/functions/creation/createindexeddbpersister"><img src="https://tinybase.org/indexeddb.svg?asImg" width="48"> IndexedDB</a></div><div><a href="https://tinybase.org/api/persister-browser"><img src="https://tinybase.org/browser.svg?asImg" width="48"> OPFS</a></div><div><a href="https://tinybase.org/guides/integrations/cloudflare-durable-objects"><img src="https://tinybase.org/cloudflare.svg?asImg" width="48"> Cloudflare</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img src="https://tinybase.org/postgresql.svg?asImg" width="48"> PostgreSQL</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img src="https://tinybase.org/pglite.svg?asImg" width="48"> PGlite</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img src="https://tinybase.org/sqlite.svg?asImg" width="48"> SQLite</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img src="https://tinybase.org/bun.svg?asImg" width="48"> Bun SQLite</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img src="https://tinybase.org/expo.svg?asImg" width="48"> Expo SQLite</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img src="https://tinybase.org/electric.svg?asImg" width="48"> ElectricSQL</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img src="https://tinybase.org/turso.svg?asImg" width="48"> Turso</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img src="https://tinybase.org/powersync.svg?asImg" width="48"> PowerSync</a></div><div><a href="https://tinybase.org/api/persister-partykit-client"><img src="https://tinybase.org/partykit.svg?asImg" width="48"> PartyKit</a></div><div><a href="https://tinybase.org/api/persister-yjs/functions/creation/createyjspersister"><img src="https://tinybase.org/yjs.svg?asImg" width="48"> YJS</a></div><div><a href="https://tinybase.org/api/persister-cr-sqlite-wasm"><img src="https://tinybase.org/crsqlite.png" width="48"> CR-SQLite</a></div><div><a href="https://tinybase.org/api/persister-automerge"><img src="https://tinybase.org/automerge.svg?asImg" width="48"> Automerge</a></div><div><a href="https://tinybase.org/api/schematizer-zod/functions/creation/createzodschematizer"><img src="https://tinybase.org/zod.svg?asImg" width="48"> Zod</a></div><div><a href="https://tinybase.org/api/schematizer-typebox/functions/creation/createtypeboxschematizer"><img src="https://tinybase.org/typebox.svg?asImg" width="48"> TypeBox</a></div><div><a href="https://tinybase.org/api/schematizer-valibot/functions/creation/createvalibotschematizer"><img src="https://tinybase.org/valibot.svg?asImg" width="48"> Valibot</a></div><div><a href="https://tinybase.org/api/schematizer-arktype/functions/creation/createarktypeschematizer"><img src="https://tinybase.org/arktype.svg?asImg" width="48"> ArkType</a></div><div><a href="https://tinybase.org/api/schematizer-yup/functions/creation/createyupschematizer"><img src="https://tinybase.org/yup.svg?asImg" width="48"> Yup</a></div><div><a href="https://tinybase.org/api/schematizer-effect/functions/creation/createeffectschematizer"><img src="https://tinybase.org/effect.svg?asImg" width="48"> Effect</a></div><p>(Baffled by all these logos? Check out our <a href="https://tinybase.org/guides/the-basics/architectural-options">architectural options</a> guide to make sense of it all!)</p></section><hr><section id="follow"><a href="https://github.com/tinyplex/tinybase" target="_blank"><img src="https://img.shields.io/github/stars/tinyplex/tinybase?style=for-the-badge&amp;logo=GitHub&amp;logoColor=%23fff&amp;label=GitHub&amp;labelColor=%23d81b60&amp;color=%23333"> </a><a href="https://bsky.app/profile/tinybase.bsky.social"><img src="https://img.shields.io/badge/Bluesky-Follow-blue?style=for-the-badge&amp;logo=bluesky&amp;logoColor=%23fff&amp;color=%23333&amp;labelColor=%230285FF"> </a><a href="https://x.com/tinybasejs" target="_blank"><img src="https://img.shields.io/badge/%2F%20Twitter-Follow-blue?style=for-the-badge&amp;logo=x&amp;logoColor=%23fff&amp;color=%23333&amp;labelColor=%23000"> </a><a href="https://discord.com/invite/mGz3mevwP8" target="_blank"><img src="https://img.shields.io/discord/1027918215323590676?style=for-the-badge&amp;logo=discord&amp;logoColor=%23fff&amp;label=Discord&amp;labelColor=%233131e8&amp;color=%23333"></a><br><a href="https://github.com/tinyplex/tinybase/discussions" target="_blank"><img src="https://img.shields.io/github/discussions/tinyplex/tinybase?style=for-the-badge&amp;logo=GitHub&amp;logoColor=%23fff&amp;label=Ideas&amp;labelColor=%23d81b60&amp;color=%23333"> </a><a href="https://github.com/tinyplex/tinybase/issues" target="_blank"><img src="https://img.shields.io/github/issues/tinyplex/tinybase?style=for-the-badge&amp;logo=GitHub&amp;logoColor=%23fff&amp;label=Issues&amp;labelColor=%23d81b60&amp;color=%23333"> </a><a href="#well-tested-and-documented"><img src="https://img.shields.io/badge/Tests-100%25-green?style=for-the-badge&amp;logo=Vitest&amp;logoColor=%23fff&amp;color=%23333&amp;labelColor=%2387c305"> </a><a href="https://www.npmjs.com/package/tinybase/v/8.0.0" target="_blank"><img src="https://img.shields.io/npm/v/tinybase?style=for-the-badge&amp;logo=npm&amp;logoColor=%23fff&amp;labelColor=%23bd0005&amp;color=%23333"></a></section><hr><section><h2 id="start-with-a-simple-key-value-store">Start with a simple key-value store.</h2><p>Creating a <a href="https://tinybase.org/api/the-essentials/creating-stores/store/"><code>Store</code></a> requires just a simple call to the <a href="https://tinybase.org/api/the-essentials/creating-stores/createstore/"><code>createStore</code></a> function. Once you have one, you can easily set <a href="https://tinybase.org/api/store/type-aliases/store/values/"><code>Values</code></a> in it by unique <a href="https://tinybase.org/api/common/type-aliases/identity/id/"><code>Id</code></a>. And of course you can easily get them back out again.</p><p>Read more about using keyed value data in <a href="https://tinybase.org/guides/the-basics/">The Basics</a> guide.</p></section>
9
+ <hr><section><h2 id="it-s-reactive">It&#x27;s <em>Reactive</em></h2><p>TinyBase lets you <a href="#register-granular-listeners">listen to changes</a> made to any part of your data. This means your app will be fast, since you only spend rendering cycles on things that change. The optional <a href="#call-hooks-to-bind-to-data">bindings to React</a> and <a href="#pre-built-reactive-components">pre-built components</a> let you easily build fully reactive UIs on top of TinyBase. You even get a built-in <a href="#set-checkpoints-for-an-undo-stack">undo stack</a>, and <a href="#an-inspector-for-your-data">developer tools</a>!</p></section><section><h2 id="it-s-database-like">It&#x27;s <em>Database-Like</em></h2><p>Consumer app? Enterprise app? Or even a game? Model <a href="#start-with-a-simple-key-value-store">key-value data</a> and <a href="#level-up-to-use-tabular-data">tabular data</a> with optional typed <a href="#apply-schemas-to-tables-values">schematization</a>, whatever its data structures. There are built-in <a href="#create-indexes-for-fast-lookups">indexing</a>, <a href="#define-metrics-and-aggregations">metric aggregation</a>, and tabular <a href="#model-table-relationships">relationships</a> APIs - and a powerful <a href="#build-complex-queries-with-tinyql">query engine</a> to select, join, filter, and group data (reactively!) without SQL.</p></section><section><h2 id="it-synchronizes">It <em>Synchronizes</em></h2><p>TinyBase has <a href="#synchronize-between-devices">native CRDT</a> support, meaning that you can deterministically <a href="https://tinybase.org/guides/synchronization/">synchronize</a> and merge data across multiple sources, clients, and servers. And although TinyBase is an in-memory data store, you can easily <a href="#persist-to-storage-databases-more">persist</a> your data to file, <a href="https://tinybase.org/api/persister-browser">browser storage</a>, <a href="https://tinybase.org/api/persister-indexed-db">IndexedDB</a>, <a href="https://tinybase.org/guides/persistence/database-persistence/">SQLite or PostgreSQL databases</a>, and <a href="https://tinybase.org/guides/persistence/third-party-crdt-persistence/">more</a>.</p></section><section><h2 id="it-s-built-for-a-local-first-world">It&#x27;s Built For A <em>Local-First</em> World</h2><p>TinyBase works anywhere that JavaScript does, but it&#x27;s especially great for local-first apps: where data is stored locally on the user&#x27;s device and that can be run offline. It&#x27;s tiny by name, tiny by nature: just <a href="#did-we-say-tiny">6.2kB - 13.2kB</a> and with no dependencies - yet <a href="#well-tested-and-documented">100% tested</a>, <a href="https://tinybase.org/guides/the-basics/getting-started/">fully documented</a>, and of course, <a href="https://github.com/tinyplex/tinybase">open source</a>!</p></section><hr><section id="friends"><h2 id="tinybase-works-great-on-its-own-but-also-plays-well-with-friends">TinyBase works great on its own, but also plays well with friends.</h2><div><a href="https://tinybase.org/guides/building-uis/getting-started-with-ui-react"><img src="https://tinybase.org/react.svg?asImg" width="48"> React</a></div><div><a href="https://tinybase.org/api/persister-indexed-db/functions/creation/createindexeddbpersister"><img src="https://tinybase.org/indexeddb.svg?asImg" width="48"> IndexedDB</a></div><div><a href="https://tinybase.org/api/persister-browser"><img src="https://tinybase.org/browser.svg?asImg" width="48"> OPFS</a></div><div><a href="https://tinybase.org/guides/integrations/cloudflare-durable-objects"><img src="https://tinybase.org/cloudflare.svg?asImg" width="48"> Cloudflare</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img src="https://tinybase.org/postgresql.svg?asImg" width="48"> PostgreSQL</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img src="https://tinybase.org/pglite.svg?asImg" width="48"> PGlite</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img src="https://tinybase.org/sqlite.svg?asImg" width="48"> SQLite</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img src="https://tinybase.org/bun.svg?asImg" width="48"> Bun SQLite</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img src="https://tinybase.org/expo.svg?asImg" width="48"> Expo SQLite</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img src="https://tinybase.org/electric.svg?asImg" width="48"> ElectricSQL</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img src="https://tinybase.org/turso.svg?asImg" width="48"> Turso</a></div><div><a href="https://tinybase.org/guides/schemas-and-persistence/database-persistence"><img src="https://tinybase.org/powersync.svg?asImg" width="48"> PowerSync</a></div><div><a href="https://tinybase.org/api/persister-partykit-client"><img src="https://tinybase.org/partykit.svg?asImg" width="48"> PartyKit</a></div><div><a href="https://tinybase.org/api/persister-yjs/functions/creation/createyjspersister"><img src="https://tinybase.org/yjs.svg?asImg" width="48"> YJS</a></div><div><a href="https://tinybase.org/api/persister-cr-sqlite-wasm"><img src="https://tinybase.org/crsqlite.png" width="48"> CR-SQLite</a></div><div><a href="https://tinybase.org/api/persister-automerge"><img src="https://tinybase.org/automerge.svg?asImg" width="48"> Automerge</a></div><div><a href="https://tinybase.org/api/schematizer-zod/functions/creation/createzodschematizer"><img src="https://tinybase.org/zod.svg?asImg" width="48"> Zod</a></div><div><a href="https://tinybase.org/api/schematizer-typebox/functions/creation/createtypeboxschematizer"><img src="https://tinybase.org/typebox.svg?asImg" width="48"> TypeBox</a></div><div><a href="https://tinybase.org/api/schematizer-valibot/functions/creation/createvalibotschematizer"><img src="https://tinybase.org/valibot.svg?asImg" width="48"> Valibot</a></div><div><a href="https://tinybase.org/api/schematizer-arktype/functions/creation/createarktypeschematizer"><img src="https://tinybase.org/arktype.svg?asImg" width="48"> ArkType</a></div><div><a href="https://tinybase.org/api/schematizer-yup/functions/creation/createyupschematizer"><img src="https://tinybase.org/yup.svg?asImg" width="48"> Yup</a></div><div><a href="https://tinybase.org/api/schematizer-effect/functions/creation/createeffectschematizer"><img src="https://tinybase.org/effect.svg?asImg" width="48"> Effect</a></div><p>(Baffled by all these logos? Check out our <a href="https://tinybase.org/guides/the-basics/architectural-options">architectural options</a> guide to make sense of it all!)</p></section><hr><section id="follow"><a href="https://github.com/tinyplex/tinybase" target="_blank"><img src="https://img.shields.io/github/stars/tinyplex/tinybase?style=for-the-badge&amp;logo=GitHub&amp;logoColor=%23fff&amp;label=GitHub&amp;labelColor=%23d81b60&amp;color=%23333"> </a><a href="https://bsky.app/profile/tinybase.bsky.social"><img src="https://img.shields.io/badge/Bluesky-Follow-blue?style=for-the-badge&amp;logo=bluesky&amp;logoColor=%23fff&amp;color=%23333&amp;labelColor=%230285FF"> </a><a href="https://x.com/tinybasejs" target="_blank"><img src="https://img.shields.io/badge/%2F%20Twitter-Follow-blue?style=for-the-badge&amp;logo=x&amp;logoColor=%23fff&amp;color=%23333&amp;labelColor=%23000"> </a><a href="https://discord.com/invite/mGz3mevwP8" target="_blank"><img src="https://img.shields.io/discord/1027918215323590676?style=for-the-badge&amp;logo=discord&amp;logoColor=%23fff&amp;label=Discord&amp;labelColor=%233131e8&amp;color=%23333"></a><br><a href="https://github.com/tinyplex/tinybase/discussions" target="_blank"><img src="https://img.shields.io/github/discussions/tinyplex/tinybase?style=for-the-badge&amp;logo=GitHub&amp;logoColor=%23fff&amp;label=Ideas&amp;labelColor=%23d81b60&amp;color=%23333"> </a><a href="https://github.com/tinyplex/tinybase/issues" target="_blank"><img src="https://img.shields.io/github/issues/tinyplex/tinybase?style=for-the-badge&amp;logo=GitHub&amp;logoColor=%23fff&amp;label=Issues&amp;labelColor=%23d81b60&amp;color=%23333"> </a><a href="#well-tested-and-documented"><img src="https://img.shields.io/badge/Tests-100%25-green?style=for-the-badge&amp;logo=Vitest&amp;logoColor=%23fff&amp;color=%23333&amp;labelColor=%2387c305"> </a><a href="https://www.npmjs.com/package/tinybase/v/8.0.1" target="_blank"><img src="https://img.shields.io/npm/v/tinybase?style=for-the-badge&amp;logo=npm&amp;logoColor=%23fff&amp;labelColor=%23bd0005&amp;color=%23333"></a></section><hr><section><h2 id="start-with-a-simple-key-value-store">Start with a simple key-value store.</h2><p>Creating a <a href="https://tinybase.org/api/the-essentials/creating-stores/store/"><code>Store</code></a> requires just a simple call to the <a href="https://tinybase.org/api/the-essentials/creating-stores/createstore/"><code>createStore</code></a> function. Once you have one, you can easily set <a href="https://tinybase.org/api/store/type-aliases/store/values/"><code>Values</code></a> in it by unique <a href="https://tinybase.org/api/common/type-aliases/identity/id/"><code>Id</code></a>. And of course you can easily get them back out again.</p><p>Read more about using keyed value data in <a href="https://tinybase.org/guides/the-basics/">The Basics</a> guide.</p></section>
10
10
 
11
11
  ```js
12
12
  import {createStore} from 'tinybase';
@@ -283,4 +283,4 @@ console.log(store.getCell('pets', 'felix', 'sold'));
283
283
  // -> false
284
284
  ```
285
285
 
286
- <section><h2 id="did-we-say-tiny">Did we say tiny?</h2><p>If you use the basic <a href="https://tinybase.org/api/store/"><code>store</code></a> module alone, you&#x27;ll only add a gzipped <em>6.2kB</em> to your app. Incrementally add the other modules as you need more functionality, or get it all for <em>13.2kB</em>.</p><p>The optional <a href="https://tinybase.org/api/ui-react/"><code>ui-react</code></a> module is just <em>5.5kB</em>, the ui-react-dom components are another <em>4.0kB</em>, and everything is super fast. Life is easy when you have zero dependencies!</p><p>Read more about how TinyBase is structured and packaged in the <a href="https://tinybase.org/guides/how-tinybase-is-built/architecture/">Architecture</a> guide.</p></section><div class="table"><table class="fixed"><tbody><tr><th> </th><th>Minified .js.gz</th><th>Source .js</th></tr><tr><th class="right"><a href="https://tinybase.org/api/store/">tinybase/store</a> (minimal)</th><td>6.2kB</td><td>65.4kB</td></tr><tr><th class="right">tinybase (complete)</th><td>13.2kB</td><td>142.7kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/ui-react/">ui-react</a></th><td>5.5kB</td><td>60.0kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/ui-react-dom/">ui-react-dom</a></th><td>4.0kB</td><td>36.5kB</td></tr></tbody></table></div><section><h2 id="well-tested-and-documented">Well tested and documented.</h2><p>TinyBase has <em>100.0%</em> test coverage, including the code throughout the documentation - even on this page! The guides, demos, and API examples are designed to make it as easy as possible for you to get your TinyBase-powered app up and running.</p><p>Read more about how TinyBase is tested in the Unit <a href="https://tinybase.org/guides/how-tinybase-is-built/testing/">Testing</a> guide.</p></section><div class="table"><table class="fixed"><tbody><tr><th width="30%"> </th><th>Total</th><th>Tested</th><th>Coverage</th></tr><tr><th class="right">Lines</th><td>2,614</td><td>2,613</td><td>100.0%</td></tr><tr><th class="right">Statements</th><td>2,840</td><td>2,839</td><td>100.0%</td></tr><tr><th class="right">Functions</th><td>1,157</td><td>1,156</td><td>99.9%</td></tr><tr><th class="right">Branches</th><td>1,008</td><td>1,008</td><td>100.0%</td></tr><tr><th class="right">Tests</th><td colspan="3">7,607</td></tr><tr><th class="right">Assertions</th><td colspan="3">32,746</td></tr></tbody></table></div><hr><section id="sponsors"><h2 id="proud-to-be-supported-by">Proud to be supported by:</h2><a href="https://github.com/fastrepl" target="_blank"><img src="https://github.com/fastrepl.png?size=48" title="fastrepl" width="48" height="48"></a><a href="https://github.com/ComputelessComputer" target="_blank"><img src="https://github.com/ComputelessComputer.png?size=48" title="ComputelessComputer" width="48" height="48"></a><a href="https://github.com/cancelself" target="_blank"><img src="https://github.com/cancelself.png?size=48" title="cancelself" width="48" height="48"></a><a href="https://github.com/expo" target="_blank"><img src="https://github.com/expo.png?size=48" title="expo" width="48" height="48"></a><a href="https://github.com/braden-w" target="_blank"><img src="https://github.com/braden-w.png?size=48" title="braden-w" width="48" height="48"></a><a href="https://github.com/dylmye" target="_blank"><img src="https://github.com/dylmye.png?size=48" title="dylmye" width="48" height="48"></a><a href="https://github.com/gonza224" target="_blank"><img src="https://github.com/gonza224.png?size=48" title="gonza224" width="48" height="48"></a><a href="https://github.com/cpojer" target="_blank"><img src="https://github.com/cpojer.png?size=48" title="cpojer" width="48" height="48"></a><a href="https://github.com/beekeeb" target="_blank"><img src="https://github.com/beekeeb.png?size=48" title="beekeeb" width="48" height="48"></a><a href="https://github.com/WonderPanda" target="_blank"><img src="https://github.com/WonderPanda.png?size=48" title="WonderPanda" width="48" height="48"></a><a href="https://github.com/arpitBhalla" target="_blank"><img src="https://github.com/arpitBhalla.png?size=48" title="arpitBhalla" width="48" height="48"></a></section><section id="users"><h2 id="excited-to-be-used-by">Excited to be used by:</h2><a href="https://github.com/behrends" target="_blank"><img src="https://github.com/behrends.png?size=48" title="behrends" width="48" height="48"></a><a href="https://github.com/betomoedano" target="_blank"><img src="https://github.com/betomoedano.png?size=48" title="betomoedano" width="48" height="48"></a><a href="https://github.com/brentvatne" target="_blank"><img src="https://github.com/brentvatne.png?size=48" title="brentvatne" width="48" height="48"></a><a href="https://github.com/byCedric" target="_blank"><img src="https://github.com/byCedric.png?size=48" title="byCedric" width="48" height="48"></a><a href="https://github.com/circadian-risk" target="_blank"><img src="https://github.com/circadian-risk.png?size=48" title="circadian-risk" width="48" height="48"></a><a href="https://github.com/cpojer" target="_blank"><img src="https://github.com/cpojer.png?size=48" title="cpojer" width="48" height="48"></a><a href="https://github.com/cubecull" target="_blank"><img src="https://github.com/cubecull.png?size=48" title="cubecull" width="48" height="48"></a><a href="https://github.com/erwinkn" target="_blank"><img src="https://github.com/erwinkn.png?size=48" title="erwinkn" width="48" height="48"></a><a href="https://github.com/expo" target="_blank"><img src="https://github.com/expo.png?size=48" title="expo" width="48" height="48"></a><a href="https://github.com/ezra-en" target="_blank"><img src="https://github.com/ezra-en.png?size=48" title="ezra-en" width="48" height="48"></a><a href="https://github.com/feychenie" target="_blank"><img src="https://github.com/feychenie.png?size=48" title="feychenie" width="48" height="48"></a><a href="https://github.com/flaming-codes" target="_blank"><img src="https://github.com/flaming-codes.png?size=48" title="flaming-codes" width="48" height="48"></a><a href="https://github.com/fostertheweb" target="_blank"><img src="https://github.com/fostertheweb.png?size=48" title="fostertheweb" width="48" height="48"></a><a href="https://github.com/Giulio987" target="_blank"><img src="https://github.com/Giulio987.png?size=48" title="Giulio987" width="48" height="48"></a><a href="https://github.com/hi-ogawa" target="_blank"><img src="https://github.com/hi-ogawa.png?size=48" title="hi-ogawa" width="48" height="48"></a><a href="https://github.com/itsdevcoffee" target="_blank"><img src="https://github.com/itsdevcoffee.png?size=48" title="itsdevcoffee" width="48" height="48"></a><a href="https://github.com/jbolda" target="_blank"><img src="https://github.com/jbolda.png?size=48" title="jbolda" width="48" height="48"></a><a href="https://github.com/Kayoo-asso" target="_blank"><img src="https://github.com/Kayoo-asso.png?size=48" title="Kayoo-asso" width="48" height="48"></a><a href="https://github.com/kotofurumiya" target="_blank"><img src="https://github.com/kotofurumiya.png?size=48" title="kotofurumiya" width="48" height="48"></a><a href="https://github.com/Kudo" target="_blank"><img src="https://github.com/Kudo.png?size=48" title="Kudo" width="48" height="48"></a><a href="https://github.com/learn-anything" target="_blank"><img src="https://github.com/learn-anything.png?size=48" title="learn-anything" width="48" height="48"></a><a href="https://github.com/lluc" target="_blank"><img src="https://github.com/lluc.png?size=48" title="lluc" width="48" height="48"></a><a href="https://github.com/marksteve" target="_blank"><img src="https://github.com/marksteve.png?size=48" title="marksteve" width="48" height="48"></a><a href="https://github.com/miking-the-viking" target="_blank"><img src="https://github.com/miking-the-viking.png?size=48" title="miking-the-viking" width="48" height="48"></a><a href="https://github.com/mjamesderocher" target="_blank"><img src="https://github.com/mjamesderocher.png?size=48" title="mjamesderocher" width="48" height="48"></a><a href="https://github.com/mouktardev" target="_blank"><img src="https://github.com/mouktardev.png?size=48" title="mouktardev" width="48" height="48"></a><a href="https://github.com/nickmessing" target="_blank"><img src="https://github.com/nickmessing.png?size=48" title="nickmessing" width="48" height="48"></a><a href="https://github.com/nikitavoloboev" target="_blank"><img src="https://github.com/nikitavoloboev.png?size=48" title="nikitavoloboev" width="48" height="48"></a><a href="https://github.com/nkzw-tech" target="_blank"><img src="https://github.com/nkzw-tech.png?size=48" title="nkzw-tech" width="48" height="48"></a><a href="https://github.com/palerdot" target="_blank"><img src="https://github.com/palerdot.png?size=48" title="palerdot" width="48" height="48"></a><a href="https://github.com/PorcoRosso85" target="_blank"><img src="https://github.com/PorcoRosso85.png?size=48" title="PorcoRosso85" width="48" height="48"></a><a href="https://github.com/primodiumxyz" target="_blank"><img src="https://github.com/primodiumxyz.png?size=48" title="primodiumxyz" width="48" height="48"></a><a href="https://github.com/shaneosullivan" target="_blank"><img src="https://github.com/shaneosullivan.png?size=48" title="shaneosullivan" width="48" height="48"></a><a href="https://github.com/sudo-self" target="_blank"><img src="https://github.com/sudo-self.png?size=48" title="sudo-self" width="48" height="48"></a><a href="https://github.com/SuperSonicHub1" target="_blank"><img src="https://github.com/SuperSonicHub1.png?size=48" title="SuperSonicHub1" width="48" height="48"></a><a href="https://github.com/threepointone" target="_blank"><img src="https://github.com/threepointone.png?size=48" title="threepointone" width="48" height="48"></a><a href="https://github.com/uptonking" target="_blank"><img src="https://github.com/uptonking.png?size=48" title="uptonking" width="48" height="48"></a><a href="https://github.com/ViktorZhurbin" target="_blank"><img src="https://github.com/ViktorZhurbin.png?size=48" title="ViktorZhurbin" width="48" height="48"></a><a href="https://github.com/wilkerlucio" target="_blank"><img src="https://github.com/wilkerlucio.png?size=48" title="wilkerlucio" width="48" height="48"></a><a href="https://github.com/WonderPanda" target="_blank"><img src="https://github.com/WonderPanda.png?size=48" title="WonderPanda" width="48" height="48"></a></section><hr><p><a class="start" href="https://tinybase.org/guides/the-basics/getting-started/">Get started</a></p><p><a href="https://tinybase.org/demos/">Try the demos</a></p><p><a href="https://tinybase.org/api/the-essentials/creating-stores/store/">Read the docs</a></p><hr><section id="family"><h2 id="meet-the-family">Meet the family</h2><p>TinyBase is part of a group of small libraries designed to help make rich client and local-first apps easier to build. Check out the others!</p><p><a href="https://synclets.org" target="_blank"><img src="https://synclets.org/favicon.svg?asImg" width="48"><br><b>Synclets</b></a><br>An open, storage-agnostic, sync engine development kit.</p><p><a href="https://tinywidgets.org" target="_blank"><img src="https://tinywidgets.org/favicon.svg?asImg" width="48"><br><b>TinyWidgets</b></a><br>A collection of tiny, reusable, UI components.</p><p><a href="https://tinytick.org" target="_blank"><img src="https://tinytick.org/favicon.svg?asImg" width="48"><br><b>TinyTick</b></a><br>A tiny but very useful task orchestrator.</p></section><hr><section id="about"><h2 id="about">About</h2><p>Modern apps deserve better. Why trade reactive user experiences to be able to use relational data? Or sacrifice features for bundle size? And why does the cloud do all the work <a href="https://localfirstweb.dev/" target="_blank">anyway</a>?</p><p>Building TinyBase was originally an interesting exercise for <a rel="me" href="https://tripleodeon.com">me</a> in API design, minification, and documentation. But now it has taken on a life of its own, and has grown beyond my wildest expectations.</p><p>It could not have been built without these great <a href="https://tinybase.org/guides/how-tinybase-is-built/credits/#giants">projects</a> and <a href="https://tinybase.org/guides/how-tinybase-is-built/credits/#and-friends">friends</a>, and I hope you enjoy using it as much as I do building it!</p></section><section id="story"><h2 id="the-story">The story</h2><a href="https://youtu.be/hXL7OkW-Prk?t=1232" target="_blank"><img src="https://tinybase.org/youtube.webp"></a></section>
286
+ <section><h2 id="did-we-say-tiny">Did we say tiny?</h2><p>If you use the basic <a href="https://tinybase.org/api/store/"><code>store</code></a> module alone, you&#x27;ll only add a gzipped <em>6.2kB</em> to your app. Incrementally add the other modules as you need more functionality, or get it all for <em>13.2kB</em>.</p><p>The optional <a href="https://tinybase.org/api/ui-react/"><code>ui-react</code></a> module is just <em>5.5kB</em>, the ui-react-dom components are another <em>4.0kB</em>, and everything is super fast. Life is easy when you have zero dependencies!</p><p>Read more about how TinyBase is structured and packaged in the <a href="https://tinybase.org/guides/how-tinybase-is-built/architecture/">Architecture</a> guide.</p></section><div class="table"><table class="fixed"><tbody><tr><th> </th><th>Minified .js.gz</th><th>Source .js</th></tr><tr><th class="right"><a href="https://tinybase.org/api/store/">tinybase/store</a> (minimal)</th><td>6.2kB</td><td>65.4kB</td></tr><tr><th class="right">tinybase (complete)</th><td>13.2kB</td><td>142.7kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/ui-react/">ui-react</a></th><td>5.5kB</td><td>60.0kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/ui-react-dom/">ui-react-dom</a></th><td>4.0kB</td><td>36.5kB</td></tr></tbody></table></div><section><h2 id="well-tested-and-documented">Well tested and documented.</h2><p>TinyBase has <em>100.0%</em> test coverage, including the code throughout the documentation - even on this page! The guides, demos, and API examples are designed to make it as easy as possible for you to get your TinyBase-powered app up and running.</p><p>Read more about how TinyBase is tested in the Unit <a href="https://tinybase.org/guides/how-tinybase-is-built/testing/">Testing</a> guide.</p></section><div class="table"><table class="fixed"><tbody><tr><th width="30%"> </th><th>Total</th><th>Tested</th><th>Coverage</th></tr><tr><th class="right">Lines</th><td>2,614</td><td>2,614</td><td>100.0%</td></tr><tr><th class="right">Statements</th><td>2,840</td><td>2,840</td><td>100.0%</td></tr><tr><th class="right">Functions</th><td>1,157</td><td>1,157</td><td>100.0%</td></tr><tr><th class="right">Branches</th><td>1,008</td><td>1,008</td><td>100.0%</td></tr><tr><th class="right">Tests</th><td colspan="3">7,608</td></tr><tr><th class="right">Assertions</th><td colspan="3">32,747</td></tr></tbody></table></div><hr><section id="sponsors"><h2 id="proud-to-be-supported-by">Proud to be supported by:</h2><a href="https://github.com/fastrepl" target="_blank"><img src="https://github.com/fastrepl.png?size=48" title="fastrepl" width="48" height="48"></a><a href="https://github.com/ComputelessComputer" target="_blank"><img src="https://github.com/ComputelessComputer.png?size=48" title="ComputelessComputer" width="48" height="48"></a><a href="https://github.com/cancelself" target="_blank"><img src="https://github.com/cancelself.png?size=48" title="cancelself" width="48" height="48"></a><a href="https://github.com/expo" target="_blank"><img src="https://github.com/expo.png?size=48" title="expo" width="48" height="48"></a><a href="https://github.com/braden-w" target="_blank"><img src="https://github.com/braden-w.png?size=48" title="braden-w" width="48" height="48"></a><a href="https://github.com/dylmye" target="_blank"><img src="https://github.com/dylmye.png?size=48" title="dylmye" width="48" height="48"></a><a href="https://github.com/gonza224" target="_blank"><img src="https://github.com/gonza224.png?size=48" title="gonza224" width="48" height="48"></a><a href="https://github.com/cpojer" target="_blank"><img src="https://github.com/cpojer.png?size=48" title="cpojer" width="48" height="48"></a><a href="https://github.com/beekeeb" target="_blank"><img src="https://github.com/beekeeb.png?size=48" title="beekeeb" width="48" height="48"></a><a href="https://github.com/WonderPanda" target="_blank"><img src="https://github.com/WonderPanda.png?size=48" title="WonderPanda" width="48" height="48"></a><a href="https://github.com/arpitBhalla" target="_blank"><img src="https://github.com/arpitBhalla.png?size=48" title="arpitBhalla" width="48" height="48"></a></section><section id="users"><h2 id="excited-to-be-used-by">Excited to be used by:</h2><a href="https://github.com/behrends" target="_blank"><img src="https://github.com/behrends.png?size=48" title="behrends" width="48" height="48"></a><a href="https://github.com/betomoedano" target="_blank"><img src="https://github.com/betomoedano.png?size=48" title="betomoedano" width="48" height="48"></a><a href="https://github.com/brentvatne" target="_blank"><img src="https://github.com/brentvatne.png?size=48" title="brentvatne" width="48" height="48"></a><a href="https://github.com/byCedric" target="_blank"><img src="https://github.com/byCedric.png?size=48" title="byCedric" width="48" height="48"></a><a href="https://github.com/circadian-risk" target="_blank"><img src="https://github.com/circadian-risk.png?size=48" title="circadian-risk" width="48" height="48"></a><a href="https://github.com/cpojer" target="_blank"><img src="https://github.com/cpojer.png?size=48" title="cpojer" width="48" height="48"></a><a href="https://github.com/cubecull" target="_blank"><img src="https://github.com/cubecull.png?size=48" title="cubecull" width="48" height="48"></a><a href="https://github.com/erwinkn" target="_blank"><img src="https://github.com/erwinkn.png?size=48" title="erwinkn" width="48" height="48"></a><a href="https://github.com/expo" target="_blank"><img src="https://github.com/expo.png?size=48" title="expo" width="48" height="48"></a><a href="https://github.com/ezra-en" target="_blank"><img src="https://github.com/ezra-en.png?size=48" title="ezra-en" width="48" height="48"></a><a href="https://github.com/feychenie" target="_blank"><img src="https://github.com/feychenie.png?size=48" title="feychenie" width="48" height="48"></a><a href="https://github.com/flaming-codes" target="_blank"><img src="https://github.com/flaming-codes.png?size=48" title="flaming-codes" width="48" height="48"></a><a href="https://github.com/fostertheweb" target="_blank"><img src="https://github.com/fostertheweb.png?size=48" title="fostertheweb" width="48" height="48"></a><a href="https://github.com/Giulio987" target="_blank"><img src="https://github.com/Giulio987.png?size=48" title="Giulio987" width="48" height="48"></a><a href="https://github.com/hi-ogawa" target="_blank"><img src="https://github.com/hi-ogawa.png?size=48" title="hi-ogawa" width="48" height="48"></a><a href="https://github.com/itsdevcoffee" target="_blank"><img src="https://github.com/itsdevcoffee.png?size=48" title="itsdevcoffee" width="48" height="48"></a><a href="https://github.com/jbolda" target="_blank"><img src="https://github.com/jbolda.png?size=48" title="jbolda" width="48" height="48"></a><a href="https://github.com/Kayoo-asso" target="_blank"><img src="https://github.com/Kayoo-asso.png?size=48" title="Kayoo-asso" width="48" height="48"></a><a href="https://github.com/kotofurumiya" target="_blank"><img src="https://github.com/kotofurumiya.png?size=48" title="kotofurumiya" width="48" height="48"></a><a href="https://github.com/Kudo" target="_blank"><img src="https://github.com/Kudo.png?size=48" title="Kudo" width="48" height="48"></a><a href="https://github.com/learn-anything" target="_blank"><img src="https://github.com/learn-anything.png?size=48" title="learn-anything" width="48" height="48"></a><a href="https://github.com/lluc" target="_blank"><img src="https://github.com/lluc.png?size=48" title="lluc" width="48" height="48"></a><a href="https://github.com/marksteve" target="_blank"><img src="https://github.com/marksteve.png?size=48" title="marksteve" width="48" height="48"></a><a href="https://github.com/miking-the-viking" target="_blank"><img src="https://github.com/miking-the-viking.png?size=48" title="miking-the-viking" width="48" height="48"></a><a href="https://github.com/mjamesderocher" target="_blank"><img src="https://github.com/mjamesderocher.png?size=48" title="mjamesderocher" width="48" height="48"></a><a href="https://github.com/mouktardev" target="_blank"><img src="https://github.com/mouktardev.png?size=48" title="mouktardev" width="48" height="48"></a><a href="https://github.com/nickmessing" target="_blank"><img src="https://github.com/nickmessing.png?size=48" title="nickmessing" width="48" height="48"></a><a href="https://github.com/nikitavoloboev" target="_blank"><img src="https://github.com/nikitavoloboev.png?size=48" title="nikitavoloboev" width="48" height="48"></a><a href="https://github.com/nkzw-tech" target="_blank"><img src="https://github.com/nkzw-tech.png?size=48" title="nkzw-tech" width="48" height="48"></a><a href="https://github.com/palerdot" target="_blank"><img src="https://github.com/palerdot.png?size=48" title="palerdot" width="48" height="48"></a><a href="https://github.com/PorcoRosso85" target="_blank"><img src="https://github.com/PorcoRosso85.png?size=48" title="PorcoRosso85" width="48" height="48"></a><a href="https://github.com/primodiumxyz" target="_blank"><img src="https://github.com/primodiumxyz.png?size=48" title="primodiumxyz" width="48" height="48"></a><a href="https://github.com/shaneosullivan" target="_blank"><img src="https://github.com/shaneosullivan.png?size=48" title="shaneosullivan" width="48" height="48"></a><a href="https://github.com/sudo-self" target="_blank"><img src="https://github.com/sudo-self.png?size=48" title="sudo-self" width="48" height="48"></a><a href="https://github.com/SuperSonicHub1" target="_blank"><img src="https://github.com/SuperSonicHub1.png?size=48" title="SuperSonicHub1" width="48" height="48"></a><a href="https://github.com/threepointone" target="_blank"><img src="https://github.com/threepointone.png?size=48" title="threepointone" width="48" height="48"></a><a href="https://github.com/uptonking" target="_blank"><img src="https://github.com/uptonking.png?size=48" title="uptonking" width="48" height="48"></a><a href="https://github.com/ViktorZhurbin" target="_blank"><img src="https://github.com/ViktorZhurbin.png?size=48" title="ViktorZhurbin" width="48" height="48"></a><a href="https://github.com/wilkerlucio" target="_blank"><img src="https://github.com/wilkerlucio.png?size=48" title="wilkerlucio" width="48" height="48"></a><a href="https://github.com/WonderPanda" target="_blank"><img src="https://github.com/WonderPanda.png?size=48" title="WonderPanda" width="48" height="48"></a></section><hr><p><a class="start" href="https://tinybase.org/guides/the-basics/getting-started/">Get started</a></p><p><a href="https://tinybase.org/demos/">Try the demos</a></p><p><a href="https://tinybase.org/api/the-essentials/creating-stores/store/">Read the docs</a></p><hr><section id="family"><h2 id="meet-the-family">Meet the family</h2><p>TinyBase is part of a group of small libraries designed to help make rich client and local-first apps easier to build. Check out the others!</p><p><a href="https://synclets.org" target="_blank"><img src="https://synclets.org/favicon.svg?asImg" width="48"><br><b>Synclets</b></a><br>An open, storage-agnostic, sync engine development kit.</p><p><a href="https://tinywidgets.org" target="_blank"><img src="https://tinywidgets.org/favicon.svg?asImg" width="48"><br><b>TinyWidgets</b></a><br>A collection of tiny, reusable, UI components.</p><p><a href="https://tinytick.org" target="_blank"><img src="https://tinytick.org/favicon.svg?asImg" width="48"><br><b>TinyTick</b></a><br>A tiny but very useful task orchestrator.</p></section><hr><section id="about"><h2 id="about">About</h2><p>Modern apps deserve better. Why trade reactive user experiences to be able to use relational data? Or sacrifice features for bundle size? And why does the cloud do all the work <a href="https://localfirstweb.dev/" target="_blank">anyway</a>?</p><p>Building TinyBase was originally an interesting exercise for <a rel="me" href="https://tripleodeon.com">me</a> in API design, minification, and documentation. But now it has taken on a life of its own, and has grown beyond my wildest expectations.</p><p>It could not have been built without these great <a href="https://tinybase.org/guides/how-tinybase-is-built/credits/#giants">projects</a> and <a href="https://tinybase.org/guides/how-tinybase-is-built/credits/#and-friends">friends</a>, and I hope you enjoy using it as much as I do building it!</p></section><section id="story"><h2 id="the-story">The story</h2><a href="https://youtu.be/hXL7OkW-Prk?t=1232" target="_blank"><img src="https://tinybase.org/youtube.webp"></a></section>
package/store/index.js CHANGED
@@ -112,7 +112,7 @@ const objIsEqual = (
112
112
  isObject(value1)
113
113
  ? /* istanbul ignore next */
114
114
  isObject(obj2[index])
115
- ? objIsEqual(obj2[index], value1)
115
+ ? objIsEqual(obj2[index], value1, isEqual)
116
116
  : false
117
117
  : isEqual(value1, obj2[index]),
118
118
  )
@@ -112,7 +112,7 @@ const objIsEqual = (
112
112
  isObject(value1)
113
113
  ? /* istanbul ignore next */
114
114
  isObject(obj2[index])
115
- ? objIsEqual(obj2[index], value1)
115
+ ? objIsEqual(obj2[index], value1, isEqual)
116
116
  : false
117
117
  : isEqual(value1, obj2[index]),
118
118
  )
package/ui-react/index.js CHANGED
@@ -106,7 +106,7 @@ const objIsEqual = (
106
106
  isObject(value1)
107
107
  ? /* istanbul ignore next */
108
108
  isObject(obj2[index])
109
- ? objIsEqual(obj2[index], value1)
109
+ ? objIsEqual(obj2[index], value1, isEqual)
110
110
  : false
111
111
  : isEqual(value1, obj2[index]),
112
112
  )
@@ -341,8 +341,12 @@ const DEFAULTS = [
341
341
  false,
342
342
  0,
343
343
  ];
344
+ const cellOrValueEqual = (thing1, thing2) =>
345
+ thing1 === thing2 ||
346
+ ((isObject(thing1) || isArray(thing1)) &&
347
+ jsonString(thing1) === jsonString(thing2));
344
348
  const IS_EQUALS = [
345
- objIsEqual,
349
+ (obj1, obj2) => objIsEqual(obj1, obj2, cellOrValueEqual),
346
350
  arrayIsEqual,
347
351
  (
348
352
  [backwardIds1, currentId1, forwardIds1],
@@ -354,10 +358,7 @@ const IS_EQUALS = [
354
358
  (paramValues1, paramValues2) =>
355
359
  objIsEqual(paramValues1, paramValues2, arrayOrValueEqual),
356
360
  arrayOrValueEqual,
357
- (thing1, thing2) =>
358
- thing1 === thing2 ||
359
- ((isObject(thing1) || isArray(thing1)) &&
360
- jsonString(thing1) === jsonString(thing2)),
361
+ cellOrValueEqual,
361
362
  ];
362
363
  const isEqual = (thing1, thing2) => thing1 === thing2;
363
364
  const useCreate = (store, create, createDeps = EMPTY_ARRAY) => {
@@ -106,7 +106,7 @@ const objIsEqual = (
106
106
  isObject(value1)
107
107
  ? /* istanbul ignore next */
108
108
  isObject(obj2[index])
109
- ? objIsEqual(obj2[index], value1)
109
+ ? objIsEqual(obj2[index], value1, isEqual)
110
110
  : false
111
111
  : isEqual(value1, obj2[index]),
112
112
  )
@@ -341,8 +341,12 @@ const DEFAULTS = [
341
341
  false,
342
342
  0,
343
343
  ];
344
+ const cellOrValueEqual = (thing1, thing2) =>
345
+ thing1 === thing2 ||
346
+ ((isObject(thing1) || isArray(thing1)) &&
347
+ jsonString(thing1) === jsonString(thing2));
344
348
  const IS_EQUALS = [
345
- objIsEqual,
349
+ (obj1, obj2) => objIsEqual(obj1, obj2, cellOrValueEqual),
346
350
  arrayIsEqual,
347
351
  (
348
352
  [backwardIds1, currentId1, forwardIds1],
@@ -354,10 +358,7 @@ const IS_EQUALS = [
354
358
  (paramValues1, paramValues2) =>
355
359
  objIsEqual(paramValues1, paramValues2, arrayOrValueEqual),
356
360
  arrayOrValueEqual,
357
- (thing1, thing2) =>
358
- thing1 === thing2 ||
359
- ((isObject(thing1) || isArray(thing1)) &&
360
- jsonString(thing1) === jsonString(thing2)),
361
+ cellOrValueEqual,
361
362
  ];
362
363
  const isEqual = (thing1, thing2) => thing1 === thing2;
363
364
  const useCreate = (store, create, createDeps = EMPTY_ARRAY) => {
@@ -114,7 +114,7 @@ const objIsEqual = (
114
114
  isObject(value1)
115
115
  ? /* istanbul ignore next */
116
116
  isObject(obj2[index])
117
- ? objIsEqual(obj2[index], value1)
117
+ ? objIsEqual(obj2[index], value1, isEqual)
118
118
  : false
119
119
  : isEqual(value1, obj2[index]),
120
120
  )
@@ -186,8 +186,12 @@ const DEFAULTS = [
186
186
  false,
187
187
  0,
188
188
  ];
189
+ const cellOrValueEqual = (thing1, thing2) =>
190
+ thing1 === thing2 ||
191
+ ((isObject(thing1) || isArray(thing1)) &&
192
+ jsonString(thing1) === jsonString(thing2));
189
193
  const IS_EQUALS = [
190
- objIsEqual,
194
+ (obj1, obj2) => objIsEqual(obj1, obj2, cellOrValueEqual),
191
195
  arrayIsEqual,
192
196
  (
193
197
  [backwardIds1, currentId1, forwardIds1],
@@ -199,10 +203,7 @@ const IS_EQUALS = [
199
203
  (paramValues1, paramValues2) =>
200
204
  objIsEqual(paramValues1, paramValues2, arrayOrValueEqual),
201
205
  arrayOrValueEqual,
202
- (thing1, thing2) =>
203
- thing1 === thing2 ||
204
- ((isObject(thing1) || isArray(thing1)) &&
205
- jsonString(thing1) === jsonString(thing2)),
206
+ cellOrValueEqual,
206
207
  ];
207
208
  const isEqual = (thing1, thing2) => thing1 === thing2;
208
209
  const addAndDelListener = (thing, listenable, ...args) => {
@@ -114,7 +114,7 @@ const objIsEqual = (
114
114
  isObject(value1)
115
115
  ? /* istanbul ignore next */
116
116
  isObject(obj2[index])
117
- ? objIsEqual(obj2[index], value1)
117
+ ? objIsEqual(obj2[index], value1, isEqual)
118
118
  : false
119
119
  : isEqual(value1, obj2[index]),
120
120
  )
@@ -186,8 +186,12 @@ const DEFAULTS = [
186
186
  false,
187
187
  0,
188
188
  ];
189
+ const cellOrValueEqual = (thing1, thing2) =>
190
+ thing1 === thing2 ||
191
+ ((isObject(thing1) || isArray(thing1)) &&
192
+ jsonString(thing1) === jsonString(thing2));
189
193
  const IS_EQUALS = [
190
- objIsEqual,
194
+ (obj1, obj2) => objIsEqual(obj1, obj2, cellOrValueEqual),
191
195
  arrayIsEqual,
192
196
  (
193
197
  [backwardIds1, currentId1, forwardIds1],
@@ -199,10 +203,7 @@ const IS_EQUALS = [
199
203
  (paramValues1, paramValues2) =>
200
204
  objIsEqual(paramValues1, paramValues2, arrayOrValueEqual),
201
205
  arrayOrValueEqual,
202
- (thing1, thing2) =>
203
- thing1 === thing2 ||
204
- ((isObject(thing1) || isArray(thing1)) &&
205
- jsonString(thing1) === jsonString(thing2)),
206
+ cellOrValueEqual,
206
207
  ];
207
208
  const isEqual = (thing1, thing2) => thing1 === thing2;
208
209
  const addAndDelListener = (thing, listenable, ...args) => {
@@ -191,7 +191,7 @@ const objIsEqual = (
191
191
  isObject(value1)
192
192
  ? /* istanbul ignore next */
193
193
  isObject(obj2[index])
194
- ? objIsEqual(obj2[index], value1)
194
+ ? objIsEqual(obj2[index], value1, isEqual)
195
195
  : false
196
196
  : isEqual(value1, obj2[index]),
197
197
  )
@@ -2586,8 +2586,12 @@ const DEFAULTS = [
2586
2586
  false,
2587
2587
  0,
2588
2588
  ];
2589
+ const cellOrValueEqual = (thing1, thing2) =>
2590
+ thing1 === thing2 ||
2591
+ ((isObject(thing1) || isArray(thing1)) &&
2592
+ jsonString(thing1) === jsonString(thing2));
2589
2593
  const IS_EQUALS = [
2590
- objIsEqual,
2594
+ (obj1, obj2) => objIsEqual(obj1, obj2, cellOrValueEqual),
2591
2595
  arrayIsEqual,
2592
2596
  (
2593
2597
  [backwardIds1, currentId1, forwardIds1],
@@ -2599,10 +2603,7 @@ const IS_EQUALS = [
2599
2603
  (paramValues1, paramValues2) =>
2600
2604
  objIsEqual(paramValues1, paramValues2, arrayOrValueEqual),
2601
2605
  arrayOrValueEqual,
2602
- (thing1, thing2) =>
2603
- thing1 === thing2 ||
2604
- ((isObject(thing1) || isArray(thing1)) &&
2605
- jsonString(thing1) === jsonString(thing2)),
2606
+ cellOrValueEqual,
2606
2607
  ];
2607
2608
  const isEqual = (thing1, thing2) => thing1 === thing2;
2608
2609
  const addAndDelListener = (thing, listenable, ...args) => {
@@ -4411,7 +4412,7 @@ const TablesView = ({store, storeId, s}) => {
4411
4412
  s,
4412
4413
  children: [
4413
4414
  arrayIsEmpty(tableIds)
4414
- ? /* @__PURE__ */ jsx('caption', {children: 'No tables.'})
4415
+ ? /* @__PURE__ */ jsx('p', {children: 'No tables.'})
4415
4416
  : sortedIdsMap(tableIds, (tableId) =>
4416
4417
  /* @__PURE__ */ jsx(
4417
4418
  TableView,
@@ -4508,7 +4509,7 @@ const ValuesView = ({store, storeId, s}) => {
4508
4509
  s,
4509
4510
  children: [
4510
4511
  arrayIsEmpty(useValueIds$1(store))
4511
- ? /* @__PURE__ */ jsx('caption', {children: 'No values.'})
4512
+ ? /* @__PURE__ */ jsx('p', {children: 'No values.'})
4512
4513
  : /* @__PURE__ */ jsx(ValuesInHtmlTable, {
4513
4514
  store,
4514
4515
  editable,
@@ -4785,10 +4786,10 @@ const MAX_WIDTH = 'max-' + WIDTH;
4785
4786
  const MIN_WIDTH = 'min-' + WIDTH;
4786
4787
  const HEIGHT = 'height';
4787
4788
  const BORDER = 'border';
4788
- const BORDER_RADIUS = BORDER + '-radius';
4789
+ const RADIUS = 'radius';
4790
+ const BORDER_RADIUS = BORDER + '-' + RADIUS;
4789
4791
  const PADDING = 'padding';
4790
4792
  const MARGIN = 'margin';
4791
- const MARGIN_RIGHT = MARGIN + '-right';
4792
4793
  const TOP = 'top';
4793
4794
  const BOTTOM = 'bottom';
4794
4795
  const LEFT = 'left';
@@ -4803,6 +4804,11 @@ const CURSOR = 'cursor';
4803
4804
  const VERTICAL_ALIGN = 'vertical-align';
4804
4805
  const TEXT_ALIGN = 'text-align';
4805
4806
  const JUSTIFY_CONTENT = 'justify-content';
4807
+ const WHITE_SPACE = 'white-space';
4808
+ const TEXT_OVERFLOW = 'text-overflow';
4809
+ const ALIGN_ITEMS = 'align-items';
4810
+ const BACKDROP_FILTER = 'backdrop-filter';
4811
+ const MARGIN_RIGHT = MARGIN + '-' + RIGHT;
4806
4812
  const FIXED = 'fixed';
4807
4813
  const REVERT = 'revert';
4808
4814
  const UNSET = 'unset';
@@ -4932,8 +4938,8 @@ const APP_STYLESHEET = arrayJoin(
4932
4938
  [WIDTH]: 'calc(100% - .5rem)',
4933
4939
  [POSITION]: 'absolute',
4934
4940
  [BORDER + '-' + BOTTOM]: cssVar(BORDER),
4935
- 'align-items': 'center',
4936
- 'backdrop-filter': 'blur(4px)',
4941
+ [ALIGN_ITEMS]: 'center',
4942
+ [BACKDROP_FILTER]: 'blur(4px)',
4937
4943
  },
4938
4944
  'header>img:nth-of-type(1)': {
4939
4945
  [HEIGHT]: rem(1),
@@ -4951,8 +4957,8 @@ const APP_STYLESHEET = arrayJoin(
4951
4957
  [OVERFLOW]: HIDDEN,
4952
4958
  [FLEX]: 1,
4953
4959
  'font-weight': 800,
4954
- 'white-space': NOWRAP,
4955
- 'text-overflow': 'ellipsis',
4960
+ [WHITE_SPACE]: NOWRAP,
4961
+ [TEXT_OVERFLOW]: 'ellipsis',
4956
4962
  },
4957
4963
  // Body
4958
4964
  article: {[OVERFLOW]: AUTO, [FLEX]: 1, [PADDING + '-' + TOP]: rem(2)},
@@ -4970,7 +4976,8 @@ const APP_STYLESHEET = arrayJoin(
4970
4976
  [BORDER_RADIUS]: rem(0.25),
4971
4977
  'user-select': NONE,
4972
4978
  [JUSTIFY_CONTENT]: 'space-between',
4973
- 'align-items': 'center',
4979
+ [ALIGN_ITEMS]: 'center',
4980
+ [BACKDROP_FILTER]: 'blur(4px)',
4974
4981
  },
4975
4982
  'summary>span::before': {
4976
4983
  [DISPLAY]: 'inline-block',
@@ -4981,8 +4988,8 @@ const APP_STYLESHEET = arrayJoin(
4981
4988
  ...RIGHT_SVG,
4982
4989
  },
4983
4990
  'details[open]>summary': {
4984
- 'border-bottom-left-radius': 0,
4985
- 'border-bottom-right-radius': 0,
4991
+ [BORDER + '-' + BOTTOM + '-' + LEFT + '-' + RADIUS]: 0,
4992
+ [BORDER + '-' + BOTTOM + '-' + RIGHT + '-' + RADIUS]: 0,
4986
4993
  [MARGIN + '-' + BOTTOM]: 0,
4987
4994
  },
4988
4995
  'details[open]>summary>span::before': DOWN_SVG,
@@ -4992,11 +4999,12 @@ const APP_STYLESHEET = arrayJoin(
4992
4999
  [MARGIN + '-' + LEFT]: rem(0.25),
4993
5000
  },
4994
5001
  'details>div': {[OVERFLOW]: AUTO},
4995
- caption: {
5002
+ [`caption,#${UNIQUE_ID} p`]: {
4996
5003
  [COLOR]: cssVar('fg2'),
4997
5004
  [PADDING]: rem(0.25, 0.5),
4998
5005
  [TEXT_ALIGN]: LEFT,
4999
- 'white-space': NOWRAP,
5006
+ [MARGIN]: 0,
5007
+ [WHITE_SPACE]: NOWRAP,
5000
5008
  },
5001
5009
  'caption button': {
5002
5010
  [WIDTH]: rem(1.5),
@@ -5026,8 +5034,8 @@ const APP_STYLESHEET = arrayJoin(
5026
5034
  [PADDING]: rem(0.25, 0.5),
5027
5035
  [MAX_WIDTH]: rem(20),
5028
5036
  [BORDER]: cssVar(BORDER),
5029
- 'text-overflow': 'ellipsis',
5030
- 'white-space': NOWRAP,
5037
+ [TEXT_OVERFLOW]: 'ellipsis',
5038
+ [WHITE_SPACE]: NOWRAP,
5031
5039
  'border-width': px(1, 0, 0),
5032
5040
  [TEXT_ALIGN]: LEFT,
5033
5041
  },
@@ -191,7 +191,7 @@ const objIsEqual = (
191
191
  isObject(value1)
192
192
  ? /* istanbul ignore next */
193
193
  isObject(obj2[index])
194
- ? objIsEqual(obj2[index], value1)
194
+ ? objIsEqual(obj2[index], value1, isEqual)
195
195
  : false
196
196
  : isEqual(value1, obj2[index]),
197
197
  )
@@ -2586,8 +2586,12 @@ const DEFAULTS = [
2586
2586
  false,
2587
2587
  0,
2588
2588
  ];
2589
+ const cellOrValueEqual = (thing1, thing2) =>
2590
+ thing1 === thing2 ||
2591
+ ((isObject(thing1) || isArray(thing1)) &&
2592
+ jsonString(thing1) === jsonString(thing2));
2589
2593
  const IS_EQUALS = [
2590
- objIsEqual,
2594
+ (obj1, obj2) => objIsEqual(obj1, obj2, cellOrValueEqual),
2591
2595
  arrayIsEqual,
2592
2596
  (
2593
2597
  [backwardIds1, currentId1, forwardIds1],
@@ -2599,10 +2603,7 @@ const IS_EQUALS = [
2599
2603
  (paramValues1, paramValues2) =>
2600
2604
  objIsEqual(paramValues1, paramValues2, arrayOrValueEqual),
2601
2605
  arrayOrValueEqual,
2602
- (thing1, thing2) =>
2603
- thing1 === thing2 ||
2604
- ((isObject(thing1) || isArray(thing1)) &&
2605
- jsonString(thing1) === jsonString(thing2)),
2606
+ cellOrValueEqual,
2606
2607
  ];
2607
2608
  const isEqual = (thing1, thing2) => thing1 === thing2;
2608
2609
  const addAndDelListener = (thing, listenable, ...args) => {
@@ -4411,7 +4412,7 @@ const TablesView = ({store, storeId, s}) => {
4411
4412
  s,
4412
4413
  children: [
4413
4414
  arrayIsEmpty(tableIds)
4414
- ? /* @__PURE__ */ jsx('caption', {children: 'No tables.'})
4415
+ ? /* @__PURE__ */ jsx('p', {children: 'No tables.'})
4415
4416
  : sortedIdsMap(tableIds, (tableId) =>
4416
4417
  /* @__PURE__ */ jsx(
4417
4418
  TableView,
@@ -4508,7 +4509,7 @@ const ValuesView = ({store, storeId, s}) => {
4508
4509
  s,
4509
4510
  children: [
4510
4511
  arrayIsEmpty(useValueIds$1(store))
4511
- ? /* @__PURE__ */ jsx('caption', {children: 'No values.'})
4512
+ ? /* @__PURE__ */ jsx('p', {children: 'No values.'})
4512
4513
  : /* @__PURE__ */ jsx(ValuesInHtmlTable, {
4513
4514
  store,
4514
4515
  editable,
@@ -4785,10 +4786,10 @@ const MAX_WIDTH = 'max-' + WIDTH;
4785
4786
  const MIN_WIDTH = 'min-' + WIDTH;
4786
4787
  const HEIGHT = 'height';
4787
4788
  const BORDER = 'border';
4788
- const BORDER_RADIUS = BORDER + '-radius';
4789
+ const RADIUS = 'radius';
4790
+ const BORDER_RADIUS = BORDER + '-' + RADIUS;
4789
4791
  const PADDING = 'padding';
4790
4792
  const MARGIN = 'margin';
4791
- const MARGIN_RIGHT = MARGIN + '-right';
4792
4793
  const TOP = 'top';
4793
4794
  const BOTTOM = 'bottom';
4794
4795
  const LEFT = 'left';
@@ -4803,6 +4804,11 @@ const CURSOR = 'cursor';
4803
4804
  const VERTICAL_ALIGN = 'vertical-align';
4804
4805
  const TEXT_ALIGN = 'text-align';
4805
4806
  const JUSTIFY_CONTENT = 'justify-content';
4807
+ const WHITE_SPACE = 'white-space';
4808
+ const TEXT_OVERFLOW = 'text-overflow';
4809
+ const ALIGN_ITEMS = 'align-items';
4810
+ const BACKDROP_FILTER = 'backdrop-filter';
4811
+ const MARGIN_RIGHT = MARGIN + '-' + RIGHT;
4806
4812
  const FIXED = 'fixed';
4807
4813
  const REVERT = 'revert';
4808
4814
  const UNSET = 'unset';
@@ -4932,8 +4938,8 @@ const APP_STYLESHEET = arrayJoin(
4932
4938
  [WIDTH]: 'calc(100% - .5rem)',
4933
4939
  [POSITION]: 'absolute',
4934
4940
  [BORDER + '-' + BOTTOM]: cssVar(BORDER),
4935
- 'align-items': 'center',
4936
- 'backdrop-filter': 'blur(4px)',
4941
+ [ALIGN_ITEMS]: 'center',
4942
+ [BACKDROP_FILTER]: 'blur(4px)',
4937
4943
  },
4938
4944
  'header>img:nth-of-type(1)': {
4939
4945
  [HEIGHT]: rem(1),
@@ -4951,8 +4957,8 @@ const APP_STYLESHEET = arrayJoin(
4951
4957
  [OVERFLOW]: HIDDEN,
4952
4958
  [FLEX]: 1,
4953
4959
  'font-weight': 800,
4954
- 'white-space': NOWRAP,
4955
- 'text-overflow': 'ellipsis',
4960
+ [WHITE_SPACE]: NOWRAP,
4961
+ [TEXT_OVERFLOW]: 'ellipsis',
4956
4962
  },
4957
4963
  // Body
4958
4964
  article: {[OVERFLOW]: AUTO, [FLEX]: 1, [PADDING + '-' + TOP]: rem(2)},
@@ -4970,7 +4976,8 @@ const APP_STYLESHEET = arrayJoin(
4970
4976
  [BORDER_RADIUS]: rem(0.25),
4971
4977
  'user-select': NONE,
4972
4978
  [JUSTIFY_CONTENT]: 'space-between',
4973
- 'align-items': 'center',
4979
+ [ALIGN_ITEMS]: 'center',
4980
+ [BACKDROP_FILTER]: 'blur(4px)',
4974
4981
  },
4975
4982
  'summary>span::before': {
4976
4983
  [DISPLAY]: 'inline-block',
@@ -4981,8 +4988,8 @@ const APP_STYLESHEET = arrayJoin(
4981
4988
  ...RIGHT_SVG,
4982
4989
  },
4983
4990
  'details[open]>summary': {
4984
- 'border-bottom-left-radius': 0,
4985
- 'border-bottom-right-radius': 0,
4991
+ [BORDER + '-' + BOTTOM + '-' + LEFT + '-' + RADIUS]: 0,
4992
+ [BORDER + '-' + BOTTOM + '-' + RIGHT + '-' + RADIUS]: 0,
4986
4993
  [MARGIN + '-' + BOTTOM]: 0,
4987
4994
  },
4988
4995
  'details[open]>summary>span::before': DOWN_SVG,
@@ -4992,11 +4999,12 @@ const APP_STYLESHEET = arrayJoin(
4992
4999
  [MARGIN + '-' + LEFT]: rem(0.25),
4993
5000
  },
4994
5001
  'details>div': {[OVERFLOW]: AUTO},
4995
- caption: {
5002
+ [`caption,#${UNIQUE_ID} p`]: {
4996
5003
  [COLOR]: cssVar('fg2'),
4997
5004
  [PADDING]: rem(0.25, 0.5),
4998
5005
  [TEXT_ALIGN]: LEFT,
4999
- 'white-space': NOWRAP,
5006
+ [MARGIN]: 0,
5007
+ [WHITE_SPACE]: NOWRAP,
5000
5008
  },
5001
5009
  'caption button': {
5002
5010
  [WIDTH]: rem(1.5),
@@ -5026,8 +5034,8 @@ const APP_STYLESHEET = arrayJoin(
5026
5034
  [PADDING]: rem(0.25, 0.5),
5027
5035
  [MAX_WIDTH]: rem(20),
5028
5036
  [BORDER]: cssVar(BORDER),
5029
- 'text-overflow': 'ellipsis',
5030
- 'white-space': NOWRAP,
5037
+ [TEXT_OVERFLOW]: 'ellipsis',
5038
+ [WHITE_SPACE]: NOWRAP,
5031
5039
  'border-width': px(1, 0, 0),
5032
5040
  [TEXT_ALIGN]: LEFT,
5033
5041
  },
@@ -163,7 +163,7 @@ const objIsEqual = (
163
163
  isObject(value1)
164
164
  ? /* istanbul ignore next */
165
165
  isObject(obj2[index])
166
- ? objIsEqual(obj2[index], value1)
166
+ ? objIsEqual(obj2[index], value1, isEqual)
167
167
  : false
168
168
  : isEqual(value1, obj2[index]),
169
169
  )