tinybase 6.2.1 → 6.3.1

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 (204) hide show
  1. package/@types/mergeable-store/index.d.ts +1 -0
  2. package/@types/mergeable-store/with-schemas/index.d.ts +1 -0
  3. package/@types/omni/index.d.ts +1 -0
  4. package/@types/omni/with-schemas/index.d.ts +1 -0
  5. package/@types/persisters/index.d.ts +5 -2
  6. package/@types/persisters/persister-browser/index.d.ts +2 -0
  7. package/@types/persisters/persister-browser/with-schemas/index.d.ts +2 -0
  8. package/@types/persisters/persister-durable-object-sql-storage/index.d.ts +349 -0
  9. package/@types/persisters/persister-durable-object-sql-storage/with-schemas/index.d.ts +382 -0
  10. package/@types/persisters/persister-pglite/index.d.ts +1 -0
  11. package/@types/persisters/persister-pglite/with-schemas/index.d.ts +1 -0
  12. package/@types/persisters/persister-sqlite-wasm/index.d.ts +1 -0
  13. package/@types/persisters/persister-sqlite-wasm/with-schemas/index.d.ts +1 -0
  14. package/@types/persisters/with-schemas/index.d.ts +5 -2
  15. package/@types/queries/index.d.ts +1 -1
  16. package/@types/queries/with-schemas/index.d.ts +1 -1
  17. package/@types/store/index.d.ts +13 -0
  18. package/@types/store/with-schemas/index.d.ts +13 -0
  19. package/@types/synchronizers/index.d.ts +1 -0
  20. package/@types/synchronizers/synchronizer-ws-client/index.d.ts +1 -0
  21. package/@types/synchronizers/synchronizer-ws-client/with-schemas/index.d.ts +1 -0
  22. package/@types/synchronizers/synchronizer-ws-server-durable-object/index.d.ts +1 -0
  23. package/@types/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.d.ts +1 -0
  24. package/@types/synchronizers/with-schemas/index.d.ts +1 -0
  25. package/@types/ui-react/index.d.ts +5 -0
  26. package/@types/ui-react/with-schemas/index.d.ts +5 -0
  27. package/@types/ui-react-inspector/index.d.ts +1 -0
  28. package/@types/ui-react-inspector/with-schemas/index.d.ts +1 -0
  29. package/LICENSE +1 -1
  30. package/min/checkpoints/index.js +1 -1
  31. package/min/checkpoints/index.js.gz +0 -0
  32. package/min/checkpoints/with-schemas/index.js +1 -1
  33. package/min/checkpoints/with-schemas/index.js.gz +0 -0
  34. package/min/common/index.js +1 -1
  35. package/min/common/index.js.gz +0 -0
  36. package/min/common/with-schemas/index.js +1 -1
  37. package/min/common/with-schemas/index.js.gz +0 -0
  38. package/min/index.js +1 -1
  39. package/min/index.js.gz +0 -0
  40. package/min/indexes/index.js +1 -1
  41. package/min/indexes/index.js.gz +0 -0
  42. package/min/indexes/with-schemas/index.js +1 -1
  43. package/min/indexes/with-schemas/index.js.gz +0 -0
  44. package/min/mergeable-store/index.js +1 -1
  45. package/min/mergeable-store/index.js.gz +0 -0
  46. package/min/mergeable-store/with-schemas/index.js +1 -1
  47. package/min/mergeable-store/with-schemas/index.js.gz +0 -0
  48. package/min/metrics/index.js +1 -1
  49. package/min/metrics/index.js.gz +0 -0
  50. package/min/metrics/with-schemas/index.js +1 -1
  51. package/min/metrics/with-schemas/index.js.gz +0 -0
  52. package/min/omni/index.js +1 -1
  53. package/min/omni/index.js.gz +0 -0
  54. package/min/omni/with-schemas/index.js +1 -1
  55. package/min/omni/with-schemas/index.js.gz +0 -0
  56. package/min/persisters/index.js +1 -1
  57. package/min/persisters/index.js.gz +0 -0
  58. package/min/persisters/persister-automerge/index.js +1 -1
  59. package/min/persisters/persister-automerge/index.js.gz +0 -0
  60. package/min/persisters/persister-automerge/with-schemas/index.js +1 -1
  61. package/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
  62. package/min/persisters/persister-browser/index.js +1 -1
  63. package/min/persisters/persister-browser/index.js.gz +0 -0
  64. package/min/persisters/persister-browser/with-schemas/index.js +1 -1
  65. package/min/persisters/persister-browser/with-schemas/index.js.gz +0 -0
  66. package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
  67. package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
  68. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
  69. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
  70. package/min/persisters/persister-durable-object-sql-storage/index.js +1 -0
  71. package/min/persisters/persister-durable-object-sql-storage/index.js.gz +0 -0
  72. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js +1 -0
  73. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js.gz +0 -0
  74. package/min/persisters/persister-durable-object-storage/index.js +1 -1
  75. package/min/persisters/persister-durable-object-storage/index.js.gz +0 -0
  76. package/min/persisters/persister-durable-object-storage/with-schemas/index.js +1 -1
  77. package/min/persisters/persister-durable-object-storage/with-schemas/index.js.gz +0 -0
  78. package/min/persisters/persister-electric-sql/index.js +1 -1
  79. package/min/persisters/persister-electric-sql/index.js.gz +0 -0
  80. package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
  81. package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
  82. package/min/persisters/persister-expo-sqlite/index.js +1 -1
  83. package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
  84. package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
  85. package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
  86. package/min/persisters/persister-file/index.js +1 -1
  87. package/min/persisters/persister-file/index.js.gz +0 -0
  88. package/min/persisters/persister-file/with-schemas/index.js +1 -1
  89. package/min/persisters/persister-file/with-schemas/index.js.gz +0 -0
  90. package/min/persisters/persister-indexed-db/index.js +1 -1
  91. package/min/persisters/persister-indexed-db/index.js.gz +0 -0
  92. package/min/persisters/persister-indexed-db/with-schemas/index.js +1 -1
  93. package/min/persisters/persister-indexed-db/with-schemas/index.js.gz +0 -0
  94. package/min/persisters/persister-libsql/index.js +1 -1
  95. package/min/persisters/persister-libsql/index.js.gz +0 -0
  96. package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
  97. package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
  98. package/min/persisters/persister-partykit-client/index.js +1 -1
  99. package/min/persisters/persister-partykit-client/index.js.gz +0 -0
  100. package/min/persisters/persister-partykit-client/with-schemas/index.js +1 -1
  101. package/min/persisters/persister-partykit-client/with-schemas/index.js.gz +0 -0
  102. package/min/persisters/persister-partykit-server/index.js +1 -1
  103. package/min/persisters/persister-partykit-server/index.js.gz +0 -0
  104. package/min/persisters/persister-partykit-server/with-schemas/index.js +1 -1
  105. package/min/persisters/persister-partykit-server/with-schemas/index.js.gz +0 -0
  106. package/min/persisters/persister-pglite/index.js +1 -1
  107. package/min/persisters/persister-pglite/index.js.gz +0 -0
  108. package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
  109. package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
  110. package/min/persisters/persister-postgres/index.js +1 -1
  111. package/min/persisters/persister-postgres/index.js.gz +0 -0
  112. package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
  113. package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
  114. package/min/persisters/persister-powersync/index.js +1 -1
  115. package/min/persisters/persister-powersync/index.js.gz +0 -0
  116. package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
  117. package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
  118. package/min/persisters/persister-remote/index.js +1 -1
  119. package/min/persisters/persister-remote/index.js.gz +0 -0
  120. package/min/persisters/persister-remote/with-schemas/index.js +1 -1
  121. package/min/persisters/persister-remote/with-schemas/index.js.gz +0 -0
  122. package/min/persisters/persister-sqlite-bun/index.js +1 -1
  123. package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
  124. package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -1
  125. package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
  126. package/min/persisters/persister-sqlite-wasm/index.js +1 -1
  127. package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
  128. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
  129. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
  130. package/min/persisters/persister-sqlite3/index.js +1 -1
  131. package/min/persisters/persister-sqlite3/index.js.gz +0 -0
  132. package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
  133. package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
  134. package/min/persisters/persister-yjs/index.js +1 -1
  135. package/min/persisters/persister-yjs/index.js.gz +0 -0
  136. package/min/persisters/persister-yjs/with-schemas/index.js +1 -1
  137. package/min/persisters/persister-yjs/with-schemas/index.js.gz +0 -0
  138. package/min/persisters/with-schemas/index.js +1 -1
  139. package/min/persisters/with-schemas/index.js.gz +0 -0
  140. package/min/queries/index.js +1 -1
  141. package/min/queries/index.js.gz +0 -0
  142. package/min/queries/with-schemas/index.js +1 -1
  143. package/min/queries/with-schemas/index.js.gz +0 -0
  144. package/min/relationships/index.js +1 -1
  145. package/min/relationships/index.js.gz +0 -0
  146. package/min/relationships/with-schemas/index.js +1 -1
  147. package/min/relationships/with-schemas/index.js.gz +0 -0
  148. package/min/store/index.js +1 -1
  149. package/min/store/index.js.gz +0 -0
  150. package/min/store/with-schemas/index.js +1 -1
  151. package/min/store/with-schemas/index.js.gz +0 -0
  152. package/min/synchronizers/index.js +1 -1
  153. package/min/synchronizers/index.js.gz +0 -0
  154. package/min/synchronizers/synchronizer-broadcast-channel/index.js +1 -1
  155. package/min/synchronizers/synchronizer-broadcast-channel/index.js.gz +0 -0
  156. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +1 -1
  157. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js.gz +0 -0
  158. package/min/synchronizers/synchronizer-local/index.js +1 -1
  159. package/min/synchronizers/synchronizer-local/index.js.gz +0 -0
  160. package/min/synchronizers/synchronizer-local/with-schemas/index.js +1 -1
  161. package/min/synchronizers/synchronizer-local/with-schemas/index.js.gz +0 -0
  162. package/min/synchronizers/synchronizer-ws-client/index.js +1 -1
  163. package/min/synchronizers/synchronizer-ws-client/index.js.gz +0 -0
  164. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js +1 -1
  165. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js.gz +0 -0
  166. package/min/synchronizers/synchronizer-ws-server/index.js +1 -1
  167. package/min/synchronizers/synchronizer-ws-server/index.js.gz +0 -0
  168. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js +1 -1
  169. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js.gz +0 -0
  170. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js +1 -1
  171. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js.gz +0 -0
  172. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +1 -1
  173. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js.gz +0 -0
  174. package/min/synchronizers/synchronizer-ws-server-simple/index.js +1 -1
  175. package/min/synchronizers/synchronizer-ws-server-simple/index.js.gz +0 -0
  176. package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +1 -1
  177. package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js.gz +0 -0
  178. package/min/synchronizers/with-schemas/index.js +1 -1
  179. package/min/synchronizers/with-schemas/index.js.gz +0 -0
  180. package/min/ui-react/index.js +1 -1
  181. package/min/ui-react/index.js.gz +0 -0
  182. package/min/ui-react/with-schemas/index.js +1 -1
  183. package/min/ui-react/with-schemas/index.js.gz +0 -0
  184. package/min/ui-react-dom/index.js +1 -1
  185. package/min/ui-react-dom/index.js.gz +0 -0
  186. package/min/ui-react-dom/with-schemas/index.js +1 -1
  187. package/min/ui-react-dom/with-schemas/index.js.gz +0 -0
  188. package/min/ui-react-inspector/index.js +1 -1
  189. package/min/ui-react-inspector/index.js.gz +0 -0
  190. package/min/ui-react-inspector/with-schemas/index.js +1 -1
  191. package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
  192. package/min/with-schemas/index.js +1 -1
  193. package/min/with-schemas/index.js.gz +0 -0
  194. package/omni/index.js +4 -1
  195. package/omni/with-schemas/index.js +4 -1
  196. package/package.json +44 -8
  197. package/persisters/persister-browser/index.js +4 -1
  198. package/persisters/persister-browser/with-schemas/index.js +4 -1
  199. package/persisters/persister-durable-object-sql-storage/index.js +1391 -0
  200. package/persisters/persister-durable-object-sql-storage/with-schemas/index.js +1391 -0
  201. package/readme.md +8 -8
  202. package/releases.md +50 -25
  203. package/ui-react-inspector/index.js +4 -1
  204. package/ui-react-inspector/with-schemas/index.js +4 -1
@@ -0,0 +1,382 @@
1
+ /**
2
+ * The persister-durable-object-sql-storage module of the TinyBase project lets
3
+ * you save and load Store data to and from Cloudflare Durable Object SQLite
4
+ * storage (in an appropriate environment).
5
+ *
6
+ * Cloudflare's SQLite storage backend for Durable Objects offers significantly
7
+ * better pricing compared to the key-value storage backend. The SQLite storage
8
+ * backend is Cloudflare's recommended storage option for new Durable Object
9
+ * namespaces.
10
+ *
11
+ * **Important:** Before using this persister, you must configure your Durable
12
+ * Object class to use SQLite storage by adding a migration to your
13
+ * `wrangler.toml` or `wrangler.json` configuration file. Use
14
+ * `new_sqlite_classes` in your migration configuration to enable SQLite storage
15
+ * for your Durable Object class.
16
+ *
17
+ * See [Cloudflare's
18
+ * documentation](https://developers.cloudflare.com/durable-objects/reference/durable-objects-migrations/)
19
+ * for more details.
20
+ * @see Cloudflare Durable Objects guide
21
+ * @see Persistence guides
22
+ * @packageDocumentation
23
+ * @module persister-durable-object-sql-storage
24
+ * @since v6.3.0
25
+ */
26
+ import type {MergeableStore} from '../../../mergeable-store/with-schemas/index.d.ts';
27
+ import type {
28
+ OptionalSchemas,
29
+ Store,
30
+ } from '../../../store/with-schemas/index.d.ts';
31
+ import type {
32
+ DatabasePersisterConfig,
33
+ Persister,
34
+ Persists,
35
+ } from '../../with-schemas/index.d.ts';
36
+
37
+ /**
38
+ * The DpcFragmented type represents the configuration for fragmented
39
+ * persistence mode in a DurableObjectSqlStoragePersister.
40
+ *
41
+ * This mode stores each table, row, cell, and value as separate database rows,
42
+ * avoiding Cloudflare's 2MB row limit that can be hit with large stores in JSON
43
+ * mode. While this creates more database writes, it provides better scalability
44
+ * for larger datasets.
45
+ * @example
46
+ * This example shows how to configure a DurableObjectSqlStoragePersister to use
47
+ * fragmented mode with a custom storage prefix.
48
+ *
49
+ * ```js yolo
50
+ * import {createMergeableStore} from 'tinybase';
51
+ * import {createDurableObjectSqlStoragePersister} from 'tinybase/persisters/persister-durable-object-sql-storage';
52
+ * import {WsServerDurableObject} from 'tinybase/synchronizers/synchronizer-ws-server-durable-object';
53
+ *
54
+ * const config = {
55
+ * mode: 'fragmented',
56
+ * storagePrefix: 'my_app_',
57
+ * };
58
+ *
59
+ * export class MyDurableObject extends WsServerDurableObject {
60
+ * createPersister() {
61
+ * const store = createMergeableStore();
62
+ * const persister = createDurableObjectSqlStoragePersister(
63
+ * store,
64
+ * this.ctx.storage.sql,
65
+ * config,
66
+ * );
67
+ * return persister;
68
+ * }
69
+ * }
70
+ * ```
71
+ * @category Configuration
72
+ * @since v6.3.0
73
+ */
74
+ export type DpcFragmented = {
75
+ /**
76
+ * The mode property must be set to 'fragmented' to enable fragmented
77
+ * persistence mode.
78
+ * @category Configuration
79
+ * @since v6.3.0
80
+ */
81
+ mode: 'fragmented';
82
+ /**
83
+ * The storagePrefix property lets you specify an optional prefix for the
84
+ * database table names used in fragmented mode.
85
+ *
86
+ * This is useful when you have multiple stores or applications sharing the
87
+ * same Durable Object SQL storage and want to avoid table name conflicts.
88
+ *
89
+ * The prefix will be sanitized to only include alphanumeric characters and
90
+ * underscores. For example, a prefix of 'my-app!' becomes 'my_app_'.
91
+ * @example
92
+ * This example shows a configuration using the storagePrefix setting. With a
93
+ * `storagePrefix` of 'user_data_', it creates `user_data_tinybase_tables` and
94
+ * `user_data_tinybase_values` tables.
95
+ * ```json
96
+ * {
97
+ * mode: 'fragmented',
98
+ * storagePrefix: 'user_data_',
99
+ * };
100
+ * ```
101
+ * @category Configuration
102
+ * @since v6.3.0
103
+ */
104
+ storagePrefix?: string;
105
+ };
106
+
107
+ /**
108
+ * The DurableObjectSqlDatabasePersisterConfig type represents the union of all
109
+ * possible configuration types for a DurableObjectSqlStoragePersister.
110
+ *
111
+ * This has schema-based typing. The following is a simplified representation:
112
+ *
113
+ * ```ts override
114
+ * DpcJson | DpcFragmented;
115
+ * ```
116
+ *
117
+ * This allows the persister to support multiple persistence modes.
118
+ * - JSON mode (via DpcJson): Stores the entire Store as JSON in a single row.
119
+ * - Fragmented mode (via DpcFragmented): Stores each piece of data as separate
120
+ * rows.
121
+ * @example
122
+ * These examples show some different configuration options.
123
+ * ```json
124
+ * // JSON mode (default)
125
+ * {
126
+ * mode: 'json',
127
+ * storeTableName: 'my_store',
128
+ * };
129
+ *
130
+ * // Fragmented mode
131
+ * {
132
+ * mode: 'fragmented',
133
+ * storagePrefix: 'app_',
134
+ * };
135
+ * ```
136
+ * @category Configuration
137
+ * @since v6.3.0
138
+ */
139
+ export type DurableObjectSqlDatabasePersisterConfig<
140
+ Schemas extends OptionalSchemas,
141
+ > = DatabasePersisterConfig<Schemas> | DpcFragmented;
142
+
143
+ /**
144
+ * The DurableObjectSqlStoragePersister interface represents a Persister that
145
+ * lets you save and load Store data to and from Cloudflare Durable Object SQL
146
+ * storage.
147
+ *
148
+ * You should use the createDurableObjectSqlStoragePersister function to create
149
+ * a DurableObjectSqlStoragePersister object, most likely within the
150
+ * createPersister method of a WsServerDurableObject.
151
+ *
152
+ * It is a minor extension to the Persister interface and simply provides an
153
+ * extra getSqlStorage method for accessing a reference to the SQL storage that
154
+ * the Store is being persisted to.
155
+ * @category Persister
156
+ * @since v6.3.0
157
+ */
158
+ export interface DurableObjectSqlStoragePersister<
159
+ Schemas extends OptionalSchemas,
160
+ > extends Persister<Schemas, Persists.MergeableStoreOnly> {
161
+ /**
162
+ * The getSqlStorage method returns a reference to the SQL storage that the
163
+ * Store is being persisted to.
164
+ * @returns The reference to the SQL storage.
165
+ * @example
166
+ * This example creates a Persister object against a newly-created Store
167
+ * (within the createPersister method of a WsServerDurableObject instance) and
168
+ * then gets the SQL storage reference back out again.
169
+ *
170
+ * ```js yolo
171
+ * import {createMergeableStore} from 'tinybase';
172
+ * import {createDurableObjectSqlStoragePersister} from 'tinybase/persisters/persister-durable-object-sql-storage';
173
+ * import {WsServerDurableObject} from 'tinybase/synchronizers/synchronizer-ws-server-durable-object';
174
+ *
175
+ * export class MyDurableObject extends WsServerDurableObject {
176
+ * createPersister() {
177
+ * const store = createMergeableStore();
178
+ * const persister = createDurableObjectSqlStoragePersister(
179
+ * store,
180
+ * this.ctx.storage.sql,
181
+ * );
182
+ * console.log(persister.getSqlStorage() == this.ctx.storage.sql);
183
+ * // -> true
184
+ *
185
+ * return persister;
186
+ * }
187
+ * }
188
+ * ```
189
+ * @category Getter
190
+ * @since v6.3.0
191
+ */
192
+ getSqlStorage(): SqlStorage;
193
+ }
194
+
195
+ /**
196
+ * The createDurableObjectSqlStoragePersister function creates a
197
+ * DurableObjectSqlStoragePersister object that can persist the Store to and
198
+ * from Cloudflare Durable Object SQLite storage.
199
+ *
200
+ * This has schema-based typing. The following is a simplified representation:
201
+ *
202
+ * ```ts override
203
+ * createDurableObjectSqlStoragePersister(
204
+ * store: MergeableStore,
205
+ * sqlStorage: SqlStorage,
206
+ * configOrStoreTableName?: DurableObjectSqlDatabasePersisterConfig | string,
207
+ * onSqlCommand?: (sql: string, params?: any[]) => void,
208
+ * onIgnoredError?: (error: any) => void,
209
+ * ): DurableObjectSqlStoragePersister;
210
+ * ```
211
+ *
212
+ * You will mostly use this within the createPersister method of a
213
+ * WsServerDurableObject.
214
+ *
215
+ * This persister uses Cloudflare's SQLite storage backend, which provides
216
+ * better pricing and performance compared to the legacy Key-value storage
217
+ * backend.
218
+ *
219
+ * **Important Prerequisites:** Before using this persister, you must configure
220
+ * your Durable Object class to use SQLite storage by adding a migration to your
221
+ * Wrangler configuration file. In your `wrangler.toml`, add the following.
222
+ * ```toml
223
+ * [[migrations]]
224
+ * tag = "v1"
225
+ * new_sqlite_classes = ["YourDurableObjectClass"]
226
+ * ```
227
+ *
228
+ * Or in your `wrangler.json`, add:
229
+ *
230
+ * ```json
231
+ * {
232
+ * "migrations": [
233
+ * {
234
+ * "tag": "v1",
235
+ * "new_sqlite_classes": ["YourDurableObjectClass"]
236
+ * }
237
+ * ]
238
+ * }
239
+ * ```
240
+ *
241
+ * For more details on Durable Object migrations, see the [Cloudflare
242
+ * documentation](https://developers.cloudflare.com/durable-objects/reference/durable-objects-migrations/).
243
+ *
244
+ * A database Persister uses one of two modes: either a JSON serialization of
245
+ * the whole Store stored in a single row of a table (the default), a fragmented
246
+ * mode that stores each piece of data separately to avoid Cloudflare's 2MB row
247
+ * limit.
248
+ *
249
+ * - **JSON Mode (Default)**: Stores the entire Store as JSON in a single
250
+ * database row. This is efficient for smaller stores but may hit Cloudflare's
251
+ * 2MB row limit for very large stores and uses fewer database writes.
252
+ *
253
+ * - **Fragmented Mode**: Stores each table, row, cell, and value as separate
254
+ * database rows. Use this mode if you're concerned about hitting Cloudflare's
255
+ * 2MB row limit with large stores in JSON mode. This mode creates more
256
+ * database writes but avoids row size limitations.
257
+ *
258
+ * The third argument is a DatabasePersisterConfig object that configures which
259
+ * of those modes to use, and settings for each. If the third argument is simply
260
+ * a string, it is used as the `storeTableName` property of the JSON
261
+ * serialization. If it is the string 'fragmented', it enables fragmented mode.
262
+ *
263
+ * See the documentation for the DpcJson, DpcFragmented, and DpcTabular types
264
+ * for more information on how all of those modes can be configured.
265
+ *
266
+ * As well as providing a reference to the Store or MergeableStore to persist,
267
+ * you must provide a `sqlStorage` parameter which identifies the Durable Object
268
+ * SQLite storage to persist it to.
269
+ * @param store The Store or MergeableStore to persist.
270
+ * @param sqlStorage The Durable Object SQL storage to persist the Store to.
271
+ * @param configOrStoreTableName A DatabasePersisterConfig to configure the
272
+ * persistence mode (or a string to set the `storeTableName` property of the
273
+ * JSON serialization).
274
+ * @param onSqlCommand An optional handler called every time the Persister
275
+ * executes a SQL command or query. This is suitable for logging persistence
276
+ * behavior in a development environment.
277
+ * @param onIgnoredError An optional handler for the errors that the Persister
278
+ * would otherwise ignore when trying to save or load data. This is suitable for
279
+ * debugging persistence issues in a development environment.
280
+ * @returns A reference to the new DurableObjectSqlStoragePersister object.
281
+ * @example
282
+ * This example creates a DurableObjectSqlStoragePersister object and persists
283
+ * the Store to Durable Object SQLite storage as a JSON serialization into the
284
+ * default `tinybase` table. It uses this within the createPersister method of a
285
+ * WsServerDurableObject instance.
286
+ *
287
+ * ```js yolo
288
+ * import {createMergeableStore} from 'tinybase';
289
+ * import {createDurableObjectSqlStoragePersister} from 'tinybase/persisters/persister-durable-object-sql-storage';
290
+ * import {WsServerDurableObject} from 'tinybase/synchronizers/synchronizer-ws-server-durable-object';
291
+ *
292
+ * export class MyDurableObject extends WsServerDurableObject {
293
+ * createPersister() {
294
+ * const store = createMergeableStore();
295
+ * const persister = createDurableObjectSqlStoragePersister(
296
+ * store,
297
+ * this.ctx.storage.sql,
298
+ * );
299
+ * return persister;
300
+ * }
301
+ * }
302
+ * ```
303
+ * @example
304
+ * This example creates a DurableObjectSqlStoragePersister object with a custom
305
+ * table name and SQL command logging for debugging.
306
+ *
307
+ * ```js yolo
308
+ * import {createMergeableStore} from 'tinybase';
309
+ * import {createDurableObjectSqlStoragePersister} from 'tinybase/persisters/persister-durable-object-sql-storage';
310
+ * import {WsServerDurableObject} from 'tinybase/synchronizers/synchronizer-ws-server-durable-object';
311
+ *
312
+ * export class MyDurableObject extends WsServerDurableObject {
313
+ * createPersister() {
314
+ * const store = createMergeableStore();
315
+ * const persister = createDurableObjectSqlStoragePersister(
316
+ * store,
317
+ * this.ctx.storage.sql,
318
+ * 'my_app_store',
319
+ * (sql, params) => console.log('SQL:', sql, params),
320
+ * (error) => console.error('Persistence error:', error),
321
+ * );
322
+ * return persister;
323
+ * }
324
+ * }
325
+ * ```
326
+ * @example
327
+ * This example creates a DurableObjectSqlStoragePersister object using
328
+ * fragmented mode to avoid Cloudflare's 2MB row limit for large stores.
329
+ *
330
+ * ```js yolo
331
+ * import {createMergeableStore} from 'tinybase';
332
+ * import {createDurableObjectSqlStoragePersister} from 'tinybase/persisters/persister-durable-object-sql-storage';
333
+ * import {WsServerDurableObject} from 'tinybase/synchronizers/synchronizer-ws-server-durable-object';
334
+ *
335
+ * export class MyDurableObject extends WsServerDurableObject {
336
+ * createPersister() {
337
+ * const store = createMergeableStore();
338
+ * const persister = createDurableObjectSqlStoragePersister(
339
+ * store,
340
+ * this.ctx.storage.sql,
341
+ * {mode: 'fragmented'},
342
+ * );
343
+ * return persister;
344
+ * }
345
+ * }
346
+ * ```
347
+ * @example
348
+ * This example creates a DurableObjectSqlStoragePersister object using
349
+ * fragmented mode with a custom storage prefix.
350
+ *
351
+ * ```js yolo
352
+ * import {createMergeableStore} from 'tinybase';
353
+ * import {createDurableObjectSqlStoragePersister} from 'tinybase/persisters/persister-durable-object-sql-storage';
354
+ * import {WsServerDurableObject} from 'tinybase/synchronizers/synchronizer-ws-server-durable-object';
355
+ *
356
+ * export class MyDurableObject extends WsServerDurableObject {
357
+ * createPersister() {
358
+ * const store = createMergeableStore();
359
+ * const persister = createDurableObjectSqlStoragePersister(
360
+ * store,
361
+ * this.ctx.storage.sql,
362
+ * {mode: 'fragmented', storagePrefix: 'my_app_'},
363
+ * );
364
+ * return persister;
365
+ * }
366
+ * }
367
+ * ```
368
+ * @category Creation
369
+ * @essential Persisting stores
370
+ * @since v6.3.0
371
+ */
372
+ export function createDurableObjectSqlStoragePersister<
373
+ Schemas extends OptionalSchemas,
374
+ >(
375
+ store: Store<Schemas> | MergeableStore<Schemas>,
376
+ sqlStorage: SqlStorage,
377
+ configOrStoreTableName?:
378
+ | DurableObjectSqlDatabasePersisterConfig<Schemas>
379
+ | string,
380
+ onSqlCommand?: (sql: string, params?: any[]) => void,
381
+ onIgnoredError?: (error: any) => void,
382
+ ): DurableObjectSqlStoragePersister<Schemas>;
@@ -166,6 +166,7 @@ export interface PglitePersister
166
166
  * await pglite.close();
167
167
  * ```
168
168
  * @category Creation
169
+ * @essential Persisting stores
169
170
  * @since 5.2.0
170
171
  */
171
172
  export function createPglitePersister(
@@ -185,6 +185,7 @@ export interface PglitePersister<Schemas extends OptionalSchemas>
185
185
  * await pglite.close();
186
186
  * ```
187
187
  * @category Creation
188
+ * @essential Persisting stores
188
189
  * @since 5.2.0
189
190
  */
190
191
  export function createPglitePersister<Schemas extends OptionalSchemas>(
@@ -163,6 +163,7 @@ export interface SqliteWasmPersister
163
163
  * await persister.destroy();
164
164
  * ```
165
165
  * @category Creation
166
+ * @essential Persisting stores
166
167
  * @since v4.0.0
167
168
  */
168
169
  export function createSqliteWasmPersister(
@@ -183,6 +183,7 @@ export interface SqliteWasmPersister<Schemas extends OptionalSchemas>
183
183
  * await persister.destroy();
184
184
  * ```
185
185
  * @category Creation
186
+ * @essential Persisting stores
186
187
  * @since v4.0.0
187
188
  */
188
189
  export function createSqliteWasmPersister<Schemas extends OptionalSchemas>(
@@ -6,8 +6,8 @@
6
6
  * Many entry points are provided (in separately installed modules), each of
7
7
  * which returns different types of Persister that can load and save a Store.
8
8
  * Between them, these allow you to store your TinyBase data locally, remotely,
9
- * to SQLite and PostgreSQL databases, and across synchronization boundaries
10
- * with CRDT frameworks.
9
+ * to a Durable Object, to SQLite and PostgreSQL databases, and across
10
+ * synchronization boundaries with CRDT frameworks.
11
11
  *
12
12
  * |Persister|Storage|Store|MergeableStore
13
13
  * |-|-|-|-|
@@ -16,6 +16,8 @@
16
16
  * |FilePersister|Local file (where possible)|Yes|Yes
17
17
  * |IndexedDbPersister|Browser IndexedDB|Yes|No
18
18
  * |RemotePersister|Remote server|Yes|No
19
+ * |DurableObjectStoragePersister|Cloudflare Durable Object (KV)|No|Yes
20
+ * |DurableObjectSqlStoragePersister|Cloudflare Durable Object (SQLite)|No|Yes
19
21
  * |Sqlite3Persister|SQLite in Node, via [sqlite3](https://github.com/TryGhost/node-sqlite3)|Yes|Yes*
20
22
  * |SqliteBunPersister| SQLite in Bun, via [bun:sqlite](https://bun.sh/docs/api/sqlite)|Yes|Yes*
21
23
  * |SqliteWasmPersister|SQLite in a browser, via [sqlite-wasm](https://github.com/tomayac/sqlite-wasm)|Yes|Yes*
@@ -1029,6 +1031,7 @@ export type DpcTabularValues = {
1029
1031
  * sessionStorage.clear();
1030
1032
  * ```
1031
1033
  * @category Persister
1034
+ * @essential Persisting stores
1032
1035
  * @since v1.0.0
1033
1036
  */
1034
1037
  export interface Persister<
@@ -1331,7 +1331,7 @@ export type Where = {
1331
1331
  * If you provide a Group for every Select, the result will be a single Row with
1332
1332
  * every Cell having been aggregated. If you provide a Group for only one, or
1333
1333
  * some, of the Select clauses, the _others_ will be automatically used as
1334
- * dimensional values (analogous to the 'group by` semantics in SQL), within
1334
+ * dimensional values (analogous to the `group by` semantics in SQL), within
1335
1335
  * which the aggregations of Group Cells will be performed.
1336
1336
  *
1337
1337
  * You can join the same underlying Cell multiple times, but in that case you
@@ -1518,7 +1518,7 @@ export type Where<
1518
1518
  * If you provide a Group for every Select, the result will be a single Row with
1519
1519
  * every Cell having been aggregated. If you provide a Group for only one, or
1520
1520
  * some, of the Select clauses, the _others_ will be automatically used as
1521
- * dimensional values (analogous to the 'group by` semantics in SQL), within
1521
+ * dimensional values (analogous to the `group by` semantics in SQL), within
1522
1522
  * which the aggregations of Group Cells will be performed.
1523
1523
  *
1524
1524
  * You can join the same underlying Cell multiple times, but in that case you
@@ -1872,6 +1872,7 @@ export type StoreListenerStats = {
1872
1872
  * @see Hello World demos
1873
1873
  * @see Todo App demos
1874
1874
  * @category Store
1875
+ * @essential Creating stores
1875
1876
  * @since v1.0.0
1876
1877
  */
1877
1878
  export interface Store {
@@ -2321,6 +2322,7 @@ export interface Store {
2321
2322
  * // -> {}
2322
2323
  * ```
2323
2324
  * @category Getter
2325
+ * @essential Getting data
2324
2326
  * @since v1.0.0
2325
2327
  */
2326
2328
  getRow(tableId: Id, rowId: Id): Row;
@@ -2394,6 +2396,7 @@ export interface Store {
2394
2396
  * // -> undefined
2395
2397
  * ```
2396
2398
  * @category Getter
2399
+ * @essential Getting data
2397
2400
  * @since v1.0.0
2398
2401
  */
2399
2402
  getCell(tableId: Id, rowId: Id, cellId: Id): CellOrUndefined;
@@ -2489,6 +2492,7 @@ export interface Store {
2489
2492
  * // -> undefined
2490
2493
  * ```
2491
2494
  * @category Getter
2495
+ * @essential Getting data
2492
2496
  * @since v3.0.0
2493
2497
  */
2494
2498
  getValue(valueId: Id): ValueOrUndefined;
@@ -3157,6 +3161,7 @@ export interface Store {
3157
3161
  * // -> {pets: {fido: {color: 'brown'}}}
3158
3162
  * ```
3159
3163
  * @category Setter
3164
+ * @essential Setting data
3160
3165
  * @since v1.0.0
3161
3166
  */
3162
3167
  setRow(tableId: Id, rowId: Id, row: Row): this;
@@ -3223,6 +3228,7 @@ export interface Store {
3223
3228
  * // -> {pets: {'0': {species: 'dog'}, '1': {species: 'cat'}}}
3224
3229
  * ```
3225
3230
  * @category Setter
3231
+ * @essential Setting data
3226
3232
  * @since v1.0.0
3227
3233
  */
3228
3234
  addRow(tableId: Id, row: Row, reuseRowIds?: boolean): Id | undefined;
@@ -3343,6 +3349,7 @@ export interface Store {
3343
3349
  * // -> {pets: {fido: {species: 'dog'}}}
3344
3350
  * ```
3345
3351
  * @category Setter
3352
+ * @essential Setting data
3346
3353
  * @since v1.0.0
3347
3354
  */
3348
3355
  setCell(tableId: Id, rowId: Id, cellId: Id, cell: Cell | MapCell): this;
@@ -3506,6 +3513,7 @@ export interface Store {
3506
3513
  * // -> {employees: 3}
3507
3514
  * ```
3508
3515
  * @category Setter
3516
+ * @essential Setting data
3509
3517
  * @since v3.0.0
3510
3518
  */
3511
3519
  setValue(valueId: Id, value: Value | MapValue): this;
@@ -4263,6 +4271,7 @@ export interface Store {
4263
4271
  * // -> {open: true}
4264
4272
  * ```
4265
4273
  * @category Transaction
4274
+ * @essential Setting data
4266
4275
  * @since v1.0.0
4267
4276
  */
4268
4277
  transaction<Return>(actions: () => Return, doRollback?: DoRollback): Return;
@@ -6025,6 +6034,7 @@ export interface Store {
6025
6034
  * store.delListener(listenerId);
6026
6035
  * ```
6027
6036
  * @category Listener
6037
+ * @essential Listening for changes
6028
6038
  * @since v1.0.0
6029
6039
  */
6030
6040
  addRowListener(
@@ -6392,6 +6402,7 @@ export interface Store {
6392
6402
  * store.delListener(listenerId);
6393
6403
  * ```
6394
6404
  * @category Listener
6405
+ * @essential Listening for changes
6395
6406
  * @since v1.0.0
6396
6407
  */
6397
6408
  addCellListener(
@@ -6794,6 +6805,7 @@ export interface Store {
6794
6805
  * store.delListener(listenerId);
6795
6806
  * ```
6796
6807
  * @category Listener
6808
+ * @essential Listening for changes
6797
6809
  * @since v3.0.0
6798
6810
  */
6799
6811
  addValueListener(
@@ -7715,6 +7727,7 @@ export interface Store {
7715
7727
  * ```
7716
7728
  * @see The Basics guides
7717
7729
  * @category Creation
7730
+ * @essential Creating stores
7718
7731
  * @since v1.0.0
7719
7732
  */
7720
7733
  export function createStore(): Store;
@@ -2843,6 +2843,7 @@ export type StoreListenerStats = {
2843
2843
  * @see Hello World demos
2844
2844
  * @see Todo App demos
2845
2845
  * @category Store
2846
+ * @essential Creating stores
2846
2847
  * @since v1.0.0
2847
2848
  */
2848
2849
  export interface Store<in out Schemas extends OptionalSchemas> {
@@ -3363,6 +3364,7 @@ export interface Store<in out Schemas extends OptionalSchemas> {
3363
3364
  * // -> {}
3364
3365
  * ```
3365
3366
  * @category Getter
3367
+ * @essential Getting data
3366
3368
  * @since v1.0.0
3367
3369
  */
3368
3370
  getRow<TableId extends TableIdFromSchema<Schemas[0]>>(
@@ -3454,6 +3456,7 @@ export interface Store<in out Schemas extends OptionalSchemas> {
3454
3456
  * // -> undefined
3455
3457
  * ```
3456
3458
  * @category Getter
3459
+ * @essential Getting data
3457
3460
  * @since v1.0.0
3458
3461
  */
3459
3462
  getCell<
@@ -3574,6 +3577,7 @@ export interface Store<in out Schemas extends OptionalSchemas> {
3574
3577
  * // -> undefined
3575
3578
  * ```
3576
3579
  * @category Getter
3580
+ * @essential Getting data
3577
3581
  * @since v3.0.0
3578
3582
  */
3579
3583
  getValue<ValueId extends ValueIdFromSchema<Schemas[1]>>(
@@ -4310,6 +4314,7 @@ export interface Store<in out Schemas extends OptionalSchemas> {
4310
4314
  * // -> {pets: {fido: {color: 'brown'}}}
4311
4315
  * ```
4312
4316
  * @category Setter
4317
+ * @essential Setting data
4313
4318
  * @since v1.0.0
4314
4319
  */
4315
4320
  setRow<TableId extends TableIdFromSchema<Schemas[0]>>(
@@ -4386,6 +4391,7 @@ export interface Store<in out Schemas extends OptionalSchemas> {
4386
4391
  * // -> {pets: {'0': {species: 'dog'}, '1': {species: 'cat'}}}
4387
4392
  * ```
4388
4393
  * @category Setter
4394
+ * @essential Setting data
4389
4395
  * @since v1.0.0
4390
4396
  */
4391
4397
  addRow<TableId extends TableIdFromSchema<Schemas[0]>>(
@@ -4526,6 +4532,7 @@ export interface Store<in out Schemas extends OptionalSchemas> {
4526
4532
  * // -> {pets: {fido: {species: 'dog'}}}
4527
4533
  * ```
4528
4534
  * @category Setter
4535
+ * @essential Setting data
4529
4536
  * @since v1.0.0
4530
4537
  */
4531
4538
  setCell<
@@ -4717,6 +4724,7 @@ export interface Store<in out Schemas extends OptionalSchemas> {
4717
4724
  * // -> {employees: 3}
4718
4725
  * ```
4719
4726
  * @category Setter
4727
+ * @essential Setting data
4720
4728
  * @since v3.0.0
4721
4729
  */
4722
4730
  setValue<ValueId extends ValueIdFromSchema<Schemas[1]>>(
@@ -5572,6 +5580,7 @@ export interface Store<in out Schemas extends OptionalSchemas> {
5572
5580
  * // -> {open: true}
5573
5581
  * ```
5574
5582
  * @category Transaction
5583
+ * @essential Setting data
5575
5584
  * @since v1.0.0
5576
5585
  */
5577
5586
  transaction<Return>(
@@ -7551,6 +7560,7 @@ export interface Store<in out Schemas extends OptionalSchemas> {
7551
7560
  * store.delListener(listenerId);
7552
7561
  * ```
7553
7562
  * @category Listener
7563
+ * @essential Listening for changes
7554
7564
  * @since v1.0.0
7555
7565
  */
7556
7566
  addRowListener<
@@ -7973,6 +7983,7 @@ export interface Store<in out Schemas extends OptionalSchemas> {
7973
7983
  * store.delListener(listenerId);
7974
7984
  * ```
7975
7985
  * @category Listener
7986
+ * @essential Listening for changes
7976
7987
  * @since v1.0.0
7977
7988
  */
7978
7989
  addCellListener<
@@ -8438,6 +8449,7 @@ export interface Store<in out Schemas extends OptionalSchemas> {
8438
8449
  * store.delListener(listenerId);
8439
8450
  * ```
8440
8451
  * @category Listener
8452
+ * @essential Listening for changes
8441
8453
  * @since v3.0.0
8442
8454
  */
8443
8455
  addValueListener<ValueIdOrNull extends ValueIdFromSchema<Schemas[1]> | null>(
@@ -9408,6 +9420,7 @@ export interface Store<in out Schemas extends OptionalSchemas> {
9408
9420
  * ```
9409
9421
  * @see The Basics guides
9410
9422
  * @category Creation
9423
+ * @essential Creating stores
9411
9424
  * @since v1.0.0
9412
9425
  */
9413
9426
  export function createStore(): Store<NoSchemas>;
@@ -198,6 +198,7 @@ export type SynchronizerStats = {
198
198
  * await synchronizer2.destroy();
199
199
  * ```
200
200
  * @category Synchronizer
201
+ * @essential Synchronizing stores
201
202
  * @since v5.0.0
202
203
  */
203
204
  export interface Synchronizer extends Persister<Persists.MergeableStoreOnly> {
@@ -148,6 +148,7 @@ export interface WsSynchronizer<WebSocketType extends WebSocketTypes>
148
148
  * await server.destroy();
149
149
  * ```
150
150
  * @category Creation
151
+ * @essential Synchronizing stores
151
152
  * @since v5.0.0
152
153
  */
153
154
  export function createWsSynchronizer<WebSocketType extends WebSocketTypes>(
@@ -164,6 +164,7 @@ export interface WsSynchronizer<
164
164
  * await server.destroy();
165
165
  * ```
166
166
  * @category Creation
167
+ * @essential Synchronizing stores
167
168
  * @since v5.0.0
168
169
  */
169
170
  export function createWsSynchronizer<