@design.estate/dees-catalog 3.98.0 → 3.98.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,21 @@
1
+ export interface IRealtimeChartPoint {
2
+ time: number;
3
+ value: number;
4
+ }
5
+ export interface IRealtimeChartUpdate {
6
+ point: IRealtimeChartPoint;
7
+ historicalUpdate: boolean;
8
+ }
9
+ export interface IRealtimeChartUpdatePlan {
10
+ replacementRequired: boolean;
11
+ updates: IRealtimeChartUpdate[];
12
+ pruneRecommended: boolean;
13
+ pruneRequired: boolean;
14
+ }
15
+ /**
16
+ * Lightweight Charts can update the newest point or append newer points with
17
+ * update(). Historical update() calls may only target timestamps that already
18
+ * exist. Everything else needs an exact setData() replacement.
19
+ */
20
+ export declare const planRealtimeChartUpdates: (renderedData: readonly IRealtimeChartPoint[], canonicalData: readonly IRealtimeChartPoint[]) => IRealtimeChartUpdatePlan;
21
+ export declare const haveSameSeriesLayout: (renderedNames: readonly string[], canonicalNames: readonly string[]) => boolean;
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Lightweight Charts can update the newest point or append newer points with
3
+ * update(). Historical update() calls may only target timestamps that already
4
+ * exist. Everything else needs an exact setData() replacement.
5
+ */
6
+ export const planRealtimeChartUpdates = (renderedData, canonicalData) => {
7
+ if (canonicalData.length === 0) {
8
+ return {
9
+ replacementRequired: renderedData.length !== 0,
10
+ updates: [],
11
+ pruneRecommended: false,
12
+ pruneRequired: false,
13
+ };
14
+ }
15
+ if (renderedData.length === 0) {
16
+ return {
17
+ replacementRequired: false,
18
+ updates: canonicalData.map((point) => ({ point, historicalUpdate: false })),
19
+ pruneRecommended: false,
20
+ pruneRequired: false,
21
+ };
22
+ }
23
+ const renderedByTime = new Map(renderedData.map((point) => [point.time, point]));
24
+ const canonicalByTime = new Map(canonicalData.map((point) => [point.time, point]));
25
+ const canonicalStart = canonicalData[0].time;
26
+ const renderedLastTime = renderedData[renderedData.length - 1].time;
27
+ // Points before canonicalStart are an expired rolling-window prefix and may
28
+ // stay hidden temporarily. Missing points anywhere else are structural
29
+ // deletions (including suffix deletion) and require an exact replacement.
30
+ const hasStructuralDeletion = renderedData.some((point) => point.time >= canonicalStart && !canonicalByTime.has(point.time));
31
+ if (hasStructuralDeletion) {
32
+ return {
33
+ replacementRequired: true,
34
+ updates: [],
35
+ pruneRecommended: false,
36
+ pruneRequired: false,
37
+ };
38
+ }
39
+ const updates = [];
40
+ for (const canonicalPoint of canonicalData) {
41
+ const renderedPoint = renderedByTime.get(canonicalPoint.time);
42
+ if (!renderedPoint) {
43
+ if (canonicalPoint.time < renderedLastTime) {
44
+ // Historical update() cannot insert a missing timestamp.
45
+ return {
46
+ replacementRequired: true,
47
+ updates: [],
48
+ pruneRecommended: false,
49
+ pruneRequired: false,
50
+ };
51
+ }
52
+ updates.push({ point: canonicalPoint, historicalUpdate: false });
53
+ continue;
54
+ }
55
+ if (renderedPoint.value !== canonicalPoint.value) {
56
+ updates.push({
57
+ point: canonicalPoint,
58
+ historicalUpdate: canonicalPoint.time < renderedLastTime,
59
+ });
60
+ }
61
+ }
62
+ const firstCanonicalPointIndex = renderedData.findIndex((point) => point.time >= canonicalStart);
63
+ const retainedPrefixLength = firstCanonicalPointIndex === -1
64
+ ? renderedData.length
65
+ : firstCanonicalPointIndex;
66
+ const projectedLength = renderedData.length
67
+ + updates.filter((update) => !renderedByTime.has(update.point.time)).length;
68
+ // Retain at most one additional hidden rolling window before compacting.
69
+ const retentionLimit = Math.max(canonicalData.length * 2, 2);
70
+ const pruneRecommended = retainedPrefixLength > 0 && projectedLength > retentionLimit;
71
+ // Hover may defer a recommended compaction to preserve the active crosshair,
72
+ // but never beyond two additional hidden windows.
73
+ const hardRetentionLimit = Math.max(canonicalData.length * 3, 3);
74
+ const pruneRequired = retainedPrefixLength > 0 && projectedLength > hardRetentionLimit;
75
+ return { replacementRequired: false, updates, pruneRecommended, pruneRequired };
76
+ };
77
+ export const haveSameSeriesLayout = (renderedNames, canonicalNames) => renderedNames.length === canonicalNames.length
78
+ && renderedNames.every((name, index) => name === canonicalNames[index]);
79
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhbHRpbWUtdXBkYXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzX3dlYi9lbGVtZW50cy8wMGdyb3VwLWNoYXJ0L2RlZXMtY2hhcnQtYXJlYS9yZWFsdGltZS11cGRhdGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWlCQTs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsQ0FDdEMsWUFBNEMsRUFDNUMsYUFBNkMsRUFDbkIsRUFBRTtJQUM1QixJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDL0IsT0FBTztZQUNMLG1CQUFtQixFQUFFLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUM5QyxPQUFPLEVBQUUsRUFBRTtZQUNYLGdCQUFnQixFQUFFLEtBQUs7WUFDdkIsYUFBYSxFQUFFLEtBQUs7U0FDckIsQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDOUIsT0FBTztZQUNMLG1CQUFtQixFQUFFLEtBQUs7WUFDMUIsT0FBTyxFQUFFLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUMzRSxnQkFBZ0IsRUFBRSxLQUFLO1lBQ3ZCLGFBQWEsRUFBRSxLQUFLO1NBQ3JCLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqRixNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUs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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@design.estate/dees-catalog",
3
- "version": "3.98.0",
3
+ "version": "3.98.1",
4
4
  "private": false,
5
5
  "description": "A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.",
6
6
  "main": "dist_ts_web/index.js",
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@design.estate/dees-catalog',
6
- version: '3.98.0',
6
+ version: '3.98.1',
7
7
  description: 'A comprehensive library that provides dynamic web components for building sophisticated and modern web applications using JavaScript and TypeScript.'
8
8
  }