tinybase 5.0.0-beta.0 → 5.0.0-beta.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 (284) hide show
  1. package/bin/cli.js +1 -1
  2. package/lib/checkpoints.js +1 -1
  3. package/lib/checkpoints.js.gz +0 -0
  4. package/lib/cjs/checkpoints.cjs +1 -1
  5. package/lib/cjs/checkpoints.cjs.gz +0 -0
  6. package/lib/cjs/indexes.cjs +1 -1
  7. package/lib/cjs/indexes.cjs.gz +0 -0
  8. package/lib/cjs/metrics.cjs +1 -1
  9. package/lib/cjs/metrics.cjs.gz +0 -0
  10. package/lib/cjs/persisters/persister-automerge.cjs +1 -1
  11. package/lib/cjs/persisters/persister-automerge.cjs.gz +0 -0
  12. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  13. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  14. package/lib/cjs/persisters/persister-electric-sql.cjs +1 -1
  15. package/lib/cjs/persisters/persister-electric-sql.cjs.gz +0 -0
  16. package/lib/cjs/persisters/persister-expo-sqlite-next.cjs +1 -1
  17. package/lib/cjs/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  18. package/lib/cjs/persisters/persister-expo-sqlite.cjs +1 -1
  19. package/lib/cjs/persisters/persister-expo-sqlite.cjs.gz +0 -0
  20. package/lib/cjs/persisters/persister-indexed-db.cjs +1 -1
  21. package/lib/cjs/persisters/persister-indexed-db.cjs.gz +0 -0
  22. package/lib/cjs/persisters/persister-partykit-server.cjs +1 -1
  23. package/lib/cjs/persisters/persister-partykit-server.cjs.gz +0 -0
  24. package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -1
  25. package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  26. package/lib/cjs/persisters/persister-sqlite3.cjs +1 -1
  27. package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
  28. package/lib/cjs/persisters/persister-yjs.cjs +1 -1
  29. package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
  30. package/lib/cjs/queries.cjs +1 -1
  31. package/lib/cjs/queries.cjs.gz +0 -0
  32. package/lib/cjs/relationships.cjs +1 -1
  33. package/lib/cjs/relationships.cjs.gz +0 -0
  34. package/lib/cjs/store.cjs +1 -1
  35. package/lib/cjs/store.cjs.gz +0 -0
  36. package/lib/cjs/tinybase.cjs +1 -1
  37. package/lib/cjs/tinybase.cjs.gz +0 -0
  38. package/lib/cjs/tools.cjs +1 -1
  39. package/lib/cjs/tools.cjs.gz +0 -0
  40. package/lib/cjs/ui-react-dom-debug.cjs +1 -1
  41. package/lib/cjs/ui-react-dom-debug.cjs.gz +0 -0
  42. package/lib/cjs/ui-react-dom.cjs +1 -1
  43. package/lib/cjs/ui-react-dom.cjs.gz +0 -0
  44. package/lib/cjs/ui-react.cjs +1 -1
  45. package/lib/cjs/ui-react.cjs.gz +0 -0
  46. package/lib/cjs-es6/checkpoints.cjs +1 -1
  47. package/lib/cjs-es6/checkpoints.cjs.gz +0 -0
  48. package/lib/cjs-es6/indexes.cjs +1 -1
  49. package/lib/cjs-es6/indexes.cjs.gz +0 -0
  50. package/lib/cjs-es6/metrics.cjs +1 -1
  51. package/lib/cjs-es6/metrics.cjs.gz +0 -0
  52. package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -1
  53. package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
  54. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  55. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  56. package/lib/cjs-es6/persisters/persister-electric-sql.cjs +1 -1
  57. package/lib/cjs-es6/persisters/persister-electric-sql.cjs.gz +0 -0
  58. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs +1 -1
  59. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  60. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -1
  61. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
  62. package/lib/cjs-es6/persisters/persister-indexed-db.cjs +1 -1
  63. package/lib/cjs-es6/persisters/persister-indexed-db.cjs.gz +0 -0
  64. package/lib/cjs-es6/persisters/persister-partykit-server.cjs +1 -1
  65. package/lib/cjs-es6/persisters/persister-partykit-server.cjs.gz +0 -0
  66. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -1
  67. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  68. package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -1
  69. package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
  70. package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -1
  71. package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
  72. package/lib/cjs-es6/queries.cjs +1 -1
  73. package/lib/cjs-es6/queries.cjs.gz +0 -0
  74. package/lib/cjs-es6/relationships.cjs +1 -1
  75. package/lib/cjs-es6/relationships.cjs.gz +0 -0
  76. package/lib/cjs-es6/store.cjs +1 -1
  77. package/lib/cjs-es6/store.cjs.gz +0 -0
  78. package/lib/cjs-es6/tinybase.cjs +1 -1
  79. package/lib/cjs-es6/tinybase.cjs.gz +0 -0
  80. package/lib/cjs-es6/tools.cjs +1 -1
  81. package/lib/cjs-es6/tools.cjs.gz +0 -0
  82. package/lib/cjs-es6/ui-react-dom-debug.cjs +1 -1
  83. package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
  84. package/lib/cjs-es6/ui-react-dom.cjs +1 -1
  85. package/lib/cjs-es6/ui-react-dom.cjs.gz +0 -0
  86. package/lib/cjs-es6/ui-react.cjs +1 -1
  87. package/lib/cjs-es6/ui-react.cjs.gz +0 -0
  88. package/lib/debug/checkpoints.js +251 -234
  89. package/lib/debug/indexes.js +7 -5
  90. package/lib/debug/metrics.js +7 -5
  91. package/lib/debug/persisters/persister-automerge.js +3 -1
  92. package/lib/debug/persisters/persister-browser.js +1 -0
  93. package/lib/debug/persisters/persister-cr-sqlite-wasm.js +10 -6
  94. package/lib/debug/persisters/persister-electric-sql.js +11 -6
  95. package/lib/debug/persisters/persister-expo-sqlite-next.js +11 -7
  96. package/lib/debug/persisters/persister-expo-sqlite.js +10 -6
  97. package/lib/debug/persisters/persister-file.js +1 -0
  98. package/lib/debug/persisters/persister-indexed-db.js +4 -1
  99. package/lib/debug/persisters/persister-partykit-client.js +1 -0
  100. package/lib/debug/persisters/persister-partykit-server.js +2 -1
  101. package/lib/debug/persisters/persister-remote.js +1 -0
  102. package/lib/debug/persisters/persister-sqlite-wasm.js +10 -6
  103. package/lib/debug/persisters/persister-sqlite3.js +10 -6
  104. package/lib/debug/persisters/persister-yjs.js +3 -1
  105. package/lib/debug/persisters.js +1 -0
  106. package/lib/debug/queries.js +9 -6
  107. package/lib/debug/relationships.js +7 -5
  108. package/lib/debug/store.js +3 -1
  109. package/lib/debug/tinybase.js +254 -235
  110. package/lib/debug/tools.js +19 -43
  111. package/lib/debug/ui-react-dom.js +3 -1
  112. package/lib/debug/ui-react.js +166 -200
  113. package/lib/es6/checkpoints.js +1 -1
  114. package/lib/es6/checkpoints.js.gz +0 -0
  115. package/lib/es6/indexes.js +1 -1
  116. package/lib/es6/indexes.js.gz +0 -0
  117. package/lib/es6/metrics.js +1 -1
  118. package/lib/es6/metrics.js.gz +0 -0
  119. package/lib/es6/persisters/persister-automerge.js +1 -1
  120. package/lib/es6/persisters/persister-automerge.js.gz +0 -0
  121. package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  122. package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  123. package/lib/es6/persisters/persister-electric-sql.js +1 -1
  124. package/lib/es6/persisters/persister-electric-sql.js.gz +0 -0
  125. package/lib/es6/persisters/persister-expo-sqlite-next.js +1 -1
  126. package/lib/es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  127. package/lib/es6/persisters/persister-expo-sqlite.js +1 -1
  128. package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
  129. package/lib/es6/persisters/persister-indexed-db.js +1 -1
  130. package/lib/es6/persisters/persister-indexed-db.js.gz +0 -0
  131. package/lib/es6/persisters/persister-partykit-server.js +1 -1
  132. package/lib/es6/persisters/persister-partykit-server.js.gz +0 -0
  133. package/lib/es6/persisters/persister-sqlite-wasm.js +1 -1
  134. package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  135. package/lib/es6/persisters/persister-sqlite3.js +1 -1
  136. package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
  137. package/lib/es6/persisters/persister-yjs.js +1 -1
  138. package/lib/es6/persisters/persister-yjs.js.gz +0 -0
  139. package/lib/es6/queries.js +1 -1
  140. package/lib/es6/queries.js.gz +0 -0
  141. package/lib/es6/relationships.js +1 -1
  142. package/lib/es6/relationships.js.gz +0 -0
  143. package/lib/es6/store.js +1 -1
  144. package/lib/es6/store.js.gz +0 -0
  145. package/lib/es6/tinybase.js +1 -1
  146. package/lib/es6/tinybase.js.gz +0 -0
  147. package/lib/es6/tools.js +1 -1
  148. package/lib/es6/tools.js.gz +0 -0
  149. package/lib/es6/ui-react-dom-debug.js +1 -1
  150. package/lib/es6/ui-react-dom-debug.js.gz +0 -0
  151. package/lib/es6/ui-react-dom.js +1 -1
  152. package/lib/es6/ui-react-dom.js.gz +0 -0
  153. package/lib/es6/ui-react.js +1 -1
  154. package/lib/es6/ui-react.js.gz +0 -0
  155. package/lib/indexes.js +1 -1
  156. package/lib/indexes.js.gz +0 -0
  157. package/lib/metrics.js +1 -1
  158. package/lib/metrics.js.gz +0 -0
  159. package/lib/persisters/persister-automerge.js +1 -1
  160. package/lib/persisters/persister-automerge.js.gz +0 -0
  161. package/lib/persisters/persister-cr-sqlite-wasm.js +1 -1
  162. package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  163. package/lib/persisters/persister-electric-sql.js +1 -1
  164. package/lib/persisters/persister-electric-sql.js.gz +0 -0
  165. package/lib/persisters/persister-expo-sqlite-next.js +1 -1
  166. package/lib/persisters/persister-expo-sqlite-next.js.gz +0 -0
  167. package/lib/persisters/persister-expo-sqlite.js +1 -1
  168. package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
  169. package/lib/persisters/persister-indexed-db.js +1 -1
  170. package/lib/persisters/persister-indexed-db.js.gz +0 -0
  171. package/lib/persisters/persister-partykit-server.js +1 -1
  172. package/lib/persisters/persister-partykit-server.js.gz +0 -0
  173. package/lib/persisters/persister-sqlite-wasm.js +1 -1
  174. package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
  175. package/lib/persisters/persister-sqlite3.js +1 -1
  176. package/lib/persisters/persister-sqlite3.js.gz +0 -0
  177. package/lib/persisters/persister-yjs.js +1 -1
  178. package/lib/persisters/persister-yjs.js.gz +0 -0
  179. package/lib/queries.js +1 -1
  180. package/lib/queries.js.gz +0 -0
  181. package/lib/relationships.js +1 -1
  182. package/lib/relationships.js.gz +0 -0
  183. package/lib/store.js +1 -1
  184. package/lib/store.js.gz +0 -0
  185. package/lib/tinybase.js +1 -1
  186. package/lib/tinybase.js.gz +0 -0
  187. package/lib/tools.js +1 -1
  188. package/lib/tools.js.gz +0 -0
  189. package/lib/types/persisters/persister-expo-sqlite-next.d.ts +3 -3
  190. package/lib/types/ui-react.d.ts +77 -88
  191. package/lib/types/with-schemas/internal/queries.d.ts +4 -3
  192. package/lib/types/with-schemas/internal/store.d.ts +4 -3
  193. package/lib/types/with-schemas/persisters/persister-expo-sqlite-next.d.ts +4 -4
  194. package/lib/types/with-schemas/ui-react.d.ts +84 -95
  195. package/lib/ui-react-dom.js +1 -1
  196. package/lib/ui-react-dom.js.gz +0 -0
  197. package/lib/ui-react.js +1 -1
  198. package/lib/ui-react.js.gz +0 -0
  199. package/lib/umd/checkpoints.js +1 -1
  200. package/lib/umd/checkpoints.js.gz +0 -0
  201. package/lib/umd/indexes.js +1 -1
  202. package/lib/umd/indexes.js.gz +0 -0
  203. package/lib/umd/metrics.js +1 -1
  204. package/lib/umd/metrics.js.gz +0 -0
  205. package/lib/umd/persisters/persister-automerge.js +1 -1
  206. package/lib/umd/persisters/persister-automerge.js.gz +0 -0
  207. package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
  208. package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  209. package/lib/umd/persisters/persister-electric-sql.js +1 -1
  210. package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
  211. package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -1
  212. package/lib/umd/persisters/persister-expo-sqlite-next.js.gz +0 -0
  213. package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
  214. package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
  215. package/lib/umd/persisters/persister-indexed-db.js +1 -1
  216. package/lib/umd/persisters/persister-indexed-db.js.gz +0 -0
  217. package/lib/umd/persisters/persister-partykit-server.js +1 -1
  218. package/lib/umd/persisters/persister-partykit-server.js.gz +0 -0
  219. package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
  220. package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
  221. package/lib/umd/persisters/persister-sqlite3.js +1 -1
  222. package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
  223. package/lib/umd/persisters/persister-yjs.js +1 -1
  224. package/lib/umd/persisters/persister-yjs.js.gz +0 -0
  225. package/lib/umd/queries.js +1 -1
  226. package/lib/umd/queries.js.gz +0 -0
  227. package/lib/umd/relationships.js +1 -1
  228. package/lib/umd/relationships.js.gz +0 -0
  229. package/lib/umd/store.js +1 -1
  230. package/lib/umd/store.js.gz +0 -0
  231. package/lib/umd/tinybase.js +1 -1
  232. package/lib/umd/tinybase.js.gz +0 -0
  233. package/lib/umd/tools.js +1 -1
  234. package/lib/umd/tools.js.gz +0 -0
  235. package/lib/umd/ui-react-dom-debug.js +1 -1
  236. package/lib/umd/ui-react-dom-debug.js.gz +0 -0
  237. package/lib/umd/ui-react-dom.js +1 -1
  238. package/lib/umd/ui-react-dom.js.gz +0 -0
  239. package/lib/umd/ui-react.js +1 -1
  240. package/lib/umd/ui-react.js.gz +0 -0
  241. package/lib/umd-es6/checkpoints.js +1 -1
  242. package/lib/umd-es6/checkpoints.js.gz +0 -0
  243. package/lib/umd-es6/indexes.js +1 -1
  244. package/lib/umd-es6/indexes.js.gz +0 -0
  245. package/lib/umd-es6/metrics.js +1 -1
  246. package/lib/umd-es6/metrics.js.gz +0 -0
  247. package/lib/umd-es6/persisters/persister-automerge.js +1 -1
  248. package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
  249. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  250. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  251. package/lib/umd-es6/persisters/persister-electric-sql.js +1 -1
  252. package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
  253. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -1
  254. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  255. package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
  256. package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
  257. package/lib/umd-es6/persisters/persister-indexed-db.js +1 -1
  258. package/lib/umd-es6/persisters/persister-indexed-db.js.gz +0 -0
  259. package/lib/umd-es6/persisters/persister-partykit-server.js +1 -1
  260. package/lib/umd-es6/persisters/persister-partykit-server.js.gz +0 -0
  261. package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
  262. package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  263. package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
  264. package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
  265. package/lib/umd-es6/persisters/persister-yjs.js +1 -1
  266. package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
  267. package/lib/umd-es6/queries.js +1 -1
  268. package/lib/umd-es6/queries.js.gz +0 -0
  269. package/lib/umd-es6/relationships.js +1 -1
  270. package/lib/umd-es6/relationships.js.gz +0 -0
  271. package/lib/umd-es6/store.js +1 -1
  272. package/lib/umd-es6/store.js.gz +0 -0
  273. package/lib/umd-es6/tinybase.js +1 -1
  274. package/lib/umd-es6/tinybase.js.gz +0 -0
  275. package/lib/umd-es6/tools.js +1 -1
  276. package/lib/umd-es6/tools.js.gz +0 -0
  277. package/lib/umd-es6/ui-react-dom-debug.js +1 -1
  278. package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
  279. package/lib/umd-es6/ui-react-dom.js +1 -1
  280. package/lib/umd-es6/ui-react-dom.js.gz +0 -0
  281. package/lib/umd-es6/ui-react.js +1 -1
  282. package/lib/umd-es6/ui-react.js.gz +0 -0
  283. package/package.json +21 -21
  284. package/readme.md +2 -2
@@ -70,6 +70,7 @@ const arrayShift = (array) => array.shift();
70
70
 
71
71
  const object = Object;
72
72
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
73
+ const objEntries = object.entries;
73
74
  const objIds = object.keys;
74
75
  const objFrozen = object.isFrozen;
75
76
  const objFreeze = object.freeze;
@@ -80,6 +81,7 @@ const isObject = (obj) =>
80
81
  (objPrototype) =>
81
82
  objPrototype == object.prototype ||
82
83
  isUndefined(getPrototypeOf(objPrototype)),
84
+ /* istanbul ignore next */
83
85
  () => true,
84
86
  );
85
87
  const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
@@ -89,7 +91,7 @@ const objDel = (obj, id) => {
89
91
  return obj;
90
92
  };
91
93
  const objMap = (obj, cb) =>
92
- arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
94
+ arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
93
95
  const objSize = (obj) => size(objIds(obj));
94
96
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
95
97
 
@@ -356,13 +358,15 @@ const getRowCellFunction = (getRowCell, defaultCellValue) =>
356
358
  isString(getRowCell)
357
359
  ? (getCell) => getCell(getRowCell)
358
360
  : getRowCell ?? (() => defaultCellValue ?? EMPTY_STRING);
359
- const getCreateFunction = (getFunction) => {
360
- const getFunctionsByStore = /* @__PURE__ */ new WeakMap();
361
+ const getCreateFunction = (getFunction, initFunction) => {
362
+ const thingsByStore = /* @__PURE__ */ new WeakMap();
361
363
  return (store) => {
362
- if (!getFunctionsByStore.has(store)) {
363
- getFunctionsByStore.set(store, getFunction(store));
364
+ if (!thingsByStore.has(store)) {
365
+ thingsByStore.set(store, getFunction(store));
364
366
  }
365
- return getFunctionsByStore.get(store);
367
+ const thing = thingsByStore.get(store);
368
+ initFunction?.(thing);
369
+ return thing;
366
370
  };
367
371
  };
368
372
 
@@ -450,241 +454,256 @@ const getListenerFunctions = (getThing) => {
450
454
  return [addListener, callListeners, delListener, callListener];
451
455
  };
452
456
 
453
- const createCheckpoints = getCreateFunction((store) => {
454
- let backwardIdsSize = 100;
455
- let currentId;
456
- let cellsDelta = mapNew();
457
- let valuesDelta = mapNew();
458
- let listening = 1;
459
- let nextCheckpointId;
460
- let checkpointsChanged;
461
- const checkpointIdsListeners = mapNew();
462
- const checkpointListeners = mapNew();
463
- const [addListener, callListeners, delListenerImpl] = getListenerFunctions(
464
- () => checkpoints,
465
- );
466
- const deltas = mapNew();
467
- const labels = mapNew();
468
- const backwardIds = [];
469
- const forwardIds = [];
470
- const updateStore = (oldOrNew, checkpointId) => {
471
- listening = 0;
472
- store.transaction(() => {
473
- const [cellsDelta2, valuesDelta2] = mapGet(deltas, checkpointId);
474
- collForEach(cellsDelta2, (table, tableId) =>
475
- collForEach(table, (row, rowId) =>
476
- collForEach(row, (oldNew, cellId) =>
477
- setOrDelCell(store, tableId, rowId, cellId, oldNew[oldOrNew]),
457
+ const createCheckpoints = getCreateFunction(
458
+ (store) => {
459
+ let backwardIdsSize = 100;
460
+ let currentId;
461
+ let cellsDelta = mapNew();
462
+ let valuesDelta = mapNew();
463
+ let listening = 1;
464
+ let nextCheckpointId;
465
+ let checkpointsChanged;
466
+ const checkpointIdsListeners = mapNew();
467
+ const checkpointListeners = mapNew();
468
+ const [addListener, callListeners, delListenerImpl] = getListenerFunctions(
469
+ () => checkpoints,
470
+ );
471
+ const deltas = mapNew();
472
+ const labels = mapNew();
473
+ const backwardIds = [];
474
+ const forwardIds = [];
475
+ const updateStore = (oldOrNew, checkpointId) => {
476
+ listening = 0;
477
+ store.transaction(() => {
478
+ const [cellsDelta2, valuesDelta2] = mapGet(deltas, checkpointId);
479
+ collForEach(cellsDelta2, (table, tableId) =>
480
+ collForEach(table, (row, rowId) =>
481
+ collForEach(row, (oldNew, cellId) =>
482
+ setOrDelCell(store, tableId, rowId, cellId, oldNew[oldOrNew]),
483
+ ),
478
484
  ),
479
- ),
480
- );
481
- collForEach(valuesDelta2, (oldNew, valueId) =>
482
- setOrDelValue(store, valueId, oldNew[oldOrNew]),
485
+ );
486
+ collForEach(valuesDelta2, (oldNew, valueId) =>
487
+ setOrDelValue(store, valueId, oldNew[oldOrNew]),
488
+ );
489
+ });
490
+ listening = 1;
491
+ };
492
+ const clearCheckpointId = (checkpointId) => {
493
+ mapSet(deltas, checkpointId);
494
+ mapSet(labels, checkpointId);
495
+ callListeners(checkpointListeners, [checkpointId]);
496
+ };
497
+ const clearCheckpointIds = (checkpointIds, to) =>
498
+ arrayForEach(
499
+ arrayClear(checkpointIds, to ?? size(checkpointIds)),
500
+ clearCheckpointId,
483
501
  );
484
- });
485
- listening = 1;
486
- };
487
- const clearCheckpointId = (checkpointId) => {
488
- mapSet(deltas, checkpointId);
489
- mapSet(labels, checkpointId);
490
- callListeners(checkpointListeners, [checkpointId]);
491
- };
492
- const clearCheckpointIds = (checkpointIds, to) =>
493
- arrayForEach(
494
- arrayClear(checkpointIds, to ?? size(checkpointIds)),
495
- clearCheckpointId,
496
- );
497
- const trimBackwardsIds = () =>
498
- clearCheckpointIds(backwardIds, size(backwardIds) - backwardIdsSize);
499
- const storeChanged = () =>
500
- ifNotUndefined(currentId, () => {
501
- arrayPush(backwardIds, currentId);
502
- trimBackwardsIds();
503
- clearCheckpointIds(forwardIds);
504
- currentId = void 0;
502
+ const trimBackwardsIds = () =>
503
+ clearCheckpointIds(backwardIds, size(backwardIds) - backwardIdsSize);
504
+ const storeChanged = () =>
505
+ ifNotUndefined(currentId, () => {
506
+ arrayPush(backwardIds, currentId);
507
+ trimBackwardsIds();
508
+ clearCheckpointIds(forwardIds);
509
+ currentId = void 0;
510
+ checkpointsChanged = 1;
511
+ });
512
+ const storeUnchanged = () => {
513
+ currentId = arrayPop(backwardIds);
505
514
  checkpointsChanged = 1;
506
- });
507
- const storeUnchanged = () => {
508
- currentId = arrayPop(backwardIds);
509
- checkpointsChanged = 1;
510
- };
511
- const cellListenerId = store.addCellListener(
512
- null,
513
- null,
514
- null,
515
- (_store, tableId, rowId, cellId, newCell, oldCell) => {
516
- if (listening) {
517
- storeChanged();
518
- const table = mapEnsure(cellsDelta, tableId, mapNew);
519
- const row = mapEnsure(table, rowId, mapNew);
520
- const oldNew = mapEnsure(row, cellId, () => [oldCell, void 0]);
521
- oldNew[1] = newCell;
522
- if (
523
- oldNew[0] === newCell &&
524
- collIsEmpty(mapSet(row, cellId)) &&
525
- collIsEmpty(mapSet(table, rowId)) &&
526
- collIsEmpty(mapSet(cellsDelta, tableId))
527
- ) {
528
- storeUnchanged();
529
- }
530
- callListenersIfChanged();
515
+ };
516
+ let cellListenerId;
517
+ let valueListenerId;
518
+ const addCheckpointImpl = (label = EMPTY_STRING) => {
519
+ if (isUndefined(currentId)) {
520
+ currentId = EMPTY_STRING + nextCheckpointId++;
521
+ mapSet(deltas, currentId, [cellsDelta, valuesDelta]);
522
+ setCheckpoint(currentId, label);
523
+ cellsDelta = mapNew();
524
+ valuesDelta = mapNew();
525
+ checkpointsChanged = 1;
531
526
  }
532
- },
533
- );
534
- const valueListenerId = store.addValueListener(
535
- null,
536
- (_store, valueId, newValue, oldValue) => {
537
- if (listening) {
538
- storeChanged();
539
- const oldNew = mapEnsure(valuesDelta, valueId, () => [
540
- oldValue,
541
- void 0,
542
- ]);
543
- oldNew[1] = newValue;
544
- if (
545
- oldNew[0] === newValue &&
546
- collIsEmpty(mapSet(valuesDelta, valueId))
547
- ) {
548
- storeUnchanged();
549
- }
550
- callListenersIfChanged();
527
+ return currentId;
528
+ };
529
+ const goBackwardImpl = () => {
530
+ if (!arrayIsEmpty(backwardIds)) {
531
+ arrayUnshift(forwardIds, addCheckpointImpl());
532
+ updateStore(0, currentId);
533
+ currentId = arrayPop(backwardIds);
534
+ checkpointsChanged = 1;
551
535
  }
552
- },
553
- );
554
- const addCheckpointImpl = (label = EMPTY_STRING) => {
555
- if (isUndefined(currentId)) {
556
- currentId = EMPTY_STRING + nextCheckpointId++;
557
- mapSet(deltas, currentId, [cellsDelta, valuesDelta]);
558
- setCheckpoint(currentId, label);
559
- cellsDelta = mapNew();
560
- valuesDelta = mapNew();
561
- checkpointsChanged = 1;
562
- }
563
- return currentId;
564
- };
565
- const goBackwardImpl = () => {
566
- if (!arrayIsEmpty(backwardIds)) {
567
- arrayUnshift(forwardIds, addCheckpointImpl());
568
- updateStore(0, currentId);
569
- currentId = arrayPop(backwardIds);
570
- checkpointsChanged = 1;
571
- }
572
- };
573
- const goForwardImpl = () => {
574
- if (!arrayIsEmpty(forwardIds)) {
575
- arrayPush(backwardIds, currentId);
576
- currentId = arrayShift(forwardIds);
577
- updateStore(1, currentId);
578
- checkpointsChanged = 1;
579
- }
580
- };
581
- const callListenersIfChanged = () => {
582
- if (checkpointsChanged) {
583
- callListeners(checkpointIdsListeners);
584
- checkpointsChanged = 0;
585
- }
586
- };
587
- const setSize = (size2) => {
588
- backwardIdsSize = size2;
589
- trimBackwardsIds();
590
- return checkpoints;
591
- };
592
- const addCheckpoint = (label) => {
593
- const id = addCheckpointImpl(label);
594
- callListenersIfChanged();
595
- return id;
596
- };
597
- const setCheckpoint = (checkpointId, label) => {
598
- if (hasCheckpoint(checkpointId) && mapGet(labels, checkpointId) !== label) {
599
- mapSet(labels, checkpointId, label);
600
- callListeners(checkpointListeners, [checkpointId]);
601
- }
602
- return checkpoints;
603
- };
604
- const getStore = () => store;
605
- const getCheckpointIds = () => [[...backwardIds], currentId, [...forwardIds]];
606
- const forEachCheckpoint = (checkpointCallback) =>
607
- mapForEach(labels, checkpointCallback);
608
- const hasCheckpoint = (checkpointId) => collHas(deltas, checkpointId);
609
- const getCheckpoint = (checkpointId) => mapGet(labels, checkpointId);
610
- const goBackward = () => {
611
- goBackwardImpl();
612
- callListenersIfChanged();
613
- return checkpoints;
614
- };
615
- const goForward = () => {
616
- goForwardImpl();
617
- callListenersIfChanged();
618
- return checkpoints;
619
- };
620
- const goTo = (checkpointId) => {
621
- const action = arrayHas(backwardIds, checkpointId)
622
- ? goBackwardImpl
623
- : arrayHas(forwardIds, checkpointId)
624
- ? goForwardImpl
625
- : null;
626
- while (!isUndefined(action) && checkpointId != currentId) {
627
- action();
628
- }
629
- callListenersIfChanged();
630
- return checkpoints;
631
- };
632
- const addCheckpointIdsListener = (listener) =>
633
- addListener(listener, checkpointIdsListeners);
634
- const addCheckpointListener = (checkpointId, listener) =>
635
- addListener(listener, checkpointListeners, [checkpointId]);
636
- const delListener = (listenerId) => {
637
- delListenerImpl(listenerId);
638
- return checkpoints;
639
- };
640
- const clear = () => {
641
- clearCheckpointIds(backwardIds);
642
- clearCheckpointIds(forwardIds);
643
- if (!isUndefined(currentId)) {
644
- clearCheckpointId(currentId);
645
- }
646
- currentId = void 0;
647
- nextCheckpointId = 0;
648
- addCheckpoint();
649
- return checkpoints;
650
- };
651
- const clearForward = () => {
652
- if (!arrayIsEmpty(forwardIds)) {
536
+ };
537
+ const goForwardImpl = () => {
538
+ if (!arrayIsEmpty(forwardIds)) {
539
+ arrayPush(backwardIds, currentId);
540
+ currentId = arrayShift(forwardIds);
541
+ updateStore(1, currentId);
542
+ checkpointsChanged = 1;
543
+ }
544
+ };
545
+ const callListenersIfChanged = () => {
546
+ if (checkpointsChanged) {
547
+ callListeners(checkpointIdsListeners);
548
+ checkpointsChanged = 0;
549
+ }
550
+ };
551
+ const setSize = (size2) => {
552
+ backwardIdsSize = size2;
553
+ trimBackwardsIds();
554
+ return checkpoints;
555
+ };
556
+ const addCheckpoint = (label) => {
557
+ const id = addCheckpointImpl(label);
558
+ callListenersIfChanged();
559
+ return id;
560
+ };
561
+ const setCheckpoint = (checkpointId, label) => {
562
+ if (
563
+ hasCheckpoint(checkpointId) &&
564
+ mapGet(labels, checkpointId) !== label
565
+ ) {
566
+ mapSet(labels, checkpointId, label);
567
+ callListeners(checkpointListeners, [checkpointId]);
568
+ }
569
+ return checkpoints;
570
+ };
571
+ const getStore = () => store;
572
+ const getCheckpointIds = () => [
573
+ [...backwardIds],
574
+ currentId,
575
+ [...forwardIds],
576
+ ];
577
+ const forEachCheckpoint = (checkpointCallback) =>
578
+ mapForEach(labels, checkpointCallback);
579
+ const hasCheckpoint = (checkpointId) => collHas(deltas, checkpointId);
580
+ const getCheckpoint = (checkpointId) => mapGet(labels, checkpointId);
581
+ const goBackward = () => {
582
+ goBackwardImpl();
583
+ callListenersIfChanged();
584
+ return checkpoints;
585
+ };
586
+ const goForward = () => {
587
+ goForwardImpl();
588
+ callListenersIfChanged();
589
+ return checkpoints;
590
+ };
591
+ const goTo = (checkpointId) => {
592
+ const action = arrayHas(backwardIds, checkpointId)
593
+ ? goBackwardImpl
594
+ : arrayHas(forwardIds, checkpointId)
595
+ ? goForwardImpl
596
+ : null;
597
+ while (!isUndefined(action) && checkpointId != currentId) {
598
+ action();
599
+ }
600
+ callListenersIfChanged();
601
+ return checkpoints;
602
+ };
603
+ const addCheckpointIdsListener = (listener) =>
604
+ addListener(listener, checkpointIdsListeners);
605
+ const addCheckpointListener = (checkpointId, listener) =>
606
+ addListener(listener, checkpointListeners, [checkpointId]);
607
+ const delListener = (listenerId) => {
608
+ delListenerImpl(listenerId);
609
+ return checkpoints;
610
+ };
611
+ const clear = () => {
612
+ clearCheckpointIds(backwardIds);
653
613
  clearCheckpointIds(forwardIds);
654
- callListeners(checkpointIdsListeners);
655
- }
656
- return checkpoints;
657
- };
658
- const destroy = () => {
659
- store.delListener(cellListenerId);
660
- store.delListener(valueListenerId);
661
- };
662
- const getListenerStats = () => ({
663
- checkpointIds: collSize2(checkpointIdsListeners),
664
- checkpoint: collSize2(checkpointListeners),
665
- });
666
- const checkpoints = {
667
- setSize,
668
- addCheckpoint,
669
- setCheckpoint,
670
- getStore,
671
- getCheckpointIds,
672
- forEachCheckpoint,
673
- hasCheckpoint,
674
- getCheckpoint,
675
- goBackward,
676
- goForward,
677
- goTo,
678
- addCheckpointIdsListener,
679
- addCheckpointListener,
680
- delListener,
681
- clear,
682
- clearForward,
683
- destroy,
684
- getListenerStats,
685
- };
686
- return objFreeze(checkpoints.clear());
687
- });
614
+ if (!isUndefined(currentId)) {
615
+ clearCheckpointId(currentId);
616
+ }
617
+ currentId = void 0;
618
+ nextCheckpointId = 0;
619
+ addCheckpoint();
620
+ return checkpoints;
621
+ };
622
+ const clearForward = () => {
623
+ if (!arrayIsEmpty(forwardIds)) {
624
+ clearCheckpointIds(forwardIds);
625
+ callListeners(checkpointIdsListeners);
626
+ }
627
+ return checkpoints;
628
+ };
629
+ const destroy = () => {
630
+ store.delListener(cellListenerId);
631
+ store.delListener(valueListenerId);
632
+ };
633
+ const getListenerStats = () => ({
634
+ checkpointIds: collSize2(checkpointIdsListeners),
635
+ checkpoint: collSize2(checkpointListeners),
636
+ });
637
+ const _registerListeners = () => {
638
+ cellListenerId = store.addCellListener(
639
+ null,
640
+ null,
641
+ null,
642
+ (_store, tableId, rowId, cellId, newCell, oldCell) => {
643
+ if (listening) {
644
+ storeChanged();
645
+ const table = mapEnsure(cellsDelta, tableId, mapNew);
646
+ const row = mapEnsure(table, rowId, mapNew);
647
+ const oldNew = mapEnsure(row, cellId, () => [oldCell, void 0]);
648
+ oldNew[1] = newCell;
649
+ if (
650
+ oldNew[0] === newCell &&
651
+ collIsEmpty(mapSet(row, cellId)) &&
652
+ collIsEmpty(mapSet(table, rowId)) &&
653
+ collIsEmpty(mapSet(cellsDelta, tableId))
654
+ ) {
655
+ storeUnchanged();
656
+ }
657
+ callListenersIfChanged();
658
+ }
659
+ },
660
+ );
661
+ valueListenerId = store.addValueListener(
662
+ null,
663
+ (_store, valueId, newValue, oldValue) => {
664
+ if (listening) {
665
+ storeChanged();
666
+ const oldNew = mapEnsure(valuesDelta, valueId, () => [
667
+ oldValue,
668
+ void 0,
669
+ ]);
670
+ oldNew[1] = newValue;
671
+ if (
672
+ oldNew[0] === newValue &&
673
+ collIsEmpty(mapSet(valuesDelta, valueId))
674
+ ) {
675
+ storeUnchanged();
676
+ }
677
+ callListenersIfChanged();
678
+ }
679
+ },
680
+ );
681
+ };
682
+ const checkpoints = {
683
+ setSize,
684
+ addCheckpoint,
685
+ setCheckpoint,
686
+ getStore,
687
+ getCheckpointIds,
688
+ forEachCheckpoint,
689
+ hasCheckpoint,
690
+ getCheckpoint,
691
+ goBackward,
692
+ goForward,
693
+ goTo,
694
+ addCheckpointIdsListener,
695
+ addCheckpointListener,
696
+ delListener,
697
+ clear,
698
+ clearForward,
699
+ destroy,
700
+ getListenerStats,
701
+ _registerListeners,
702
+ };
703
+ return objFreeze(checkpoints.clear());
704
+ },
705
+ (checkpoints) => checkpoints._registerListeners(),
706
+ );
688
707
 
689
708
  const defaultSorter = (sortKey1, sortKey2) =>
690
709
  (sortKey1 ?? 0) < (sortKey2 ?? 0) ? -1 : 1;
@@ -56,6 +56,7 @@ const arrayShift = (array) => array.shift();
56
56
 
57
57
  const object = Object;
58
58
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
59
+ const objEntries = object.entries;
59
60
  const objIds = object.keys;
60
61
  const objFreeze = object.freeze;
61
62
  const isObject = (obj) =>
@@ -65,10 +66,11 @@ const isObject = (obj) =>
65
66
  (objPrototype) =>
66
67
  objPrototype == object.prototype ||
67
68
  isUndefined(getPrototypeOf(objPrototype)),
69
+ /* istanbul ignore next */
68
70
  () => true,
69
71
  );
70
72
  const objMap = (obj, cb) =>
71
- arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
73
+ arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
72
74
  const objSize = (obj) => size(objIds(obj));
73
75
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
74
76
 
@@ -155,9 +157,7 @@ const getTheContentOfTheStoreDoc = (content = 0, verb, set = 0, has = 0) =>
155
157
  (set ? ' when setting it' : EMPTY_STRING);
156
158
  const getRowTypeDoc = (tableId, set = 0) =>
157
159
  REPRESENTS +
158
- ` a Row when ${
159
- set ? 's' : 'g'
160
- }etting ${getTheContentOfDoc()} the '${tableId}' ` +
160
+ ` a Row when ${set ? 's' : 'g'}etting ${getTheContentOfDoc()} the '${tableId}' ` +
161
161
  TABLE;
162
162
  const getIdsDoc = (idsNoun, parentNoun, sorted = 0) =>
163
163
  `Gets ${sorted ? 'sorted, paginated' : 'the'} Ids of the ${idsNoun}s in ` +
@@ -372,9 +372,7 @@ const getCodeFunctions = () => {
372
372
  const getTypes = () =>
373
373
  mapMap(types, ([body, doc, generic, exported], name) => [
374
374
  comment(doc),
375
- `${
376
- exported ? EXPORT + ' ' : EMPTY_STRING
377
- }type ${name}${generic} = ${body};`,
375
+ `${exported ? EXPORT + ' ' : EMPTY_STRING}type ${name}${generic} = ${body};`,
378
376
  EMPTY_STRING,
379
377
  ]);
380
378
  const getConstants = () =>
@@ -395,13 +393,15 @@ const getCodeFunctions = () => {
395
393
  ];
396
394
  };
397
395
 
398
- const getCreateFunction = (getFunction) => {
399
- const getFunctionsByStore = /* @__PURE__ */ new WeakMap();
396
+ const getCreateFunction = (getFunction, initFunction) => {
397
+ const thingsByStore = /* @__PURE__ */ new WeakMap();
400
398
  return (store) => {
401
- if (!getFunctionsByStore.has(store)) {
402
- getFunctionsByStore.set(store, getFunction(store));
399
+ if (!thingsByStore.has(store)) {
400
+ thingsByStore.set(store, getFunction(store));
403
401
  }
404
- return getFunctionsByStore.get(store);
402
+ const thing = thingsByStore.get(store);
403
+ initFunction?.(thing);
404
+ return thing;
405
405
  };
406
406
  };
407
407
 
@@ -455,9 +455,7 @@ const getTypeFunctions = (
455
455
  ...mapCellSchema(
456
456
  tableId,
457
457
  (cellId, type, defaultValue) =>
458
- `'${cellId}'${
459
- isUndefined(defaultValue) ? '?' : EMPTY_STRING
460
- }: ${type}`,
458
+ `'${cellId}'${isUndefined(defaultValue) ? '?' : EMPTY_STRING}: ${type}`,
461
459
  ),
462
460
  ) +
463
461
  '}',
@@ -792,9 +790,7 @@ const getTypeFunctions = (
792
790
  getFieldTypeList(
793
791
  ...mapValuesSchema(
794
792
  (valueId, type, defaultValue) =>
795
- `'${valueId}'${
796
- isUndefined(defaultValue) ? '?' : EMPTY_STRING
797
- }: ${type}`,
793
+ `'${valueId}'${isUndefined(defaultValue) ? '?' : EMPTY_STRING}: ${type}`,
798
794
  ),
799
795
  ),
800
796
  getTheContentOfTheStoreDoc(2, 5),
@@ -910,9 +906,7 @@ const storeListener = (
910
906
  beforeParameters = EMPTY_STRING,
911
907
  afterParameters = EMPTY_STRING,
912
908
  ) =>
913
- `store.${method}(${
914
- beforeParameters ? beforeParameters + ', ' : EMPTY_STRING
915
- }proxy(listener)${afterParameters ? ', ' + afterParameters : EMPTY_STRING})`;
909
+ `store.${method}(${beforeParameters ? beforeParameters + ', ' : EMPTY_STRING}proxy(listener)${afterParameters ? ', ' + afterParameters : EMPTY_STRING})`;
916
910
  const getStoreCoreApi = (tablesSchema, valuesSchema, module) => {
917
911
  const [
918
912
  build,
@@ -1521,14 +1515,7 @@ const getStoreCoreApi = (tablesSchema, valuesSchema, module) => {
1521
1515
  `[${CELL_ID}]: {[${addConstant(
1522
1516
  snake(TYPE),
1523
1517
  `'${TYPE}'`,
1524
- )}]: ${addConstant(snake(type), `'${type}'`)}${
1525
- isUndefined(defaultValue)
1526
- ? EMPTY_STRING
1527
- : `, [${addConstant(snake(DEFAULT), `'${DEFAULT}'`)}]: ` +
1528
- (isString(defaultValue)
1529
- ? addConstant(snake(defaultValue), `'${defaultValue}'`)
1530
- : defaultValue)
1531
- }},`,
1518
+ )}]: ${addConstant(snake(type), `'${type}'`)}${isUndefined(defaultValue) ? EMPTY_STRING : `, [${addConstant(snake(DEFAULT), `'${DEFAULT}'`)}]: ` + (isString(defaultValue) ? addConstant(snake(defaultValue), `'${defaultValue}'`) : defaultValue)}},`,
1532
1519
  ),
1533
1520
  `},`,
1534
1521
  ]),
@@ -1690,14 +1677,7 @@ const getStoreCoreApi = (tablesSchema, valuesSchema, module) => {
1690
1677
  `[${VALUE_ID}]: {[${addConstant(
1691
1678
  snake(TYPE),
1692
1679
  `'${TYPE}'`,
1693
- )}]: ${addConstant(snake(type), `'${type}'`)}${
1694
- isUndefined(defaultValue)
1695
- ? EMPTY_STRING
1696
- : `, [${addConstant(snake(DEFAULT), `'${DEFAULT}'`)}]: ` +
1697
- (isString(defaultValue)
1698
- ? addConstant(snake(defaultValue), `'${defaultValue}'`)
1699
- : defaultValue)
1700
- }},`,
1680
+ )}]: ${addConstant(snake(type), `'${type}'`)}${isUndefined(defaultValue) ? EMPTY_STRING : `, [${addConstant(snake(DEFAULT), `'${DEFAULT}'`)}]: ` + (isString(defaultValue) ? addConstant(snake(defaultValue), `'${defaultValue}'`) : defaultValue)}},`,
1701
1681
  ]),
1702
1682
  '})',
1703
1683
  );
@@ -2016,16 +1996,12 @@ const getStoreUiReactApi = (
2016
1996
  const lines = location
2017
1997
  ? [
2018
1998
  EXPORT +
2019
- ` const ${name}: typeof ${name}Decl = ${generic}(${parameters}): ${
2020
- returnType == 1 ? 'any' : returnType
2021
- } =>`,
1999
+ ` const ${name}: typeof ${name}Decl = ${generic}(${parameters}): ${returnType == 1 ? 'any' : returnType} =>`,
2022
2000
  body,
2023
2001
  ]
2024
2002
  : [
2025
2003
  EXPORT +
2026
- ` function ${name}${generic}(${parameters}): ${
2027
- returnType == 1 ? 'ComponentReturnType' : returnType
2028
- };`,
2004
+ ` function ${name}${generic}(${parameters}): ${returnType == 1 ? 'ComponentReturnType' : returnType};`,
2029
2005
  ];
2030
2006
  if (!location) {
2031
2007
  arrayUnshift(lines, comment(doc));