@pixerate/editor 0.27.0 → 0.29.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.
- package/README.md +44 -2
- package/dist/HistoryManager-DWSLd6Tf.d.ts +150 -0
- package/dist/HistoryManager-DeQQMBCj.d.cts +150 -0
- package/dist/agent/index.cjs +20 -427
- package/dist/agent/index.cjs.map +1 -1
- package/dist/agent/index.d.cts +4 -342
- package/dist/agent/index.d.ts +4 -342
- package/dist/agent/index.js +14 -421
- package/dist/agent/index.js.map +1 -1
- package/dist/animation/index.cjs +62 -0
- package/dist/animation/index.cjs.map +1 -0
- package/dist/animation/index.d.cts +226 -0
- package/dist/animation/index.d.ts +226 -0
- package/dist/animation/index.js +62 -0
- package/dist/animation/index.js.map +1 -0
- package/dist/{builtins-nMXh9sT3.d.cts → builtins-DxC3aUR2.d.cts} +2 -2
- package/dist/{builtins-haN82vjT.d.ts → builtins-NGxNxQfJ.d.ts} +2 -2
- package/dist/canvas/index.cjs +177 -743
- package/dist/canvas/index.cjs.map +1 -1
- package/dist/canvas/index.d.cts +6 -289
- package/dist/canvas/index.d.ts +6 -289
- package/dist/canvas/index.js +49 -615
- package/dist/canvas/index.js.map +1 -1
- package/dist/chunk-36BLROHV.js +438 -0
- package/dist/chunk-36BLROHV.js.map +1 -0
- package/dist/{chunk-JT7AXQTE.js → chunk-3RPOW4CS.js} +7 -7
- package/dist/{chunk-AGR7EVRW.cjs → chunk-6MDQKHRH.cjs} +6 -6
- package/dist/{chunk-AGR7EVRW.cjs.map → chunk-6MDQKHRH.cjs.map} +1 -1
- package/dist/chunk-A6PHCAGX.cjs +87 -0
- package/dist/chunk-A6PHCAGX.cjs.map +1 -0
- package/dist/{chunk-HRMEDT2L.js → chunk-D6AVOTSD.js} +6 -85
- package/dist/chunk-D6AVOTSD.js.map +1 -0
- package/dist/{chunk-ARRTP33I.js → chunk-D6S5M7HV.js} +2 -2
- package/dist/{chunk-ARRTP33I.js.map → chunk-D6S5M7HV.js.map} +1 -1
- package/dist/{chunk-6IO7WUSU.js → chunk-DDADOHJW.js} +17 -17
- package/dist/{chunk-CPOKFNBG.cjs → chunk-I6BZB5ZH.cjs} +2 -2
- package/dist/{chunk-CPOKFNBG.cjs.map → chunk-I6BZB5ZH.cjs.map} +1 -1
- package/dist/{chunk-4BVP64JJ.cjs → chunk-K2UYKJ6M.cjs} +24 -103
- package/dist/chunk-K2UYKJ6M.cjs.map +1 -0
- package/dist/chunk-PIIAZV3L.cjs +244 -0
- package/dist/chunk-PIIAZV3L.cjs.map +1 -0
- package/dist/chunk-PWJARCI4.js +637 -0
- package/dist/chunk-PWJARCI4.js.map +1 -0
- package/dist/{chunk-G2I4QJOT.cjs → chunk-QKLRAA4T.cjs} +3 -244
- package/dist/chunk-QKLRAA4T.cjs.map +1 -0
- package/dist/{chunk-2H7ZHPEJ.js → chunk-QVZZGT4X.js} +1 -242
- package/dist/chunk-QVZZGT4X.js.map +1 -0
- package/dist/chunk-TGD52FEZ.js +87 -0
- package/dist/chunk-TGD52FEZ.js.map +1 -0
- package/dist/chunk-TTYCN6ZH.cjs +637 -0
- package/dist/chunk-TTYCN6ZH.cjs.map +1 -0
- package/dist/{chunk-YK5TATOF.cjs → chunk-U7VGDSNY.cjs} +3 -3
- package/dist/{chunk-YK5TATOF.cjs.map → chunk-U7VGDSNY.cjs.map} +1 -1
- package/dist/chunk-V7CC7RZ6.cjs +438 -0
- package/dist/chunk-V7CC7RZ6.cjs.map +1 -0
- package/dist/chunk-YK57D7PW.js +244 -0
- package/dist/chunk-YK57D7PW.js.map +1 -0
- package/dist/commands/index.cjs +2 -2
- package/dist/commands/index.cjs.map +1 -1
- package/dist/commands/index.d.cts +2 -2
- package/dist/commands/index.d.ts +2 -2
- package/dist/commands/index.js +1 -1
- package/dist/commands/index.js.map +1 -1
- package/dist/easing-B6iAnJHk.d.cts +74 -0
- package/dist/easing-B6iAnJHk.d.ts +74 -0
- package/dist/extensions/index.cjs +5 -5
- package/dist/extensions/index.cjs.map +1 -1
- package/dist/extensions/index.js +4 -4
- package/dist/generation/index.cjs +4 -4
- package/dist/generation/index.cjs.map +1 -1
- package/dist/generation/index.js +3 -3
- package/dist/generation/index.js.map +1 -1
- package/dist/history/index.cjs +4 -2
- package/dist/history/index.cjs.map +1 -1
- package/dist/history/index.d.cts +3 -149
- package/dist/history/index.d.ts +3 -149
- package/dist/history/index.js +5 -3
- package/dist/image-editor/index.cjs.map +1 -1
- package/dist/image-editor/index.js.map +1 -1
- package/dist/index.cjs +24 -22
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -2
- package/dist/index.d.ts +3 -2
- package/dist/index.js +112 -110
- package/dist/index.js.map +1 -1
- package/dist/parameters/index.cjs +1283 -0
- package/dist/parameters/index.cjs.map +1 -0
- package/dist/parameters/index.d.cts +595 -0
- package/dist/parameters/index.d.ts +595 -0
- package/dist/parameters/index.js +1283 -0
- package/dist/parameters/index.js.map +1 -0
- package/dist/spreadsheet/index.cjs +4 -4
- package/dist/spreadsheet/index.cjs.map +1 -1
- package/dist/spreadsheet/index.js +8 -8
- package/dist/tokens/index.cjs +4 -2
- package/dist/tokens/index.cjs.map +1 -1
- package/dist/tokens/index.js +6 -4
- package/dist/tools/index.cjs +31 -0
- package/dist/tools/index.cjs.map +1 -0
- package/dist/tools/index.d.cts +343 -0
- package/dist/tools/index.d.ts +343 -0
- package/dist/tools/index.js +31 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/{types-GT5a5YAX.d.cts → types-DsiXGmjo.d.cts} +1 -1
- package/dist/{types-GT5a5YAX.d.ts → types-DsiXGmjo.d.ts} +1 -1
- package/package.json +16 -1
- package/dist/chunk-2H7ZHPEJ.js.map +0 -1
- package/dist/chunk-4BVP64JJ.cjs.map +0 -1
- package/dist/chunk-G2I4QJOT.cjs.map +0 -1
- package/dist/chunk-HRMEDT2L.js.map +0 -1
- /package/dist/{chunk-JT7AXQTE.js.map → chunk-3RPOW4CS.js.map} +0 -0
- /package/dist/{chunk-6IO7WUSU.js.map → chunk-DDADOHJW.js.map} +0 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class;// src/dirty.ts
|
|
2
|
+
function defaultIsEqual(a, b) {
|
|
3
|
+
if (Object.is(a, b)) return true;
|
|
4
|
+
if (typeof a !== "object" || a === null || typeof b !== "object" || b === null) {
|
|
5
|
+
return false;
|
|
6
|
+
}
|
|
7
|
+
if (Array.isArray(a) && Array.isArray(b)) {
|
|
8
|
+
if (a.length !== b.length) return false;
|
|
9
|
+
for (let i = 0; i < a.length; i++) {
|
|
10
|
+
if (!defaultIsEqual(a[i], b[i])) return false;
|
|
11
|
+
}
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
if (Array.isArray(a) !== Array.isArray(b)) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
const keysA = Object.keys(a);
|
|
18
|
+
const keysB = Object.keys(b);
|
|
19
|
+
if (keysA.length !== keysB.length) return false;
|
|
20
|
+
for (const key of keysA) {
|
|
21
|
+
if (!Object.prototype.hasOwnProperty.call(b, key)) return false;
|
|
22
|
+
if (!defaultIsEqual(a[key], b[key])) return false;
|
|
23
|
+
}
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
var isThenable = (value) => !!value && (typeof value === "object" || typeof value === "function") && typeof value.then === "function";
|
|
27
|
+
var DirtyTracker = (_class = class {
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
__init() {this.normalizedBaseline = null}
|
|
32
|
+
/** `isDirty` result as of a revision (and baseline version). */
|
|
33
|
+
__init2() {this.cache = null}
|
|
34
|
+
__init3() {this.baselineVersion = 0}
|
|
35
|
+
__init4() {this.suppressDepth = 0}
|
|
36
|
+
__init5() {this.hasValue = false}
|
|
37
|
+
|
|
38
|
+
__init6() {this.dirtyState = false}
|
|
39
|
+
__init7() {this.listeners = /* @__PURE__ */ new Set()}
|
|
40
|
+
constructor(initialBaseline, options) {;_class.prototype.__init.call(this);_class.prototype.__init2.call(this);_class.prototype.__init3.call(this);_class.prototype.__init4.call(this);_class.prototype.__init5.call(this);_class.prototype.__init6.call(this);_class.prototype.__init7.call(this);
|
|
41
|
+
this.baseline = initialBaseline;
|
|
42
|
+
if (typeof options === "function") {
|
|
43
|
+
this.isEqual = options;
|
|
44
|
+
} else {
|
|
45
|
+
this.isEqual = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _ => _.isEqual]), () => ( defaultIsEqual));
|
|
46
|
+
this.normalize = _optionalChain([options, 'optionalAccess', _2 => _2.normalize]);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Returns current baseline value.
|
|
51
|
+
*/
|
|
52
|
+
getBaseline() {
|
|
53
|
+
return this.baseline;
|
|
54
|
+
}
|
|
55
|
+
changeBaseline(value) {
|
|
56
|
+
this.baseline = value;
|
|
57
|
+
this.baselineVersion++;
|
|
58
|
+
this.normalizedBaseline = null;
|
|
59
|
+
this.cache = null;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Sets a new baseline value without triggering any dirty state.
|
|
63
|
+
* If a value is being tracked (`update`), `dirty` is recomputed against it.
|
|
64
|
+
*/
|
|
65
|
+
setBaseline(value) {
|
|
66
|
+
this.changeBaseline(value);
|
|
67
|
+
if (this.hasValue) {
|
|
68
|
+
this.setDirtyState(this.compare(this.lastValue));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
compare(current) {
|
|
72
|
+
if (!this.normalize) return !this.isEqual(this.baseline, current);
|
|
73
|
+
this.normalizedBaseline ??= { value: this.normalize(this.baseline) };
|
|
74
|
+
return !this.isEqual(
|
|
75
|
+
this.normalizedBaseline.value,
|
|
76
|
+
this.normalize(current)
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Checks whether the given value differs from the baseline.
|
|
81
|
+
* With a `revision` (e.g. `HistoryManager.getRevision()`), the result is
|
|
82
|
+
* cached and reused for the same revision until the baseline changes.
|
|
83
|
+
*/
|
|
84
|
+
isDirty(current, revision) {
|
|
85
|
+
if (revision === void 0) return this.compare(current);
|
|
86
|
+
const cache = this.cache;
|
|
87
|
+
if (cache && cache.revision === revision && cache.baseline === this.baselineVersion) {
|
|
88
|
+
return cache.dirty;
|
|
89
|
+
}
|
|
90
|
+
const dirty = this.compare(current);
|
|
91
|
+
this.cache = { revision, baseline: this.baselineVersion, dirty };
|
|
92
|
+
return dirty;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Resets the baseline to the provided current value (or clears dirty status).
|
|
96
|
+
*/
|
|
97
|
+
reset(current) {
|
|
98
|
+
this.changeBaseline(current);
|
|
99
|
+
this.hasValue = true;
|
|
100
|
+
this.lastValue = current;
|
|
101
|
+
this.setDirtyState(false);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Records the current value and returns whether it is dirty. While
|
|
105
|
+
* suppressed (`suppress`), the value becomes the new baseline instead, so
|
|
106
|
+
* programmatic loads and restores never mark the document dirty.
|
|
107
|
+
*/
|
|
108
|
+
update(current, revision) {
|
|
109
|
+
this.hasValue = true;
|
|
110
|
+
this.lastValue = current;
|
|
111
|
+
if (this.suppressDepth > 0) {
|
|
112
|
+
this.changeBaseline(current);
|
|
113
|
+
this.setDirtyState(false);
|
|
114
|
+
return false;
|
|
115
|
+
}
|
|
116
|
+
const dirty = this.isDirty(current, revision);
|
|
117
|
+
this.setDirtyState(dirty);
|
|
118
|
+
return dirty;
|
|
119
|
+
}
|
|
120
|
+
/** Whether the last value passed to `update` differs from the baseline. */
|
|
121
|
+
get dirty() {
|
|
122
|
+
return this.dirtyState;
|
|
123
|
+
}
|
|
124
|
+
/** Whether `suppress` is currently running. */
|
|
125
|
+
get suppressed() {
|
|
126
|
+
return this.suppressDepth > 0;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Marks the document saved: `current` (default: the last value passed to
|
|
130
|
+
* `update`) becomes the baseline.
|
|
131
|
+
*/
|
|
132
|
+
markClean(...args) {
|
|
133
|
+
if (args.length > 0) {
|
|
134
|
+
this.reset(args[0]);
|
|
135
|
+
} else if (this.hasValue) {
|
|
136
|
+
this.reset(this.lastValue);
|
|
137
|
+
} else {
|
|
138
|
+
this.setDirtyState(false);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Runs `fn` without marking anything dirty: every `update` during it
|
|
143
|
+
* rebaselines. Re-entrant (depth counter). If `fn` returns a promise, the
|
|
144
|
+
* suppression lasts until it settles.
|
|
145
|
+
*/
|
|
146
|
+
suppress(fn) {
|
|
147
|
+
this.suppressDepth++;
|
|
148
|
+
let result;
|
|
149
|
+
try {
|
|
150
|
+
result = fn();
|
|
151
|
+
} catch (error) {
|
|
152
|
+
this.suppressDepth--;
|
|
153
|
+
throw error;
|
|
154
|
+
}
|
|
155
|
+
if (isThenable(result)) {
|
|
156
|
+
const release = () => {
|
|
157
|
+
this.suppressDepth--;
|
|
158
|
+
};
|
|
159
|
+
return result.then(
|
|
160
|
+
(value) => {
|
|
161
|
+
release();
|
|
162
|
+
return value;
|
|
163
|
+
},
|
|
164
|
+
(error) => {
|
|
165
|
+
release();
|
|
166
|
+
throw error;
|
|
167
|
+
}
|
|
168
|
+
);
|
|
169
|
+
}
|
|
170
|
+
this.suppressDepth--;
|
|
171
|
+
return result;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Subscribes to changes of `dirty`. The listener is called immediately with
|
|
175
|
+
* the current value. Returns an unsubscribe function.
|
|
176
|
+
*/
|
|
177
|
+
subscribe(listener) {
|
|
178
|
+
this.listeners.add(listener);
|
|
179
|
+
listener(this.dirtyState);
|
|
180
|
+
return () => {
|
|
181
|
+
this.listeners.delete(listener);
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
setDirtyState(dirty) {
|
|
185
|
+
if (dirty === this.dirtyState) return;
|
|
186
|
+
this.dirtyState = dirty;
|
|
187
|
+
this.listeners.forEach((listener) => {
|
|
188
|
+
try {
|
|
189
|
+
listener(dirty);
|
|
190
|
+
} catch (err) {
|
|
191
|
+
console.error("[DirtyTracker] Error in listener:", err);
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}, _class);
|
|
196
|
+
function createDirtyTracker(initialBaseline, options) {
|
|
197
|
+
return new DirtyTracker(initialBaseline, options);
|
|
198
|
+
}
|
|
199
|
+
function withoutDirty(tracker, fn) {
|
|
200
|
+
return tracker.suppress(fn);
|
|
201
|
+
}
|
|
202
|
+
function bindDirtyToHistory(options) {
|
|
203
|
+
const { history, getValue } = options;
|
|
204
|
+
const tracker = _nullishCoalesce(options.tracker, () => ( new DirtyTracker(getValue(), {
|
|
205
|
+
isEqual: options.isEqual,
|
|
206
|
+
normalize: options.normalize
|
|
207
|
+
})));
|
|
208
|
+
const unsubscribe = history.subscribe(() => {
|
|
209
|
+
tracker.update(getValue(), _optionalChain([history, 'access', _3 => _3.getRevision, 'optionalCall', _4 => _4()]));
|
|
210
|
+
});
|
|
211
|
+
return {
|
|
212
|
+
tracker,
|
|
213
|
+
get dirty() {
|
|
214
|
+
return tracker.dirty;
|
|
215
|
+
},
|
|
216
|
+
markClean: () => tracker.markClean(getValue()),
|
|
217
|
+
suppress: (fn) => {
|
|
218
|
+
const rebaseline = () => {
|
|
219
|
+
if (!tracker.suppressed) tracker.reset(getValue());
|
|
220
|
+
};
|
|
221
|
+
const result = tracker.suppress(fn);
|
|
222
|
+
if (isThenable(result)) {
|
|
223
|
+
return result.then((value) => {
|
|
224
|
+
rebaseline();
|
|
225
|
+
return value;
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
rebaseline();
|
|
229
|
+
return result;
|
|
230
|
+
},
|
|
231
|
+
refresh: () => tracker.update(getValue()),
|
|
232
|
+
subscribe: (listener) => tracker.subscribe(listener),
|
|
233
|
+
destroy: unsubscribe
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
exports.defaultIsEqual = defaultIsEqual; exports.DirtyTracker = DirtyTracker; exports.createDirtyTracker = createDirtyTracker; exports.withoutDirty = withoutDirty; exports.bindDirtyToHistory = bindDirtyToHistory;
|
|
244
|
+
//# sourceMappingURL=chunk-PIIAZV3L.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/editor/editor/packages/core/dist/chunk-PIIAZV3L.cjs","../src/dirty.ts"],"names":[],"mappings":"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","file":"/home/runner/work/editor/editor/packages/core/dist/chunk-PIIAZV3L.cjs","sourcesContent":[null,"// Portions ported from soundcraft-main/crates/engine/src/lib.rs (MIT OR Apache-2.0,\n// © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\n\n/**\n * Compares two values for structural equality.\n * Handles primitives, objects, arrays, and null/undefined.\n */\nexport function defaultIsEqual<T>(a: T, b: T): boolean {\n if (Object.is(a, b)) return true;\n if (\n typeof a !== \"object\" ||\n a === null ||\n typeof b !== \"object\" ||\n b === null\n ) {\n return false;\n }\n\n // Fast path for arrays\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!defaultIsEqual(a[i], b[i])) return false;\n }\n return true;\n }\n if (Array.isArray(a) !== Array.isArray(b)) {\n return false;\n }\n\n const keysA = Object.keys(a) as (keyof T)[];\n const keysB = Object.keys(b) as (keyof T)[];\n\n if (keysA.length !== keysB.length) return false;\n\n for (const key of keysA) {\n if (!Object.prototype.hasOwnProperty.call(b, key)) return false;\n if (!defaultIsEqual(a[key], b[key])) return false;\n }\n\n return true;\n}\n\nexport interface DirtyTrackerOptions<T> {\n /**\n * Equality check. When `normalize` is set it receives the normalized values.\n */\n isEqual?: (a: T, b: T) => boolean;\n /**\n * Projects a value onto the part that counts as \"the document\" before\n * comparing, e.g. `({ selection, viewport, ...doc }) => doc` so that\n * selecting, scrolling or zooming never marks the document dirty.\n */\n normalize?: (value: T) => unknown;\n}\n\ntype Thenable = { then: (...args: any[]) => any };\n\nconst isThenable = (value: unknown): value is Thenable =>\n !!value &&\n (typeof value === \"object\" || typeof value === \"function\") &&\n typeof (value as Thenable).then === \"function\";\n\n/**\n * Tracks a baseline (saved) value and determines whether the current value is\n * dirty (modified).\n *\n * Stateless use: `isDirty(current)`. Stateful use: feed values with\n * `update(current, revision?)`, read `dirty`, `subscribe` to changes, call\n * `markClean()` after saving and wrap programmatic loads in `suppress(fn)`.\n */\nexport class DirtyTracker<T = unknown> {\n private baseline: T;\n private readonly isEqual: (a: T, b: T) => boolean;\n private readonly normalize?: (value: T) => unknown;\n private normalizedBaseline: { value: unknown } | null = null;\n /** `isDirty` result as of a revision (and baseline version). */\n private cache: { revision: number; baseline: number; dirty: boolean } | null =\n null;\n private baselineVersion = 0;\n private suppressDepth = 0;\n private hasValue = false;\n private lastValue: T | undefined;\n private dirtyState = false;\n private listeners = new Set<(dirty: boolean) => void>();\n\n constructor(\n initialBaseline: T,\n options?: DirtyTrackerOptions<T> | ((a: T, b: T) => boolean),\n ) {\n this.baseline = initialBaseline;\n if (typeof options === \"function\") {\n this.isEqual = options;\n } else {\n this.isEqual = options?.isEqual ?? defaultIsEqual;\n this.normalize = options?.normalize;\n }\n }\n\n /**\n * Returns current baseline value.\n */\n public getBaseline(): T {\n return this.baseline;\n }\n\n private changeBaseline(value: T): void {\n this.baseline = value;\n this.baselineVersion++;\n this.normalizedBaseline = null;\n this.cache = null;\n }\n\n /**\n * Sets a new baseline value without triggering any dirty state.\n * If a value is being tracked (`update`), `dirty` is recomputed against it.\n */\n public setBaseline(value: T): void {\n this.changeBaseline(value);\n if (this.hasValue) {\n this.setDirtyState(this.compare(this.lastValue as T));\n }\n }\n\n private compare(current: T): boolean {\n if (!this.normalize) return !this.isEqual(this.baseline, current);\n this.normalizedBaseline ??= { value: this.normalize(this.baseline) };\n return !this.isEqual(\n this.normalizedBaseline.value as T,\n this.normalize(current) as T,\n );\n }\n\n /**\n * Checks whether the given value differs from the baseline.\n * With a `revision` (e.g. `HistoryManager.getRevision()`), the result is\n * cached and reused for the same revision until the baseline changes.\n */\n public isDirty(current: T, revision?: number): boolean {\n if (revision === undefined) return this.compare(current);\n const cache = this.cache;\n if (\n cache &&\n cache.revision === revision &&\n cache.baseline === this.baselineVersion\n ) {\n return cache.dirty;\n }\n const dirty = this.compare(current);\n this.cache = { revision, baseline: this.baselineVersion, dirty };\n return dirty;\n }\n\n /**\n * Resets the baseline to the provided current value (or clears dirty status).\n */\n public reset(current: T): void {\n this.changeBaseline(current);\n this.hasValue = true;\n this.lastValue = current;\n this.setDirtyState(false);\n }\n\n /**\n * Records the current value and returns whether it is dirty. While\n * suppressed (`suppress`), the value becomes the new baseline instead, so\n * programmatic loads and restores never mark the document dirty.\n */\n public update(current: T, revision?: number): boolean {\n this.hasValue = true;\n this.lastValue = current;\n if (this.suppressDepth > 0) {\n this.changeBaseline(current);\n this.setDirtyState(false);\n return false;\n }\n const dirty = this.isDirty(current, revision);\n this.setDirtyState(dirty);\n return dirty;\n }\n\n /** Whether the last value passed to `update` differs from the baseline. */\n public get dirty(): boolean {\n return this.dirtyState;\n }\n\n /** Whether `suppress` is currently running. */\n public get suppressed(): boolean {\n return this.suppressDepth > 0;\n }\n\n /**\n * Marks the document saved: `current` (default: the last value passed to\n * `update`) becomes the baseline.\n */\n public markClean(...args: [] | [current: T]): void {\n if (args.length > 0) {\n this.reset(args[0] as T);\n } else if (this.hasValue) {\n this.reset(this.lastValue as T);\n } else {\n this.setDirtyState(false);\n }\n }\n\n /**\n * Runs `fn` without marking anything dirty: every `update` during it\n * rebaselines. Re-entrant (depth counter). If `fn` returns a promise, the\n * suppression lasts until it settles.\n */\n public suppress<R>(fn: () => R): R {\n this.suppressDepth++;\n let result: R;\n try {\n result = fn();\n } catch (error) {\n this.suppressDepth--;\n throw error;\n }\n if (isThenable(result)) {\n const release = () => {\n this.suppressDepth--;\n };\n return (result as unknown as Promise<unknown>).then(\n (value) => {\n release();\n return value;\n },\n (error) => {\n release();\n throw error;\n },\n ) as unknown as R;\n }\n this.suppressDepth--;\n return result;\n }\n\n /**\n * Subscribes to changes of `dirty`. The listener is called immediately with\n * the current value. Returns an unsubscribe function.\n */\n public subscribe(listener: (dirty: boolean) => void): () => void {\n this.listeners.add(listener);\n listener(this.dirtyState);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private setDirtyState(dirty: boolean): void {\n if (dirty === this.dirtyState) return;\n this.dirtyState = dirty;\n this.listeners.forEach((listener) => {\n try {\n listener(dirty);\n } catch (err) {\n console.error(\"[DirtyTracker] Error in listener:\", err);\n }\n });\n }\n}\n\n/**\n * Creates a DirtyTracker instance.\n */\nexport function createDirtyTracker<T>(\n initialBaseline: T,\n options?: DirtyTrackerOptions<T> | ((a: T, b: T) => boolean),\n): DirtyTracker<T> {\n return new DirtyTracker(initialBaseline, options);\n}\n\n/**\n * Runs `fn` with dirty tracking suppressed (see `DirtyTracker.suppress`).\n */\nexport function withoutDirty<R>(tracker: DirtyTracker<any>, fn: () => R): R {\n return tracker.suppress(fn);\n}\n\n/** Minimal history surface used by `bindDirtyToHistory` (`HistoryManager` satisfies it). */\nexport interface DirtyHistorySource {\n subscribe(listener: (...args: any[]) => void): () => void;\n getRevision?(): number;\n}\n\nexport interface BindDirtyToHistoryOptions<T> extends DirtyTrackerOptions<T> {\n history: DirtyHistorySource;\n /** Reads the current document value. */\n getValue: () => T;\n /** Existing tracker to drive (default: a new one baselined on `getValue()`). */\n tracker?: DirtyTracker<T>;\n}\n\nexport interface HistoryDirtyBinding<T> {\n readonly tracker: DirtyTracker<T>;\n /** Whether the document differs from the saved baseline. */\n readonly dirty: boolean;\n /** Marks the current value as saved. */\n markClean(): void;\n /** Runs `fn` (e.g. a load or restore) without marking the document dirty. */\n suppress<R>(fn: () => R): R;\n /** Re-reads the value after a change made outside the history. */\n refresh(): boolean;\n subscribe(listener: (dirty: boolean) => void): () => void;\n /** Stops listening to the history. */\n destroy(): void;\n}\n\n/**\n * Keeps a `DirtyTracker` in step with a `HistoryManager`: every history change\n * re-reads the value (cached per history revision), so undoing back to the\n * saved state makes the document clean again.\n */\nexport function bindDirtyToHistory<T>(\n options: BindDirtyToHistoryOptions<T>,\n): HistoryDirtyBinding<T> {\n const { history, getValue } = options;\n const tracker =\n options.tracker ??\n new DirtyTracker<T>(getValue(), {\n isEqual: options.isEqual,\n normalize: options.normalize,\n });\n const unsubscribe = history.subscribe(() => {\n tracker.update(getValue(), history.getRevision?.());\n });\n return {\n tracker,\n get dirty() {\n return tracker.dirty;\n },\n markClean: () => tracker.markClean(getValue()),\n suppress: <R>(fn: () => R): R => {\n // The loaded value becomes the baseline even if the load never touched the history.\n const rebaseline = () => {\n if (!tracker.suppressed) tracker.reset(getValue());\n };\n const result = tracker.suppress(fn);\n if (isThenable(result)) {\n return (result as unknown as Promise<unknown>).then((value) => {\n rebaseline();\n return value;\n }) as unknown as R;\n }\n rebaseline();\n return result;\n },\n refresh: () => tracker.update(getValue()),\n subscribe: (listener) => tracker.subscribe(listener),\n destroy: unsubscribe,\n };\n}\n"]}
|