tinybase 4.3.8 → 4.3.9

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 (243) hide show
  1. package/lib/checkpoints.js +1 -1
  2. package/lib/checkpoints.js.gz +0 -0
  3. package/lib/cjs/checkpoints.cjs +1 -1
  4. package/lib/cjs/checkpoints.cjs.gz +0 -0
  5. package/lib/cjs/indexes.cjs +1 -1
  6. package/lib/cjs/indexes.cjs.gz +0 -0
  7. package/lib/cjs/metrics.cjs +1 -1
  8. package/lib/cjs/metrics.cjs.gz +0 -0
  9. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  10. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  11. package/lib/cjs/persisters/persister-expo-sqlite.cjs +1 -1
  12. package/lib/cjs/persisters/persister-expo-sqlite.cjs.gz +0 -0
  13. package/lib/cjs/persisters/persister-indexed-db.cjs +1 -1
  14. package/lib/cjs/persisters/persister-indexed-db.cjs.gz +0 -0
  15. package/lib/cjs/persisters/persister-partykit-client.cjs +1 -1
  16. package/lib/cjs/persisters/persister-partykit-client.cjs.gz +0 -0
  17. package/lib/cjs/persisters/persister-partykit-server.cjs +1 -1
  18. package/lib/cjs/persisters/persister-partykit-server.cjs.gz +0 -0
  19. package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -1
  20. package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  21. package/lib/cjs/persisters/persister-sqlite3.cjs +1 -1
  22. package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
  23. package/lib/cjs/persisters/persister-yjs.cjs +1 -1
  24. package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
  25. package/lib/cjs/queries.cjs +1 -1
  26. package/lib/cjs/queries.cjs.gz +0 -0
  27. package/lib/cjs/relationships.cjs +1 -1
  28. package/lib/cjs/relationships.cjs.gz +0 -0
  29. package/lib/cjs/store.cjs +1 -1
  30. package/lib/cjs/store.cjs.gz +0 -0
  31. package/lib/cjs/tinybase.cjs +1 -1
  32. package/lib/cjs/tinybase.cjs.gz +0 -0
  33. package/lib/cjs/tools.cjs +1 -1
  34. package/lib/cjs/tools.cjs.gz +0 -0
  35. package/lib/cjs/ui-react-dom-debug.cjs +1 -1
  36. package/lib/cjs/ui-react-dom-debug.cjs.gz +0 -0
  37. package/lib/cjs/ui-react.cjs +1 -1
  38. package/lib/cjs/ui-react.cjs.gz +0 -0
  39. package/lib/cjs-es6/checkpoints.cjs +1 -1
  40. package/lib/cjs-es6/checkpoints.cjs.gz +0 -0
  41. package/lib/cjs-es6/indexes.cjs +1 -1
  42. package/lib/cjs-es6/indexes.cjs.gz +0 -0
  43. package/lib/cjs-es6/metrics.cjs +1 -1
  44. package/lib/cjs-es6/metrics.cjs.gz +0 -0
  45. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  46. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  47. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -1
  48. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
  49. package/lib/cjs-es6/persisters/persister-indexed-db.cjs +1 -1
  50. package/lib/cjs-es6/persisters/persister-indexed-db.cjs.gz +0 -0
  51. package/lib/cjs-es6/persisters/persister-partykit-client.cjs +1 -1
  52. package/lib/cjs-es6/persisters/persister-partykit-client.cjs.gz +0 -0
  53. package/lib/cjs-es6/persisters/persister-partykit-server.cjs +1 -1
  54. package/lib/cjs-es6/persisters/persister-partykit-server.cjs.gz +0 -0
  55. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -1
  56. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  57. package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -1
  58. package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
  59. package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -1
  60. package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
  61. package/lib/cjs-es6/queries.cjs +1 -1
  62. package/lib/cjs-es6/queries.cjs.gz +0 -0
  63. package/lib/cjs-es6/relationships.cjs +1 -1
  64. package/lib/cjs-es6/relationships.cjs.gz +0 -0
  65. package/lib/cjs-es6/store.cjs +1 -1
  66. package/lib/cjs-es6/store.cjs.gz +0 -0
  67. package/lib/cjs-es6/tinybase.cjs +1 -1
  68. package/lib/cjs-es6/tinybase.cjs.gz +0 -0
  69. package/lib/cjs-es6/tools.cjs +1 -1
  70. package/lib/cjs-es6/tools.cjs.gz +0 -0
  71. package/lib/cjs-es6/ui-react-dom-debug.cjs +1 -1
  72. package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
  73. package/lib/cjs-es6/ui-react.cjs +1 -1
  74. package/lib/cjs-es6/ui-react.cjs.gz +0 -0
  75. package/lib/debug/checkpoints.js +12 -12
  76. package/lib/debug/indexes.js +9 -9
  77. package/lib/debug/metrics.js +9 -9
  78. package/lib/debug/persisters/persister-automerge.js +6 -6
  79. package/lib/debug/persisters/persister-browser.js +2 -2
  80. package/lib/debug/persisters/persister-cr-sqlite-wasm.js +5 -5
  81. package/lib/debug/persisters/persister-expo-sqlite.js +5 -5
  82. package/lib/debug/persisters/persister-file.js +2 -2
  83. package/lib/debug/persisters/persister-indexed-db.js +6 -6
  84. package/lib/debug/persisters/persister-partykit-client.js +15 -5
  85. package/lib/debug/persisters/persister-partykit-server.js +44 -30
  86. package/lib/debug/persisters/persister-remote.js +2 -2
  87. package/lib/debug/persisters/persister-sqlite-wasm.js +5 -5
  88. package/lib/debug/persisters/persister-sqlite3.js +5 -5
  89. package/lib/debug/persisters/persister-yjs.js +9 -9
  90. package/lib/debug/persisters.js +2 -2
  91. package/lib/debug/queries.js +15 -15
  92. package/lib/debug/relationships.js +9 -9
  93. package/lib/debug/store.js +9 -9
  94. package/lib/debug/tinybase.js +15 -15
  95. package/lib/debug/tools.js +6 -7
  96. package/lib/debug/ui-react-dom.js +10 -10
  97. package/lib/debug/ui-react.js +2 -2
  98. package/lib/es6/checkpoints.js +1 -1
  99. package/lib/es6/checkpoints.js.gz +0 -0
  100. package/lib/es6/indexes.js +1 -1
  101. package/lib/es6/indexes.js.gz +0 -0
  102. package/lib/es6/metrics.js +1 -1
  103. package/lib/es6/metrics.js.gz +0 -0
  104. package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  105. package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  106. package/lib/es6/persisters/persister-expo-sqlite.js +1 -1
  107. package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
  108. package/lib/es6/persisters/persister-indexed-db.js +1 -1
  109. package/lib/es6/persisters/persister-indexed-db.js.gz +0 -0
  110. package/lib/es6/persisters/persister-partykit-client.js +1 -1
  111. package/lib/es6/persisters/persister-partykit-client.js.gz +0 -0
  112. package/lib/es6/persisters/persister-partykit-server.js +1 -1
  113. package/lib/es6/persisters/persister-partykit-server.js.gz +0 -0
  114. package/lib/es6/persisters/persister-sqlite-wasm.js +1 -1
  115. package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  116. package/lib/es6/persisters/persister-sqlite3.js +1 -1
  117. package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
  118. package/lib/es6/persisters/persister-yjs.js +1 -1
  119. package/lib/es6/persisters/persister-yjs.js.gz +0 -0
  120. package/lib/es6/queries.js +1 -1
  121. package/lib/es6/queries.js.gz +0 -0
  122. package/lib/es6/relationships.js +1 -1
  123. package/lib/es6/relationships.js.gz +0 -0
  124. package/lib/es6/store.js +1 -1
  125. package/lib/es6/store.js.gz +0 -0
  126. package/lib/es6/tinybase.js +1 -1
  127. package/lib/es6/tinybase.js.gz +0 -0
  128. package/lib/es6/tools.js +1 -1
  129. package/lib/es6/tools.js.gz +0 -0
  130. package/lib/es6/ui-react-dom-debug.js +1 -1
  131. package/lib/es6/ui-react-dom-debug.js.gz +0 -0
  132. package/lib/es6/ui-react.js +1 -1
  133. package/lib/es6/ui-react.js.gz +0 -0
  134. package/lib/indexes.js +1 -1
  135. package/lib/indexes.js.gz +0 -0
  136. package/lib/metrics.js +1 -1
  137. package/lib/metrics.js.gz +0 -0
  138. package/lib/persisters/persister-cr-sqlite-wasm.js +1 -1
  139. package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  140. package/lib/persisters/persister-expo-sqlite.js +1 -1
  141. package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
  142. package/lib/persisters/persister-indexed-db.js +1 -1
  143. package/lib/persisters/persister-indexed-db.js.gz +0 -0
  144. package/lib/persisters/persister-partykit-client.js +1 -1
  145. package/lib/persisters/persister-partykit-client.js.gz +0 -0
  146. package/lib/persisters/persister-partykit-server.js +1 -1
  147. package/lib/persisters/persister-partykit-server.js.gz +0 -0
  148. package/lib/persisters/persister-sqlite-wasm.js +1 -1
  149. package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
  150. package/lib/persisters/persister-sqlite3.js +1 -1
  151. package/lib/persisters/persister-sqlite3.js.gz +0 -0
  152. package/lib/persisters/persister-yjs.js +1 -1
  153. package/lib/persisters/persister-yjs.js.gz +0 -0
  154. package/lib/queries.js +1 -1
  155. package/lib/queries.js.gz +0 -0
  156. package/lib/relationships.js +1 -1
  157. package/lib/relationships.js.gz +0 -0
  158. package/lib/store.js +1 -1
  159. package/lib/store.js.gz +0 -0
  160. package/lib/tinybase.js +1 -1
  161. package/lib/tinybase.js.gz +0 -0
  162. package/lib/tools.js +1 -1
  163. package/lib/tools.js.gz +0 -0
  164. package/lib/types/persisters/persister-partykit-client.d.ts +43 -4
  165. package/lib/types/persisters/persister-partykit-server.d.ts +66 -0
  166. package/lib/types/with-schemas/persisters/persister-partykit-client.d.ts +44 -5
  167. package/lib/types/with-schemas/persisters/persister-partykit-server.d.ts +66 -0
  168. package/lib/ui-react.js +1 -1
  169. package/lib/ui-react.js.gz +0 -0
  170. package/lib/umd/checkpoints.js +1 -1
  171. package/lib/umd/checkpoints.js.gz +0 -0
  172. package/lib/umd/indexes.js +1 -1
  173. package/lib/umd/indexes.js.gz +0 -0
  174. package/lib/umd/metrics.js +1 -1
  175. package/lib/umd/metrics.js.gz +0 -0
  176. package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
  177. package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  178. package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
  179. package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
  180. package/lib/umd/persisters/persister-indexed-db.js +1 -1
  181. package/lib/umd/persisters/persister-indexed-db.js.gz +0 -0
  182. package/lib/umd/persisters/persister-partykit-client.js +1 -1
  183. package/lib/umd/persisters/persister-partykit-client.js.gz +0 -0
  184. package/lib/umd/persisters/persister-partykit-server.js +1 -1
  185. package/lib/umd/persisters/persister-partykit-server.js.gz +0 -0
  186. package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
  187. package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
  188. package/lib/umd/persisters/persister-sqlite3.js +1 -1
  189. package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
  190. package/lib/umd/persisters/persister-yjs.js +1 -1
  191. package/lib/umd/persisters/persister-yjs.js.gz +0 -0
  192. package/lib/umd/queries.js +1 -1
  193. package/lib/umd/queries.js.gz +0 -0
  194. package/lib/umd/relationships.js +1 -1
  195. package/lib/umd/relationships.js.gz +0 -0
  196. package/lib/umd/store.js +1 -1
  197. package/lib/umd/store.js.gz +0 -0
  198. package/lib/umd/tinybase.js +1 -1
  199. package/lib/umd/tinybase.js.gz +0 -0
  200. package/lib/umd/tools.js +1 -1
  201. package/lib/umd/tools.js.gz +0 -0
  202. package/lib/umd/ui-react-dom-debug.js +1 -1
  203. package/lib/umd/ui-react-dom-debug.js.gz +0 -0
  204. package/lib/umd/ui-react.js +1 -1
  205. package/lib/umd/ui-react.js.gz +0 -0
  206. package/lib/umd-es6/checkpoints.js +1 -1
  207. package/lib/umd-es6/checkpoints.js.gz +0 -0
  208. package/lib/umd-es6/indexes.js +1 -1
  209. package/lib/umd-es6/indexes.js.gz +0 -0
  210. package/lib/umd-es6/metrics.js +1 -1
  211. package/lib/umd-es6/metrics.js.gz +0 -0
  212. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  213. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  214. package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
  215. package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
  216. package/lib/umd-es6/persisters/persister-indexed-db.js +1 -1
  217. package/lib/umd-es6/persisters/persister-indexed-db.js.gz +0 -0
  218. package/lib/umd-es6/persisters/persister-partykit-client.js +1 -1
  219. package/lib/umd-es6/persisters/persister-partykit-client.js.gz +0 -0
  220. package/lib/umd-es6/persisters/persister-partykit-server.js +1 -1
  221. package/lib/umd-es6/persisters/persister-partykit-server.js.gz +0 -0
  222. package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
  223. package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  224. package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
  225. package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
  226. package/lib/umd-es6/persisters/persister-yjs.js +1 -1
  227. package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
  228. package/lib/umd-es6/queries.js +1 -1
  229. package/lib/umd-es6/queries.js.gz +0 -0
  230. package/lib/umd-es6/relationships.js +1 -1
  231. package/lib/umd-es6/relationships.js.gz +0 -0
  232. package/lib/umd-es6/store.js +1 -1
  233. package/lib/umd-es6/store.js.gz +0 -0
  234. package/lib/umd-es6/tinybase.js +1 -1
  235. package/lib/umd-es6/tinybase.js.gz +0 -0
  236. package/lib/umd-es6/tools.js +1 -1
  237. package/lib/umd-es6/tools.js.gz +0 -0
  238. package/lib/umd-es6/ui-react-dom-debug.js +1 -1
  239. package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
  240. package/lib/umd-es6/ui-react.js +1 -1
  241. package/lib/umd-es6/ui-react.js.gz +0 -0
  242. package/package.json +7 -7
  243. package/readme.md +2 -2
@@ -4,12 +4,12 @@ const isUndefined = (thing) => thing == void 0;
4
4
  const ifNotUndefined = (value, then, otherwise) =>
5
5
  isUndefined(value) ? otherwise?.() : then(value);
6
6
  const isArray = (thing) => Array.isArray(thing);
7
+ const size = (arrayOrString) => arrayOrString.length;
7
8
  const test = (regex, subject) => regex.test(subject);
8
9
 
9
10
  const arrayHas = (array, value) => array.includes(value);
10
11
  const arrayForEach = (array, cb) => array.forEach(cb);
11
- const arrayLength = (array) => array.length;
12
- const arrayIsEmpty = (array) => arrayLength(array) == 0;
12
+ const arrayIsEmpty = (array) => size(array) == 0;
13
13
  const arrayReduce = (array, cb, initial) => array.reduce(cb, initial);
14
14
  const arrayClear = (array, to) => array.splice(0, to);
15
15
  const arrayPush = (array, ...values) => array.push(...values);
@@ -47,10 +47,10 @@ const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
47
47
  (ensureLeaf ? mapEnsure : mapGet)(
48
48
  node,
49
49
  path[p],
50
- p > arrayLength(path) - 2 ? ensureLeaf : mapNew,
50
+ p > size(path) - 2 ? ensureLeaf : mapNew,
51
51
  ),
52
52
  (nodeOrLeaf) => {
53
- if (p > arrayLength(path) - 2) {
53
+ if (p > size(path) - 2) {
54
54
  if (pruneLeaf?.(nodeOrLeaf)) {
55
55
  mapSet(node, path[p]);
56
56
  }
@@ -96,7 +96,7 @@ const getPoolFunctions = () => {
96
96
  return [
97
97
  (reuse) => (reuse ? arrayShift(pool) : null) ?? EMPTY_STRING + nextId++,
98
98
  (id) => {
99
- if (test(INTEGER, id) && arrayLength(pool) < 1e3) {
99
+ if (test(INTEGER, id) && size(pool) < 1e3) {
100
100
  arrayPush(pool, id);
101
101
  }
102
102
  },
@@ -106,7 +106,7 @@ const getPoolFunctions = () => {
106
106
  const getWildcardedLeaves = (deepIdSet, path = [EMPTY_STRING]) => {
107
107
  const leaves = [];
108
108
  const deep = (node, p) =>
109
- p == arrayLength(path)
109
+ p == size(path)
110
110
  ? arrayPush(leaves, node)
111
111
  : path[p] === null
112
112
  ? collForEach(node, (node2) => deep(node2, p + 1))
@@ -158,8 +158,8 @@ const getListenerFunctions = (getThing) => {
158
158
  mapGet(allListeners, id),
159
159
  ([listener, , path = [], pathGetters, extraArgsGetter]) => {
160
160
  const callWithIds = (...ids) => {
161
- const index = arrayLength(ids);
162
- index == arrayLength(path)
161
+ const index = size(ids);
162
+ index == size(path)
163
163
  ? listener(thing, ...ids, ...extraArgsGetter(ids))
164
164
  : isUndefined(path[index])
165
165
  ? arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
@@ -214,11 +214,11 @@ const createCheckpoints = getCreateFunction((store) => {
214
214
  };
215
215
  const clearCheckpointIds = (checkpointIds, to) =>
216
216
  arrayForEach(
217
- arrayClear(checkpointIds, to ?? arrayLength(checkpointIds)),
217
+ arrayClear(checkpointIds, to ?? size(checkpointIds)),
218
218
  clearCheckpointId,
219
219
  );
220
220
  const trimBackwardsIds = () =>
221
- clearCheckpointIds(backwardIds, arrayLength(backwardIds) - backwardIdsSize);
221
+ clearCheckpointIds(backwardIds, size(backwardIds) - backwardIdsSize);
222
222
  const storeChanged = () =>
223
223
  ifNotUndefined(currentId, () => {
224
224
  arrayPush(backwardIds, currentId);
@@ -307,8 +307,8 @@ const createCheckpoints = getCreateFunction((store) => {
307
307
  checkpointsChanged = 0;
308
308
  }
309
309
  };
310
- const setSize = (size) => {
311
- backwardIdsSize = size;
310
+ const setSize = (size2) => {
311
+ backwardIdsSize = size2;
312
312
  trimBackwardsIds();
313
313
  return checkpoints;
314
314
  };
@@ -8,11 +8,12 @@ const ifNotUndefined = (value, then, otherwise) =>
8
8
  isUndefined(value) ? otherwise?.() : then(value);
9
9
  const isString = (thing) => getTypeOf(thing) == STRING;
10
10
  const isArray = (thing) => Array.isArray(thing);
11
+ const size = (arrayOrString) => arrayOrString.length;
11
12
  const test = (regex, subject) => regex.test(subject);
12
13
 
13
14
  const arrayEvery = (array, cb) => array.every(cb);
14
15
  const arrayIsEqual = (array1, array2) =>
15
- arrayLength(array1) === arrayLength(array2) &&
16
+ size(array1) === size(array2) &&
16
17
  arrayEvery(array1, (value1, index) => array2[index] === value1);
17
18
  const arrayIsSorted = (array, sorter) =>
18
19
  arrayEvery(
@@ -22,8 +23,7 @@ const arrayIsSorted = (array, sorter) =>
22
23
  const arraySort = (array, sorter) => array.sort(sorter);
23
24
  const arrayForEach = (array, cb) => array.forEach(cb);
24
25
  const arrayMap = (array, cb) => array.map(cb);
25
- const arrayLength = (array) => array.length;
26
- const arrayIsEmpty = (array) => arrayLength(array) == 0;
26
+ const arrayIsEmpty = (array) => size(array) == 0;
27
27
  const arrayReduce = (array, cb, initial) => array.reduce(cb, initial);
28
28
  const arrayPush = (array, ...values) => array.push(...values);
29
29
  const arrayShift = (array) => array.shift();
@@ -61,10 +61,10 @@ const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
61
61
  (ensureLeaf ? mapEnsure : mapGet)(
62
62
  node,
63
63
  path[p],
64
- p > arrayLength(path) - 2 ? ensureLeaf : mapNew,
64
+ p > size(path) - 2 ? ensureLeaf : mapNew,
65
65
  ),
66
66
  (nodeOrLeaf) => {
67
- if (p > arrayLength(path) - 2) {
67
+ if (p > size(path) - 2) {
68
68
  if (pruneLeaf?.(nodeOrLeaf)) {
69
69
  mapSet(node, path[p]);
70
70
  }
@@ -266,7 +266,7 @@ const getPoolFunctions = () => {
266
266
  return [
267
267
  (reuse) => (reuse ? arrayShift(pool) : null) ?? EMPTY_STRING + nextId++,
268
268
  (id) => {
269
- if (test(INTEGER, id) && arrayLength(pool) < 1e3) {
269
+ if (test(INTEGER, id) && size(pool) < 1e3) {
270
270
  arrayPush(pool, id);
271
271
  }
272
272
  },
@@ -276,7 +276,7 @@ const getPoolFunctions = () => {
276
276
  const getWildcardedLeaves = (deepIdSet, path = [EMPTY_STRING]) => {
277
277
  const leaves = [];
278
278
  const deep = (node, p) =>
279
- p == arrayLength(path)
279
+ p == size(path)
280
280
  ? arrayPush(leaves, node)
281
281
  : path[p] === null
282
282
  ? collForEach(node, (node2) => deep(node2, p + 1))
@@ -328,8 +328,8 @@ const getListenerFunctions = (getThing) => {
328
328
  mapGet(allListeners, id),
329
329
  ([listener, , path = [], pathGetters, extraArgsGetter]) => {
330
330
  const callWithIds = (...ids) => {
331
- const index = arrayLength(ids);
332
- index == arrayLength(path)
331
+ const index = size(ids);
332
+ index == size(path)
333
333
  ? listener(thing, ...ids, ...extraArgsGetter(ids))
334
334
  : isUndefined(path[index])
335
335
  ? arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
@@ -16,17 +16,17 @@ const ifNotUndefined = (value, then, otherwise) =>
16
16
  const isString = (thing) => getTypeOf(thing) == STRING;
17
17
  const isFunction = (thing) => getTypeOf(thing) == FUNCTION;
18
18
  const isArray = (thing) => Array.isArray(thing);
19
+ const size = (arrayOrString) => arrayOrString.length;
19
20
  const test = (regex, subject) => regex.test(subject);
20
21
  const getUndefined = () => void 0;
21
22
 
22
23
  const arrayEvery = (array, cb) => array.every(cb);
23
24
  const arrayIsEqual = (array1, array2) =>
24
- arrayLength(array1) === arrayLength(array2) &&
25
+ size(array1) === size(array2) &&
25
26
  arrayEvery(array1, (value1, index) => array2[index] === value1);
26
27
  const arrayForEach = (array, cb) => array.forEach(cb);
27
28
  const arraySum = (array) => arrayReduce(array, (i, j) => i + j, 0);
28
- const arrayLength = (array) => array.length;
29
- const arrayIsEmpty = (array) => arrayLength(array) == 0;
29
+ const arrayIsEmpty = (array) => size(array) == 0;
30
30
  const arrayReduce = (array, cb, initial) => array.reduce(cb, initial);
31
31
  const arrayPush = (array, ...values) => array.push(...values);
32
32
  const arrayShift = (array) => array.shift();
@@ -63,10 +63,10 @@ const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
63
63
  (ensureLeaf ? mapEnsure : mapGet)(
64
64
  node,
65
65
  path[p],
66
- p > arrayLength(path) - 2 ? ensureLeaf : mapNew,
66
+ p > size(path) - 2 ? ensureLeaf : mapNew,
67
67
  ),
68
68
  (nodeOrLeaf) => {
69
- if (p > arrayLength(path) - 2) {
69
+ if (p > size(path) - 2) {
70
70
  if (pruneLeaf?.(nodeOrLeaf)) {
71
71
  mapSet(node, path[p]);
72
72
  }
@@ -334,7 +334,7 @@ const getPoolFunctions = () => {
334
334
  return [
335
335
  (reuse) => (reuse ? arrayShift(pool) : null) ?? EMPTY_STRING + nextId++,
336
336
  (id) => {
337
- if (test(INTEGER, id) && arrayLength(pool) < 1e3) {
337
+ if (test(INTEGER, id) && size(pool) < 1e3) {
338
338
  arrayPush(pool, id);
339
339
  }
340
340
  },
@@ -344,7 +344,7 @@ const getPoolFunctions = () => {
344
344
  const getWildcardedLeaves = (deepIdSet, path = [EMPTY_STRING]) => {
345
345
  const leaves = [];
346
346
  const deep = (node, p) =>
347
- p == arrayLength(path)
347
+ p == size(path)
348
348
  ? arrayPush(leaves, node)
349
349
  : path[p] === null
350
350
  ? collForEach(node, (node2) => deep(node2, p + 1))
@@ -396,8 +396,8 @@ const getListenerFunctions = (getThing) => {
396
396
  mapGet(allListeners, id),
397
397
  ([listener, , path = [], pathGetters, extraArgsGetter]) => {
398
398
  const callWithIds = (...ids) => {
399
- const index = arrayLength(ids);
400
- index == arrayLength(path)
399
+ const index = size(ids);
400
+ index == size(path)
401
401
  ? listener(thing, ...ids, ...extraArgsGetter(ids))
402
402
  : isUndefined(path[index])
403
403
  ? arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
@@ -1,14 +1,14 @@
1
1
  const TINYBASE = 'tinybase';
2
2
 
3
- const arrayMap = (array, cb) => array.map(cb);
4
- const arrayLength = (array) => array.length;
5
- const arrayPush = (array, ...values) => array.push(...values);
6
- const arrayShift = (array) => array.shift();
7
-
8
3
  const isInstanceOf = (thing, cls) => thing instanceof cls;
9
4
  const isUndefined = (thing) => thing == void 0;
10
5
  const ifNotUndefined = (value, then, otherwise) =>
11
6
  isUndefined(value) ? otherwise?.() : then(value);
7
+ const size = (arrayOrString) => arrayOrString.length;
8
+
9
+ const arrayMap = (array, cb) => array.map(cb);
10
+ const arrayPush = (array, ...values) => array.push(...values);
11
+ const arrayShift = (array) => array.shift();
12
12
 
13
13
  const object = Object;
14
14
  const objIds = object.keys;
@@ -23,7 +23,7 @@ const objDel = (obj, id) => {
23
23
  };
24
24
  const objMap = (obj, cb) =>
25
25
  arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
26
- const objSize = (obj) => arrayLength(objIds(obj));
26
+ const objSize = (obj) => size(objIds(obj));
27
27
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
28
28
  const objEnsure = (obj, id, getDefaultValue) => {
29
29
  if (!objHas(obj, id)) {
@@ -2,8 +2,8 @@ const isInstanceOf = (thing, cls) => thing instanceof cls;
2
2
  const isUndefined = (thing) => thing == void 0;
3
3
  const ifNotUndefined = (value, then, otherwise) =>
4
4
  isUndefined(value) ? otherwise?.() : then(value);
5
+ const size = (arrayOrString) => arrayOrString.length;
5
6
 
6
- const arrayLength = (array) => array.length;
7
7
  const arrayPush = (array, ...values) => array.push(...values);
8
8
  const arrayShift = (array) => array.shift();
9
9
 
@@ -12,7 +12,7 @@ const objIds = object.keys;
12
12
  const objFreeze = object.freeze;
13
13
  const isObject = (obj) =>
14
14
  isInstanceOf(obj, object) && obj.constructor == object;
15
- const objSize = (obj) => arrayLength(objIds(obj));
15
+ const objSize = (obj) => size(objIds(obj));
16
16
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
17
17
 
18
18
  const jsonString = (obj) =>
@@ -15,12 +15,12 @@ const ifNotUndefined = (value, then, otherwise) =>
15
15
  const isString = (thing) => getTypeOf(thing) == STRING;
16
16
  const isArray = (thing) => Array.isArray(thing);
17
17
  const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
18
+ const size = (arrayOrString) => arrayOrString.length;
18
19
  const promiseAll = async (promises) => promise.all(promises);
19
20
 
20
21
  const arrayJoin = (array, sep = EMPTY_STRING) => array.join(sep);
21
22
  const arrayMap = (array, cb) => array.map(cb);
22
- const arrayLength = (array) => array.length;
23
- const arrayIsEmpty = (array) => arrayLength(array) == 0;
23
+ const arrayIsEmpty = (array) => size(array) == 0;
24
24
  const arrayFilter = (array, cb) => array.filter(cb);
25
25
  const arrayPush = (array, ...values) => array.push(...values);
26
26
  const arrayShift = (array) => array.shift();
@@ -46,7 +46,7 @@ const objDel = (obj, id) => {
46
46
  const objMap = (obj, cb) =>
47
47
  arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
48
48
  const objValues = (obj) => object.values(obj);
49
- const objSize = (obj) => arrayLength(objIds(obj));
49
+ const objSize = (obj) => size(objIds(obj));
50
50
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
51
51
 
52
52
  const mapNew = (entries) => new Map(entries);
@@ -317,8 +317,8 @@ const upsert = async (
317
317
  ')VALUES' +
318
318
  slice(
319
319
  strRepeat(
320
- `,(?${strRepeat(',?', arrayLength(changingColumnNames))})`,
321
- arrayLength(args) / (arrayLength(changingColumnNames) + 1),
320
+ `,(?${strRepeat(',?', size(changingColumnNames))})`,
321
+ size(args) / (size(changingColumnNames) + 1),
322
322
  ),
323
323
  1,
324
324
  ) +
@@ -15,12 +15,12 @@ const ifNotUndefined = (value, then, otherwise) =>
15
15
  const isString = (thing) => getTypeOf(thing) == STRING;
16
16
  const isArray = (thing) => Array.isArray(thing);
17
17
  const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
18
+ const size = (arrayOrString) => arrayOrString.length;
18
19
  const promiseAll = async (promises) => promise.all(promises);
19
20
 
20
21
  const arrayJoin = (array, sep = EMPTY_STRING) => array.join(sep);
21
22
  const arrayMap = (array, cb) => array.map(cb);
22
- const arrayLength = (array) => array.length;
23
- const arrayIsEmpty = (array) => arrayLength(array) == 0;
23
+ const arrayIsEmpty = (array) => size(array) == 0;
24
24
  const arrayFilter = (array, cb) => array.filter(cb);
25
25
  const arrayPush = (array, ...values) => array.push(...values);
26
26
  const arrayShift = (array) => array.shift();
@@ -46,7 +46,7 @@ const objDel = (obj, id) => {
46
46
  const objMap = (obj, cb) =>
47
47
  arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
48
48
  const objValues = (obj) => object.values(obj);
49
- const objSize = (obj) => arrayLength(objIds(obj));
49
+ const objSize = (obj) => size(objIds(obj));
50
50
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
51
51
 
52
52
  const mapNew = (entries) => new Map(entries);
@@ -317,8 +317,8 @@ const upsert = async (
317
317
  ')VALUES' +
318
318
  slice(
319
319
  strRepeat(
320
- `,(?${strRepeat(',?', arrayLength(changingColumnNames))})`,
321
- arrayLength(args) / (arrayLength(changingColumnNames) + 1),
320
+ `,(?${strRepeat(',?', size(changingColumnNames))})`,
321
+ size(args) / (size(changingColumnNames) + 1),
322
322
  ),
323
323
  1,
324
324
  ) +
@@ -7,8 +7,8 @@ const isInstanceOf = (thing, cls) => thing instanceof cls;
7
7
  const isUndefined = (thing) => thing == void 0;
8
8
  const ifNotUndefined = (value, then, otherwise) =>
9
9
  isUndefined(value) ? otherwise?.() : then(value);
10
+ const size = (arrayOrString) => arrayOrString.length;
10
11
 
11
- const arrayLength = (array) => array.length;
12
12
  const arrayPush = (array, ...values) => array.push(...values);
13
13
  const arrayShift = (array) => array.shift();
14
14
 
@@ -17,7 +17,7 @@ const objIds = object.keys;
17
17
  const objFreeze = object.freeze;
18
18
  const isObject = (obj) =>
19
19
  isInstanceOf(obj, object) && obj.constructor == object;
20
- const objSize = (obj) => arrayLength(objIds(obj));
20
+ const objSize = (obj) => size(objIds(obj));
21
21
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
22
22
 
23
23
  const jsonString = (obj) =>
@@ -1,11 +1,6 @@
1
1
  const T = 't';
2
2
  const V = 'v';
3
3
 
4
- const arrayMap = (array, cb) => array.map(cb);
5
- const arrayLength = (array) => array.length;
6
- const arrayPush = (array, ...values) => array.push(...values);
7
- const arrayShift = (array) => array.shift();
8
-
9
4
  const promise = Promise;
10
5
  const startInterval = setInterval;
11
6
  const stopInterval = clearInterval;
@@ -13,9 +8,14 @@ const isInstanceOf = (thing, cls) => thing instanceof cls;
13
8
  const isUndefined = (thing) => thing == void 0;
14
9
  const ifNotUndefined = (value, then, otherwise) =>
15
10
  isUndefined(value) ? otherwise?.() : then(value);
11
+ const size = (arrayOrString) => arrayOrString.length;
16
12
  const promiseNew = (resolver) => new promise(resolver);
17
13
  const promiseAll = async (promises) => promise.all(promises);
18
14
 
15
+ const arrayMap = (array, cb) => array.map(cb);
16
+ const arrayPush = (array, ...values) => array.push(...values);
17
+ const arrayShift = (array) => array.shift();
18
+
19
19
  const object = Object;
20
20
  const objIds = object.keys;
21
21
  const objFreeze = object.freeze;
@@ -26,7 +26,7 @@ const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
26
26
  const objHas = (obj, id) => !isUndefined(objGet(obj, id));
27
27
  const objMap = (obj, cb) =>
28
28
  arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
29
- const objSize = (obj) => arrayLength(objIds(obj));
29
+ const objSize = (obj) => size(objIds(obj));
30
30
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
31
31
 
32
32
  const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
@@ -8,8 +8,8 @@ const ifNotUndefined = (value, then, otherwise) =>
8
8
  isUndefined(value) ? otherwise?.() : then(value);
9
9
  const isString = (thing) => getTypeOf(thing) == STRING;
10
10
  const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
11
+ const size = (arrayOrString) => arrayOrString.length;
11
12
 
12
- const arrayLength = (array) => array.length;
13
13
  const arrayPush = (array, ...values) => array.push(...values);
14
14
  const arrayShift = (array) => array.shift();
15
15
 
@@ -18,7 +18,7 @@ const objIds = object.keys;
18
18
  const objFreeze = object.freeze;
19
19
  const isObject = (obj) =>
20
20
  isInstanceOf(obj, object) && obj.constructor == object;
21
- const objSize = (obj) => arrayLength(objIds(obj));
21
+ const objSize = (obj) => size(objIds(obj));
22
22
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
23
23
 
24
24
  const jsonString = (obj) =>
@@ -191,22 +191,32 @@ const createCustomPersister = (
191
191
  };
192
192
 
193
193
  const MESSAGE = 'message';
194
+ const DEFAULT_CONFIG = {
195
+ storeProtocol: 'https',
196
+ storePath: STORE_PATH,
197
+ };
194
198
  const createPartyKitPersister = (
195
199
  store,
196
200
  connection,
197
- storeUrlProtocol = 'https',
201
+ configOrStoreProtocol,
198
202
  onIgnoredError,
199
203
  ) => {
200
204
  const {host, room} = connection.partySocketOptions;
205
+ const {storeProtocol, storePath} = {
206
+ ...DEFAULT_CONFIG,
207
+ ...(isString(configOrStoreProtocol)
208
+ ? {storeProtocol: configOrStoreProtocol}
209
+ : configOrStoreProtocol),
210
+ };
201
211
  const storeUrl =
202
- storeUrlProtocol +
212
+ storeProtocol +
203
213
  '://' +
204
214
  host +
205
215
  '/parties/' +
206
216
  (connection.name ?? 'main') +
207
217
  '/' +
208
218
  room +
209
- STORE_PATH;
219
+ storePath;
210
220
  const getOrSetStore = async (content) =>
211
221
  await (
212
222
  await fetch(storeUrl, {
@@ -11,12 +11,12 @@ const ifNotUndefined = (value, then, otherwise) =>
11
11
  isUndefined(value) ? otherwise?.() : then(value);
12
12
  const isString = (thing) => getTypeOf(thing) == STRING;
13
13
  const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
14
+ const size = (arrayOrString) => arrayOrString.length;
14
15
  const promiseAll = async (promises) => promise.all(promises);
15
16
 
16
17
  const arrayEvery = (array, cb) => array.every(cb);
17
18
  const arrayMap = (array, cb) => array.map(cb);
18
- const arrayLength = (array) => array.length;
19
- const arrayIsEmpty = (array) => arrayLength(array) == 0;
19
+ const arrayIsEmpty = (array) => size(array) == 0;
20
20
  const arrayPush = (array, ...values) => array.push(...values);
21
21
  const arrayUnshift = (array, ...values) => array.unshift(...values);
22
22
 
@@ -55,52 +55,59 @@ const mapForEach = (map, cb) =>
55
55
  collForEach(map, (value, key) => cb(key, value));
56
56
 
57
57
  const HAS_STORE = 'hasStore';
58
- const CORS_HEADERS = objNew(
58
+ const RESPONSE_HEADERS = objNew(
59
59
  arrayMap(['Origin', 'Methods', 'Headers'], (suffix) => [
60
60
  'Access-Control-Allow-' + suffix,
61
61
  '*',
62
62
  ]),
63
63
  );
64
- const hasStoreInStorage = async (storage) => await storage.get(HAS_STORE);
65
- const loadStoreFromStorage = async (storage) => {
64
+ const hasStoreInStorage = async (storage, prefix) =>
65
+ await storage.get(prefix + HAS_STORE);
66
+ const loadStoreFromStorage = async (storage, prefix) => {
66
67
  const tables = {};
67
68
  const values = {};
68
69
  mapForEach(await storage.list(), (key, cellOrValue) => {
69
- const [type, ids] = deconstructMessage(key);
70
- if (type == T) {
71
- const [tableId, rowId, cellId] = jsonParse('[' + ids + ']');
72
- objEnsure(objEnsure(tables, tableId, objNew), rowId, objNew)[cellId] =
73
- cellOrValue;
74
- } else if (type == V) {
75
- values[ids] = cellOrValue;
70
+ if (key.startsWith(prefix)) {
71
+ key = slice(key, size(prefix));
72
+ const [type, ids] = deconstructMessage(key);
73
+ if (type == T) {
74
+ const [tableId, rowId, cellId] = jsonParse('[' + ids + ']');
75
+ objEnsure(objEnsure(tables, tableId, objNew), rowId, objNew)[cellId] =
76
+ cellOrValue;
77
+ } else if (type == V) {
78
+ values[ids] = cellOrValue;
79
+ }
76
80
  }
77
81
  });
78
82
  return [tables, values];
79
83
  };
80
- const saveStoreToStorage = async (storage, transactionChanges) => {
81
- const promises = [storage.put(HAS_STORE, 1)];
84
+ const saveStoreToStorage = async (storage, prefix, transactionChanges) => {
85
+ const promises = [storage.put(prefix + HAS_STORE, 1)];
82
86
  const keyPrefixesToDelete = [];
83
87
  objMap(transactionChanges[0], (table, tableId) =>
84
88
  isUndefined(table)
85
- ? arrayUnshift(keyPrefixesToDelete, getStoreStorageKey(T, tableId))
89
+ ? arrayUnshift(
90
+ keyPrefixesToDelete,
91
+ prefix + getStoreStorageKey(T, tableId),
92
+ )
86
93
  : objMap(table, (row, rowId) =>
87
94
  isUndefined(row)
88
95
  ? arrayPush(
89
96
  keyPrefixesToDelete,
90
- getStoreStorageKey(T, tableId, rowId),
97
+ prefix + getStoreStorageKey(T, tableId, rowId),
91
98
  )
92
99
  : objMap(row, (cell, cellId) =>
93
100
  promiseToSetOrDelStorage(
94
101
  promises,
95
102
  storage,
96
- getStoreStorageKey(T, tableId, rowId, cellId),
103
+ prefix + getStoreStorageKey(T, tableId, rowId, cellId),
97
104
  cell,
98
105
  ),
99
106
  ),
100
107
  ),
101
108
  );
102
109
  objMap(transactionChanges[1], (value, valueId) =>
103
- promiseToSetOrDelStorage(promises, storage, V + valueId, value),
110
+ promiseToSetOrDelStorage(promises, storage, prefix + V + valueId, value),
104
111
  );
105
112
  if (!arrayIsEmpty(keyPrefixesToDelete)) {
106
113
  mapForEach(await storage.list(), (key) =>
@@ -121,38 +128,45 @@ const promiseToSetOrDelStorage = (promises, storage, key, value) =>
121
128
  promises,
122
129
  isUndefined(value) ? storage.delete(key) : storage.put(key, value),
123
130
  );
124
- const newResponse = (status, body = null) =>
125
- new Response(body, {status, headers: CORS_HEADERS});
126
131
  class TinyBasePartyKitServer {
127
132
  constructor(party) {
128
133
  this.party = party;
134
+ this.config = {};
135
+ this.createResponse = (status, body = null) =>
136
+ new Response(body, {
137
+ status,
138
+ headers: this.config.responseHeaders ?? RESPONSE_HEADERS,
139
+ });
129
140
  }
130
141
  async onRequest(request) {
131
142
  const storage = this.party.storage;
132
- if (request.url.endsWith(STORE_PATH)) {
133
- const hasStore = await hasStoreInStorage(storage);
143
+ const prefix = this.config.storagePrefix ?? EMPTY_STRING;
144
+ const storePath = this.config.storePath ?? STORE_PATH;
145
+ if (new URL(request.url).pathname.endsWith(storePath)) {
146
+ const hasStore = await hasStoreInStorage(storage, prefix);
134
147
  const text = await request.text();
135
148
  if (request.method == PUT) {
136
149
  if (hasStore) {
137
- return newResponse(205);
150
+ return this.createResponse(205);
138
151
  }
139
- await saveStoreToStorage(this.party.storage, jsonParse(text));
140
- return newResponse(201);
152
+ await saveStoreToStorage(storage, prefix, jsonParse(text));
153
+ return this.createResponse(201);
141
154
  }
142
- return newResponse(
155
+ return this.createResponse(
143
156
  200,
144
157
  hasStore
145
- ? jsonString(await loadStoreFromStorage(storage))
158
+ ? jsonString(await loadStoreFromStorage(storage, prefix))
146
159
  : EMPTY_STRING,
147
160
  );
148
161
  }
149
- return newResponse(404);
162
+ return this.createResponse(404);
150
163
  }
151
164
  async onMessage(message, client) {
152
165
  const storage = this.party.storage;
166
+ const prefix = this.config.storagePrefix ?? EMPTY_STRING;
153
167
  const [type, payload] = deconstructMessage(message, 1);
154
- if (type == SET_CHANGES && (await hasStoreInStorage(storage))) {
155
- await saveStoreToStorage(storage, payload);
168
+ if (type == SET_CHANGES && (await hasStoreInStorage(storage, prefix))) {
169
+ await saveStoreToStorage(storage, prefix, payload);
156
170
  this.party.broadcast(constructMessage(SET_CHANGES, payload), [client.id]);
157
171
  }
158
172
  }
@@ -4,8 +4,8 @@ const isInstanceOf = (thing, cls) => thing instanceof cls;
4
4
  const isUndefined = (thing) => thing == void 0;
5
5
  const ifNotUndefined = (value, then, otherwise) =>
6
6
  isUndefined(value) ? otherwise?.() : then(value);
7
+ const size = (arrayOrString) => arrayOrString.length;
7
8
 
8
- const arrayLength = (array) => array.length;
9
9
  const arrayPush = (array, ...values) => array.push(...values);
10
10
  const arrayShift = (array) => array.shift();
11
11
 
@@ -14,7 +14,7 @@ const objIds = object.keys;
14
14
  const objFreeze = object.freeze;
15
15
  const isObject = (obj) =>
16
16
  isInstanceOf(obj, object) && obj.constructor == object;
17
- const objSize = (obj) => arrayLength(objIds(obj));
17
+ const objSize = (obj) => size(objIds(obj));
18
18
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
19
19
 
20
20
  const jsonString = (obj) =>
@@ -15,12 +15,12 @@ const ifNotUndefined = (value, then, otherwise) =>
15
15
  const isString = (thing) => getTypeOf(thing) == STRING;
16
16
  const isArray = (thing) => Array.isArray(thing);
17
17
  const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
18
+ const size = (arrayOrString) => arrayOrString.length;
18
19
  const promiseAll = async (promises) => promise.all(promises);
19
20
 
20
21
  const arrayJoin = (array, sep = EMPTY_STRING) => array.join(sep);
21
22
  const arrayMap = (array, cb) => array.map(cb);
22
- const arrayLength = (array) => array.length;
23
- const arrayIsEmpty = (array) => arrayLength(array) == 0;
23
+ const arrayIsEmpty = (array) => size(array) == 0;
24
24
  const arrayFilter = (array, cb) => array.filter(cb);
25
25
  const arrayPush = (array, ...values) => array.push(...values);
26
26
  const arrayShift = (array) => array.shift();
@@ -46,7 +46,7 @@ const objDel = (obj, id) => {
46
46
  const objMap = (obj, cb) =>
47
47
  arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
48
48
  const objValues = (obj) => object.values(obj);
49
- const objSize = (obj) => arrayLength(objIds(obj));
49
+ const objSize = (obj) => size(objIds(obj));
50
50
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
51
51
 
52
52
  const mapNew = (entries) => new Map(entries);
@@ -317,8 +317,8 @@ const upsert = async (
317
317
  ')VALUES' +
318
318
  slice(
319
319
  strRepeat(
320
- `,(?${strRepeat(',?', arrayLength(changingColumnNames))})`,
321
- arrayLength(args) / (arrayLength(changingColumnNames) + 1),
320
+ `,(?${strRepeat(',?', size(changingColumnNames))})`,
321
+ size(args) / (size(changingColumnNames) + 1),
322
322
  ),
323
323
  1,
324
324
  ) +