@verdant-web/common 1.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/EventSubscriber.d.ts +17 -0
  3. package/dist/cjs/EventSubscriber.js +67 -0
  4. package/dist/cjs/EventSubscriber.js.map +1 -0
  5. package/dist/cjs/baseline.d.ts +5 -0
  6. package/dist/cjs/baseline.js +3 -0
  7. package/dist/cjs/baseline.js.map +1 -0
  8. package/dist/cjs/batching.d.ts +41 -0
  9. package/dist/cjs/batching.js +89 -0
  10. package/dist/cjs/batching.js.map +1 -0
  11. package/dist/cjs/files.d.ts +19 -0
  12. package/dist/cjs/files.js +19 -0
  13. package/dist/cjs/files.js.map +1 -0
  14. package/dist/cjs/files.test.d.ts +1 -0
  15. package/dist/cjs/files.test.js +81 -0
  16. package/dist/cjs/files.test.js.map +1 -0
  17. package/dist/cjs/index.d.ts +18 -0
  18. package/dist/cjs/index.js +36 -0
  19. package/dist/cjs/index.js.map +1 -0
  20. package/dist/cjs/indexes.d.ts +14 -0
  21. package/dist/cjs/indexes.js +116 -0
  22. package/dist/cjs/indexes.js.map +1 -0
  23. package/dist/cjs/indexes.test.d.ts +1 -0
  24. package/dist/cjs/indexes.test.js +128 -0
  25. package/dist/cjs/indexes.test.js.map +1 -0
  26. package/dist/cjs/migration.d.ts +98 -0
  27. package/dist/cjs/migration.js +128 -0
  28. package/dist/cjs/migration.js.map +1 -0
  29. package/dist/cjs/oids.d.ts +87 -0
  30. package/dist/cjs/oids.js +375 -0
  31. package/dist/cjs/oids.js.map +1 -0
  32. package/dist/cjs/oids.test.d.ts +1 -0
  33. package/dist/cjs/oids.test.js +282 -0
  34. package/dist/cjs/oids.test.js.map +1 -0
  35. package/dist/cjs/operation.d.ts +139 -0
  36. package/dist/cjs/operation.js +533 -0
  37. package/dist/cjs/operation.js.map +1 -0
  38. package/dist/cjs/operation.test.d.ts +1 -0
  39. package/dist/cjs/operation.test.js +827 -0
  40. package/dist/cjs/operation.test.js.map +1 -0
  41. package/dist/cjs/patch.d.ts +26 -0
  42. package/dist/cjs/patch.js +227 -0
  43. package/dist/cjs/patch.js.map +1 -0
  44. package/dist/cjs/presence.d.ts +27 -0
  45. package/dist/cjs/presence.js +3 -0
  46. package/dist/cjs/presence.js.map +1 -0
  47. package/dist/cjs/protocol.d.ts +145 -0
  48. package/dist/cjs/protocol.js +4 -0
  49. package/dist/cjs/protocol.js.map +1 -0
  50. package/dist/cjs/refs.d.ts +5 -0
  51. package/dist/cjs/refs.js +22 -0
  52. package/dist/cjs/refs.js.map +1 -0
  53. package/dist/cjs/replica.d.ts +28 -0
  54. package/dist/cjs/replica.js +29 -0
  55. package/dist/cjs/replica.js.map +1 -0
  56. package/dist/cjs/schema/defaults.d.ts +4 -0
  57. package/dist/cjs/schema/defaults.js +72 -0
  58. package/dist/cjs/schema/defaults.js.map +1 -0
  59. package/dist/cjs/schema/defaults.test.d.ts +1 -0
  60. package/dist/cjs/schema/defaults.test.js +21 -0
  61. package/dist/cjs/schema/defaults.test.js.map +1 -0
  62. package/dist/cjs/schema/index.d.ts +8 -0
  63. package/dist/cjs/schema/index.js +29 -0
  64. package/dist/cjs/schema/index.js.map +1 -0
  65. package/dist/cjs/schema/indexFilters.d.ts +6 -0
  66. package/dist/cjs/schema/indexFilters.js +31 -0
  67. package/dist/cjs/schema/indexFilters.js.map +1 -0
  68. package/dist/cjs/schema/types/collection.d.ts +51 -0
  69. package/dist/cjs/schema/types/collection.js +3 -0
  70. package/dist/cjs/schema/types/collection.js.map +1 -0
  71. package/dist/cjs/schema/types/compounds.d.ts +12 -0
  72. package/dist/cjs/schema/types/compounds.js +3 -0
  73. package/dist/cjs/schema/types/compounds.js.map +1 -0
  74. package/dist/cjs/schema/types/fields.d.ts +59 -0
  75. package/dist/cjs/schema/types/fields.js +3 -0
  76. package/dist/cjs/schema/types/fields.js.map +1 -0
  77. package/dist/cjs/schema/types/filters.d.ts +29 -0
  78. package/dist/cjs/schema/types/filters.js +3 -0
  79. package/dist/cjs/schema/types/filters.js.map +1 -0
  80. package/dist/cjs/schema/types/shapes.d.ts +21 -0
  81. package/dist/cjs/schema/types/shapes.js +3 -0
  82. package/dist/cjs/schema/types/shapes.js.map +1 -0
  83. package/dist/cjs/schema/types/synthetics.d.ts +28 -0
  84. package/dist/cjs/schema/types/synthetics.js +3 -0
  85. package/dist/cjs/schema/types/synthetics.js.map +1 -0
  86. package/dist/cjs/schema/types.d.ts +18 -0
  87. package/dist/cjs/schema/types.js +23 -0
  88. package/dist/cjs/schema/types.js.map +1 -0
  89. package/dist/cjs/timestamp.d.ts +48 -0
  90. package/dist/cjs/timestamp.js +244 -0
  91. package/dist/cjs/timestamp.js.map +1 -0
  92. package/dist/cjs/timestamp.test.d.ts +1 -0
  93. package/dist/cjs/timestamp.test.js +94 -0
  94. package/dist/cjs/timestamp.test.js.map +1 -0
  95. package/dist/cjs/undo.d.ts +3 -0
  96. package/dist/cjs/undo.js +199 -0
  97. package/dist/cjs/undo.js.map +1 -0
  98. package/dist/cjs/utils.d.ts +15 -0
  99. package/dist/cjs/utils.js +128 -0
  100. package/dist/cjs/utils.js.map +1 -0
  101. package/dist/cjs/utils.test.d.ts +1 -0
  102. package/dist/cjs/utils.test.js +37 -0
  103. package/dist/cjs/utils.test.js.map +1 -0
  104. package/dist/esm/EventSubscriber.d.ts +17 -0
  105. package/dist/esm/EventSubscriber.js +63 -0
  106. package/dist/esm/EventSubscriber.js.map +1 -0
  107. package/dist/esm/baseline.d.ts +5 -0
  108. package/dist/esm/baseline.js +2 -0
  109. package/dist/esm/baseline.js.map +1 -0
  110. package/dist/esm/batching.d.ts +41 -0
  111. package/dist/esm/batching.js +84 -0
  112. package/dist/esm/batching.js.map +1 -0
  113. package/dist/esm/files.d.ts +19 -0
  114. package/dist/esm/files.js +13 -0
  115. package/dist/esm/files.js.map +1 -0
  116. package/dist/esm/files.test.d.ts +1 -0
  117. package/dist/esm/files.test.js +79 -0
  118. package/dist/esm/files.test.js.map +1 -0
  119. package/dist/esm/index.d.ts +18 -0
  120. package/dist/esm/index.js +16 -0
  121. package/dist/esm/index.js.map +1 -0
  122. package/dist/esm/indexes.d.ts +14 -0
  123. package/dist/esm/indexes.js +106 -0
  124. package/dist/esm/indexes.js.map +1 -0
  125. package/dist/esm/indexes.test.d.ts +1 -0
  126. package/dist/esm/indexes.test.js +126 -0
  127. package/dist/esm/indexes.test.js.map +1 -0
  128. package/dist/esm/migration.d.ts +98 -0
  129. package/dist/esm/migration.js +122 -0
  130. package/dist/esm/migration.js.map +1 -0
  131. package/dist/esm/oids.d.ts +87 -0
  132. package/dist/esm/oids.js +348 -0
  133. package/dist/esm/oids.js.map +1 -0
  134. package/dist/esm/oids.test.d.ts +1 -0
  135. package/dist/esm/oids.test.js +280 -0
  136. package/dist/esm/oids.test.js.map +1 -0
  137. package/dist/esm/operation.d.ts +139 -0
  138. package/dist/esm/operation.js +518 -0
  139. package/dist/esm/operation.js.map +1 -0
  140. package/dist/esm/operation.test.d.ts +1 -0
  141. package/dist/esm/operation.test.js +825 -0
  142. package/dist/esm/operation.test.js.map +1 -0
  143. package/dist/esm/patch.d.ts +26 -0
  144. package/dist/esm/patch.js +223 -0
  145. package/dist/esm/patch.js.map +1 -0
  146. package/dist/esm/presence.d.ts +27 -0
  147. package/dist/esm/presence.js +2 -0
  148. package/dist/esm/presence.js.map +1 -0
  149. package/dist/esm/protocol.d.ts +145 -0
  150. package/dist/esm/protocol.js +3 -0
  151. package/dist/esm/protocol.js.map +1 -0
  152. package/dist/esm/refs.d.ts +5 -0
  153. package/dist/esm/refs.js +17 -0
  154. package/dist/esm/refs.js.map +1 -0
  155. package/dist/esm/replica.d.ts +28 -0
  156. package/dist/esm/replica.js +26 -0
  157. package/dist/esm/replica.js.map +1 -0
  158. package/dist/esm/schema/defaults.d.ts +4 -0
  159. package/dist/esm/schema/defaults.js +66 -0
  160. package/dist/esm/schema/defaults.js.map +1 -0
  161. package/dist/esm/schema/defaults.test.d.ts +1 -0
  162. package/dist/esm/schema/defaults.test.js +19 -0
  163. package/dist/esm/schema/defaults.test.js.map +1 -0
  164. package/dist/esm/schema/index.d.ts +8 -0
  165. package/dist/esm/schema/index.js +10 -0
  166. package/dist/esm/schema/index.js.map +1 -0
  167. package/dist/esm/schema/indexFilters.d.ts +6 -0
  168. package/dist/esm/schema/indexFilters.js +23 -0
  169. package/dist/esm/schema/indexFilters.js.map +1 -0
  170. package/dist/esm/schema/types/collection.d.ts +51 -0
  171. package/dist/esm/schema/types/collection.js +2 -0
  172. package/dist/esm/schema/types/collection.js.map +1 -0
  173. package/dist/esm/schema/types/compounds.d.ts +12 -0
  174. package/dist/esm/schema/types/compounds.js +2 -0
  175. package/dist/esm/schema/types/compounds.js.map +1 -0
  176. package/dist/esm/schema/types/fields.d.ts +59 -0
  177. package/dist/esm/schema/types/fields.js +2 -0
  178. package/dist/esm/schema/types/fields.js.map +1 -0
  179. package/dist/esm/schema/types/filters.d.ts +29 -0
  180. package/dist/esm/schema/types/filters.js +2 -0
  181. package/dist/esm/schema/types/filters.js.map +1 -0
  182. package/dist/esm/schema/types/shapes.d.ts +21 -0
  183. package/dist/esm/schema/types/shapes.js +2 -0
  184. package/dist/esm/schema/types/shapes.js.map +1 -0
  185. package/dist/esm/schema/types/synthetics.d.ts +28 -0
  186. package/dist/esm/schema/types/synthetics.js +2 -0
  187. package/dist/esm/schema/types/synthetics.js.map +1 -0
  188. package/dist/esm/schema/types.d.ts +18 -0
  189. package/dist/esm/schema/types.js +7 -0
  190. package/dist/esm/schema/types.js.map +1 -0
  191. package/dist/esm/timestamp.d.ts +48 -0
  192. package/dist/esm/timestamp.js +229 -0
  193. package/dist/esm/timestamp.js.map +1 -0
  194. package/dist/esm/timestamp.test.d.ts +1 -0
  195. package/dist/esm/timestamp.test.js +92 -0
  196. package/dist/esm/timestamp.test.js.map +1 -0
  197. package/dist/esm/undo.d.ts +3 -0
  198. package/dist/esm/undo.js +195 -0
  199. package/dist/esm/undo.js.map +1 -0
  200. package/dist/esm/utils.d.ts +15 -0
  201. package/dist/esm/utils.js +114 -0
  202. package/dist/esm/utils.js.map +1 -0
  203. package/dist/esm/utils.test.d.ts +1 -0
  204. package/dist/esm/utils.test.js +35 -0
  205. package/dist/esm/utils.test.js.map +1 -0
  206. package/dist/tsconfig-cjs.tsbuildinfo +1 -0
  207. package/dist/tsconfig.tsbuildinfo +1 -0
  208. package/package.json +38 -0
  209. package/src/EventSubscriber.ts +81 -0
  210. package/src/baseline.ts +9 -0
  211. package/src/batching.ts +135 -0
  212. package/src/files.ts +34 -0
  213. package/src/index.ts +26 -0
  214. package/src/indexes.test.ts +158 -0
  215. package/src/indexes.ts +151 -0
  216. package/src/migration.ts +391 -0
  217. package/src/oids.test.ts +395 -0
  218. package/src/oids.ts +442 -0
  219. package/src/operation.test.ts +966 -0
  220. package/src/operation.ts +755 -0
  221. package/src/patch.ts +277 -0
  222. package/src/presence.ts +29 -0
  223. package/src/protocol.ts +184 -0
  224. package/src/refs.ts +16 -0
  225. package/src/replica.ts +29 -0
  226. package/src/schema/defaults.test.ts +19 -0
  227. package/src/schema/defaults.ts +72 -0
  228. package/src/schema/index.ts +28 -0
  229. package/src/schema/indexFilters.ts +49 -0
  230. package/src/schema/types/collection.ts +133 -0
  231. package/src/schema/types/compounds.ts +33 -0
  232. package/src/schema/types/fields.ts +85 -0
  233. package/src/schema/types/filters.ts +39 -0
  234. package/src/schema/types/shapes.ts +83 -0
  235. package/src/schema/types/synthetics.ts +45 -0
  236. package/src/schema/types.ts +28 -0
  237. package/src/timestamp.test.ts +113 -0
  238. package/src/timestamp.ts +284 -0
  239. package/src/undo.ts +205 -0
  240. package/src/utils.test.ts +38 -0
  241. package/src/utils.ts +137 -0
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findLastIndex = exports.generateId = exports.assert = exports.roughSizeOfObject = exports.isObject = exports.hashObject = exports.cloneDeep = exports.stableStringify = exports.getSortedIndex = exports.omit = exports.take = void 0;
4
+ const uuid_1 = require("uuid");
5
+ const oids_js_1 = require("./oids.js");
6
+ function take(obj, keys) {
7
+ const result = {};
8
+ for (const key of keys) {
9
+ result[key] = obj[key];
10
+ }
11
+ return result;
12
+ }
13
+ exports.take = take;
14
+ function omit(obj, keys) {
15
+ const result = {};
16
+ for (const key of Object.keys(obj)) {
17
+ if (!keys.includes(key)) {
18
+ result[key] = obj[key];
19
+ }
20
+ }
21
+ return result;
22
+ }
23
+ exports.omit = omit;
24
+ function getSortedIndex(array, insert, compare) {
25
+ let low = 0;
26
+ let high = array.length;
27
+ while (low < high) {
28
+ const mid = (low + high) >>> 1;
29
+ const cmp = compare(array[mid], insert);
30
+ if (cmp < 0) {
31
+ low = mid + 1;
32
+ }
33
+ else {
34
+ high = mid;
35
+ }
36
+ }
37
+ return low;
38
+ }
39
+ exports.getSortedIndex = getSortedIndex;
40
+ function orderedReplacer(_, v) {
41
+ if (typeof v !== 'object' || v === null || Array.isArray(v)) {
42
+ return v;
43
+ }
44
+ return Object.fromEntries(Object.entries(v).sort(([ka], [kb]) => (ka < kb ? -1 : ka > kb ? 1 : 0)));
45
+ }
46
+ /**
47
+ * Consistently stringifies an object regardless
48
+ * of key insertion order
49
+ */
50
+ function stableStringify(obj) {
51
+ return JSON.stringify(obj, orderedReplacer);
52
+ }
53
+ exports.stableStringify = stableStringify;
54
+ function cloneDeep(obj) {
55
+ if (isObject(obj)) {
56
+ const oid = (0, oids_js_1.maybeGetOid)(obj);
57
+ let clone;
58
+ if (Array.isArray(obj)) {
59
+ clone = obj.map(cloneDeep);
60
+ }
61
+ else {
62
+ clone = {};
63
+ for (const [key, value] of Object.entries(obj)) {
64
+ clone[key] = cloneDeep(value);
65
+ }
66
+ }
67
+ if (oid) {
68
+ (0, oids_js_1.assignOid)(clone, oid);
69
+ }
70
+ return clone;
71
+ }
72
+ return obj;
73
+ }
74
+ exports.cloneDeep = cloneDeep;
75
+ // TODO: better hash
76
+ function hashObject(obj) {
77
+ return stableStringify(obj);
78
+ }
79
+ exports.hashObject = hashObject;
80
+ function isObject(obj) {
81
+ return obj && typeof obj === 'object';
82
+ }
83
+ exports.isObject = isObject;
84
+ function roughSizeOfObject(object) {
85
+ var objectList = [];
86
+ var stack = [object];
87
+ var bytes = 0;
88
+ while (stack.length) {
89
+ var value = stack.pop();
90
+ if (typeof value === 'boolean') {
91
+ bytes += 4;
92
+ }
93
+ else if (typeof value === 'string') {
94
+ bytes += value.length * 2;
95
+ }
96
+ else if (typeof value === 'number') {
97
+ bytes += 8;
98
+ }
99
+ else if (typeof value === 'object' && objectList.indexOf(value) === -1) {
100
+ objectList.push(value);
101
+ for (var i in value) {
102
+ stack.push(value[i]);
103
+ }
104
+ }
105
+ }
106
+ return bytes;
107
+ }
108
+ exports.roughSizeOfObject = roughSizeOfObject;
109
+ function assert(condition, message = 'assertion failed') {
110
+ if (!condition) {
111
+ throw new Error(message);
112
+ }
113
+ }
114
+ exports.assert = assert;
115
+ function generateId(length = 16) {
116
+ return (0, uuid_1.v4)().replace('-', '').slice(0, length);
117
+ }
118
+ exports.generateId = generateId;
119
+ function findLastIndex(array, predicate) {
120
+ for (let i = array.length - 1; i >= 0; i--) {
121
+ if (predicate(array[i])) {
122
+ return i;
123
+ }
124
+ }
125
+ return -1;
126
+ }
127
+ exports.findLastIndex = findLastIndex;
128
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const oids_js_1 = require("./oids.js");
5
+ const utils_js_1 = require("./utils.js");
6
+ (0, vitest_1.describe)('utils', () => {
7
+ (0, vitest_1.describe)('get sorted index', () => {
8
+ (0, vitest_1.it)('finds the right insertion index', () => {
9
+ function compare(a, b) {
10
+ return a - b;
11
+ }
12
+ (0, vitest_1.expect)((0, utils_js_1.getSortedIndex)([1, 2, 3, 4, 5], 6, compare)).toBe(5);
13
+ (0, vitest_1.expect)((0, utils_js_1.getSortedIndex)([1, 2, 3, 4, 5], 0, compare)).toBe(0);
14
+ (0, vitest_1.expect)((0, utils_js_1.getSortedIndex)([1, 2, 3, 4, 5], -1, compare)).toBe(0);
15
+ (0, vitest_1.expect)((0, utils_js_1.getSortedIndex)([1, 2, 3, 4, 5], 20, compare)).toBe(5);
16
+ });
17
+ });
18
+ (0, vitest_1.describe)('clone deep', () => {
19
+ (0, vitest_1.it)('preserves OIDs', () => {
20
+ const obj = {
21
+ foo: 'bar',
22
+ qux: [
23
+ {
24
+ corge: true,
25
+ },
26
+ ],
27
+ };
28
+ (0, oids_js_1.assignOid)(obj, 'test/a');
29
+ (0, oids_js_1.assignOidsToAllSubObjects)(obj);
30
+ const cloned = (0, utils_js_1.cloneDeep)(obj);
31
+ (0, vitest_1.expect)((0, oids_js_1.getOid)(cloned)).toEqual((0, oids_js_1.getOid)(obj));
32
+ (0, vitest_1.expect)((0, oids_js_1.getOid)(cloned.qux)).toEqual((0, oids_js_1.getOid)(obj.qux));
33
+ (0, vitest_1.expect)((0, oids_js_1.getOid)(cloned.qux[0])).toEqual((0, oids_js_1.getOid)(obj.qux[0]));
34
+ });
35
+ });
36
+ });
37
+ //# sourceMappingURL=utils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../../src/utils.test.ts"],"names":[],"mappings":";;AAAA,mCAA8C;AAC9C,uCAAyE;AACzE,yCAAuD;AAEvD,IAAA,iBAAQ,EAAC,OAAO,EAAE,GAAG,EAAE;IACtB,IAAA,iBAAQ,EAAC,kBAAkB,EAAE,GAAG,EAAE;QACjC,IAAA,WAAE,EAAC,iCAAiC,EAAE,GAAG,EAAE;YAC1C,SAAS,OAAO,CAAC,CAAS,EAAE,CAAS;gBACpC,OAAO,CAAC,GAAG,CAAC,CAAC;YACd,CAAC;YACD,IAAA,eAAM,EAAC,IAAA,yBAAc,EAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5D,IAAA,eAAM,EAAC,IAAA,yBAAc,EAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC5D,IAAA,eAAM,EAAC,IAAA,yBAAc,EAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC7D,IAAA,eAAM,EAAC,IAAA,yBAAc,EAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAQ,EAAC,YAAY,EAAE,GAAG,EAAE;QAC3B,IAAA,WAAE,EAAC,gBAAgB,EAAE,GAAG,EAAE;YACzB,MAAM,GAAG,GAAG;gBACX,GAAG,EAAE,KAAK;gBACV,GAAG,EAAE;oBACJ;wBACC,KAAK,EAAE,IAAI;qBACX;iBACD;aACD,CAAC;YACF,IAAA,mBAAS,EAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YACzB,IAAA,mCAAyB,EAAC,GAAG,CAAC,CAAC;YAE/B,MAAM,MAAM,GAAG,IAAA,oBAAS,EAAC,GAAG,CAAC,CAAC;YAE9B,IAAA,eAAM,EAAC,IAAA,gBAAM,EAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAA,gBAAM,EAAC,GAAG,CAAC,CAAC,CAAC;YAC5C,IAAA,eAAM,EAAC,IAAA,gBAAM,EAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAA,gBAAM,EAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACpD,IAAA,eAAM,EAAC,IAAA,gBAAM,EAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAA,gBAAM,EAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ export declare class EventSubscriber<Events extends {
2
+ [key: string]: (...args: any[]) => void;
3
+ }> {
4
+ private _onAllUnsubscribed?;
5
+ protected subscribers: Record<string, Record<string, (...args: any[]) => void>>;
6
+ protected counts: Record<string, number>;
7
+ private _disabled;
8
+ constructor(_onAllUnsubscribed?: ((event: keyof Events) => void) | undefined);
9
+ get disabled(): boolean;
10
+ subscriberCount: (event: Extract<keyof Events, string>) => number;
11
+ totalSubscriberCount: () => number;
12
+ subscribe: <K extends Extract<keyof Events, string>>(event: K, callback: Events[K]) => () => void;
13
+ emit: <K extends Extract<keyof Events, string>>(event: K, ...args: Parameters<Events[K]>) => void;
14
+ dispose: () => void;
15
+ disable: () => void;
16
+ }
17
+ export declare type EventsOf<T extends EventSubscriber<any>> = T extends EventSubscriber<infer E> ? keyof E : never;
@@ -0,0 +1,63 @@
1
+ import { generateId } from './utils.js';
2
+ export class EventSubscriber {
3
+ constructor(_onAllUnsubscribed) {
4
+ this._onAllUnsubscribed = _onAllUnsubscribed;
5
+ this.subscribers = {};
6
+ this.counts = {};
7
+ this._disabled = false;
8
+ this.subscriberCount = (event) => {
9
+ var _a;
10
+ return (_a = this.counts[event]) !== null && _a !== void 0 ? _a : 0;
11
+ };
12
+ this.totalSubscriberCount = () => {
13
+ return Object.values(this.counts).reduce((acc, count) => acc + count, 0);
14
+ };
15
+ this.subscribe = (event, callback) => {
16
+ const key = generateId();
17
+ let subscribers = this.subscribers[event];
18
+ if (!subscribers) {
19
+ subscribers = this.subscribers[event] = {};
20
+ }
21
+ subscribers[key] = callback;
22
+ this.counts[event] = (this.counts[event] || 0) + 1;
23
+ return () => {
24
+ // already removed
25
+ if (!this.subscribers[event])
26
+ return;
27
+ delete this.subscribers[event][key];
28
+ this.counts[event]--;
29
+ if (this.counts[event] === 0) {
30
+ delete this.subscribers[event];
31
+ delete this.counts[event];
32
+ if (this._onAllUnsubscribed) {
33
+ this._onAllUnsubscribed(event);
34
+ }
35
+ }
36
+ };
37
+ };
38
+ this.emit = (event, ...args) => {
39
+ if (this._disabled)
40
+ return;
41
+ if (this.subscribers[event]) {
42
+ Object.values(this.subscribers[event]).forEach((c) => c(...args));
43
+ }
44
+ };
45
+ this.dispose = () => {
46
+ const events = Object.keys(this.subscribers);
47
+ this.subscribers = {};
48
+ this.counts = {};
49
+ events.forEach((event) => {
50
+ if (this._onAllUnsubscribed) {
51
+ this._onAllUnsubscribed(event);
52
+ }
53
+ });
54
+ };
55
+ this.disable = () => {
56
+ this._disabled = true;
57
+ };
58
+ }
59
+ get disabled() {
60
+ return this._disabled;
61
+ }
62
+ }
63
+ //# sourceMappingURL=EventSubscriber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventSubscriber.js","sourceRoot":"","sources":["../../src/EventSubscriber.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare type DocumentBaseline<T extends any = any> = {
2
+ oid: string;
3
+ snapshot: T;
4
+ timestamp: string;
5
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=baseline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseline.js","sourceRoot":"","sources":["../../src/baseline.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ export declare class Batcher<T, UserData = any> {
3
+ private flusher;
4
+ private batches;
5
+ constructor(flusher: (items: T[], batchKey: string, userData: UserData) => any);
6
+ add({ key, userData, items, max, timeout, }: {
7
+ key: string;
8
+ userData?: UserData;
9
+ items: T[];
10
+ max?: number | null;
11
+ timeout?: number | null;
12
+ }): Batch<T, UserData>;
13
+ flush: (key: string) => any;
14
+ discard: (key: string) => void;
15
+ }
16
+ export declare class Batch<T, UserData = any> {
17
+ items: Array<T>;
18
+ max: number | null;
19
+ startedAt: number;
20
+ timeout: number | null;
21
+ flushTimeout?: NodeJS.Timeout;
22
+ userData?: any;
23
+ flusher: (items: T[], batchKey: string, userData: UserData) => any;
24
+ key: string;
25
+ constructor({ max, startedAt, timeout, userData, flusher, key, }: {
26
+ key: string;
27
+ max: number | null;
28
+ startedAt: number;
29
+ timeout: number | null;
30
+ userData?: UserData;
31
+ flusher: (items: T[], batchKey: string, userData: UserData) => any;
32
+ });
33
+ update: ({ items, max, timeout, userData, }: {
34
+ items: Array<T>;
35
+ max?: number | null | undefined;
36
+ timeout?: number | null | undefined;
37
+ userData?: UserData | undefined;
38
+ }) => void;
39
+ flush: () => any;
40
+ discard: () => void;
41
+ }
@@ -0,0 +1,84 @@
1
+ export class Batcher {
2
+ constructor(flusher) {
3
+ this.flusher = flusher;
4
+ this.batches = new Map();
5
+ this.flush = (key) => {
6
+ const batch = this.batches.get(key);
7
+ if (!batch)
8
+ return;
9
+ return batch.flush();
10
+ };
11
+ this.discard = (key) => {
12
+ const batch = this.batches.get(key);
13
+ if (!batch)
14
+ return;
15
+ batch.discard();
16
+ this.batches.delete(key);
17
+ };
18
+ }
19
+ add({ key, userData, items, max, timeout, }) {
20
+ let batch = this.batches.get(key);
21
+ if (!batch) {
22
+ batch = new Batch({
23
+ max: max || null,
24
+ startedAt: Date.now(),
25
+ userData,
26
+ timeout: timeout || null,
27
+ flusher: this.flusher,
28
+ key,
29
+ });
30
+ this.batches.set(key, batch);
31
+ }
32
+ batch.update({
33
+ items,
34
+ max,
35
+ timeout,
36
+ userData,
37
+ });
38
+ return batch;
39
+ }
40
+ }
41
+ export class Batch {
42
+ constructor({ max, startedAt, timeout, userData, flusher, key, }) {
43
+ this.items = [];
44
+ this.update = ({ items, max, timeout, userData, }) => {
45
+ this.items.push(...items);
46
+ if (max !== undefined)
47
+ this.max = max;
48
+ if (timeout !== undefined)
49
+ this.timeout = timeout;
50
+ if (userData)
51
+ this.userData = userData;
52
+ // if the batch has items and a timeout but has not
53
+ // scheduled yet, schedule it
54
+ const needsSchedule = this.items.length !== 0 && this.timeout !== null && !this.flushTimeout;
55
+ // if the batch has already reached its max, skip scheduling
56
+ // and flush immediately
57
+ if (this.max !== null && this.items.length >= this.max) {
58
+ this.flush();
59
+ }
60
+ else if (needsSchedule && this.timeout !== null) {
61
+ this.flushTimeout = setTimeout(this.flush, this.timeout);
62
+ }
63
+ };
64
+ this.flush = () => {
65
+ this.flushTimeout && clearTimeout(this.flushTimeout);
66
+ this.flushTimeout = undefined;
67
+ const items = this.items;
68
+ this.items = [];
69
+ return this.flusher(items, this.key, this.userData);
70
+ };
71
+ this.discard = () => {
72
+ this.flushTimeout && clearTimeout(this.flushTimeout);
73
+ this.flushTimeout = undefined;
74
+ this.items = [];
75
+ };
76
+ this.max = max;
77
+ this.startedAt = startedAt;
78
+ this.timeout = timeout;
79
+ this.userData = userData;
80
+ this.flusher = flusher;
81
+ this.key = key;
82
+ }
83
+ }
84
+ //# sourceMappingURL=batching.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batching.js","sourceRoot":"","sources":["../../src/batching.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export declare type FileRef = {
2
+ '@@type': 'file';
3
+ id: string;
4
+ };
5
+ export declare function isFileRef(value: any): value is FileRef;
6
+ export declare function createFileRef(id: string): FileRef;
7
+ export declare type FileData = {
8
+ id: string;
9
+ /**
10
+ * For locally created files, this starts false, until it's uploaded
11
+ * Remote files this is always true
12
+ */
13
+ remote: boolean;
14
+ name: string;
15
+ type: string;
16
+ file?: Blob;
17
+ url?: string;
18
+ };
19
+ export declare function getAllFileFields(snapshot: any): [string, FileRef][];
@@ -0,0 +1,13 @@
1
+ export function isFileRef(value) {
2
+ return value && value['@@type'] === 'file';
3
+ }
4
+ export function createFileRef(id) {
5
+ return {
6
+ '@@type': 'file',
7
+ id,
8
+ };
9
+ }
10
+ export function getAllFileFields(snapshot) {
11
+ return Object.entries(snapshot).filter((entry) => isFileRef(entry[1]));
12
+ }
13
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/files.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,SAAS,CAAC,KAAU;IACnC,OAAO,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAC;AAC5C,CAAC;AACD,MAAM,UAAU,aAAa,CAAC,EAAU;IACvC,OAAO;QACN,QAAQ,EAAE,MAAM;QAChB,EAAE;KACF,CAAC;AACH,CAAC;AAeD,MAAM,UAAU,gBAAgB,CAAC,QAAa;IAC7C,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAGlE,CAAC;AACL,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,79 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { processValueFiles } from './files.js';
3
+ function makeFile() {
4
+ return new File([''], 'test.txt', { type: 'text/plain' });
5
+ }
6
+ describe('processing files in a value', () => {
7
+ it('replaces a single file with a reference', () => {
8
+ const file = makeFile();
9
+ const list = [];
10
+ const result = processValueFiles(file, list.push.bind(list));
11
+ expect(result).toEqual({
12
+ '@@type': 'file',
13
+ id: expect.stringContaining(''),
14
+ });
15
+ expect(list).toEqual([
16
+ {
17
+ id: expect.stringContaining(''),
18
+ blob: file,
19
+ url: null,
20
+ remote: false,
21
+ name: 'test.txt',
22
+ type: 'text/plain',
23
+ },
24
+ ]);
25
+ });
26
+ it('replaces a list of files with references', () => {
27
+ const file1 = makeFile();
28
+ const file2 = makeFile();
29
+ const list = [];
30
+ const result = processValueFiles([file1, file2], list.push.bind(list));
31
+ expect(result).toEqual([
32
+ { '@@type': 'file', id: expect.stringContaining('') },
33
+ { '@@type': 'file', id: expect.stringContaining('') },
34
+ ]);
35
+ expect(list).toEqual([
36
+ {
37
+ id: expect.stringContaining(''),
38
+ blob: file1,
39
+ url: null,
40
+ remote: false,
41
+ name: 'test.txt',
42
+ type: 'text/plain',
43
+ },
44
+ {
45
+ id: expect.stringContaining(''),
46
+ blob: file2,
47
+ url: null,
48
+ remote: false,
49
+ name: 'test.txt',
50
+ type: 'text/plain',
51
+ },
52
+ ]);
53
+ expect(result[0].id).not.toEqual(result[1].id);
54
+ });
55
+ it('replaces nested files with references', () => {
56
+ const file = makeFile();
57
+ const list = [];
58
+ const result = processValueFiles({ a: { b: file } }, list.push.bind(list));
59
+ expect(result).toEqual({
60
+ a: {
61
+ b: {
62
+ '@@type': 'file',
63
+ id: expect.stringContaining(''),
64
+ },
65
+ },
66
+ });
67
+ expect(list).toEqual([
68
+ {
69
+ id: expect.stringContaining(''),
70
+ blob: file,
71
+ url: null,
72
+ remote: false,
73
+ name: 'test.txt',
74
+ type: 'text/plain',
75
+ },
76
+ ]);
77
+ });
78
+ });
79
+ //# sourceMappingURL=files.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.test.js","sourceRoot":"","sources":["../../src/files.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export * from './protocol.js';
2
+ export * from './timestamp.js';
3
+ export * from './operation.js';
4
+ export * from './baseline.js';
5
+ export * from './replica.js';
6
+ export * from './schema/index.js';
7
+ export * from './utils.js';
8
+ export * from './indexes.js';
9
+ export { migrate, migrationRange, createDefaultMigration, } from './migration.js';
10
+ export type { Migration, MigrationIndexDescription, MigrationEngine, } from './migration.js';
11
+ export type { UserInfo } from './presence.js';
12
+ export * from './patch.js';
13
+ export * from './oids.js';
14
+ export * from './EventSubscriber.js';
15
+ export * from './undo.js';
16
+ export * from './batching.js';
17
+ export * from './files.js';
18
+ export type { Ref } from './refs.js';
@@ -0,0 +1,16 @@
1
+ export * from './protocol.js';
2
+ export * from './timestamp.js';
3
+ export * from './operation.js';
4
+ export * from './baseline.js';
5
+ export * from './replica.js';
6
+ export * from './schema/index.js';
7
+ export * from './utils.js';
8
+ export * from './indexes.js';
9
+ export { migrate, migrationRange, createDefaultMigration, } from './migration.js';
10
+ export * from './patch.js';
11
+ export * from './oids.js';
12
+ export * from './EventSubscriber.js';
13
+ export * from './undo.js';
14
+ export * from './batching.js';
15
+ export * from './files.js';
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,OAAO,EACN,OAAO,EACP,cAAc,EACd,sBAAsB,GACtB,MAAM,gBAAgB,CAAC;AAOxB,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,sBAAsB,CAAC;AACrC,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { StorageCollectionSchema } from './index.js';
2
+ export declare const COMPOUND_INDEX_SEPARATOR = "\uFFFFFE";
3
+ export declare const COMPOUND_INDEX_LOWER_BOUND_SEPARATOR = "\0";
4
+ export declare const COMPOUND_INDEX_UPPER_BOUND_SEPARATOR = "\uFFFFFF";
5
+ declare type IndexableFieldValue = string | number | boolean | any[];
6
+ export declare type CompoundIndexValue = string | string[];
7
+ export declare function createCompoundIndexValue(...fields: IndexableFieldValue[]): CompoundIndexValue;
8
+ export declare function createUpperBoundIndexValue(...fields: IndexableFieldValue[]): string;
9
+ export declare function createLowerBoundIndexValue(...fields: IndexableFieldValue[]): string;
10
+ export declare function computeSynthetics(schema: StorageCollectionSchema, obj: any): Record<string, any>;
11
+ export declare function computeCompoundIndices(schema: StorageCollectionSchema<any, any, any>, doc: any): any;
12
+ export declare function assignIndexValues(schema: StorageCollectionSchema<any, any, any>, doc: any): any;
13
+ export declare function sanitizeIndexValue(value: unknown): string | number | (string | number)[];
14
+ export {};