cross-state 1.9.9 → 1.9.11

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 (69) hide show
  1. package/dist/duration-B07HkB7T.cjs +142 -0
  2. package/dist/duration-B07HkB7T.cjs.map +1 -0
  3. package/dist/duration-ByqeeOs7.js +124 -0
  4. package/dist/duration-ByqeeOs7.js.map +1 -0
  5. package/dist/index.cjs +6 -4
  6. package/dist/index.cjs.map +1 -1
  7. package/dist/index.js +5 -3
  8. package/dist/index.js.map +1 -1
  9. package/dist/mutative/register.cjs +1 -1
  10. package/dist/mutative/register.cjs.map +1 -1
  11. package/dist/mutative/register.d.cts +1 -1
  12. package/dist/mutative/register.d.ts +1 -1
  13. package/dist/mutative/register.js +1 -1
  14. package/dist/mutative/register.js.map +1 -1
  15. package/dist/patchMethods-BBQDDqwe.cjs.map +1 -1
  16. package/dist/{patchMethods-R3f7HxTy.d.cts → patchMethods-Bfu4UYG7.d.cts} +2 -2
  17. package/dist/{patchMethods--ekCkYUF.d.ts → patchMethods-CEUdeSb_.d.ts} +2 -2
  18. package/dist/patchMethods-D3cdG80W.js.map +1 -1
  19. package/dist/patches/index.d.cts +1 -1
  20. package/dist/patches/index.d.ts +1 -1
  21. package/dist/patches/register.cjs +1 -1
  22. package/dist/patches/register.cjs.map +1 -1
  23. package/dist/patches/register.d.cts +2 -2
  24. package/dist/patches/register.d.ts +2 -2
  25. package/dist/patches/register.js +1 -1
  26. package/dist/patches/register.js.map +1 -1
  27. package/dist/persist/index.cjs +4 -0
  28. package/dist/persist/index.d.cts +2 -0
  29. package/dist/persist/index.d.ts +2 -0
  30. package/dist/persist/index.js +3 -0
  31. package/dist/persist/register.cjs +2 -2
  32. package/dist/persist/register.cjs.map +1 -1
  33. package/dist/persist/register.d.cts +1 -1
  34. package/dist/persist/register.d.ts +1 -1
  35. package/dist/persist/register.js +2 -2
  36. package/dist/persist/register.js.map +1 -1
  37. package/dist/{persist-xv73m7UR.js → persist-BRvAr-ZK.js} +2 -2
  38. package/dist/{persist-xv73m7UR.js.map → persist-BRvAr-ZK.js.map} +1 -1
  39. package/dist/{persist-B341lrOA.cjs → persist-IJeNYfT6.cjs} +11 -11
  40. package/dist/{persist-B341lrOA.cjs.map → persist-IJeNYfT6.cjs.map} +1 -1
  41. package/dist/react/index.cjs +8 -7
  42. package/dist/react/index.cjs.map +1 -1
  43. package/dist/react/index.d.cts +1 -1
  44. package/dist/react/index.d.ts +1 -1
  45. package/dist/react/index.js +3 -2
  46. package/dist/react/index.js.map +1 -1
  47. package/dist/react/register.cjs +3 -3
  48. package/dist/react/register.cjs.map +1 -1
  49. package/dist/react/register.d.cts +2 -2
  50. package/dist/react/register.d.ts +2 -2
  51. package/dist/react/register.js +3 -3
  52. package/dist/react/register.js.map +1 -1
  53. package/dist/{scope-BfaweXvz.js → scope-CtOcmKmO.js} +3 -2
  54. package/dist/{scope-BfaweXvz.js.map → scope-CtOcmKmO.js.map} +1 -1
  55. package/dist/{scope-8MUrzqlS.cjs → scope-DiDmyExm.cjs} +5 -4
  56. package/dist/{scope-8MUrzqlS.cjs.map → scope-DiDmyExm.cjs.map} +1 -1
  57. package/dist/{store-BmlnyYal.js → store-9XkJrxBs.js} +3 -124
  58. package/dist/store-9XkJrxBs.js.map +1 -0
  59. package/dist/{store-fmAYV5hy.cjs → store-B_ToOCrU.cjs} +10 -149
  60. package/dist/store-B_ToOCrU.cjs.map +1 -0
  61. package/dist/{storeMethods-pGlt0zfb.js → storeMethods-D54_9ZCG.js} +2 -2
  62. package/dist/{storeMethods-pGlt0zfb.js.map → storeMethods-D54_9ZCG.js.map} +1 -1
  63. package/dist/{storeMethods-DrMQ7hqX.d.cts → storeMethods-DlScpjKj.d.cts} +2 -2
  64. package/dist/{storeMethods-CYX3AAnA.d.ts → storeMethods-M7KjCOHg.d.ts} +2 -2
  65. package/dist/{storeMethods-DYgUGHSk.cjs → storeMethods-fBHg4hVK.cjs} +2 -2
  66. package/dist/{storeMethods-DYgUGHSk.cjs.map → storeMethods-fBHg4hVK.cjs.map} +1 -1
  67. package/package.json +5 -1
  68. package/dist/store-BmlnyYal.js.map +0 -1
  69. package/dist/store-fmAYV5hy.cjs.map +0 -1
@@ -0,0 +1,142 @@
1
+
2
+ //#region src/lib/isPromise.ts
3
+ function isPromise(value) {
4
+ return typeof value === "object" && value !== null && "then" in value && typeof value.then === "function";
5
+ }
6
+
7
+ //#endregion
8
+ //#region src/lib/queue.ts
9
+ function queue() {
10
+ const q = [];
11
+ const completionListeners = /* @__PURE__ */ new Set();
12
+ let active = false;
13
+ const notify = () => {
14
+ for (const listener of completionListeners) listener();
15
+ completionListeners.clear();
16
+ };
17
+ const run = async () => {
18
+ if (!active) {
19
+ active = true;
20
+ let next;
21
+ while (next = q.shift()) try {
22
+ let result = next.action();
23
+ if (isPromise(result)) result = await result;
24
+ next.resolve(result);
25
+ } catch (error) {
26
+ next.reject(error);
27
+ }
28
+ active = false;
29
+ notify();
30
+ }
31
+ };
32
+ return Object.assign((action, ref) => {
33
+ return new Promise((resolve, reject) => {
34
+ q.push({
35
+ action,
36
+ resolve,
37
+ reject,
38
+ ref
39
+ });
40
+ run();
41
+ });
42
+ }, {
43
+ clear() {
44
+ q.length = 0;
45
+ },
46
+ whenDone() {
47
+ if (!active) return Promise.resolve();
48
+ return new Promise((resolve) => {
49
+ completionListeners.add(resolve);
50
+ });
51
+ },
52
+ get size() {
53
+ return q.length;
54
+ },
55
+ getRefs() {
56
+ return q.map((item) => item.ref).filter((x) => x !== void 0);
57
+ }
58
+ });
59
+ }
60
+
61
+ //#endregion
62
+ //#region src/lib/duration.ts
63
+ const unitToMilliseconds = {
64
+ ns: 1e-6,
65
+ us: .001,
66
+ µs: .001,
67
+ ms: 1,
68
+ s: 1e3,
69
+ m: 6e4,
70
+ h: 36e5,
71
+ D: 864e5,
72
+ M: 2592e6,
73
+ Y: 31536e6
74
+ };
75
+ function calcDuration(t) {
76
+ switch (typeof t) {
77
+ case "number": return t;
78
+ case "string": return calcDurationString(t);
79
+ default: return calcDurationObject(t);
80
+ }
81
+ }
82
+ const plainNumberStyle = /^-?\d+(\.\d+)?$/;
83
+ const golangStyle = /^-?(\d+(\.\d+)?(h|m|s|ms|us|µs|ns))+$/;
84
+ const dotnetStyle = /^(?<sign>-)?((?<D>\d+)\.)?(?<h>\d{1,2}):(?<m>\d{1,2})(:(?<s>\d{1,2}))?(\.(?<ms>\d{1,3}))?$/;
85
+ const iso8601Style = /^(?<sign>-)?P((?<Y>\d+)Y)?((?<M>\d+)M)?((?<D>\d+)D)?T?((?<h>\d+)H)?((?<m>\d+)M)?((?<s>\d+(\.\d+)?)S)?$/;
86
+ function calcDurationString(t) {
87
+ let match;
88
+ if (plainNumberStyle.test(t)) return parseFloat(t);
89
+ if (golangStyle.test(t)) {
90
+ let ms = 0;
91
+ let sign = 1;
92
+ if (t.startsWith("-")) {
93
+ sign = -1;
94
+ t = t.slice(1);
95
+ }
96
+ const parts = t.split(/(\d+(?:\.\d+))|([a-zµ]+)/).filter(Boolean);
97
+ for (let i = 0; i < parts.length; i += 2) {
98
+ const value = parseFloat(parts[i]);
99
+ const unit = parts[i + 1];
100
+ ms += value * unitToMilliseconds[unit];
101
+ }
102
+ return ms * sign;
103
+ }
104
+ if (match = t.match(dotnetStyle) ?? t.match(iso8601Style)) {
105
+ let ms = 0;
106
+ let sign = 1;
107
+ for (const [unit, factor] of Object.entries(match.groups ?? {})) {
108
+ if (!factor) continue;
109
+ if (unit === "sign") {
110
+ sign = -1;
111
+ continue;
112
+ }
113
+ ms += parseFloat(factor) * unitToMilliseconds[unit];
114
+ }
115
+ return ms * sign;
116
+ }
117
+ throw new Error(`Invalid duration string: "${t}"`);
118
+ }
119
+ function calcDurationObject(t) {
120
+ return (t.milliseconds ?? 0) + (t.seconds ?? 0) * unitToMilliseconds.s + (t.minutes ?? 0) * unitToMilliseconds.m + (t.hours ?? 0) * unitToMilliseconds.h + (t.days ?? 0) * unitToMilliseconds.D + (t.months ?? 0) * unitToMilliseconds.M + (t.years ?? 0) * unitToMilliseconds.Y;
121
+ }
122
+
123
+ //#endregion
124
+ Object.defineProperty(exports, 'calcDuration', {
125
+ enumerable: true,
126
+ get: function () {
127
+ return calcDuration;
128
+ }
129
+ });
130
+ Object.defineProperty(exports, 'isPromise', {
131
+ enumerable: true,
132
+ get: function () {
133
+ return isPromise;
134
+ }
135
+ });
136
+ Object.defineProperty(exports, 'queue', {
137
+ enumerable: true,
138
+ get: function () {
139
+ return queue;
140
+ }
141
+ });
142
+ //# sourceMappingURL=duration-B07HkB7T.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duration-B07HkB7T.cjs","names":[],"sources":["../src/lib/isPromise.ts","../src/lib/queue.ts","../src/lib/duration.ts"],"sourcesContent":["export default function isPromise(value: unknown): value is Promise<unknown> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'then' in value &&\n typeof value.then === 'function'\n );\n}\n","import type { MaybePromise } from './maybePromise';\nimport type { Listener } from '@core';\nimport isPromise from '@lib/isPromise';\n\ntype Action<T> = () => MaybePromise<T>;\n\nexport interface Queue {\n <T>(action: Action<T>, ref?: any): Promise<T>;\n clear: () => void;\n whenDone: () => Promise<void>;\n size: number;\n getRefs: () => any[];\n}\n\nexport function queue(): Queue {\n const q: {\n action: Action<any>;\n resolve: (value: any) => void;\n reject: (error: unknown) => void;\n ref?: any;\n }[] = [];\n const completionListeners = new Set<Listener<void>>();\n let active = false;\n\n const notify = () => {\n for (const listener of completionListeners) {\n listener();\n }\n\n completionListeners.clear();\n };\n\n const run = async () => {\n if (!active) {\n active = true;\n\n let next;\n while ((next = q.shift())) {\n try {\n let result = next.action();\n if (isPromise(result)) {\n result = await result;\n }\n\n next.resolve(result);\n } catch (error) {\n next.reject(error);\n }\n }\n\n active = false;\n notify();\n }\n };\n\n return Object.assign(\n <T>(action: Action<T>, ref?: any) => {\n return new Promise<T>((resolve, reject) => {\n q.push({ action, resolve, reject, ref });\n void run();\n });\n },\n {\n clear() {\n q.length = 0;\n },\n\n whenDone() {\n if (!active) {\n return Promise.resolve();\n }\n\n return new Promise<void>((resolve) => {\n completionListeners.add(resolve);\n });\n },\n\n get size() {\n return q.length;\n },\n\n getRefs() {\n return q.map((item) => item.ref).filter((x) => x !== undefined);\n },\n },\n );\n}\n","import type { Duration, DurationObject } from '../core/commonTypes';\n\nconst unitToMilliseconds = {\n ns: 1e-6,\n us: 1e-3,\n µs: 1e-3,\n ms: 1,\n s: 1_000,\n m: 60_000,\n h: 3_600_000,\n D: 86_400_000, // approximation - not accounting for DST changes\n M: 2_592_000_000, // approximation - 30 days\n Y: 31_536_000_000, // approximation - 365 days\n} satisfies Record<string, number>;\n\nexport function calcDuration(t: Duration): number {\n switch (typeof t) {\n case 'number':\n return t;\n case 'string':\n return calcDurationString(t);\n default:\n return calcDurationObject(t);\n }\n}\n\nconst plainNumberStyle = /^-?\\d+(\\.\\d+)?$/;\nconst golangStyle = /^-?(\\d+(\\.\\d+)?(h|m|s|ms|us|µs|ns))+$/;\nconst dotnetStyle =\n /^(?<sign>-)?((?<D>\\d+)\\.)?(?<h>\\d{1,2}):(?<m>\\d{1,2})(:(?<s>\\d{1,2}))?(\\.(?<ms>\\d{1,3}))?$/;\nconst iso8601Style =\n /^(?<sign>-)?P((?<Y>\\d+)Y)?((?<M>\\d+)M)?((?<D>\\d+)D)?T?((?<h>\\d+)H)?((?<m>\\d+)M)?((?<s>\\d+(\\.\\d+)?)S)?$/;\n\nexport function calcDurationString(t: string): number {\n let match;\n\n if (plainNumberStyle.test(t)) {\n return parseFloat(t);\n }\n\n if (golangStyle.test(t)) {\n let ms = 0;\n let sign = 1;\n\n if (t.startsWith('-')) {\n sign = -1;\n t = t.slice(1);\n }\n\n const parts = t.split(/(\\d+(?:\\.\\d+))|([a-zµ]+)/).filter(Boolean);\n for (let i = 0; i < parts.length; i += 2) {\n const value = parseFloat(parts[i]!);\n const unit = parts[i + 1] as keyof typeof unitToMilliseconds;\n ms += value * unitToMilliseconds[unit];\n }\n\n return ms * sign;\n }\n\n if ((match = t.match(dotnetStyle) ?? t.match(iso8601Style))) {\n let ms = 0;\n let sign = 1;\n\n for (const [unit, factor] of Object.entries(match.groups ?? {})) {\n if (!factor) {\n continue;\n }\n if (unit === 'sign') {\n sign = -1;\n continue;\n }\n\n ms += parseFloat(factor) * unitToMilliseconds[unit as keyof typeof unitToMilliseconds];\n }\n\n return ms * sign;\n }\n\n throw new Error(`Invalid duration string: \"${t}\"`);\n}\n\nexport function calcDurationObject(t: DurationObject): number {\n return (\n (t.milliseconds ?? 0) +\n (t.seconds ?? 0) * unitToMilliseconds.s +\n (t.minutes ?? 0) * unitToMilliseconds.m +\n (t.hours ?? 0) * unitToMilliseconds.h +\n (t.days ?? 0) * unitToMilliseconds.D +\n (t.months ?? 0) * unitToMilliseconds.M +\n (t.years ?? 0) * unitToMilliseconds.Y\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ //#region src/lib/isPromise.ts
2
+ function isPromise(value) {
3
+ return typeof value === "object" && value !== null && "then" in value && typeof value.then === "function";
4
+ }
5
+
6
+ //#endregion
7
+ //#region src/lib/queue.ts
8
+ function queue() {
9
+ const q = [];
10
+ const completionListeners = /* @__PURE__ */ new Set();
11
+ let active = false;
12
+ const notify = () => {
13
+ for (const listener of completionListeners) listener();
14
+ completionListeners.clear();
15
+ };
16
+ const run = async () => {
17
+ if (!active) {
18
+ active = true;
19
+ let next;
20
+ while (next = q.shift()) try {
21
+ let result = next.action();
22
+ if (isPromise(result)) result = await result;
23
+ next.resolve(result);
24
+ } catch (error) {
25
+ next.reject(error);
26
+ }
27
+ active = false;
28
+ notify();
29
+ }
30
+ };
31
+ return Object.assign((action, ref) => {
32
+ return new Promise((resolve, reject) => {
33
+ q.push({
34
+ action,
35
+ resolve,
36
+ reject,
37
+ ref
38
+ });
39
+ run();
40
+ });
41
+ }, {
42
+ clear() {
43
+ q.length = 0;
44
+ },
45
+ whenDone() {
46
+ if (!active) return Promise.resolve();
47
+ return new Promise((resolve) => {
48
+ completionListeners.add(resolve);
49
+ });
50
+ },
51
+ get size() {
52
+ return q.length;
53
+ },
54
+ getRefs() {
55
+ return q.map((item) => item.ref).filter((x) => x !== void 0);
56
+ }
57
+ });
58
+ }
59
+
60
+ //#endregion
61
+ //#region src/lib/duration.ts
62
+ const unitToMilliseconds = {
63
+ ns: 1e-6,
64
+ us: .001,
65
+ µs: .001,
66
+ ms: 1,
67
+ s: 1e3,
68
+ m: 6e4,
69
+ h: 36e5,
70
+ D: 864e5,
71
+ M: 2592e6,
72
+ Y: 31536e6
73
+ };
74
+ function calcDuration(t) {
75
+ switch (typeof t) {
76
+ case "number": return t;
77
+ case "string": return calcDurationString(t);
78
+ default: return calcDurationObject(t);
79
+ }
80
+ }
81
+ const plainNumberStyle = /^-?\d+(\.\d+)?$/;
82
+ const golangStyle = /^-?(\d+(\.\d+)?(h|m|s|ms|us|µs|ns))+$/;
83
+ const dotnetStyle = /^(?<sign>-)?((?<D>\d+)\.)?(?<h>\d{1,2}):(?<m>\d{1,2})(:(?<s>\d{1,2}))?(\.(?<ms>\d{1,3}))?$/;
84
+ const iso8601Style = /^(?<sign>-)?P((?<Y>\d+)Y)?((?<M>\d+)M)?((?<D>\d+)D)?T?((?<h>\d+)H)?((?<m>\d+)M)?((?<s>\d+(\.\d+)?)S)?$/;
85
+ function calcDurationString(t) {
86
+ let match;
87
+ if (plainNumberStyle.test(t)) return parseFloat(t);
88
+ if (golangStyle.test(t)) {
89
+ let ms = 0;
90
+ let sign = 1;
91
+ if (t.startsWith("-")) {
92
+ sign = -1;
93
+ t = t.slice(1);
94
+ }
95
+ const parts = t.split(/(\d+(?:\.\d+))|([a-zµ]+)/).filter(Boolean);
96
+ for (let i = 0; i < parts.length; i += 2) {
97
+ const value = parseFloat(parts[i]);
98
+ const unit = parts[i + 1];
99
+ ms += value * unitToMilliseconds[unit];
100
+ }
101
+ return ms * sign;
102
+ }
103
+ if (match = t.match(dotnetStyle) ?? t.match(iso8601Style)) {
104
+ let ms = 0;
105
+ let sign = 1;
106
+ for (const [unit, factor] of Object.entries(match.groups ?? {})) {
107
+ if (!factor) continue;
108
+ if (unit === "sign") {
109
+ sign = -1;
110
+ continue;
111
+ }
112
+ ms += parseFloat(factor) * unitToMilliseconds[unit];
113
+ }
114
+ return ms * sign;
115
+ }
116
+ throw new Error(`Invalid duration string: "${t}"`);
117
+ }
118
+ function calcDurationObject(t) {
119
+ return (t.milliseconds ?? 0) + (t.seconds ?? 0) * unitToMilliseconds.s + (t.minutes ?? 0) * unitToMilliseconds.m + (t.hours ?? 0) * unitToMilliseconds.h + (t.days ?? 0) * unitToMilliseconds.D + (t.months ?? 0) * unitToMilliseconds.M + (t.years ?? 0) * unitToMilliseconds.Y;
120
+ }
121
+
122
+ //#endregion
123
+ export { queue as n, isPromise as r, calcDuration as t };
124
+ //# sourceMappingURL=duration-ByqeeOs7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duration-ByqeeOs7.js","names":[],"sources":["../src/lib/isPromise.ts","../src/lib/queue.ts","../src/lib/duration.ts"],"sourcesContent":["export default function isPromise(value: unknown): value is Promise<unknown> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'then' in value &&\n typeof value.then === 'function'\n );\n}\n","import type { MaybePromise } from './maybePromise';\nimport type { Listener } from '@core';\nimport isPromise from '@lib/isPromise';\n\ntype Action<T> = () => MaybePromise<T>;\n\nexport interface Queue {\n <T>(action: Action<T>, ref?: any): Promise<T>;\n clear: () => void;\n whenDone: () => Promise<void>;\n size: number;\n getRefs: () => any[];\n}\n\nexport function queue(): Queue {\n const q: {\n action: Action<any>;\n resolve: (value: any) => void;\n reject: (error: unknown) => void;\n ref?: any;\n }[] = [];\n const completionListeners = new Set<Listener<void>>();\n let active = false;\n\n const notify = () => {\n for (const listener of completionListeners) {\n listener();\n }\n\n completionListeners.clear();\n };\n\n const run = async () => {\n if (!active) {\n active = true;\n\n let next;\n while ((next = q.shift())) {\n try {\n let result = next.action();\n if (isPromise(result)) {\n result = await result;\n }\n\n next.resolve(result);\n } catch (error) {\n next.reject(error);\n }\n }\n\n active = false;\n notify();\n }\n };\n\n return Object.assign(\n <T>(action: Action<T>, ref?: any) => {\n return new Promise<T>((resolve, reject) => {\n q.push({ action, resolve, reject, ref });\n void run();\n });\n },\n {\n clear() {\n q.length = 0;\n },\n\n whenDone() {\n if (!active) {\n return Promise.resolve();\n }\n\n return new Promise<void>((resolve) => {\n completionListeners.add(resolve);\n });\n },\n\n get size() {\n return q.length;\n },\n\n getRefs() {\n return q.map((item) => item.ref).filter((x) => x !== undefined);\n },\n },\n );\n}\n","import type { Duration, DurationObject } from '../core/commonTypes';\n\nconst unitToMilliseconds = {\n ns: 1e-6,\n us: 1e-3,\n µs: 1e-3,\n ms: 1,\n s: 1_000,\n m: 60_000,\n h: 3_600_000,\n D: 86_400_000, // approximation - not accounting for DST changes\n M: 2_592_000_000, // approximation - 30 days\n Y: 31_536_000_000, // approximation - 365 days\n} satisfies Record<string, number>;\n\nexport function calcDuration(t: Duration): number {\n switch (typeof t) {\n case 'number':\n return t;\n case 'string':\n return calcDurationString(t);\n default:\n return calcDurationObject(t);\n }\n}\n\nconst plainNumberStyle = /^-?\\d+(\\.\\d+)?$/;\nconst golangStyle = /^-?(\\d+(\\.\\d+)?(h|m|s|ms|us|µs|ns))+$/;\nconst dotnetStyle =\n /^(?<sign>-)?((?<D>\\d+)\\.)?(?<h>\\d{1,2}):(?<m>\\d{1,2})(:(?<s>\\d{1,2}))?(\\.(?<ms>\\d{1,3}))?$/;\nconst iso8601Style =\n /^(?<sign>-)?P((?<Y>\\d+)Y)?((?<M>\\d+)M)?((?<D>\\d+)D)?T?((?<h>\\d+)H)?((?<m>\\d+)M)?((?<s>\\d+(\\.\\d+)?)S)?$/;\n\nexport function calcDurationString(t: string): number {\n let match;\n\n if (plainNumberStyle.test(t)) {\n return parseFloat(t);\n }\n\n if (golangStyle.test(t)) {\n let ms = 0;\n let sign = 1;\n\n if (t.startsWith('-')) {\n sign = -1;\n t = t.slice(1);\n }\n\n const parts = t.split(/(\\d+(?:\\.\\d+))|([a-zµ]+)/).filter(Boolean);\n for (let i = 0; i < parts.length; i += 2) {\n const value = parseFloat(parts[i]!);\n const unit = parts[i + 1] as keyof typeof unitToMilliseconds;\n ms += value * unitToMilliseconds[unit];\n }\n\n return ms * sign;\n }\n\n if ((match = t.match(dotnetStyle) ?? t.match(iso8601Style))) {\n let ms = 0;\n let sign = 1;\n\n for (const [unit, factor] of Object.entries(match.groups ?? {})) {\n if (!factor) {\n continue;\n }\n if (unit === 'sign') {\n sign = -1;\n continue;\n }\n\n ms += parseFloat(factor) * unitToMilliseconds[unit as keyof typeof unitToMilliseconds];\n }\n\n return ms * sign;\n }\n\n throw new Error(`Invalid duration string: \"${t}\"`);\n}\n\nexport function calcDurationObject(t: DurationObject): number {\n return (\n (t.milliseconds ?? 0) +\n (t.seconds ?? 0) * unitToMilliseconds.s +\n (t.minutes ?? 0) * unitToMilliseconds.m +\n (t.hours ?? 0) * unitToMilliseconds.h +\n (t.days ?? 0) * unitToMilliseconds.D +\n (t.months ?? 0) * unitToMilliseconds.M +\n (t.years ?? 0) * unitToMilliseconds.Y\n );\n}\n"],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -1,10 +1,12 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_store = require('./store-fmAYV5hy.cjs');
3
- const require_scope = require('./scope-8MUrzqlS.cjs');
2
+ const require_store = require('./store-B_ToOCrU.cjs');
3
+ const require_scope = require('./scope-DiDmyExm.cjs');
4
4
  const require_propAccess = require('./propAccess-DdLF12Jq.cjs');
5
+ const require_duration = require('./duration-B07HkB7T.cjs');
5
6
  const require_patchMethods = require('./patchMethods-BBQDDqwe.cjs');
6
7
  const require_extendedJson = require('./extendedJson-pbOLcymB.cjs');
7
- const require_persist = require('./persist-B341lrOA.cjs');
8
+ const require_persist = require('./persist-IJeNYfT6.cjs');
9
+ require('./persist/index.cjs');
8
10
 
9
11
  //#region src/core/pagedCache.ts
10
12
  var PagedCache = class PagedCache extends require_scope.Cache {
@@ -95,7 +97,7 @@ exports.Store = require_store.Store;
95
97
  exports.allResources = require_scope.allResources;
96
98
  exports.applyPatches = require_patchMethods.applyPatches;
97
99
  exports.arrayMethods = require_store.arrayMethods;
98
- exports.calcDuration = require_store.calcDuration;
100
+ exports.calcDuration = require_duration.calcDuration;
99
101
  exports.createCache = require_scope.createCache;
100
102
  exports.createPagedCache = createPagedCache;
101
103
  exports.createResourceGroup = require_scope.createResourceGroup;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["Cache","internalCreate","defaultCacheOptions"],"sources":["../src/core/pagedCache.ts","../src/lib/updateHelpers.ts"],"sourcesContent":["import {\n Cache,\n defaultCacheOptions,\n internalCreate,\n type CacheOptions,\n type CreateCacheResult,\n} from '@core/cache';\nimport type { CalculationActions } from '@core/commonTypes';\nimport { autobind } from '@lib/autobind';\n\nexport interface PageCacheFunctionProps<T> extends CalculationActions<Promise<PagedCacheState<T>>> {\n /**\n * Previously fetched pages (in order).\n */\n pages: T[];\n /**\n * Last fetched page or null if there are no previously fetched pages.\n */\n prevPage: T | null;\n}\n\nexport interface PageCacheFunction<T> {\n (props: PageCacheFunctionProps<T>): Promise<T | null>;\n}\n\nexport interface PagedCacheDefinition<T, Args extends any[]> {\n /**\n * Function to fetch a page.\n * The function receives the current state of the cache, including previously fetched pages.\n */\n fetchPage: (this: PagedCache<T, Args>, props: PageCacheFunctionProps<T>) => Promise<T | null>;\n /**\n * Optional function to determine the total number of pages - usually based on data in the fetched pages.\n */\n getPageCount?: (this: PagedCache<T, Args>, pages: T[]) => number | null;\n /**\n * Optional function to determine if there are more pages to fetch - usually based on data in the fetched pages.\n * If not provided, it will be assumed there are more pages until getPageCount is provided and the number of fetched pages equals the page count or until fetchPage returns null.\n */\n hasMorePages?: (this: PagedCache<T, Args>, pages: T[]) => boolean;\n}\n\nexport interface PagedCacheDefinitionFunction<T, Args extends any[]> {\n (...args: Args): PagedCacheDefinition<T, Args>;\n}\n\nexport interface PagedCacheState<T> {\n pages: T[];\n hasMore: boolean;\n pageCount: number | null;\n}\n\nexport interface FetchNextPageOptions {\n /**\n * If true, will throw if the cache is in an error state or if another page is being fetched.\n */\n throwOnError?: boolean;\n}\n\nexport class PagedCache<T, Args extends any[] = []> extends Cache<PagedCacheState<T>, Args> {\n constructor(\n public readonly definition: PagedCacheDefinition<T, Args>,\n args: Args,\n options: CacheOptions<PagedCacheState<T>, Args> = {},\n ) {\n super(async (helpers) => loadPage(this, helpers, []), args, options, undefined);\n autobind(PagedCache);\n }\n\n async fetchNextPage({ throwOnError }: FetchNextPageOptions = {}): Promise<void> {\n const { status, isStale, isUpdating, value } = this.state.get();\n\n if (status === 'error') {\n if (!throwOnError) return;\n throw new Error('Cannot fetch next page while cache is in error state');\n }\n\n if (isUpdating) {\n if (!throwOnError) return;\n throw new Error('Cannot fetch next page while another page is being fetched');\n }\n\n if (status === 'pending' || isStale) {\n await this.get().catch(() => {});\n return;\n }\n\n if (!value.hasMore) {\n if (!throwOnError) return;\n throw new Error('No more pages to fetch');\n }\n\n this.stalePromise = this.calculatedValue?.value;\n\n const ac = new AbortController();\n const promise = loadPage(\n this,\n {\n use() {\n throw new Error('Not implemented');\n },\n connect() {\n throw new Error('Not implemented');\n },\n signal: ac.signal,\n },\n value.pages,\n );\n\n this.updateValue(promise);\n\n try {\n await promise;\n } catch (error) {\n if (!throwOnError) return;\n throw error;\n }\n }\n}\n\nasync function loadPage<T, Args extends any[]>(\n cache: PagedCache<T, Args>,\n helpers: CalculationActions<Promise<PagedCacheState<T>>>,\n oldPages: T[],\n) {\n const { fetchPage, hasMorePages, getPageCount } = cache.definition;\n\n const page = await fetchPage.call(cache, {\n ...helpers,\n pages: oldPages,\n prevPage: oldPages.length > 0 ? oldPages[oldPages.length - 1]! : null,\n });\n\n const pages = page === null ? oldPages : oldPages.concat([page]);\n const pageCount = getPageCount?.call(cache, pages) ?? null;\n const hasMore = hasMorePages\n ? hasMorePages.call(cache, pages)\n : pageCount !== null\n ? pages.length < pageCount\n : page !== null;\n\n return { pages, hasMore, pageCount };\n}\n\nfunction createPaged<T, Args extends any[] = []>(\n definition: PagedCacheDefinitionFunction<T, Args>,\n options?: CacheOptions<PagedCacheState<T>, Args>,\n): CreateCacheResult<PagedCacheState<T>, Args, PagedCache<T, Args>>;\n\nfunction createPaged<T>(\n definition: PagedCacheDefinition<T, []>,\n options?: CacheOptions<PagedCacheState<T>, []>,\n): CreateCacheResult<PagedCacheState<T>, [], PagedCache<T, []>>;\n\nfunction createPaged<T, Args extends any[] = []>(\n definition: PagedCacheDefinitionFunction<T, Args> | PagedCacheDefinition<T, Args>,\n options?: CacheOptions<PagedCacheState<T>, Args>,\n): CreateCacheResult<PagedCacheState<T>, Args, PagedCache<T, Args>> {\n return internalCreate<PagedCacheState<T>, Args, PagedCache<T, Args>>((args, options) => {\n let currentDefinition = definition;\n if (currentDefinition instanceof Function) {\n currentDefinition = currentDefinition(...args);\n }\n return new PagedCache(currentDefinition, args, options);\n }, options);\n}\n\nexport const createPagedCache: typeof createPaged & { defaultOptions: CacheOptions<any, any> } =\n /* @__PURE__ */ Object.assign(createPaged, {\n defaultOptions: defaultCacheOptions,\n });\n","export function findOrDefault<T>(\n array: T[],\n predicate: (item: T) => boolean,\n defaultValue: T | (() => T),\n): T {\n const index = array.findIndex(predicate);\n\n if (index >= 0) {\n return array[index]!;\n }\n\n const value = defaultValue instanceof Function ? defaultValue() : defaultValue;\n array.push(value);\n return value;\n}\n"],"mappings":";;;;;;;;;AA2DA,IAAa,aAAb,MAAa,mBAA+CA,oBAAgC;CAC1F,YACE,AAAgB,YAChB,MACA,UAAkD,CAAC,GACnD;EACA,MAAM,OAAO,YAAY,SAAS,MAAM,SAAS,CAAC,CAAC,GAAG,MAAM,SAAS,MAAS;EAJ9D;EAKhB,uBAAS,UAAU;CACrB;CAEA,MAAM,cAAc,EAAE,iBAAuC,CAAC,GAAkB;EAC9E,MAAM,EAAE,QAAQ,SAAS,YAAY,UAAU,KAAK,MAAM,IAAI;EAE9D,IAAI,WAAW,SAAS;GACtB,IAAI,CAAC,cAAc;GACnB,MAAM,IAAI,MAAM,sDAAsD;EACxE;EAEA,IAAI,YAAY;GACd,IAAI,CAAC,cAAc;GACnB,MAAM,IAAI,MAAM,4DAA4D;EAC9E;EAEA,IAAI,WAAW,aAAa,SAAS;GACnC,MAAM,KAAK,IAAI,EAAE,YAAY,CAAC,CAAC;GAC/B;EACF;EAEA,IAAI,CAAC,MAAM,SAAS;GAClB,IAAI,CAAC,cAAc;GACnB,MAAM,IAAI,MAAM,wBAAwB;EAC1C;EAEA,KAAK,eAAe,KAAK,iBAAiB;EAE1C,MAAM,KAAK,IAAI,gBAAgB;EAC/B,MAAM,UAAU,SACd,MACA;GACE,MAAM;IACJ,MAAM,IAAI,MAAM,iBAAiB;GACnC;GACA,UAAU;IACR,MAAM,IAAI,MAAM,iBAAiB;GACnC;GACA,QAAQ,GAAG;EACb,GACA,MAAM,KACR;EAEA,KAAK,YAAY,OAAO;EAExB,IAAI;GACF,MAAM;EACR,SAAS,OAAO;GACd,IAAI,CAAC,cAAc;GACnB,MAAM;EACR;CACF;AACF;AAEA,eAAe,SACb,OACA,SACA,UACA;CACA,MAAM,EAAE,WAAW,cAAc,iBAAiB,MAAM;CAExD,MAAM,OAAO,MAAM,UAAU,KAAK,OAAO;EACvC,GAAG;EACH,OAAO;EACP,UAAU,SAAS,SAAS,IAAI,SAAS,SAAS,SAAS,KAAM;CACnE,CAAC;CAED,MAAM,QAAQ,SAAS,OAAO,WAAW,SAAS,OAAO,CAAC,IAAI,CAAC;CAC/D,MAAM,YAAY,cAAc,KAAK,OAAO,KAAK,KAAK;CAOtD,OAAO;EAAE;EAAO,SANA,eACZ,aAAa,KAAK,OAAO,KAAK,IAC9B,cAAc,OACZ,MAAM,SAAS,YACf,SAAS;EAEU;CAAU;AACrC;AAYA,SAAS,YACP,YACA,SACkE;CAClE,OAAOC,8BAA+D,MAAM,YAAY;EACtF,IAAI,oBAAoB;EACxB,IAAI,6BAA6B,UAC/B,oBAAoB,kBAAkB,GAAG,IAAI;EAE/C,OAAO,IAAI,WAAW,mBAAmB,MAAM,OAAO;CACxD,GAAG,OAAO;AACZ;AAEA,MAAa,mBACK,uBAAO,OAAO,aAAa,EACzC,gBAAgBC,kCAClB,CAAC;;;;AC1KH,SAAgB,cACd,OACA,WACA,cACG;CACH,MAAM,QAAQ,MAAM,UAAU,SAAS;CAEvC,IAAI,SAAS,GACX,OAAO,MAAM;CAGf,MAAM,QAAQ,wBAAwB,WAAW,aAAa,IAAI;CAClE,MAAM,KAAK,KAAK;CAChB,OAAO;AACT"}
1
+ {"version":3,"file":"index.cjs","names":["Cache","internalCreate","defaultCacheOptions"],"sources":["../src/core/pagedCache.ts","../src/lib/updateHelpers.ts"],"sourcesContent":["import {\n Cache,\n defaultCacheOptions,\n internalCreate,\n type CacheOptions,\n type CreateCacheResult,\n} from '@core/cache';\nimport type { CalculationActions } from '@core/commonTypes';\nimport { autobind } from '@lib/autobind';\n\nexport interface PageCacheFunctionProps<T> extends CalculationActions<Promise<PagedCacheState<T>>> {\n /**\n * Previously fetched pages (in order).\n */\n pages: T[];\n /**\n * Last fetched page or null if there are no previously fetched pages.\n */\n prevPage: T | null;\n}\n\nexport interface PageCacheFunction<T> {\n (props: PageCacheFunctionProps<T>): Promise<T | null>;\n}\n\nexport interface PagedCacheDefinition<T, Args extends any[]> {\n /**\n * Function to fetch a page.\n * The function receives the current state of the cache, including previously fetched pages.\n */\n fetchPage: (this: PagedCache<T, Args>, props: PageCacheFunctionProps<T>) => Promise<T | null>;\n /**\n * Optional function to determine the total number of pages - usually based on data in the fetched pages.\n */\n getPageCount?: (this: PagedCache<T, Args>, pages: T[]) => number | null;\n /**\n * Optional function to determine if there are more pages to fetch - usually based on data in the fetched pages.\n * If not provided, it will be assumed there are more pages until getPageCount is provided and the number of fetched pages equals the page count or until fetchPage returns null.\n */\n hasMorePages?: (this: PagedCache<T, Args>, pages: T[]) => boolean;\n}\n\nexport interface PagedCacheDefinitionFunction<T, Args extends any[]> {\n (...args: Args): PagedCacheDefinition<T, Args>;\n}\n\nexport interface PagedCacheState<T> {\n pages: T[];\n hasMore: boolean;\n pageCount: number | null;\n}\n\nexport interface FetchNextPageOptions {\n /**\n * If true, will throw if the cache is in an error state or if another page is being fetched.\n */\n throwOnError?: boolean;\n}\n\nexport class PagedCache<T, Args extends any[] = []> extends Cache<PagedCacheState<T>, Args> {\n constructor(\n public readonly definition: PagedCacheDefinition<T, Args>,\n args: Args,\n options: CacheOptions<PagedCacheState<T>, Args> = {},\n ) {\n super(async (helpers) => loadPage(this, helpers, []), args, options, undefined);\n autobind(PagedCache);\n }\n\n async fetchNextPage({ throwOnError }: FetchNextPageOptions = {}): Promise<void> {\n const { status, isStale, isUpdating, value } = this.state.get();\n\n if (status === 'error') {\n if (!throwOnError) return;\n throw new Error('Cannot fetch next page while cache is in error state');\n }\n\n if (isUpdating) {\n if (!throwOnError) return;\n throw new Error('Cannot fetch next page while another page is being fetched');\n }\n\n if (status === 'pending' || isStale) {\n await this.get().catch(() => {});\n return;\n }\n\n if (!value.hasMore) {\n if (!throwOnError) return;\n throw new Error('No more pages to fetch');\n }\n\n this.stalePromise = this.calculatedValue?.value;\n\n const ac = new AbortController();\n const promise = loadPage(\n this,\n {\n use() {\n throw new Error('Not implemented');\n },\n connect() {\n throw new Error('Not implemented');\n },\n signal: ac.signal,\n },\n value.pages,\n );\n\n this.updateValue(promise);\n\n try {\n await promise;\n } catch (error) {\n if (!throwOnError) return;\n throw error;\n }\n }\n}\n\nasync function loadPage<T, Args extends any[]>(\n cache: PagedCache<T, Args>,\n helpers: CalculationActions<Promise<PagedCacheState<T>>>,\n oldPages: T[],\n) {\n const { fetchPage, hasMorePages, getPageCount } = cache.definition;\n\n const page = await fetchPage.call(cache, {\n ...helpers,\n pages: oldPages,\n prevPage: oldPages.length > 0 ? oldPages[oldPages.length - 1]! : null,\n });\n\n const pages = page === null ? oldPages : oldPages.concat([page]);\n const pageCount = getPageCount?.call(cache, pages) ?? null;\n const hasMore = hasMorePages\n ? hasMorePages.call(cache, pages)\n : pageCount !== null\n ? pages.length < pageCount\n : page !== null;\n\n return { pages, hasMore, pageCount };\n}\n\nfunction createPaged<T, Args extends any[] = []>(\n definition: PagedCacheDefinitionFunction<T, Args>,\n options?: CacheOptions<PagedCacheState<T>, Args>,\n): CreateCacheResult<PagedCacheState<T>, Args, PagedCache<T, Args>>;\n\nfunction createPaged<T>(\n definition: PagedCacheDefinition<T, []>,\n options?: CacheOptions<PagedCacheState<T>, []>,\n): CreateCacheResult<PagedCacheState<T>, [], PagedCache<T, []>>;\n\nfunction createPaged<T, Args extends any[] = []>(\n definition: PagedCacheDefinitionFunction<T, Args> | PagedCacheDefinition<T, Args>,\n options?: CacheOptions<PagedCacheState<T>, Args>,\n): CreateCacheResult<PagedCacheState<T>, Args, PagedCache<T, Args>> {\n return internalCreate<PagedCacheState<T>, Args, PagedCache<T, Args>>((args, options) => {\n let currentDefinition = definition;\n if (currentDefinition instanceof Function) {\n currentDefinition = currentDefinition(...args);\n }\n return new PagedCache(currentDefinition, args, options);\n }, options);\n}\n\nexport const createPagedCache: typeof createPaged & { defaultOptions: CacheOptions<any, any> } =\n /* @__PURE__ */ Object.assign(createPaged, {\n defaultOptions: defaultCacheOptions,\n });\n","export function findOrDefault<T>(\n array: T[],\n predicate: (item: T) => boolean,\n defaultValue: T | (() => T),\n): T {\n const index = array.findIndex(predicate);\n\n if (index >= 0) {\n return array[index]!;\n }\n\n const value = defaultValue instanceof Function ? defaultValue() : defaultValue;\n array.push(value);\n return value;\n}\n"],"mappings":";;;;;;;;;;;AA2DA,IAAa,aAAb,MAAa,mBAA+CA,oBAAgC;CAC1F,YACE,AAAgB,YAChB,MACA,UAAkD,CAAC,GACnD;EACA,MAAM,OAAO,YAAY,SAAS,MAAM,SAAS,CAAC,CAAC,GAAG,MAAM,SAAS,MAAS;EAJ9D;EAKhB,uBAAS,UAAU;CACrB;CAEA,MAAM,cAAc,EAAE,iBAAuC,CAAC,GAAkB;EAC9E,MAAM,EAAE,QAAQ,SAAS,YAAY,UAAU,KAAK,MAAM,IAAI;EAE9D,IAAI,WAAW,SAAS;GACtB,IAAI,CAAC,cAAc;GACnB,MAAM,IAAI,MAAM,sDAAsD;EACxE;EAEA,IAAI,YAAY;GACd,IAAI,CAAC,cAAc;GACnB,MAAM,IAAI,MAAM,4DAA4D;EAC9E;EAEA,IAAI,WAAW,aAAa,SAAS;GACnC,MAAM,KAAK,IAAI,EAAE,YAAY,CAAC,CAAC;GAC/B;EACF;EAEA,IAAI,CAAC,MAAM,SAAS;GAClB,IAAI,CAAC,cAAc;GACnB,MAAM,IAAI,MAAM,wBAAwB;EAC1C;EAEA,KAAK,eAAe,KAAK,iBAAiB;EAE1C,MAAM,KAAK,IAAI,gBAAgB;EAC/B,MAAM,UAAU,SACd,MACA;GACE,MAAM;IACJ,MAAM,IAAI,MAAM,iBAAiB;GACnC;GACA,UAAU;IACR,MAAM,IAAI,MAAM,iBAAiB;GACnC;GACA,QAAQ,GAAG;EACb,GACA,MAAM,KACR;EAEA,KAAK,YAAY,OAAO;EAExB,IAAI;GACF,MAAM;EACR,SAAS,OAAO;GACd,IAAI,CAAC,cAAc;GACnB,MAAM;EACR;CACF;AACF;AAEA,eAAe,SACb,OACA,SACA,UACA;CACA,MAAM,EAAE,WAAW,cAAc,iBAAiB,MAAM;CAExD,MAAM,OAAO,MAAM,UAAU,KAAK,OAAO;EACvC,GAAG;EACH,OAAO;EACP,UAAU,SAAS,SAAS,IAAI,SAAS,SAAS,SAAS,KAAM;CACnE,CAAC;CAED,MAAM,QAAQ,SAAS,OAAO,WAAW,SAAS,OAAO,CAAC,IAAI,CAAC;CAC/D,MAAM,YAAY,cAAc,KAAK,OAAO,KAAK,KAAK;CAOtD,OAAO;EAAE;EAAO,SANA,eACZ,aAAa,KAAK,OAAO,KAAK,IAC9B,cAAc,OACZ,MAAM,SAAS,YACf,SAAS;EAEU;CAAU;AACrC;AAYA,SAAS,YACP,YACA,SACkE;CAClE,OAAOC,8BAA+D,MAAM,YAAY;EACtF,IAAI,oBAAoB;EACxB,IAAI,6BAA6B,UAC/B,oBAAoB,kBAAkB,GAAG,IAAI;EAE/C,OAAO,IAAI,WAAW,mBAAmB,MAAM,OAAO;CACxD,GAAG,OAAO;AACZ;AAEA,MAAa,mBACK,uBAAO,OAAO,aAAa,EACzC,gBAAgBC,kCAClB,CAAC;;;;AC1KH,SAAgB,cACd,OACA,WACA,cACG;CACH,MAAM,QAAQ,MAAM,UAAU,SAAS;CAEvC,IAAI,SAAS,GACX,OAAO,MAAM;CAGf,MAAM,QAAQ,wBAAwB,WAAW,aAAa,IAAI;CAClE,MAAM,KAAK,KAAK;CAChB,OAAO;AACT"}
package/dist/index.js CHANGED
@@ -1,9 +1,11 @@
1
- import { a as mapMethods, h as autobind, i as arrayMethods, n as createStore, o as recordMethods, s as setMethods, t as Store, u as calcDuration } from "./store-BmlnyYal.js";
2
- import { a as defaultCacheOptions, c as hash, d as allResources, f as createResourceGroup, i as createCache, l as simpleHash, n as createScope, o as internalCreate, r as Cache, s as InstanceCache, t as Scope, u as ResourceGroup } from "./scope-BfaweXvz.js";
1
+ import { a as mapMethods, f as autobind, i as arrayMethods, n as createStore, o as recordMethods, s as setMethods, t as Store } from "./store-9XkJrxBs.js";
2
+ import { a as defaultCacheOptions, c as hash, d as allResources, f as createResourceGroup, i as createCache, l as simpleHash, n as createScope, o as internalCreate, r as Cache, s as InstanceCache, t as Scope, u as ResourceGroup } from "./scope-CtOcmKmO.js";
3
3
  import { a as set, c as deepEqual, l as shallowEqual, n as get, u as strictEqual } from "./propAccess-CsUaG5V_.js";
4
+ import { t as calcDuration } from "./duration-ByqeeOs7.js";
4
5
  import { r as applyPatches } from "./patchMethods-D3cdG80W.js";
5
6
  import { a as diff, i as toExtendedJsonString, n as fromExtendedJsonString, r as toExtendedJson, t as fromExtendedJson } from "./extendedJson-BOmrkRrD.js";
6
- import { t as persist } from "./persist-xv73m7UR.js";
7
+ import { t as persist } from "./persist-BRvAr-ZK.js";
8
+ import "./persist/index.js";
7
9
 
8
10
  //#region src/core/pagedCache.ts
9
11
  var PagedCache = class PagedCache extends Cache {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/core/pagedCache.ts","../src/lib/updateHelpers.ts"],"sourcesContent":["import {\n Cache,\n defaultCacheOptions,\n internalCreate,\n type CacheOptions,\n type CreateCacheResult,\n} from '@core/cache';\nimport type { CalculationActions } from '@core/commonTypes';\nimport { autobind } from '@lib/autobind';\n\nexport interface PageCacheFunctionProps<T> extends CalculationActions<Promise<PagedCacheState<T>>> {\n /**\n * Previously fetched pages (in order).\n */\n pages: T[];\n /**\n * Last fetched page or null if there are no previously fetched pages.\n */\n prevPage: T | null;\n}\n\nexport interface PageCacheFunction<T> {\n (props: PageCacheFunctionProps<T>): Promise<T | null>;\n}\n\nexport interface PagedCacheDefinition<T, Args extends any[]> {\n /**\n * Function to fetch a page.\n * The function receives the current state of the cache, including previously fetched pages.\n */\n fetchPage: (this: PagedCache<T, Args>, props: PageCacheFunctionProps<T>) => Promise<T | null>;\n /**\n * Optional function to determine the total number of pages - usually based on data in the fetched pages.\n */\n getPageCount?: (this: PagedCache<T, Args>, pages: T[]) => number | null;\n /**\n * Optional function to determine if there are more pages to fetch - usually based on data in the fetched pages.\n * If not provided, it will be assumed there are more pages until getPageCount is provided and the number of fetched pages equals the page count or until fetchPage returns null.\n */\n hasMorePages?: (this: PagedCache<T, Args>, pages: T[]) => boolean;\n}\n\nexport interface PagedCacheDefinitionFunction<T, Args extends any[]> {\n (...args: Args): PagedCacheDefinition<T, Args>;\n}\n\nexport interface PagedCacheState<T> {\n pages: T[];\n hasMore: boolean;\n pageCount: number | null;\n}\n\nexport interface FetchNextPageOptions {\n /**\n * If true, will throw if the cache is in an error state or if another page is being fetched.\n */\n throwOnError?: boolean;\n}\n\nexport class PagedCache<T, Args extends any[] = []> extends Cache<PagedCacheState<T>, Args> {\n constructor(\n public readonly definition: PagedCacheDefinition<T, Args>,\n args: Args,\n options: CacheOptions<PagedCacheState<T>, Args> = {},\n ) {\n super(async (helpers) => loadPage(this, helpers, []), args, options, undefined);\n autobind(PagedCache);\n }\n\n async fetchNextPage({ throwOnError }: FetchNextPageOptions = {}): Promise<void> {\n const { status, isStale, isUpdating, value } = this.state.get();\n\n if (status === 'error') {\n if (!throwOnError) return;\n throw new Error('Cannot fetch next page while cache is in error state');\n }\n\n if (isUpdating) {\n if (!throwOnError) return;\n throw new Error('Cannot fetch next page while another page is being fetched');\n }\n\n if (status === 'pending' || isStale) {\n await this.get().catch(() => {});\n return;\n }\n\n if (!value.hasMore) {\n if (!throwOnError) return;\n throw new Error('No more pages to fetch');\n }\n\n this.stalePromise = this.calculatedValue?.value;\n\n const ac = new AbortController();\n const promise = loadPage(\n this,\n {\n use() {\n throw new Error('Not implemented');\n },\n connect() {\n throw new Error('Not implemented');\n },\n signal: ac.signal,\n },\n value.pages,\n );\n\n this.updateValue(promise);\n\n try {\n await promise;\n } catch (error) {\n if (!throwOnError) return;\n throw error;\n }\n }\n}\n\nasync function loadPage<T, Args extends any[]>(\n cache: PagedCache<T, Args>,\n helpers: CalculationActions<Promise<PagedCacheState<T>>>,\n oldPages: T[],\n) {\n const { fetchPage, hasMorePages, getPageCount } = cache.definition;\n\n const page = await fetchPage.call(cache, {\n ...helpers,\n pages: oldPages,\n prevPage: oldPages.length > 0 ? oldPages[oldPages.length - 1]! : null,\n });\n\n const pages = page === null ? oldPages : oldPages.concat([page]);\n const pageCount = getPageCount?.call(cache, pages) ?? null;\n const hasMore = hasMorePages\n ? hasMorePages.call(cache, pages)\n : pageCount !== null\n ? pages.length < pageCount\n : page !== null;\n\n return { pages, hasMore, pageCount };\n}\n\nfunction createPaged<T, Args extends any[] = []>(\n definition: PagedCacheDefinitionFunction<T, Args>,\n options?: CacheOptions<PagedCacheState<T>, Args>,\n): CreateCacheResult<PagedCacheState<T>, Args, PagedCache<T, Args>>;\n\nfunction createPaged<T>(\n definition: PagedCacheDefinition<T, []>,\n options?: CacheOptions<PagedCacheState<T>, []>,\n): CreateCacheResult<PagedCacheState<T>, [], PagedCache<T, []>>;\n\nfunction createPaged<T, Args extends any[] = []>(\n definition: PagedCacheDefinitionFunction<T, Args> | PagedCacheDefinition<T, Args>,\n options?: CacheOptions<PagedCacheState<T>, Args>,\n): CreateCacheResult<PagedCacheState<T>, Args, PagedCache<T, Args>> {\n return internalCreate<PagedCacheState<T>, Args, PagedCache<T, Args>>((args, options) => {\n let currentDefinition = definition;\n if (currentDefinition instanceof Function) {\n currentDefinition = currentDefinition(...args);\n }\n return new PagedCache(currentDefinition, args, options);\n }, options);\n}\n\nexport const createPagedCache: typeof createPaged & { defaultOptions: CacheOptions<any, any> } =\n /* @__PURE__ */ Object.assign(createPaged, {\n defaultOptions: defaultCacheOptions,\n });\n","export function findOrDefault<T>(\n array: T[],\n predicate: (item: T) => boolean,\n defaultValue: T | (() => T),\n): T {\n const index = array.findIndex(predicate);\n\n if (index >= 0) {\n return array[index]!;\n }\n\n const value = defaultValue instanceof Function ? defaultValue() : defaultValue;\n array.push(value);\n return value;\n}\n"],"mappings":";;;;;;;;AA2DA,IAAa,aAAb,MAAa,mBAA+C,MAAgC;CAC1F,YACE,AAAgB,YAChB,MACA,UAAkD,CAAC,GACnD;EACA,MAAM,OAAO,YAAY,SAAS,MAAM,SAAS,CAAC,CAAC,GAAG,MAAM,SAAS,MAAS;EAJ9D;EAKhB,SAAS,UAAU;CACrB;CAEA,MAAM,cAAc,EAAE,iBAAuC,CAAC,GAAkB;EAC9E,MAAM,EAAE,QAAQ,SAAS,YAAY,UAAU,KAAK,MAAM,IAAI;EAE9D,IAAI,WAAW,SAAS;GACtB,IAAI,CAAC,cAAc;GACnB,MAAM,IAAI,MAAM,sDAAsD;EACxE;EAEA,IAAI,YAAY;GACd,IAAI,CAAC,cAAc;GACnB,MAAM,IAAI,MAAM,4DAA4D;EAC9E;EAEA,IAAI,WAAW,aAAa,SAAS;GACnC,MAAM,KAAK,IAAI,EAAE,YAAY,CAAC,CAAC;GAC/B;EACF;EAEA,IAAI,CAAC,MAAM,SAAS;GAClB,IAAI,CAAC,cAAc;GACnB,MAAM,IAAI,MAAM,wBAAwB;EAC1C;EAEA,KAAK,eAAe,KAAK,iBAAiB;EAE1C,MAAM,KAAK,IAAI,gBAAgB;EAC/B,MAAM,UAAU,SACd,MACA;GACE,MAAM;IACJ,MAAM,IAAI,MAAM,iBAAiB;GACnC;GACA,UAAU;IACR,MAAM,IAAI,MAAM,iBAAiB;GACnC;GACA,QAAQ,GAAG;EACb,GACA,MAAM,KACR;EAEA,KAAK,YAAY,OAAO;EAExB,IAAI;GACF,MAAM;EACR,SAAS,OAAO;GACd,IAAI,CAAC,cAAc;GACnB,MAAM;EACR;CACF;AACF;AAEA,eAAe,SACb,OACA,SACA,UACA;CACA,MAAM,EAAE,WAAW,cAAc,iBAAiB,MAAM;CAExD,MAAM,OAAO,MAAM,UAAU,KAAK,OAAO;EACvC,GAAG;EACH,OAAO;EACP,UAAU,SAAS,SAAS,IAAI,SAAS,SAAS,SAAS,KAAM;CACnE,CAAC;CAED,MAAM,QAAQ,SAAS,OAAO,WAAW,SAAS,OAAO,CAAC,IAAI,CAAC;CAC/D,MAAM,YAAY,cAAc,KAAK,OAAO,KAAK,KAAK;CAOtD,OAAO;EAAE;EAAO,SANA,eACZ,aAAa,KAAK,OAAO,KAAK,IAC9B,cAAc,OACZ,MAAM,SAAS,YACf,SAAS;EAEU;CAAU;AACrC;AAYA,SAAS,YACP,YACA,SACkE;CAClE,OAAO,gBAA+D,MAAM,YAAY;EACtF,IAAI,oBAAoB;EACxB,IAAI,6BAA6B,UAC/B,oBAAoB,kBAAkB,GAAG,IAAI;EAE/C,OAAO,IAAI,WAAW,mBAAmB,MAAM,OAAO;CACxD,GAAG,OAAO;AACZ;AAEA,MAAa,mBACK,uBAAO,OAAO,aAAa,EACzC,gBAAgB,oBAClB,CAAC;;;;AC1KH,SAAgB,cACd,OACA,WACA,cACG;CACH,MAAM,QAAQ,MAAM,UAAU,SAAS;CAEvC,IAAI,SAAS,GACX,OAAO,MAAM;CAGf,MAAM,QAAQ,wBAAwB,WAAW,aAAa,IAAI;CAClE,MAAM,KAAK,KAAK;CAChB,OAAO;AACT"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/core/pagedCache.ts","../src/lib/updateHelpers.ts"],"sourcesContent":["import {\n Cache,\n defaultCacheOptions,\n internalCreate,\n type CacheOptions,\n type CreateCacheResult,\n} from '@core/cache';\nimport type { CalculationActions } from '@core/commonTypes';\nimport { autobind } from '@lib/autobind';\n\nexport interface PageCacheFunctionProps<T> extends CalculationActions<Promise<PagedCacheState<T>>> {\n /**\n * Previously fetched pages (in order).\n */\n pages: T[];\n /**\n * Last fetched page or null if there are no previously fetched pages.\n */\n prevPage: T | null;\n}\n\nexport interface PageCacheFunction<T> {\n (props: PageCacheFunctionProps<T>): Promise<T | null>;\n}\n\nexport interface PagedCacheDefinition<T, Args extends any[]> {\n /**\n * Function to fetch a page.\n * The function receives the current state of the cache, including previously fetched pages.\n */\n fetchPage: (this: PagedCache<T, Args>, props: PageCacheFunctionProps<T>) => Promise<T | null>;\n /**\n * Optional function to determine the total number of pages - usually based on data in the fetched pages.\n */\n getPageCount?: (this: PagedCache<T, Args>, pages: T[]) => number | null;\n /**\n * Optional function to determine if there are more pages to fetch - usually based on data in the fetched pages.\n * If not provided, it will be assumed there are more pages until getPageCount is provided and the number of fetched pages equals the page count or until fetchPage returns null.\n */\n hasMorePages?: (this: PagedCache<T, Args>, pages: T[]) => boolean;\n}\n\nexport interface PagedCacheDefinitionFunction<T, Args extends any[]> {\n (...args: Args): PagedCacheDefinition<T, Args>;\n}\n\nexport interface PagedCacheState<T> {\n pages: T[];\n hasMore: boolean;\n pageCount: number | null;\n}\n\nexport interface FetchNextPageOptions {\n /**\n * If true, will throw if the cache is in an error state or if another page is being fetched.\n */\n throwOnError?: boolean;\n}\n\nexport class PagedCache<T, Args extends any[] = []> extends Cache<PagedCacheState<T>, Args> {\n constructor(\n public readonly definition: PagedCacheDefinition<T, Args>,\n args: Args,\n options: CacheOptions<PagedCacheState<T>, Args> = {},\n ) {\n super(async (helpers) => loadPage(this, helpers, []), args, options, undefined);\n autobind(PagedCache);\n }\n\n async fetchNextPage({ throwOnError }: FetchNextPageOptions = {}): Promise<void> {\n const { status, isStale, isUpdating, value } = this.state.get();\n\n if (status === 'error') {\n if (!throwOnError) return;\n throw new Error('Cannot fetch next page while cache is in error state');\n }\n\n if (isUpdating) {\n if (!throwOnError) return;\n throw new Error('Cannot fetch next page while another page is being fetched');\n }\n\n if (status === 'pending' || isStale) {\n await this.get().catch(() => {});\n return;\n }\n\n if (!value.hasMore) {\n if (!throwOnError) return;\n throw new Error('No more pages to fetch');\n }\n\n this.stalePromise = this.calculatedValue?.value;\n\n const ac = new AbortController();\n const promise = loadPage(\n this,\n {\n use() {\n throw new Error('Not implemented');\n },\n connect() {\n throw new Error('Not implemented');\n },\n signal: ac.signal,\n },\n value.pages,\n );\n\n this.updateValue(promise);\n\n try {\n await promise;\n } catch (error) {\n if (!throwOnError) return;\n throw error;\n }\n }\n}\n\nasync function loadPage<T, Args extends any[]>(\n cache: PagedCache<T, Args>,\n helpers: CalculationActions<Promise<PagedCacheState<T>>>,\n oldPages: T[],\n) {\n const { fetchPage, hasMorePages, getPageCount } = cache.definition;\n\n const page = await fetchPage.call(cache, {\n ...helpers,\n pages: oldPages,\n prevPage: oldPages.length > 0 ? oldPages[oldPages.length - 1]! : null,\n });\n\n const pages = page === null ? oldPages : oldPages.concat([page]);\n const pageCount = getPageCount?.call(cache, pages) ?? null;\n const hasMore = hasMorePages\n ? hasMorePages.call(cache, pages)\n : pageCount !== null\n ? pages.length < pageCount\n : page !== null;\n\n return { pages, hasMore, pageCount };\n}\n\nfunction createPaged<T, Args extends any[] = []>(\n definition: PagedCacheDefinitionFunction<T, Args>,\n options?: CacheOptions<PagedCacheState<T>, Args>,\n): CreateCacheResult<PagedCacheState<T>, Args, PagedCache<T, Args>>;\n\nfunction createPaged<T>(\n definition: PagedCacheDefinition<T, []>,\n options?: CacheOptions<PagedCacheState<T>, []>,\n): CreateCacheResult<PagedCacheState<T>, [], PagedCache<T, []>>;\n\nfunction createPaged<T, Args extends any[] = []>(\n definition: PagedCacheDefinitionFunction<T, Args> | PagedCacheDefinition<T, Args>,\n options?: CacheOptions<PagedCacheState<T>, Args>,\n): CreateCacheResult<PagedCacheState<T>, Args, PagedCache<T, Args>> {\n return internalCreate<PagedCacheState<T>, Args, PagedCache<T, Args>>((args, options) => {\n let currentDefinition = definition;\n if (currentDefinition instanceof Function) {\n currentDefinition = currentDefinition(...args);\n }\n return new PagedCache(currentDefinition, args, options);\n }, options);\n}\n\nexport const createPagedCache: typeof createPaged & { defaultOptions: CacheOptions<any, any> } =\n /* @__PURE__ */ Object.assign(createPaged, {\n defaultOptions: defaultCacheOptions,\n });\n","export function findOrDefault<T>(\n array: T[],\n predicate: (item: T) => boolean,\n defaultValue: T | (() => T),\n): T {\n const index = array.findIndex(predicate);\n\n if (index >= 0) {\n return array[index]!;\n }\n\n const value = defaultValue instanceof Function ? defaultValue() : defaultValue;\n array.push(value);\n return value;\n}\n"],"mappings":";;;;;;;;;;AA2DA,IAAa,aAAb,MAAa,mBAA+C,MAAgC;CAC1F,YACE,AAAgB,YAChB,MACA,UAAkD,CAAC,GACnD;EACA,MAAM,OAAO,YAAY,SAAS,MAAM,SAAS,CAAC,CAAC,GAAG,MAAM,SAAS,MAAS;EAJ9D;EAKhB,SAAS,UAAU;CACrB;CAEA,MAAM,cAAc,EAAE,iBAAuC,CAAC,GAAkB;EAC9E,MAAM,EAAE,QAAQ,SAAS,YAAY,UAAU,KAAK,MAAM,IAAI;EAE9D,IAAI,WAAW,SAAS;GACtB,IAAI,CAAC,cAAc;GACnB,MAAM,IAAI,MAAM,sDAAsD;EACxE;EAEA,IAAI,YAAY;GACd,IAAI,CAAC,cAAc;GACnB,MAAM,IAAI,MAAM,4DAA4D;EAC9E;EAEA,IAAI,WAAW,aAAa,SAAS;GACnC,MAAM,KAAK,IAAI,EAAE,YAAY,CAAC,CAAC;GAC/B;EACF;EAEA,IAAI,CAAC,MAAM,SAAS;GAClB,IAAI,CAAC,cAAc;GACnB,MAAM,IAAI,MAAM,wBAAwB;EAC1C;EAEA,KAAK,eAAe,KAAK,iBAAiB;EAE1C,MAAM,KAAK,IAAI,gBAAgB;EAC/B,MAAM,UAAU,SACd,MACA;GACE,MAAM;IACJ,MAAM,IAAI,MAAM,iBAAiB;GACnC;GACA,UAAU;IACR,MAAM,IAAI,MAAM,iBAAiB;GACnC;GACA,QAAQ,GAAG;EACb,GACA,MAAM,KACR;EAEA,KAAK,YAAY,OAAO;EAExB,IAAI;GACF,MAAM;EACR,SAAS,OAAO;GACd,IAAI,CAAC,cAAc;GACnB,MAAM;EACR;CACF;AACF;AAEA,eAAe,SACb,OACA,SACA,UACA;CACA,MAAM,EAAE,WAAW,cAAc,iBAAiB,MAAM;CAExD,MAAM,OAAO,MAAM,UAAU,KAAK,OAAO;EACvC,GAAG;EACH,OAAO;EACP,UAAU,SAAS,SAAS,IAAI,SAAS,SAAS,SAAS,KAAM;CACnE,CAAC;CAED,MAAM,QAAQ,SAAS,OAAO,WAAW,SAAS,OAAO,CAAC,IAAI,CAAC;CAC/D,MAAM,YAAY,cAAc,KAAK,OAAO,KAAK,KAAK;CAOtD,OAAO;EAAE;EAAO,SANA,eACZ,aAAa,KAAK,OAAO,KAAK,IAC9B,cAAc,OACZ,MAAM,SAAS,YACf,SAAS;EAEU;CAAU;AACrC;AAYA,SAAS,YACP,YACA,SACkE;CAClE,OAAO,gBAA+D,MAAM,YAAY;EACtF,IAAI,oBAAoB;EACxB,IAAI,6BAA6B,UAC/B,oBAAoB,kBAAkB,GAAG,IAAI;EAE/C,OAAO,IAAI,WAAW,mBAAmB,MAAM,OAAO;CACxD,GAAG,OAAO;AACZ;AAEA,MAAa,mBACK,uBAAO,OAAO,aAAa,EACzC,gBAAgB,oBAClB,CAAC;;;;AC1KH,SAAgB,cACd,OACA,WACA,cACG;CACH,MAAM,QAAQ,MAAM,UAAU,SAAS;CAEvC,IAAI,SAAS,GACX,OAAO,MAAM;CAGf,MAAM,QAAQ,wBAAwB,WAAW,aAAa,IAAI;CAClE,MAAM,KAAK,KAAK;CAChB,OAAO;AACT"}
@@ -1,4 +1,4 @@
1
- const require_store = require('../store-fmAYV5hy.cjs');
1
+ const require_store = require('../store-B_ToOCrU.cjs');
2
2
  const require_mutativeMethods = require('../mutativeMethods-AiKkraqx.cjs');
3
3
 
4
4
  //#region src/mutative/register.ts
@@ -1 +1 @@
1
- {"version":3,"file":"register.cjs","names":["Store","mutativeMethods","autobind"],"sources":["../../src/mutative/register.ts"],"sourcesContent":["import { mutativeMethods } from './mutativeMethods';\nimport { Store } from '@core';\nimport { autobind } from '@lib/autobind';\n\ntype MutativeMethods = typeof mutativeMethods;\n\ndeclare module '@core' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> extends MutativeMethods {}\n}\n\nObject.assign(Store.prototype, mutativeMethods);\nautobind(Store);\n"],"mappings":";;;;AAWA,OAAO,OAAOA,oBAAM,WAAWC,uCAAe;AAC9CC,uBAASF,mBAAK"}
1
+ {"version":3,"file":"register.cjs","names":["Store","mutativeMethods","autobind"],"sources":["../../src/mutative/register.ts"],"sourcesContent":["import { mutativeMethods } from './mutativeMethods';\nimport { Store } from '@core';\nimport { autobind } from '@lib/autobind';\n\ntype MutativeMethods = typeof mutativeMethods;\n\ndeclare module '..' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> extends MutativeMethods {}\n}\n\nObject.assign(Store.prototype, mutativeMethods);\nautobind(Store);\n"],"mappings":";;;;AAWA,OAAO,OAAOA,oBAAM,WAAWC,uCAAe;AAC9CC,uBAASF,mBAAK"}
@@ -2,7 +2,7 @@ import { n as mutativeMethods } from "../mutativeMethods-BHPlSHBi.cjs";
2
2
 
3
3
  //#region src/mutative/register.d.ts
4
4
  type MutativeMethods = typeof mutativeMethods;
5
- declare module "@core" {
5
+ declare module ".." {
6
6
  interface Store<T> extends MutativeMethods {}
7
7
  }
8
8
  //# sourceMappingURL=register.d.cts.map
@@ -2,7 +2,7 @@ import { n as mutativeMethods } from "../mutativeMethods-COQxFB3B.js";
2
2
 
3
3
  //#region src/mutative/register.d.ts
4
4
  type MutativeMethods = typeof mutativeMethods;
5
- declare module "@core" {
5
+ declare module ".." {
6
6
  interface Store<T> extends MutativeMethods {}
7
7
  }
8
8
  //# sourceMappingURL=register.d.ts.map
@@ -1,4 +1,4 @@
1
- import { h as autobind, t as Store } from "../store-BmlnyYal.js";
1
+ import { f as autobind, t as Store } from "../store-9XkJrxBs.js";
2
2
  import { t as mutativeMethods } from "../mutativeMethods-qVJ36MY5.js";
3
3
 
4
4
  //#region src/mutative/register.ts
@@ -1 +1 @@
1
- {"version":3,"file":"register.js","names":[],"sources":["../../src/mutative/register.ts"],"sourcesContent":["import { mutativeMethods } from './mutativeMethods';\nimport { Store } from '@core';\nimport { autobind } from '@lib/autobind';\n\ntype MutativeMethods = typeof mutativeMethods;\n\ndeclare module '@core' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> extends MutativeMethods {}\n}\n\nObject.assign(Store.prototype, mutativeMethods);\nautobind(Store);\n"],"mappings":";;;;AAWA,OAAO,OAAO,MAAM,WAAW,eAAe;AAC9C,SAAS,KAAK"}
1
+ {"version":3,"file":"register.js","names":[],"sources":["../../src/mutative/register.ts"],"sourcesContent":["import { mutativeMethods } from './mutativeMethods';\nimport { Store } from '@core';\nimport { autobind } from '@lib/autobind';\n\ntype MutativeMethods = typeof mutativeMethods;\n\ndeclare module '..' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> extends MutativeMethods {}\n}\n\nObject.assign(Store.prototype, mutativeMethods);\nautobind(Store);\n"],"mappings":";;;;AAWA,OAAO,OAAO,MAAM,WAAW,eAAe;AAC9C,SAAS,KAAK"}
@@ -1 +1 @@
1
- {"version":3,"file":"patchMethods-BBQDDqwe.cjs","names":["remove","set","applyPatches","diff","_applyPatches","toExtendedJson","fromExtendedJson"],"sources":["../src/lib/applyPatches.ts","../src/lib/trie.ts","../src/patches/patchMethods.ts"],"sourcesContent":["import type { Patch } from './diff';\nimport { remove, set } from './propAccess';\n\nfunction applySinglePatch<T>(target: T, patch: Patch): T {\n if (patch.op === 'remove') {\n return remove(target, patch.path as any);\n }\n\n return set(target, patch.path as any, patch.value);\n}\n\nexport function applyPatches<T>(target: T, ...patches: Patch[]): T {\n for (const patch of patches) {\n target = applySinglePatch(target, patch);\n }\n\n return target;\n}\n","import type { KeyType } from '@lib/path';\n\nclass TrieNode {\n children: Map<KeyType, TrieNode> = new Map();\n isLeaf = false;\n}\n\nexport class Trie {\n root: TrieNode = new TrieNode();\n\n add(path: KeyType[]): void {\n let node = this.root;\n for (const key of path) {\n let next = node.children.get(key);\n if (!next) node.children.set(key, (next = new TrieNode()));\n node = next;\n }\n node.isLeaf = true;\n }\n\n hasSubPath(path: KeyType[]): boolean {\n let node = this.root;\n for (const key of path) {\n const next = node.children.get(key);\n if (!next) return false;\n node = next;\n }\n return node.isLeaf;\n }\n}\n","import type { Cancel, DisposableCancel, SubscribeOptions } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport { applyPatches as _applyPatches } from '@lib/applyPatches';\nimport { diff, type DiffOptions, type Patch } from '@lib/diff';\nimport { fromExtendedJson, toExtendedJson } from '@lib/extendedJson';\nimport { Trie } from '@lib/trie';\n\nexport interface SyncMessage {\n fromVersion?: string;\n toVersion: string;\n patches: Patch[];\n}\n\nexport interface HistoryEntry extends SyncMessage {\n reversePatches: Patch[];\n}\n\ndeclare module '@core' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> {\n __patches?: {\n value: T;\n version: string;\n history: HistoryEntry[];\n };\n }\n}\n\nexport interface SubscribePatchOptions extends SubscribeOptions, DiffOptions {\n /** @default false */\n runNow?: boolean;\n /** try to start from a specific version and only receive patches after that.\n * If the id is not found, it will start from the beginning */\n startAt?: string;\n}\n\nexport type InteropPatch = Patch | { op: 'add' | 'replace' | 'remove'; value?: any };\n\nconst genId = () => Math.random().toString(36).slice(2);\n\nexport function subscribePatches<T>(\n this: Store<T>,\n listener: (\n this: { cancel: Cancel },\n patches: Patch[],\n reversePatches: Patch[],\n version: string,\n previousVersion: string | undefined,\n ) => void,\n options: SubscribePatchOptions = {},\n): DisposableCancel {\n const patches = (this.__patches ??= {\n value: this.get(),\n version: genId(),\n history: [],\n });\n\n options = { ...options };\n options.runNow ??= false;\n let cursor = options.startAt ?? (options.runNow ? undefined : this.__patches.version);\n\n return this.subscribe(function (value) {\n if (patches.value !== value) {\n const result = diff(patches.value, value, options);\n patches.value = value;\n\n if (result[0].length > 0) {\n const newVersion = genId();\n\n patches.history = patches.history\n .concat({\n fromVersion: patches.version,\n toVersion: newVersion,\n patches: result[0],\n reversePatches: result[1],\n })\n .slice(-1000);\n\n patches.version = newVersion;\n }\n }\n\n if (cursor === patches.version) return;\n const index = patches.history.findIndex((h) => h.fromVersion === cursor);\n let forward, backward, previousVersion;\n\n if (index === -1) {\n [forward, backward] = diff(undefined, value, options);\n previousVersion = undefined;\n } else {\n forward = patches.history.slice(index).flatMap((h) => h.patches);\n backward = patches.history.slice(index).flatMap((h) => h.reversePatches);\n previousVersion = cursor;\n }\n\n cursor = patches.version;\n listener.apply(this, [forward, backward, cursor, previousVersion]);\n }, options);\n}\n\nexport function applyPatches<T>(this: Store<T>, patches: InteropPatch[]): void;\nexport function applyPatches<T>(this: Store<T>, ...patches: InteropPatch[]): void;\nexport function applyPatches<T>(\n this: Store<T>,\n ...patches: (InteropPatch | InteropPatch[])[]\n): void {\n this.set((value) => _applyPatches(value, ...(patches.flat() as Patch[])));\n}\n\nexport function sync<T>(\n this: Store<T>,\n listener: (syncMessage: SyncMessage) => void,\n options?: Omit<SubscribePatchOptions, 'runNow'>,\n): DisposableCancel {\n const debounce =\n typeof options?.debounce === 'object' && 'wait' in options.debounce\n ? { ...options.debounce }\n : options?.debounce !== undefined\n ? { wait: options.debounce }\n : undefined;\n\n if (debounce) {\n debounce.waitOnRunNow ??= false;\n }\n\n return subscribePatches.apply<\n Store<T>,\n Parameters<typeof subscribePatches<T>>,\n ReturnType<typeof subscribePatches<T>>\n >(this, [\n (patches, _, version, previousVersion) => {\n const trie = new Trie();\n\n patches = [...patches]\n .reverse()\n .filter((patch) => {\n if (trie.hasSubPath(patch.path)) {\n return false;\n }\n\n trie.add(patch.path);\n return true;\n })\n .reverse();\n\n listener({\n fromVersion: previousVersion,\n toVersion: version,\n patches: toExtendedJson(patches) as Patch[],\n });\n },\n { ...options, debounce, runNow: true },\n ]);\n}\n\nexport function acceptSync<T>(this: Store<T>, message: SyncMessage): void {\n if (message.fromVersion && message.fromVersion !== this.version) {\n throw new Error(\n `version mismatch! version=${this.version}, fromVersion=${message.fromVersion}`,\n );\n }\n\n const patches = fromExtendedJson(message.patches) as Patch[];\n\n this.version = message.toVersion;\n applyPatches.apply<Store<T>, Patch[], void>(this, patches);\n}\n\nexport const patchMethods: {\n subscribePatches: typeof subscribePatches;\n applyPatches: typeof applyPatches;\n sync: typeof sync;\n acceptSync: typeof acceptSync;\n} = {\n subscribePatches,\n applyPatches,\n sync,\n acceptSync,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"patchMethods-BBQDDqwe.cjs","names":["remove","set","applyPatches","diff","_applyPatches","toExtendedJson","fromExtendedJson"],"sources":["../src/lib/applyPatches.ts","../src/lib/trie.ts","../src/patches/patchMethods.ts"],"sourcesContent":["import type { Patch } from './diff';\nimport { remove, set } from './propAccess';\n\nfunction applySinglePatch<T>(target: T, patch: Patch): T {\n if (patch.op === 'remove') {\n return remove(target, patch.path as any);\n }\n\n return set(target, patch.path as any, patch.value);\n}\n\nexport function applyPatches<T>(target: T, ...patches: Patch[]): T {\n for (const patch of patches) {\n target = applySinglePatch(target, patch);\n }\n\n return target;\n}\n","import type { KeyType } from '@lib/path';\n\nclass TrieNode {\n children: Map<KeyType, TrieNode> = new Map();\n isLeaf = false;\n}\n\nexport class Trie {\n root: TrieNode = new TrieNode();\n\n add(path: KeyType[]): void {\n let node = this.root;\n for (const key of path) {\n let next = node.children.get(key);\n if (!next) node.children.set(key, (next = new TrieNode()));\n node = next;\n }\n node.isLeaf = true;\n }\n\n hasSubPath(path: KeyType[]): boolean {\n let node = this.root;\n for (const key of path) {\n const next = node.children.get(key);\n if (!next) return false;\n node = next;\n }\n return node.isLeaf;\n }\n}\n","import type { Cancel, DisposableCancel, SubscribeOptions } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport { applyPatches as _applyPatches } from '@lib/applyPatches';\nimport { diff, type DiffOptions, type Patch } from '@lib/diff';\nimport { fromExtendedJson, toExtendedJson } from '@lib/extendedJson';\nimport { Trie } from '@lib/trie';\n\nexport interface SyncMessage {\n fromVersion?: string;\n toVersion: string;\n patches: Patch[];\n}\n\nexport interface HistoryEntry extends SyncMessage {\n reversePatches: Patch[];\n}\n\ndeclare module '..' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> {\n __patches?: {\n value: T;\n version: string;\n history: HistoryEntry[];\n };\n }\n}\n\nexport interface SubscribePatchOptions extends SubscribeOptions, DiffOptions {\n /** @default false */\n runNow?: boolean;\n /** try to start from a specific version and only receive patches after that.\n * If the id is not found, it will start from the beginning */\n startAt?: string;\n}\n\nexport type InteropPatch = Patch | { op: 'add' | 'replace' | 'remove'; value?: any };\n\nconst genId = () => Math.random().toString(36).slice(2);\n\nexport function subscribePatches<T>(\n this: Store<T>,\n listener: (\n this: { cancel: Cancel },\n patches: Patch[],\n reversePatches: Patch[],\n version: string,\n previousVersion: string | undefined,\n ) => void,\n options: SubscribePatchOptions = {},\n): DisposableCancel {\n const patches = (this.__patches ??= {\n value: this.get(),\n version: genId(),\n history: [],\n });\n\n options = { ...options };\n options.runNow ??= false;\n let cursor = options.startAt ?? (options.runNow ? undefined : this.__patches.version);\n\n return this.subscribe(function (value) {\n if (patches.value !== value) {\n const result = diff(patches.value, value, options);\n patches.value = value;\n\n if (result[0].length > 0) {\n const newVersion = genId();\n\n patches.history = patches.history\n .concat({\n fromVersion: patches.version,\n toVersion: newVersion,\n patches: result[0],\n reversePatches: result[1],\n })\n .slice(-1000);\n\n patches.version = newVersion;\n }\n }\n\n if (cursor === patches.version) return;\n const index = patches.history.findIndex((h) => h.fromVersion === cursor);\n let forward, backward, previousVersion;\n\n if (index === -1) {\n [forward, backward] = diff(undefined, value, options);\n previousVersion = undefined;\n } else {\n forward = patches.history.slice(index).flatMap((h) => h.patches);\n backward = patches.history.slice(index).flatMap((h) => h.reversePatches);\n previousVersion = cursor;\n }\n\n cursor = patches.version;\n listener.apply(this, [forward, backward, cursor, previousVersion]);\n }, options);\n}\n\nexport function applyPatches<T>(this: Store<T>, patches: InteropPatch[]): void;\nexport function applyPatches<T>(this: Store<T>, ...patches: InteropPatch[]): void;\nexport function applyPatches<T>(\n this: Store<T>,\n ...patches: (InteropPatch | InteropPatch[])[]\n): void {\n this.set((value) => _applyPatches(value, ...(patches.flat() as Patch[])));\n}\n\nexport function sync<T>(\n this: Store<T>,\n listener: (syncMessage: SyncMessage) => void,\n options?: Omit<SubscribePatchOptions, 'runNow'>,\n): DisposableCancel {\n const debounce =\n typeof options?.debounce === 'object' && 'wait' in options.debounce\n ? { ...options.debounce }\n : options?.debounce !== undefined\n ? { wait: options.debounce }\n : undefined;\n\n if (debounce) {\n debounce.waitOnRunNow ??= false;\n }\n\n return subscribePatches.apply<\n Store<T>,\n Parameters<typeof subscribePatches<T>>,\n ReturnType<typeof subscribePatches<T>>\n >(this, [\n (patches, _, version, previousVersion) => {\n const trie = new Trie();\n\n patches = [...patches]\n .reverse()\n .filter((patch) => {\n if (trie.hasSubPath(patch.path)) {\n return false;\n }\n\n trie.add(patch.path);\n return true;\n })\n .reverse();\n\n listener({\n fromVersion: previousVersion,\n toVersion: version,\n patches: toExtendedJson(patches) as Patch[],\n });\n },\n { ...options, debounce, runNow: true },\n ]);\n}\n\nexport function acceptSync<T>(this: Store<T>, message: SyncMessage): void {\n if (message.fromVersion && message.fromVersion !== this.version) {\n throw new Error(\n `version mismatch! version=${this.version}, fromVersion=${message.fromVersion}`,\n );\n }\n\n const patches = fromExtendedJson(message.patches) as Patch[];\n\n this.version = message.toVersion;\n applyPatches.apply<Store<T>, Patch[], void>(this, patches);\n}\n\nexport const patchMethods: {\n subscribePatches: typeof subscribePatches;\n applyPatches: typeof applyPatches;\n sync: typeof sync;\n acceptSync: typeof acceptSync;\n} = {\n subscribePatches,\n applyPatches,\n sync,\n acceptSync,\n};\n"],"mappings":"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"}
@@ -10,7 +10,7 @@ interface SyncMessage {
10
10
  interface HistoryEntry extends SyncMessage {
11
11
  reversePatches: Patch[];
12
12
  }
13
- declare module "@core" {
13
+ declare module ".." {
14
14
  interface Store<T> {
15
15
  __patches?: {
16
16
  value: T;
@@ -45,4 +45,4 @@ declare const patchMethods: {
45
45
  };
46
46
  //#endregion
47
47
  export { SyncMessage as n, patchMethods as r, SubscribePatchOptions as t };
48
- //# sourceMappingURL=patchMethods-R3f7HxTy.d.cts.map
48
+ //# sourceMappingURL=patchMethods-Bfu4UYG7.d.cts.map
@@ -10,7 +10,7 @@ interface SyncMessage {
10
10
  interface HistoryEntry extends SyncMessage {
11
11
  reversePatches: Patch[];
12
12
  }
13
- declare module "@core" {
13
+ declare module ".." {
14
14
  interface Store<T> {
15
15
  __patches?: {
16
16
  value: T;
@@ -45,4 +45,4 @@ declare const patchMethods: {
45
45
  };
46
46
  //#endregion
47
47
  export { SyncMessage as n, patchMethods as r, SubscribePatchOptions as t };
48
- //# sourceMappingURL=patchMethods--ekCkYUF.d.ts.map
48
+ //# sourceMappingURL=patchMethods-CEUdeSb_.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"patchMethods-D3cdG80W.js","names":["applyPatches","_applyPatches"],"sources":["../src/lib/applyPatches.ts","../src/lib/trie.ts","../src/patches/patchMethods.ts"],"sourcesContent":["import type { Patch } from './diff';\nimport { remove, set } from './propAccess';\n\nfunction applySinglePatch<T>(target: T, patch: Patch): T {\n if (patch.op === 'remove') {\n return remove(target, patch.path as any);\n }\n\n return set(target, patch.path as any, patch.value);\n}\n\nexport function applyPatches<T>(target: T, ...patches: Patch[]): T {\n for (const patch of patches) {\n target = applySinglePatch(target, patch);\n }\n\n return target;\n}\n","import type { KeyType } from '@lib/path';\n\nclass TrieNode {\n children: Map<KeyType, TrieNode> = new Map();\n isLeaf = false;\n}\n\nexport class Trie {\n root: TrieNode = new TrieNode();\n\n add(path: KeyType[]): void {\n let node = this.root;\n for (const key of path) {\n let next = node.children.get(key);\n if (!next) node.children.set(key, (next = new TrieNode()));\n node = next;\n }\n node.isLeaf = true;\n }\n\n hasSubPath(path: KeyType[]): boolean {\n let node = this.root;\n for (const key of path) {\n const next = node.children.get(key);\n if (!next) return false;\n node = next;\n }\n return node.isLeaf;\n }\n}\n","import type { Cancel, DisposableCancel, SubscribeOptions } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport { applyPatches as _applyPatches } from '@lib/applyPatches';\nimport { diff, type DiffOptions, type Patch } from '@lib/diff';\nimport { fromExtendedJson, toExtendedJson } from '@lib/extendedJson';\nimport { Trie } from '@lib/trie';\n\nexport interface SyncMessage {\n fromVersion?: string;\n toVersion: string;\n patches: Patch[];\n}\n\nexport interface HistoryEntry extends SyncMessage {\n reversePatches: Patch[];\n}\n\ndeclare module '@core' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> {\n __patches?: {\n value: T;\n version: string;\n history: HistoryEntry[];\n };\n }\n}\n\nexport interface SubscribePatchOptions extends SubscribeOptions, DiffOptions {\n /** @default false */\n runNow?: boolean;\n /** try to start from a specific version and only receive patches after that.\n * If the id is not found, it will start from the beginning */\n startAt?: string;\n}\n\nexport type InteropPatch = Patch | { op: 'add' | 'replace' | 'remove'; value?: any };\n\nconst genId = () => Math.random().toString(36).slice(2);\n\nexport function subscribePatches<T>(\n this: Store<T>,\n listener: (\n this: { cancel: Cancel },\n patches: Patch[],\n reversePatches: Patch[],\n version: string,\n previousVersion: string | undefined,\n ) => void,\n options: SubscribePatchOptions = {},\n): DisposableCancel {\n const patches = (this.__patches ??= {\n value: this.get(),\n version: genId(),\n history: [],\n });\n\n options = { ...options };\n options.runNow ??= false;\n let cursor = options.startAt ?? (options.runNow ? undefined : this.__patches.version);\n\n return this.subscribe(function (value) {\n if (patches.value !== value) {\n const result = diff(patches.value, value, options);\n patches.value = value;\n\n if (result[0].length > 0) {\n const newVersion = genId();\n\n patches.history = patches.history\n .concat({\n fromVersion: patches.version,\n toVersion: newVersion,\n patches: result[0],\n reversePatches: result[1],\n })\n .slice(-1000);\n\n patches.version = newVersion;\n }\n }\n\n if (cursor === patches.version) return;\n const index = patches.history.findIndex((h) => h.fromVersion === cursor);\n let forward, backward, previousVersion;\n\n if (index === -1) {\n [forward, backward] = diff(undefined, value, options);\n previousVersion = undefined;\n } else {\n forward = patches.history.slice(index).flatMap((h) => h.patches);\n backward = patches.history.slice(index).flatMap((h) => h.reversePatches);\n previousVersion = cursor;\n }\n\n cursor = patches.version;\n listener.apply(this, [forward, backward, cursor, previousVersion]);\n }, options);\n}\n\nexport function applyPatches<T>(this: Store<T>, patches: InteropPatch[]): void;\nexport function applyPatches<T>(this: Store<T>, ...patches: InteropPatch[]): void;\nexport function applyPatches<T>(\n this: Store<T>,\n ...patches: (InteropPatch | InteropPatch[])[]\n): void {\n this.set((value) => _applyPatches(value, ...(patches.flat() as Patch[])));\n}\n\nexport function sync<T>(\n this: Store<T>,\n listener: (syncMessage: SyncMessage) => void,\n options?: Omit<SubscribePatchOptions, 'runNow'>,\n): DisposableCancel {\n const debounce =\n typeof options?.debounce === 'object' && 'wait' in options.debounce\n ? { ...options.debounce }\n : options?.debounce !== undefined\n ? { wait: options.debounce }\n : undefined;\n\n if (debounce) {\n debounce.waitOnRunNow ??= false;\n }\n\n return subscribePatches.apply<\n Store<T>,\n Parameters<typeof subscribePatches<T>>,\n ReturnType<typeof subscribePatches<T>>\n >(this, [\n (patches, _, version, previousVersion) => {\n const trie = new Trie();\n\n patches = [...patches]\n .reverse()\n .filter((patch) => {\n if (trie.hasSubPath(patch.path)) {\n return false;\n }\n\n trie.add(patch.path);\n return true;\n })\n .reverse();\n\n listener({\n fromVersion: previousVersion,\n toVersion: version,\n patches: toExtendedJson(patches) as Patch[],\n });\n },\n { ...options, debounce, runNow: true },\n ]);\n}\n\nexport function acceptSync<T>(this: Store<T>, message: SyncMessage): void {\n if (message.fromVersion && message.fromVersion !== this.version) {\n throw new Error(\n `version mismatch! version=${this.version}, fromVersion=${message.fromVersion}`,\n );\n }\n\n const patches = fromExtendedJson(message.patches) as Patch[];\n\n this.version = message.toVersion;\n applyPatches.apply<Store<T>, Patch[], void>(this, patches);\n}\n\nexport const patchMethods: {\n subscribePatches: typeof subscribePatches;\n applyPatches: typeof applyPatches;\n sync: typeof sync;\n acceptSync: typeof acceptSync;\n} = {\n subscribePatches,\n applyPatches,\n sync,\n acceptSync,\n};\n"],"mappings":";;;;AAGA,SAAS,iBAAoB,QAAW,OAAiB;CACvD,IAAI,MAAM,OAAO,UACf,OAAO,OAAO,QAAQ,MAAM,IAAW;CAGzC,OAAO,IAAI,QAAQ,MAAM,MAAa,MAAM,KAAK;AACnD;AAEA,SAAgBA,eAAgB,QAAW,GAAG,SAAqB;CACjE,KAAK,MAAM,SAAS,SAClB,SAAS,iBAAiB,QAAQ,KAAK;CAGzC,OAAO;AACT;;;;ACfA,IAAM,WAAN,MAAe;;kCACsB,IAAI,IAAI;gBAClC;;AACX;AAEA,IAAa,OAAb,MAAkB;;cACC,IAAI,SAAS;;CAE9B,IAAI,MAAuB;EACzB,IAAI,OAAO,KAAK;EAChB,KAAK,MAAM,OAAO,MAAM;GACtB,IAAI,OAAO,KAAK,SAAS,IAAI,GAAG;GAChC,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,KAAM,OAAO,IAAI,SAAS,CAAE;GACzD,OAAO;EACT;EACA,KAAK,SAAS;CAChB;CAEA,WAAW,MAA0B;EACnC,IAAI,OAAO,KAAK;EAChB,KAAK,MAAM,OAAO,MAAM;GACtB,MAAM,OAAO,KAAK,SAAS,IAAI,GAAG;GAClC,IAAI,CAAC,MAAM,OAAO;GAClB,OAAO;EACT;EACA,OAAO,KAAK;CACd;AACF;;;;ACSA,MAAM,cAAc,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC;AAEtD,SAAgB,iBAEd,UAOA,UAAiC,CAAC,GAChB;CAClB,MAAM,UAAW,KAAK,cAAc;EAClC,OAAO,KAAK,IAAI;EAChB,SAAS,MAAM;EACf,SAAS,CAAC;CACZ;CAEA,UAAU,EAAE,GAAG,QAAQ;CACvB,QAAQ,WAAW;CACnB,IAAI,SAAS,QAAQ,YAAY,QAAQ,SAAS,SAAY,KAAK,UAAU;CAE7E,OAAO,KAAK,UAAU,SAAU,OAAO;EACrC,IAAI,QAAQ,UAAU,OAAO;GAC3B,MAAM,SAAS,KAAK,QAAQ,OAAO,OAAO,OAAO;GACjD,QAAQ,QAAQ;GAEhB,IAAI,OAAO,GAAG,SAAS,GAAG;IACxB,MAAM,aAAa,MAAM;IAEzB,QAAQ,UAAU,QAAQ,QACvB,OAAO;KACN,aAAa,QAAQ;KACrB,WAAW;KACX,SAAS,OAAO;KAChB,gBAAgB,OAAO;IACzB,CAAC,EACA,MAAM,IAAK;IAEd,QAAQ,UAAU;GACpB;EACF;EAEA,IAAI,WAAW,QAAQ,SAAS;EAChC,MAAM,QAAQ,QAAQ,QAAQ,WAAW,MAAM,EAAE,gBAAgB,MAAM;EACvE,IAAI,SAAS,UAAU;EAEvB,IAAI,UAAU,IAAI;GAChB,CAAC,SAAS,YAAY,KAAK,QAAW,OAAO,OAAO;GACpD,kBAAkB;EACpB,OAAO;GACL,UAAU,QAAQ,QAAQ,MAAM,KAAK,EAAE,SAAS,MAAM,EAAE,OAAO;GAC/D,WAAW,QAAQ,QAAQ,MAAM,KAAK,EAAE,SAAS,MAAM,EAAE,cAAc;GACvE,kBAAkB;EACpB;EAEA,SAAS,QAAQ;EACjB,SAAS,MAAM,MAAM;GAAC;GAAS;GAAU;GAAQ;EAAe,CAAC;CACnE,GAAG,OAAO;AACZ;AAIA,SAAgB,aAEd,GAAG,SACG;CACN,KAAK,KAAK,UAAUC,eAAc,OAAO,GAAI,QAAQ,KAAK,CAAa,CAAC;AAC1E;AAEA,SAAgB,KAEd,UACA,SACkB;CAClB,MAAM,WACJ,OAAO,SAAS,aAAa,YAAY,UAAU,QAAQ,WACvD,EAAE,GAAG,QAAQ,SAAS,IACtB,SAAS,aAAa,SACpB,EAAE,MAAM,QAAQ,SAAS,IACzB;CAER,IAAI,UACF,SAAS,iBAAiB;CAG5B,OAAO,iBAAiB,MAItB,MAAM,EACL,SAAS,GAAG,SAAS,oBAAoB;EACxC,MAAM,OAAO,IAAI,KAAK;EAEtB,UAAU,CAAC,GAAG,OAAO,EAClB,QAAQ,EACR,QAAQ,UAAU;GACjB,IAAI,KAAK,WAAW,MAAM,IAAI,GAC5B,OAAO;GAGT,KAAK,IAAI,MAAM,IAAI;GACnB,OAAO;EACT,CAAC,EACA,QAAQ;EAEX,SAAS;GACP,aAAa;GACb,WAAW;GACX,SAAS,eAAe,OAAO;EACjC,CAAC;CACH,GACA;EAAE,GAAG;EAAS;EAAU,QAAQ;CAAK,CACvC,CAAC;AACH;AAEA,SAAgB,WAA8B,SAA4B;CACxE,IAAI,QAAQ,eAAe,QAAQ,gBAAgB,KAAK,SACtD,MAAM,IAAI,MACR,6BAA6B,KAAK,QAAQ,gBAAgB,QAAQ,aACpE;CAGF,MAAM,UAAU,iBAAiB,QAAQ,OAAO;CAEhD,KAAK,UAAU,QAAQ;CACvB,aAAa,MAA+B,MAAM,OAAO;AAC3D;AAEA,MAAa,eAKT;CACF;CACA;CACA;CACA;AACF"}
1
+ {"version":3,"file":"patchMethods-D3cdG80W.js","names":["applyPatches","_applyPatches"],"sources":["../src/lib/applyPatches.ts","../src/lib/trie.ts","../src/patches/patchMethods.ts"],"sourcesContent":["import type { Patch } from './diff';\nimport { remove, set } from './propAccess';\n\nfunction applySinglePatch<T>(target: T, patch: Patch): T {\n if (patch.op === 'remove') {\n return remove(target, patch.path as any);\n }\n\n return set(target, patch.path as any, patch.value);\n}\n\nexport function applyPatches<T>(target: T, ...patches: Patch[]): T {\n for (const patch of patches) {\n target = applySinglePatch(target, patch);\n }\n\n return target;\n}\n","import type { KeyType } from '@lib/path';\n\nclass TrieNode {\n children: Map<KeyType, TrieNode> = new Map();\n isLeaf = false;\n}\n\nexport class Trie {\n root: TrieNode = new TrieNode();\n\n add(path: KeyType[]): void {\n let node = this.root;\n for (const key of path) {\n let next = node.children.get(key);\n if (!next) node.children.set(key, (next = new TrieNode()));\n node = next;\n }\n node.isLeaf = true;\n }\n\n hasSubPath(path: KeyType[]): boolean {\n let node = this.root;\n for (const key of path) {\n const next = node.children.get(key);\n if (!next) return false;\n node = next;\n }\n return node.isLeaf;\n }\n}\n","import type { Cancel, DisposableCancel, SubscribeOptions } from '@core/commonTypes';\nimport type { Store } from '@core/store';\nimport { applyPatches as _applyPatches } from '@lib/applyPatches';\nimport { diff, type DiffOptions, type Patch } from '@lib/diff';\nimport { fromExtendedJson, toExtendedJson } from '@lib/extendedJson';\nimport { Trie } from '@lib/trie';\n\nexport interface SyncMessage {\n fromVersion?: string;\n toVersion: string;\n patches: Patch[];\n}\n\nexport interface HistoryEntry extends SyncMessage {\n reversePatches: Patch[];\n}\n\ndeclare module '..' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> {\n __patches?: {\n value: T;\n version: string;\n history: HistoryEntry[];\n };\n }\n}\n\nexport interface SubscribePatchOptions extends SubscribeOptions, DiffOptions {\n /** @default false */\n runNow?: boolean;\n /** try to start from a specific version and only receive patches after that.\n * If the id is not found, it will start from the beginning */\n startAt?: string;\n}\n\nexport type InteropPatch = Patch | { op: 'add' | 'replace' | 'remove'; value?: any };\n\nconst genId = () => Math.random().toString(36).slice(2);\n\nexport function subscribePatches<T>(\n this: Store<T>,\n listener: (\n this: { cancel: Cancel },\n patches: Patch[],\n reversePatches: Patch[],\n version: string,\n previousVersion: string | undefined,\n ) => void,\n options: SubscribePatchOptions = {},\n): DisposableCancel {\n const patches = (this.__patches ??= {\n value: this.get(),\n version: genId(),\n history: [],\n });\n\n options = { ...options };\n options.runNow ??= false;\n let cursor = options.startAt ?? (options.runNow ? undefined : this.__patches.version);\n\n return this.subscribe(function (value) {\n if (patches.value !== value) {\n const result = diff(patches.value, value, options);\n patches.value = value;\n\n if (result[0].length > 0) {\n const newVersion = genId();\n\n patches.history = patches.history\n .concat({\n fromVersion: patches.version,\n toVersion: newVersion,\n patches: result[0],\n reversePatches: result[1],\n })\n .slice(-1000);\n\n patches.version = newVersion;\n }\n }\n\n if (cursor === patches.version) return;\n const index = patches.history.findIndex((h) => h.fromVersion === cursor);\n let forward, backward, previousVersion;\n\n if (index === -1) {\n [forward, backward] = diff(undefined, value, options);\n previousVersion = undefined;\n } else {\n forward = patches.history.slice(index).flatMap((h) => h.patches);\n backward = patches.history.slice(index).flatMap((h) => h.reversePatches);\n previousVersion = cursor;\n }\n\n cursor = patches.version;\n listener.apply(this, [forward, backward, cursor, previousVersion]);\n }, options);\n}\n\nexport function applyPatches<T>(this: Store<T>, patches: InteropPatch[]): void;\nexport function applyPatches<T>(this: Store<T>, ...patches: InteropPatch[]): void;\nexport function applyPatches<T>(\n this: Store<T>,\n ...patches: (InteropPatch | InteropPatch[])[]\n): void {\n this.set((value) => _applyPatches(value, ...(patches.flat() as Patch[])));\n}\n\nexport function sync<T>(\n this: Store<T>,\n listener: (syncMessage: SyncMessage) => void,\n options?: Omit<SubscribePatchOptions, 'runNow'>,\n): DisposableCancel {\n const debounce =\n typeof options?.debounce === 'object' && 'wait' in options.debounce\n ? { ...options.debounce }\n : options?.debounce !== undefined\n ? { wait: options.debounce }\n : undefined;\n\n if (debounce) {\n debounce.waitOnRunNow ??= false;\n }\n\n return subscribePatches.apply<\n Store<T>,\n Parameters<typeof subscribePatches<T>>,\n ReturnType<typeof subscribePatches<T>>\n >(this, [\n (patches, _, version, previousVersion) => {\n const trie = new Trie();\n\n patches = [...patches]\n .reverse()\n .filter((patch) => {\n if (trie.hasSubPath(patch.path)) {\n return false;\n }\n\n trie.add(patch.path);\n return true;\n })\n .reverse();\n\n listener({\n fromVersion: previousVersion,\n toVersion: version,\n patches: toExtendedJson(patches) as Patch[],\n });\n },\n { ...options, debounce, runNow: true },\n ]);\n}\n\nexport function acceptSync<T>(this: Store<T>, message: SyncMessage): void {\n if (message.fromVersion && message.fromVersion !== this.version) {\n throw new Error(\n `version mismatch! version=${this.version}, fromVersion=${message.fromVersion}`,\n );\n }\n\n const patches = fromExtendedJson(message.patches) as Patch[];\n\n this.version = message.toVersion;\n applyPatches.apply<Store<T>, Patch[], void>(this, patches);\n}\n\nexport const patchMethods: {\n subscribePatches: typeof subscribePatches;\n applyPatches: typeof applyPatches;\n sync: typeof sync;\n acceptSync: typeof acceptSync;\n} = {\n subscribePatches,\n applyPatches,\n sync,\n acceptSync,\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import { n as SyncMessage, r as patchMethods, t as SubscribePatchOptions } from "../patchMethods-R3f7HxTy.cjs";
1
+ import { n as SyncMessage, r as patchMethods, t as SubscribePatchOptions } from "../patchMethods-Bfu4UYG7.cjs";
2
2
  export { type SubscribePatchOptions, type SyncMessage, patchMethods };
@@ -1,2 +1,2 @@
1
- import { n as SyncMessage, r as patchMethods, t as SubscribePatchOptions } from "../patchMethods--ekCkYUF.js";
1
+ import { n as SyncMessage, r as patchMethods, t as SubscribePatchOptions } from "../patchMethods-CEUdeSb_.js";
2
2
  export { type SubscribePatchOptions, type SyncMessage, patchMethods };
@@ -1,4 +1,4 @@
1
- const require_store = require('../store-fmAYV5hy.cjs');
1
+ const require_store = require('../store-B_ToOCrU.cjs');
2
2
  const require_patchMethods = require('../patchMethods-BBQDDqwe.cjs');
3
3
 
4
4
  //#region src/patches/register.ts
@@ -1 +1 @@
1
- {"version":3,"file":"register.cjs","names":["Store","patchMethods","autobind"],"sources":["../../src/patches/register.ts"],"sourcesContent":["import { patchMethods } from './patchMethods';\nimport { Store } from '@core';\nimport { autobind } from '@lib/autobind';\n\ntype PatchMethods = typeof patchMethods;\n\ndeclare module '@core' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> extends PatchMethods {}\n}\n\nObject.assign(Store.prototype, patchMethods);\nautobind(Store);\n"],"mappings":";;;;AAWA,OAAO,OAAOA,oBAAM,WAAWC,iCAAY;AAC3CC,uBAASF,mBAAK"}
1
+ {"version":3,"file":"register.cjs","names":["Store","patchMethods","autobind"],"sources":["../../src/patches/register.ts"],"sourcesContent":["import { patchMethods } from './patchMethods';\nimport { Store } from '@core';\nimport { autobind } from '@lib/autobind';\n\ntype PatchMethods = typeof patchMethods;\n\ndeclare module '..' {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n interface Store<T> extends PatchMethods {}\n}\n\nObject.assign(Store.prototype, patchMethods);\nautobind(Store);\n"],"mappings":";;;;AAWA,OAAO,OAAOA,oBAAM,WAAWC,iCAAY;AAC3CC,uBAASF,mBAAK"}