@memberjunction/react-runtime 6.2.0-edge.0 → 6.2.0-edge.2
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/.turbo/turbo-build.log +14 -14
- package/CHANGELOG.md +93 -0
- package/dist/compiler/babel-config.d.ts +14 -0
- package/dist/compiler/babel-config.d.ts.map +1 -1
- package/dist/compiler/babel-config.js +12 -3
- package/dist/compiler/babel-config.js.map +1 -1
- package/dist/compiler/component-compiler.d.ts +5 -0
- package/dist/compiler/component-compiler.d.ts.map +1 -1
- package/dist/compiler/component-compiler.js +24 -9
- package/dist/compiler/component-compiler.js.map +1 -1
- package/dist/compiler/index.d.ts +1 -1
- package/dist/compiler/index.d.ts.map +1 -1
- package/dist/compiler/index.js +1 -1
- package/dist/compiler/index.js.map +1 -1
- package/dist/component-manager/component-manager.d.ts +8 -0
- package/dist/component-manager/component-manager.d.ts.map +1 -1
- package/dist/component-manager/component-manager.js +18 -6
- package/dist/component-manager/component-manager.js.map +1 -1
- package/dist/index.d.ts +21 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -10
- package/dist/index.js.map +1 -1
- package/dist/registry/component-registry-service.d.ts +18 -0
- package/dist/registry/component-registry-service.d.ts.map +1 -1
- package/dist/registry/component-registry-service.js +65 -23
- package/dist/registry/component-registry-service.js.map +1 -1
- package/dist/registry/component-registry.d.ts +24 -1
- package/dist/registry/component-registry.d.ts.map +1 -1
- package/dist/registry/component-registry.js +74 -23
- package/dist/registry/component-registry.js.map +1 -1
- package/dist/registry/component-resolver.d.ts +10 -0
- package/dist/registry/component-resolver.d.ts.map +1 -1
- package/dist/registry/component-resolver.js +30 -9
- package/dist/registry/component-resolver.js.map +1 -1
- package/dist/registry/registry-provider.js.map +1 -1
- package/dist/runtime/component-hierarchy.d.ts +15 -0
- package/dist/runtime/component-hierarchy.d.ts.map +1 -1
- package/dist/runtime/component-hierarchy.js +28 -10
- package/dist/runtime/component-hierarchy.js.map +1 -1
- package/dist/runtime/error-boundary.d.ts +4 -0
- package/dist/runtime/error-boundary.d.ts.map +1 -1
- package/dist/runtime/error-boundary.js +50 -20
- package/dist/runtime/error-boundary.js.map +1 -1
- package/dist/runtime/index.d.ts +3 -3
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +3 -3
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/prop-builder.d.ts +8 -0
- package/dist/runtime/prop-builder.d.ts.map +1 -1
- package/dist/runtime/prop-builder.js +39 -11
- package/dist/runtime/prop-builder.js.map +1 -1
- package/dist/runtime/react-root-manager.d.ts +10 -0
- package/dist/runtime/react-root-manager.d.ts.map +1 -1
- package/dist/runtime/react-root-manager.js +27 -9
- package/dist/runtime/react-root-manager.js.map +1 -1
- package/dist/runtime.umd.js +194 -125
- package/dist/utilities/cache-manager.d.ts +13 -0
- package/dist/utilities/cache-manager.d.ts.map +1 -1
- package/dist/utilities/cache-manager.js +40 -16
- package/dist/utilities/cache-manager.js.map +1 -1
- package/dist/utilities/component-error-analyzer.d.ts +3 -0
- package/dist/utilities/component-error-analyzer.d.ts.map +1 -1
- package/dist/utilities/component-error-analyzer.js +12 -3
- package/dist/utilities/component-error-analyzer.js.map +1 -1
- package/dist/utilities/component-hash.d.ts +1 -0
- package/dist/utilities/component-hash.d.ts.map +1 -1
- package/dist/utilities/component-hash.js +4 -1
- package/dist/utilities/component-hash.js.map +1 -1
- package/dist/utilities/component-library-theming.d.ts +4 -0
- package/dist/utilities/component-library-theming.d.ts.map +1 -1
- package/dist/utilities/component-library-theming.js +12 -6
- package/dist/utilities/component-library-theming.js.map +1 -1
- package/dist/utilities/component-styles.d.ts +1 -0
- package/dist/utilities/component-styles.d.ts.map +1 -1
- package/dist/utilities/component-styles.js +2 -1
- package/dist/utilities/component-styles.js.map +1 -1
- package/dist/utilities/component-unwrapper.d.ts +8 -2
- package/dist/utilities/component-unwrapper.d.ts.map +1 -1
- package/dist/utilities/component-unwrapper.js +19 -7
- package/dist/utilities/component-unwrapper.js.map +1 -1
- package/dist/utilities/core-libraries.d.ts +2 -0
- package/dist/utilities/core-libraries.d.ts.map +1 -1
- package/dist/utilities/core-libraries.js +9 -3
- package/dist/utilities/core-libraries.js.map +1 -1
- package/dist/utilities/entity-record-key.d.ts +1 -0
- package/dist/utilities/entity-record-key.d.ts.map +1 -1
- package/dist/utilities/entity-record-key.js +4 -1
- package/dist/utilities/entity-record-key.js.map +1 -1
- package/dist/utilities/library-dependency-resolver.d.ts +8 -0
- package/dist/utilities/library-dependency-resolver.d.ts.map +1 -1
- package/dist/utilities/library-dependency-resolver.js +39 -15
- package/dist/utilities/library-dependency-resolver.js.map +1 -1
- package/dist/utilities/library-loader.d.ts +12 -0
- package/dist/utilities/library-loader.d.ts.map +1 -1
- package/dist/utilities/library-loader.js +46 -16
- package/dist/utilities/library-loader.js.map +1 -1
- package/dist/utilities/library-registry.d.ts +5 -0
- package/dist/utilities/library-registry.d.ts.map +1 -1
- package/dist/utilities/library-registry.js +20 -5
- package/dist/utilities/library-registry.js.map +1 -1
- package/dist/utilities/resource-manager.d.ts +19 -0
- package/dist/utilities/resource-manager.d.ts.map +1 -1
- package/dist/utilities/resource-manager.js +63 -18
- package/dist/utilities/resource-manager.js.map +1 -1
- package/dist/utilities/runtime-utilities.d.ts +9 -7
- package/dist/utilities/runtime-utilities.d.ts.map +1 -1
- package/dist/utilities/runtime-utilities.js +22 -16
- package/dist/utilities/runtime-utilities.js.map +1 -1
- package/dist/utilities/standard-libraries.d.ts +10 -0
- package/dist/utilities/standard-libraries.d.ts.map +1 -1
- package/dist/utilities/standard-libraries.js +40 -10
- package/dist/utilities/standard-libraries.js.map +1 -1
- package/dist/utilities/user-state.d.ts +5 -0
- package/dist/utilities/user-state.d.ts.map +1 -1
- package/dist/utilities/user-state.js +20 -5
- package/dist/utilities/user-state.js.map +1 -1
- package/package.json +7 -7
- package/src/__tests__/error-boundary.test.ts +80 -0
- package/src/__tests__/runtime-utilities-factory.test.ts +4 -4
- package/src/__tests__/user-state.test.ts +44 -44
- package/src/compiler/babel-config.ts +18 -3
- package/src/compiler/component-compiler.ts +34 -9
- package/src/compiler/index.ts +3 -3
- package/src/component-manager/component-manager.ts +36 -6
- package/src/index.ts +35 -21
- package/src/registry/component-registry-service.ts +126 -23
- package/src/registry/component-registry.ts +122 -24
- package/src/registry/component-resolver.ts +51 -9
- package/src/registry/registry-provider.ts +40 -40
- package/src/runtime/component-hierarchy.ts +61 -10
- package/src/runtime/error-boundary.ts +77 -22
- package/src/runtime/index.ts +16 -16
- package/src/runtime/prop-builder.ts +69 -11
- package/src/runtime/react-root-manager.ts +48 -10
- package/src/utilities/cache-manager.ts +61 -16
- package/src/utilities/component-error-analyzer.ts +18 -3
- package/src/utilities/component-hash.ts +6 -1
- package/src/utilities/component-library-theming.ts +24 -6
- package/src/utilities/component-styles.ts +4 -1
- package/src/utilities/component-unwrapper.ts +34 -7
- package/src/utilities/core-libraries.ts +13 -3
- package/src/utilities/entity-record-key.ts +11 -1
- package/src/utilities/library-dependency-resolver.ts +66 -15
- package/src/utilities/library-loader.ts +81 -17
- package/src/utilities/library-registry.ts +30 -5
- package/src/utilities/resource-manager.ts +126 -19
- package/src/utilities/runtime-utilities.ts +26 -16
- package/src/utilities/standard-libraries.ts +60 -10
- package/src/utilities/user-state.ts +40 -5
|
@@ -16,18 +16,31 @@ export declare class CacheManager<T = unknown> {
|
|
|
16
16
|
private cleanupTimer?;
|
|
17
17
|
private readonly options;
|
|
18
18
|
constructor(options?: CacheOptions);
|
|
19
|
+
Set(key: string, value: T, ttl?: number): void;
|
|
19
20
|
set(key: string, value: T, ttl?: number): void;
|
|
21
|
+
Get(key: string): T | undefined;
|
|
20
22
|
get(key: string): T | undefined;
|
|
23
|
+
Has(key: string): boolean;
|
|
21
24
|
has(key: string): boolean;
|
|
25
|
+
Delete(key: string): boolean;
|
|
22
26
|
delete(key: string): boolean;
|
|
27
|
+
Clear(): void;
|
|
23
28
|
clear(): void;
|
|
29
|
+
GetStats(): {
|
|
30
|
+
size: number;
|
|
31
|
+
memoryUsage: number;
|
|
32
|
+
maxSize: number;
|
|
33
|
+
maxMemory: number;
|
|
34
|
+
};
|
|
24
35
|
getStats(): {
|
|
25
36
|
size: number;
|
|
26
37
|
memoryUsage: number;
|
|
27
38
|
maxSize: number;
|
|
28
39
|
maxMemory: number;
|
|
29
40
|
};
|
|
41
|
+
Cleanup(): number;
|
|
30
42
|
cleanup(): number;
|
|
43
|
+
Destroy(): void;
|
|
31
44
|
destroy(): void;
|
|
32
45
|
private isExpired;
|
|
33
46
|
private evictLRU;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-manager.d.ts","sourceRoot":"","sources":["../../src/utilities/cache-manager.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAMD,qBAAa,YAAY,CAAC,CAAC,GAAG,OAAO;IACnC,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,MAAM,CAAoD;IAClE,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,YAAY,CAAC,CAAiC;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;gBAErC,OAAO,GAAE,YAAiB;IAgBtC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"cache-manager.d.ts","sourceRoot":"","sources":["../../src/utilities/cache-manager.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,KAAK,EAAE,CAAC,CAAC;IACT,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAMD,qBAAa,YAAY,CAAC,CAAC,GAAG,OAAO;IACnC,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,MAAM,CAAoD;IAClE,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,YAAY,CAAC,CAAiC;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;gBAErC,OAAO,GAAE,YAAiB;IAgBtC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IA+C9C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAO9C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAgB/B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAO/B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAazB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAOzB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAe5B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAO5B,KAAK,IAAI,IAAI;IAUb,KAAK,IAAI,IAAI;IAOb,QAAQ,IAAI;QACV,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;KACnB;IAUD,QAAQ,IAAI;QACV,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;KACnB;IAOD,OAAO,IAAI,MAAM;IAejB,OAAO,IAAI,MAAM;IAOjB,OAAO,IAAI,IAAI;IAMf,OAAO,IAAI,IAAI;IAOf,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,QAAQ;IAmBhB,OAAO,CAAC,aAAa;IAerB,OAAO,CAAC,YAAY;IAkBpB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,gBAAgB;CAMzB"}
|
|
@@ -13,7 +13,7 @@ export class CacheManager {
|
|
|
13
13
|
this.startCleanupTimer();
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
|
-
|
|
16
|
+
Set(key, value, ttl) {
|
|
17
17
|
const size = this.estimateSize(value);
|
|
18
18
|
const entry = {
|
|
19
19
|
value,
|
|
@@ -41,33 +41,42 @@ export class CacheManager {
|
|
|
41
41
|
const timeout = ttl || this.options.defaultTTL;
|
|
42
42
|
const timerId = setTimeout(() => {
|
|
43
43
|
this.timers.delete(key);
|
|
44
|
-
this.
|
|
44
|
+
this.Delete(key);
|
|
45
45
|
}, timeout);
|
|
46
46
|
this.timers.set(key, timerId);
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
|
-
|
|
49
|
+
set(key, value, ttl) {
|
|
50
|
+
return this.Set(key, value, ttl);
|
|
51
|
+
}
|
|
52
|
+
Get(key) {
|
|
50
53
|
const entry = this.cache.get(key);
|
|
51
54
|
if (!entry)
|
|
52
55
|
return undefined;
|
|
53
56
|
if (this.isExpired(entry)) {
|
|
54
|
-
this.
|
|
57
|
+
this.Delete(key);
|
|
55
58
|
return undefined;
|
|
56
59
|
}
|
|
57
60
|
entry.timestamp = Date.now();
|
|
58
61
|
return entry.value;
|
|
59
62
|
}
|
|
60
|
-
|
|
63
|
+
get(key) {
|
|
64
|
+
return this.Get(key);
|
|
65
|
+
}
|
|
66
|
+
Has(key) {
|
|
61
67
|
const entry = this.cache.get(key);
|
|
62
68
|
if (!entry)
|
|
63
69
|
return false;
|
|
64
70
|
if (this.isExpired(entry)) {
|
|
65
|
-
this.
|
|
71
|
+
this.Delete(key);
|
|
66
72
|
return false;
|
|
67
73
|
}
|
|
68
74
|
return true;
|
|
69
75
|
}
|
|
70
|
-
|
|
76
|
+
has(key) {
|
|
77
|
+
return this.Has(key);
|
|
78
|
+
}
|
|
79
|
+
Delete(key) {
|
|
71
80
|
const timer = this.timers.get(key);
|
|
72
81
|
if (timer !== undefined) {
|
|
73
82
|
clearTimeout(timer);
|
|
@@ -80,7 +89,10 @@ export class CacheManager {
|
|
|
80
89
|
}
|
|
81
90
|
return false;
|
|
82
91
|
}
|
|
83
|
-
|
|
92
|
+
delete(key) {
|
|
93
|
+
return this.Delete(key);
|
|
94
|
+
}
|
|
95
|
+
Clear() {
|
|
84
96
|
for (const timer of this.timers.values()) {
|
|
85
97
|
clearTimeout(timer);
|
|
86
98
|
}
|
|
@@ -88,7 +100,10 @@ export class CacheManager {
|
|
|
88
100
|
this.cache.clear();
|
|
89
101
|
this.memoryUsage = 0;
|
|
90
102
|
}
|
|
91
|
-
|
|
103
|
+
clear() {
|
|
104
|
+
return this.Clear();
|
|
105
|
+
}
|
|
106
|
+
GetStats() {
|
|
92
107
|
return {
|
|
93
108
|
size: this.cache.size,
|
|
94
109
|
memoryUsage: this.memoryUsage,
|
|
@@ -96,20 +111,29 @@ export class CacheManager {
|
|
|
96
111
|
maxMemory: this.options.maxMemory
|
|
97
112
|
};
|
|
98
113
|
}
|
|
99
|
-
|
|
114
|
+
getStats() {
|
|
115
|
+
return this.GetStats();
|
|
116
|
+
}
|
|
117
|
+
Cleanup() {
|
|
100
118
|
let removed = 0;
|
|
101
119
|
const now = Date.now();
|
|
102
120
|
for (const [key, entry] of this.cache) {
|
|
103
121
|
if (this.isExpired(entry, now)) {
|
|
104
|
-
this.
|
|
122
|
+
this.Delete(key);
|
|
105
123
|
removed++;
|
|
106
124
|
}
|
|
107
125
|
}
|
|
108
126
|
return removed;
|
|
109
127
|
}
|
|
110
|
-
|
|
128
|
+
cleanup() {
|
|
129
|
+
return this.Cleanup();
|
|
130
|
+
}
|
|
131
|
+
Destroy() {
|
|
111
132
|
this.stopCleanupTimer();
|
|
112
|
-
this.
|
|
133
|
+
this.Clear();
|
|
134
|
+
}
|
|
135
|
+
destroy() {
|
|
136
|
+
return this.Destroy();
|
|
113
137
|
}
|
|
114
138
|
isExpired(entry, now) {
|
|
115
139
|
if (!this.options.defaultTTL)
|
|
@@ -127,7 +151,7 @@ export class CacheManager {
|
|
|
127
151
|
}
|
|
128
152
|
}
|
|
129
153
|
if (lruKey) {
|
|
130
|
-
this.
|
|
154
|
+
this.Delete(lruKey);
|
|
131
155
|
}
|
|
132
156
|
}
|
|
133
157
|
evictByMemory(requiredSize) {
|
|
@@ -138,7 +162,7 @@ export class CacheManager {
|
|
|
138
162
|
if (freedMemory >= requiredSize)
|
|
139
163
|
break;
|
|
140
164
|
freedMemory += entry.size || 0;
|
|
141
|
-
this.
|
|
165
|
+
this.Delete(key);
|
|
142
166
|
}
|
|
143
167
|
}
|
|
144
168
|
estimateSize(value) {
|
|
@@ -159,7 +183,7 @@ export class CacheManager {
|
|
|
159
183
|
}
|
|
160
184
|
startCleanupTimer() {
|
|
161
185
|
this.cleanupTimer = setInterval(() => {
|
|
162
|
-
this.
|
|
186
|
+
this.Cleanup();
|
|
163
187
|
}, this.options.cleanupInterval);
|
|
164
188
|
}
|
|
165
189
|
stopCleanupTimer() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-manager.js","sourceRoot":"","sources":["../../src/utilities/cache-manager.ts"],"names":[],"mappings":"AAsBA,MAAM,OAAO,YAAY;IAOvB,YAAY,UAAwB,EAAE;QAN9B,UAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;QACzC,WAAM,GAAG,IAAI,GAAG,EAAyC,CAAC;QAC1D,gBAAW,GAAG,CAAC,CAAC;QAKtB,IAAI,CAAC,OAAO,GAAG;YACb,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,IAAI;YAChC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI;YAChD,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI;YAC/C,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,EAAE,GAAG,IAAI;SACtD,CAAC;QAEF,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAKD,GAAG,CAAC,GAAW,EAAE,KAAQ,EAAE,GAAY;QACrC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,KAAK,GAAkB;YAC3B,KAAK;YACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,IAAI;SACL,CAAC;QAGF,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,CAAC;QAGD,IAAI,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACrD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QAGD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,WAAW,IAAI,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC;QACzC,CAAC;QAID,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,YAAY,CAAC,QAAQ,CAAC,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3B,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC;QAGzB,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;YAC/C,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC,EAAE,OAAO,CAAC,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAKD,GAAG,CAAC,GAAW;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAG7B,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjB,OAAO,SAAS,CAAC;QACnB,CAAC;QAGD,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC,KAAK,CAAC;IACrB,CAAC;IAKD,GAAG,CAAC,GAAW;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QAEzB,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAKD,MAAM,CAAC,GAAW;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;YACpC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAKD,KAAK;QACH,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC;IACvB,CAAC;IAKD,QAAQ;QAMN,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YACrB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;YAC7B,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS;SAClC,CAAC;IACJ,CAAC;IAKD,OAAO;QACL,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;gBAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjB,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAKD,OAAO;QACL,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAKO,SAAS,CAAC,KAAoB,EAAE,GAAY;QAClD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QAC3C,MAAM,WAAW,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QACtC,OAAO,WAAW,GAAG,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;IACjE,CAAC;IAKO,QAAQ;QACd,IAAI,MAA0B,CAAC;QAC/B,IAAI,OAAO,GAAG,QAAQ,CAAC;QAEvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACtC,IAAI,KAAK,CAAC,SAAS,GAAG,OAAO,EAAE,CAAC;gBAC9B,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC;gBAC1B,MAAM,GAAG,GAAG,CAAC;YACf,CAAC;QACH,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAKO,aAAa,CAAC,YAAoB;QACxC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;aAC7C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAEnD,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;YACnC,IAAI,WAAW,IAAI,YAAY;gBAAE,MAAM;YACvC,WAAW,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAKO,YAAY,CAAC,KAAQ;QAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAC1B,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAEvD,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YAC1C,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAKO,iBAAiB;QACvB,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,GAAG,EAAE;YACnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACnC,CAAC;IAKO,gBAAgB;QACtB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACjC,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;QAChC,CAAC;IACH,CAAC;CACF","sourcesContent":["/**\n * @fileoverview Cache management with TTL and size limits\n * @module @memberjunction/react-runtime/utilities\n */\n\nexport interface CacheEntry<T> {\n value: T;\n timestamp: number;\n size?: number;\n}\n\nexport interface CacheOptions {\n maxSize?: number; // Maximum number of entries\n maxMemory?: number; // Maximum memory in bytes (estimated)\n defaultTTL?: number; // Default TTL in milliseconds\n cleanupInterval?: number; // Cleanup interval in milliseconds\n}\n\n/**\n * Cache manager with TTL and size limits.\n * Provides automatic cleanup and memory management.\n */\nexport class CacheManager<T = unknown> {\n private cache = new Map<string, CacheEntry<T>>();\n private timers = new Map<string, ReturnType<typeof setTimeout>>();\n private memoryUsage = 0;\n private cleanupTimer?: ReturnType<typeof setInterval>;\n private readonly options: Required<CacheOptions>;\n\n constructor(options: CacheOptions = {}) {\n this.options = {\n maxSize: options.maxSize || 1000,\n maxMemory: options.maxMemory || 50 * 1024 * 1024, // 50MB default\n defaultTTL: options.defaultTTL || 5 * 60 * 1000, // 5 minutes default\n cleanupInterval: options.cleanupInterval || 60 * 1000 // 1 minute default\n };\n\n if (this.options.cleanupInterval > 0) {\n this.startCleanupTimer();\n }\n }\n\n /**\n * Set a value in the cache\n */\n set(key: string, value: T, ttl?: number): void {\n const size = this.estimateSize(value);\n const entry: CacheEntry<T> = {\n value,\n timestamp: Date.now(),\n size\n };\n\n // Check if we need to evict entries\n if (this.cache.size >= this.options.maxSize) {\n this.evictLRU();\n }\n\n // Check memory usage\n if (this.memoryUsage + size > this.options.maxMemory) {\n this.evictByMemory(size);\n }\n\n // Remove old entry if exists\n const oldEntry = this.cache.get(key);\n if (oldEntry) {\n this.memoryUsage -= oldEntry.size || 0;\n }\n\n // Cancel any existing TTL timer for this key so overwriting an entry doesn't\n // leave a dangling timer that deletes the new value when it fires.\n const oldTimer = this.timers.get(key);\n if (oldTimer !== undefined) {\n clearTimeout(oldTimer);\n this.timers.delete(key);\n }\n\n this.cache.set(key, entry);\n this.memoryUsage += size;\n\n // Schedule removal if TTL is set\n if (ttl || this.options.defaultTTL) {\n const timeout = ttl || this.options.defaultTTL;\n const timerId = setTimeout(() => {\n this.timers.delete(key);\n this.delete(key);\n }, timeout);\n this.timers.set(key, timerId);\n }\n }\n\n /**\n * Get a value from the cache\n */\n get(key: string): T | undefined {\n const entry = this.cache.get(key);\n if (!entry) return undefined;\n\n // Check if expired\n if (this.isExpired(entry)) {\n this.delete(key);\n return undefined;\n }\n\n // Update timestamp for LRU\n entry.timestamp = Date.now();\n return entry.value;\n }\n\n /**\n * Check if a key exists and is not expired\n */\n has(key: string): boolean {\n const entry = this.cache.get(key);\n if (!entry) return false;\n\n if (this.isExpired(entry)) {\n this.delete(key);\n return false;\n }\n\n return true;\n }\n\n /**\n * Delete a key from the cache\n */\n delete(key: string): boolean {\n const timer = this.timers.get(key);\n if (timer !== undefined) {\n clearTimeout(timer);\n this.timers.delete(key);\n }\n const entry = this.cache.get(key);\n if (entry) {\n this.memoryUsage -= entry.size || 0;\n return this.cache.delete(key);\n }\n return false;\n }\n\n /**\n * Clear all entries\n */\n clear(): void {\n for (const timer of this.timers.values()) {\n clearTimeout(timer);\n }\n this.timers.clear();\n this.cache.clear();\n this.memoryUsage = 0;\n }\n\n /**\n * Get cache statistics\n */\n getStats(): {\n size: number;\n memoryUsage: number;\n maxSize: number;\n maxMemory: number;\n } {\n return {\n size: this.cache.size,\n memoryUsage: this.memoryUsage,\n maxSize: this.options.maxSize,\n maxMemory: this.options.maxMemory\n };\n }\n\n /**\n * Manually trigger cleanup\n */\n cleanup(): number {\n let removed = 0;\n const now = Date.now();\n\n for (const [key, entry] of this.cache) {\n if (this.isExpired(entry, now)) {\n this.delete(key);\n removed++;\n }\n }\n\n return removed;\n }\n\n /**\n * Destroy the cache, cancel all entry timers, and stop the cleanup timer.\n */\n destroy(): void {\n this.stopCleanupTimer();\n this.clear();\n }\n\n /**\n * Check if an entry is expired\n */\n private isExpired(entry: CacheEntry<T>, now?: number): boolean {\n if (!this.options.defaultTTL) return false;\n const currentTime = now || Date.now();\n return currentTime - entry.timestamp > this.options.defaultTTL;\n }\n\n /**\n * Evict least recently used entry\n */\n private evictLRU(): void {\n let lruKey: string | undefined;\n let lruTime = Infinity;\n\n for (const [key, entry] of this.cache) {\n if (entry.timestamp < lruTime) {\n lruTime = entry.timestamp;\n lruKey = key;\n }\n }\n\n if (lruKey) {\n this.delete(lruKey);\n }\n }\n\n /**\n * Evict entries to make room for new memory\n */\n private evictByMemory(requiredSize: number): void {\n const entries = Array.from(this.cache.entries())\n .sort((a, b) => a[1].timestamp - b[1].timestamp);\n\n let freedMemory = 0;\n for (const [key, entry] of entries) {\n if (freedMemory >= requiredSize) break;\n freedMemory += entry.size || 0;\n this.delete(key);\n }\n }\n\n /**\n * Estimate size of a value\n */\n private estimateSize(value: T): number {\n if (typeof value === 'string') {\n return value.length * 2; // 2 bytes per character\n } else if (typeof value === 'object' && value !== null) {\n // Rough estimation for objects\n try {\n return JSON.stringify(value).length * 2;\n } catch {\n return 1024; // Default 1KB for objects that can't be stringified\n }\n } else {\n return 8; // Default for primitives\n }\n }\n\n /**\n * Start the cleanup timer\n */\n private startCleanupTimer(): void {\n this.cleanupTimer = setInterval(() => {\n this.cleanup();\n }, this.options.cleanupInterval);\n }\n\n /**\n * Stop the cleanup timer\n */\n private stopCleanupTimer(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = undefined;\n }\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"cache-manager.js","sourceRoot":"","sources":["../../src/utilities/cache-manager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Cache management with TTL and size limits\n * @module @memberjunction/react-runtime/utilities\n */\n\nexport interface CacheEntry<T> {\n value: T;\n timestamp: number;\n size?: number;\n}\n\nexport interface CacheOptions {\n maxSize?: number; // Maximum number of entries\n maxMemory?: number; // Maximum memory in bytes (estimated)\n defaultTTL?: number; // Default TTL in milliseconds\n cleanupInterval?: number; // Cleanup interval in milliseconds\n}\n\n/**\n * Cache manager with TTL and size limits.\n * Provides automatic cleanup and memory management.\n */\nexport class CacheManager<T = unknown> {\n private cache = new Map<string, CacheEntry<T>>();\n private timers = new Map<string, ReturnType<typeof setTimeout>>();\n private memoryUsage = 0;\n private cleanupTimer?: ReturnType<typeof setInterval>;\n private readonly options: Required<CacheOptions>;\n\n constructor(options: CacheOptions = {}) {\n this.options = {\n maxSize: options.maxSize || 1000,\n maxMemory: options.maxMemory || 50 * 1024 * 1024, // 50MB default\n defaultTTL: options.defaultTTL || 5 * 60 * 1000, // 5 minutes default\n cleanupInterval: options.cleanupInterval || 60 * 1000 // 1 minute default\n };\n\n if (this.options.cleanupInterval > 0) {\n this.startCleanupTimer();\n }\n }\n\n /**\n * Set a value in the cache\n */\n Set(key: string, value: T, ttl?: number): void {\n const size = this.estimateSize(value);\n const entry: CacheEntry<T> = {\n value,\n timestamp: Date.now(),\n size\n };\n\n // Check if we need to evict entries\n if (this.cache.size >= this.options.maxSize) {\n this.evictLRU();\n }\n\n // Check memory usage\n if (this.memoryUsage + size > this.options.maxMemory) {\n this.evictByMemory(size);\n }\n\n // Remove old entry if exists\n const oldEntry = this.cache.get(key);\n if (oldEntry) {\n this.memoryUsage -= oldEntry.size || 0;\n }\n\n // Cancel any existing TTL timer for this key so overwriting an entry doesn't\n // leave a dangling timer that deletes the new value when it fires.\n const oldTimer = this.timers.get(key);\n if (oldTimer !== undefined) {\n clearTimeout(oldTimer);\n this.timers.delete(key);\n }\n\n this.cache.set(key, entry);\n this.memoryUsage += size;\n\n // Schedule removal if TTL is set\n if (ttl || this.options.defaultTTL) {\n const timeout = ttl || this.options.defaultTTL;\n const timerId = setTimeout(() => {\n this.timers.delete(key);\n this.Delete(key);\n }, timeout);\n this.timers.set(key, timerId);\n }\n }\n\n /** @deprecated Use {@link Set}. */\n set(key: string, value: T, ttl?: number): void {\n return this.Set(key, value, ttl);\n }\n\n /**\n * Get a value from the cache\n */\n Get(key: string): T | undefined {\n const entry = this.cache.get(key);\n if (!entry) return undefined;\n\n // Check if expired\n if (this.isExpired(entry)) {\n this.Delete(key);\n return undefined;\n }\n\n // Update timestamp for LRU\n entry.timestamp = Date.now();\n return entry.value;\n }\n\n /** @deprecated Use {@link Get}. */\n get(key: string): T | undefined {\n return this.Get(key);\n }\n\n /**\n * Check if a key exists and is not expired\n */\n Has(key: string): boolean {\n const entry = this.cache.get(key);\n if (!entry) return false;\n\n if (this.isExpired(entry)) {\n this.Delete(key);\n return false;\n }\n\n return true;\n }\n\n /** @deprecated Use {@link Has}. */\n has(key: string): boolean {\n return this.Has(key);\n }\n\n /**\n * Delete a key from the cache\n */\n Delete(key: string): boolean {\n const timer = this.timers.get(key);\n if (timer !== undefined) {\n clearTimeout(timer);\n this.timers.delete(key);\n }\n const entry = this.cache.get(key);\n if (entry) {\n this.memoryUsage -= entry.size || 0;\n return this.cache.delete(key);\n }\n return false;\n }\n\n /** @deprecated Use {@link Delete}. */\n delete(key: string): boolean {\n return this.Delete(key);\n }\n\n /**\n * Clear all entries\n */\n Clear(): void {\n for (const timer of this.timers.values()) {\n clearTimeout(timer);\n }\n this.timers.clear();\n this.cache.clear();\n this.memoryUsage = 0;\n }\n\n /** @deprecated Use {@link Clear}. */\n clear(): void {\n return this.Clear();\n }\n\n /**\n * Get cache statistics\n */\n GetStats(): {\n size: number;\n memoryUsage: number;\n maxSize: number;\n maxMemory: number;\n } {\n return {\n size: this.cache.size,\n memoryUsage: this.memoryUsage,\n maxSize: this.options.maxSize,\n maxMemory: this.options.maxMemory\n };\n }\n\n /** @deprecated Use {@link GetStats}. */\n getStats(): {\n size: number;\n memoryUsage: number;\n maxSize: number;\n maxMemory: number;\n } {\n return this.GetStats();\n }\n\n /**\n * Manually trigger cleanup\n */\n Cleanup(): number {\n let removed = 0;\n const now = Date.now();\n\n for (const [key, entry] of this.cache) {\n if (this.isExpired(entry, now)) {\n this.Delete(key);\n removed++;\n }\n }\n\n return removed;\n }\n\n /** @deprecated Use {@link Cleanup}. */\n cleanup(): number {\n return this.Cleanup();\n }\n\n /**\n * Destroy the cache, cancel all entry timers, and stop the cleanup timer.\n */\n Destroy(): void {\n this.stopCleanupTimer();\n this.Clear();\n }\n\n /** @deprecated Use {@link Destroy}. */\n destroy(): void {\n return this.Destroy();\n }\n\n /**\n * Check if an entry is expired\n */\n private isExpired(entry: CacheEntry<T>, now?: number): boolean {\n if (!this.options.defaultTTL) return false;\n const currentTime = now || Date.now();\n return currentTime - entry.timestamp > this.options.defaultTTL;\n }\n\n /**\n * Evict least recently used entry\n */\n private evictLRU(): void {\n let lruKey: string | undefined;\n let lruTime = Infinity;\n\n for (const [key, entry] of this.cache) {\n if (entry.timestamp < lruTime) {\n lruTime = entry.timestamp;\n lruKey = key;\n }\n }\n\n if (lruKey) {\n this.Delete(lruKey);\n }\n }\n\n /**\n * Evict entries to make room for new memory\n */\n private evictByMemory(requiredSize: number): void {\n const entries = Array.from(this.cache.entries())\n .sort((a, b) => a[1].timestamp - b[1].timestamp);\n\n let freedMemory = 0;\n for (const [key, entry] of entries) {\n if (freedMemory >= requiredSize) break;\n freedMemory += entry.size || 0;\n this.Delete(key);\n }\n }\n\n /**\n * Estimate size of a value\n */\n private estimateSize(value: T): number {\n if (typeof value === 'string') {\n return value.length * 2; // 2 bytes per character\n } else if (typeof value === 'object' && value !== null) {\n // Rough estimation for objects\n try {\n return JSON.stringify(value).length * 2;\n } catch {\n return 1024; // Default 1KB for objects that can't be stringified\n }\n } else {\n return 8; // Default for primitives\n }\n }\n\n /**\n * Start the cleanup timer\n */\n private startCleanupTimer(): void {\n this.cleanupTimer = setInterval(() => {\n this.Cleanup();\n }, this.options.cleanupInterval);\n }\n\n /**\n * Stop the cleanup timer\n */\n private stopCleanupTimer(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = undefined;\n }\n }\n}"]}
|
|
@@ -7,7 +7,9 @@ export interface FailedComponentInfo {
|
|
|
7
7
|
}
|
|
8
8
|
export declare class ComponentErrorAnalyzer {
|
|
9
9
|
private static readonly ERROR_PATTERNS;
|
|
10
|
+
static IdentifyFailedComponents(errors: string[]): string[];
|
|
10
11
|
static identifyFailedComponents(errors: string[]): string[];
|
|
12
|
+
static AnalyzeComponentErrors(errors: string[]): FailedComponentInfo[];
|
|
11
13
|
static analyzeComponentErrors(errors: string[]): FailedComponentInfo[];
|
|
12
14
|
private static extractComponentsFromError;
|
|
13
15
|
private static analyzeError;
|
|
@@ -15,6 +17,7 @@ export declare class ComponentErrorAnalyzer {
|
|
|
15
17
|
private static isLikelyComponentName;
|
|
16
18
|
private static extractLineNumber;
|
|
17
19
|
private static extractContext;
|
|
20
|
+
static FormatAnalysisResults(failures: FailedComponentInfo[]): string;
|
|
18
21
|
static formatAnalysisResults(failures: FailedComponentInfo[]): string;
|
|
19
22
|
}
|
|
20
23
|
//# sourceMappingURL=component-error-analyzer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-error-analyzer.d.ts","sourceRoot":"","sources":["../../src/utilities/component-error-analyzer.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,mBAAmB;IAElC,aAAa,EAAE,MAAM,CAAC;IAEtB,SAAS,EAAE,MAAM,CAAC;IAElB,YAAY,EAAE,MAAM,CAAC;IAErB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAKD,qBAAa,sBAAsB;IAIjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CA6DpC;IAOF,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"component-error-analyzer.d.ts","sourceRoot":"","sources":["../../src/utilities/component-error-analyzer.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,mBAAmB;IAElC,aAAa,EAAE,MAAM,CAAC;IAEtB,SAAS,EAAE,MAAM,CAAC;IAElB,YAAY,EAAE,MAAM,CAAC;IAErB,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAKD,qBAAa,sBAAsB;IAIjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CA6DpC;IAOF,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAY3D,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE;IAS3D,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,mBAAmB,EAAE;IAqBtE,MAAM,CAAC,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,mBAAmB,EAAE;IAOtE,OAAO,CAAC,MAAM,CAAC,0BAA0B;IAuBzC,OAAO,CAAC,MAAM,CAAC,YAAY;IAsC3B,OAAO,CAAC,MAAM,CAAC,+BAA+B;IA2B9C,OAAO,CAAC,MAAM,CAAC,qBAAqB;IA6BpC,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAqBhC,OAAO,CAAC,MAAM,CAAC,cAAc;IAmB7B,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,mBAAmB,EAAE,GAAG,MAAM;IAuBrE,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,mBAAmB,EAAE,GAAG,MAAM;CAGtE"}
|
|
@@ -51,7 +51,7 @@ export class ComponentErrorAnalyzer {
|
|
|
51
51
|
extractComponent: (match) => match[1]
|
|
52
52
|
}
|
|
53
53
|
]; }
|
|
54
|
-
static
|
|
54
|
+
static IdentifyFailedComponents(errors) {
|
|
55
55
|
const failedComponents = new Set();
|
|
56
56
|
for (const error of errors) {
|
|
57
57
|
const components = this.extractComponentsFromError(error);
|
|
@@ -59,7 +59,10 @@ export class ComponentErrorAnalyzer {
|
|
|
59
59
|
}
|
|
60
60
|
return Array.from(failedComponents);
|
|
61
61
|
}
|
|
62
|
-
static
|
|
62
|
+
static identifyFailedComponents(errors) {
|
|
63
|
+
return this.IdentifyFailedComponents(errors);
|
|
64
|
+
}
|
|
65
|
+
static AnalyzeComponentErrors(errors) {
|
|
63
66
|
const failures = [];
|
|
64
67
|
for (const error of errors) {
|
|
65
68
|
const failureInfo = this.analyzeError(error);
|
|
@@ -74,6 +77,9 @@ export class ComponentErrorAnalyzer {
|
|
|
74
77
|
});
|
|
75
78
|
return Array.from(uniqueFailures.values());
|
|
76
79
|
}
|
|
80
|
+
static analyzeComponentErrors(errors) {
|
|
81
|
+
return this.AnalyzeComponentErrors(errors);
|
|
82
|
+
}
|
|
77
83
|
static extractComponentsFromError(error) {
|
|
78
84
|
const components = [];
|
|
79
85
|
for (const errorPattern of this.ERROR_PATTERNS) {
|
|
@@ -179,7 +185,7 @@ export class ComponentErrorAnalyzer {
|
|
|
179
185
|
}
|
|
180
186
|
return undefined;
|
|
181
187
|
}
|
|
182
|
-
static
|
|
188
|
+
static FormatAnalysisResults(failures) {
|
|
183
189
|
if (failures.length === 0) {
|
|
184
190
|
return 'No component failures detected';
|
|
185
191
|
}
|
|
@@ -197,5 +203,8 @@ export class ComponentErrorAnalyzer {
|
|
|
197
203
|
});
|
|
198
204
|
return result;
|
|
199
205
|
}
|
|
206
|
+
static formatAnalysisResults(failures) {
|
|
207
|
+
return this.FormatAnalysisResults(failures);
|
|
208
|
+
}
|
|
200
209
|
}
|
|
201
210
|
//# sourceMappingURL=component-error-analyzer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-error-analyzer.js","sourceRoot":"","sources":["../../src/utilities/component-error-analyzer.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Component error analysis utilities\n * Provides methods to analyze component errors and identify failed components\n * @module @memberjunction/react-runtime/utilities\n */\n\n/**\n * Information about a failed component\n */\nexport interface FailedComponentInfo {\n /** Component name that failed */\n componentName: string;\n /** Error type (e.g., 'not_defined', 'render_error', 'property_error') */\n errorType: string;\n /** Original error message */\n errorMessage: string;\n /** Line number if available */\n lineNumber?: number;\n /** Additional context */\n context?: string;\n}\n\n/**\n * Analyzes component errors to provide detailed failure information\n */\nexport class ComponentErrorAnalyzer {\n /**\n * Common error patterns for component failures\n */\n private static readonly ERROR_PATTERNS = [\n {\n // Component is not defined\n pattern: /ReferenceError: (\\w+) is not defined/,\n errorType: 'not_defined',\n extractComponent: (match: RegExpMatchArray) => match[1]\n },\n {\n // Cannot read property of undefined (component reference)\n pattern: /Cannot read propert(?:y|ies) '(\\w+)' of undefined/,\n errorType: 'property_error',\n extractComponent: (match: RegExpMatchArray) => match[1]\n },\n {\n // Component render errors\n pattern: /(\\w+)\\(\\.\\.\\.\\): Nothing was returned from render/,\n errorType: 'render_error',\n extractComponent: (match: RegExpMatchArray) => match[1]\n },\n {\n // Component in stack trace\n pattern: /at (\\w+Component\\w*)/,\n errorType: 'stack_trace',\n extractComponent: (match: RegExpMatchArray) => match[1]\n },\n {\n // React component errors\n pattern: /Error: Unable to find node on an unmounted component/,\n errorType: 'unmounted_component',\n extractComponent: () => null // Need to look at stack trace\n },\n {\n // Hook errors\n pattern: /Invalid hook call.*component (\\w+)/,\n errorType: 'invalid_hook',\n extractComponent: (match: RegExpMatchArray) => match[1]\n },\n {\n // Type errors in components\n pattern: /TypeError:.*in (\\w+) \\(at/,\n errorType: 'type_error',\n extractComponent: (match: RegExpMatchArray) => match[1]\n },\n {\n // Missing imports/components\n pattern: /Module not found: Error: Can't resolve '\\.\\/(\\w+)'/,\n errorType: 'missing_import',\n extractComponent: (match: RegExpMatchArray) => match[1]\n },\n {\n // Component is not a function\n pattern: /(\\w+) is not a function/,\n errorType: 'not_a_function',\n extractComponent: (match: RegExpMatchArray) => match[1]\n },\n {\n // Minified React error with component hint\n pattern: /Minified React error.*Visit.*for the full message.*component[: ](\\w+)/s,\n errorType: 'react_error',\n extractComponent: (match: RegExpMatchArray) => match[1]\n }\n ];\n\n /**\n * Analyzes error messages to identify which components failed\n * @param errors Array of error messages\n * @returns Array of failed component names\n */\n static identifyFailedComponents(errors: string[]): string[] {\n const failedComponents = new Set<string>();\n \n for (const error of errors) {\n const components = this.extractComponentsFromError(error);\n components.forEach(comp => failedComponents.add(comp));\n }\n \n return Array.from(failedComponents);\n }\n\n /**\n * Analyzes errors and returns detailed information about failures\n * @param errors Array of error messages\n * @returns Array of detailed failure information\n */\n static analyzeComponentErrors(errors: string[]): FailedComponentInfo[] {\n const failures: FailedComponentInfo[] = [];\n \n for (const error of errors) {\n const failureInfo = this.analyzeError(error);\n failures.push(...failureInfo);\n }\n \n // Remove duplicates based on component name and error type\n const uniqueFailures = new Map<string, FailedComponentInfo>();\n failures.forEach(failure => {\n const key = `${failure.componentName}-${failure.errorType}`;\n if (!uniqueFailures.has(key)) {\n uniqueFailures.set(key, failure);\n }\n });\n \n return Array.from(uniqueFailures.values());\n }\n\n /**\n * Extract component names from a single error message\n */\n private static extractComponentsFromError(error: string): string[] {\n const components: string[] = [];\n \n for (const errorPattern of this.ERROR_PATTERNS) {\n const match = error.match(errorPattern.pattern);\n if (match) {\n const componentName = errorPattern.extractComponent(match);\n if (componentName && this.isLikelyComponentName(componentName)) {\n components.push(componentName);\n }\n }\n }\n \n // Also check for components in stack traces\n const stackComponents = this.extractComponentsFromStackTrace(error);\n components.push(...stackComponents);\n \n return components;\n }\n\n /**\n * Analyze a single error and return detailed information\n */\n private static analyzeError(error: string): FailedComponentInfo[] {\n const failures: FailedComponentInfo[] = [];\n \n for (const errorPattern of this.ERROR_PATTERNS) {\n const match = error.match(errorPattern.pattern);\n if (match) {\n const componentName = errorPattern.extractComponent(match);\n if (componentName && this.isLikelyComponentName(componentName)) {\n failures.push({\n componentName,\n errorType: errorPattern.errorType,\n errorMessage: error,\n lineNumber: this.extractLineNumber(error),\n context: this.extractContext(error)\n });\n }\n }\n }\n \n // If no specific pattern matched, try to extract from stack trace\n if (failures.length === 0) {\n const stackComponents = this.extractComponentsFromStackTrace(error);\n stackComponents.forEach(componentName => {\n failures.push({\n componentName,\n errorType: 'unknown',\n errorMessage: error,\n lineNumber: this.extractLineNumber(error)\n });\n });\n }\n \n return failures;\n }\n\n /**\n * Extract component names from stack trace\n */\n private static extractComponentsFromStackTrace(error: string): string[] {\n const components: string[] = [];\n \n // Look for React component patterns in stack traces\n const stackPatterns = [\n /at (\\w+Component\\w*)/g,\n /at (\\w+)\\s*\\(/g,\n /in (\\w+)\\s*\\(at/g,\n /in (\\w+)\\s*\\(created by/g\n ];\n \n for (const pattern of stackPatterns) {\n let match;\n while ((match = pattern.exec(error)) !== null) {\n const name = match[1];\n if (this.isLikelyComponentName(name)) {\n components.push(name);\n }\n }\n }\n \n return [...new Set(components)]; // Remove duplicates\n }\n\n /**\n * Check if a string is likely to be a React component name\n */\n private static isLikelyComponentName(name: string): boolean {\n // Component names typically:\n // - Start with uppercase letter\n // - Are not JavaScript built-ins\n // - Are not common non-component names\n \n const jsBuiltins = new Set([\n 'Object', 'Array', 'String', 'Number', 'Boolean', 'Function',\n 'Promise', 'Error', 'TypeError', 'ReferenceError', 'SyntaxError',\n 'undefined', 'null', 'console', 'window', 'document'\n ]);\n \n const nonComponents = new Set([\n 'render', 'setState', 'forceUpdate', 'props', 'state', 'context',\n 'componentDidMount', 'componentWillUnmount', 'useEffect', 'useState'\n ]);\n \n return (\n name.length > 0 &&\n /^[A-Z]/.test(name) && // Starts with uppercase\n !jsBuiltins.has(name) &&\n !nonComponents.has(name) &&\n !/^use[A-Z]/.test(name) // Not a hook\n );\n }\n\n /**\n * Extract line number from error message\n */\n private static extractLineNumber(error: string): number | undefined {\n // Look for patterns like \":12:34\" or \"line 12\"\n const patterns = [\n /:(\\d+):\\d+/,\n /line (\\d+)/i,\n /Line (\\d+)/\n ];\n \n for (const pattern of patterns) {\n const match = error.match(pattern);\n if (match) {\n return parseInt(match[1], 10);\n }\n }\n \n return undefined;\n }\n\n /**\n * Extract additional context from error\n */\n private static extractContext(error: string): string | undefined {\n // Extract file names or additional context\n const fileMatch = error.match(/\\(at ([^)]+)\\)/);\n if (fileMatch) {\n return fileMatch[1];\n }\n \n // Extract \"created by\" information\n const createdByMatch = error.match(/created by (\\w+)/);\n if (createdByMatch) {\n return `Created by ${createdByMatch[1]}`;\n }\n \n return undefined;\n }\n\n /**\n * Format error analysis results for logging\n */\n static formatAnalysisResults(failures: FailedComponentInfo[]): string {\n if (failures.length === 0) {\n return 'No component failures detected';\n }\n \n let result = `Detected ${failures.length} component failure(s):\\n`;\n \n failures.forEach((failure, index) => {\n result += `\\n${index + 1}. Component: ${failure.componentName}\\n`;\n result += ` Error Type: ${failure.errorType}\\n`;\n if (failure.lineNumber) {\n result += ` Line: ${failure.lineNumber}\\n`;\n }\n if (failure.context) {\n result += ` Context: ${failure.context}\\n`;\n }\n result += ` Message: ${failure.errorMessage.substring(0, 200)}${failure.errorMessage.length > 200 ? '...' : ''}\\n`;\n });\n \n return result;\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"component-error-analyzer.js","sourceRoot":"","sources":["../../src/utilities/component-error-analyzer.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Component error analysis utilities\n * Provides methods to analyze component errors and identify failed components\n * @module @memberjunction/react-runtime/utilities\n */\n\n/**\n * Information about a failed component\n */\nexport interface FailedComponentInfo {\n /** Component name that failed */\n componentName: string;\n /** Error type (e.g., 'not_defined', 'render_error', 'property_error') */\n errorType: string;\n /** Original error message */\n errorMessage: string;\n /** Line number if available */\n lineNumber?: number;\n /** Additional context */\n context?: string;\n}\n\n/**\n * Analyzes component errors to provide detailed failure information\n */\nexport class ComponentErrorAnalyzer {\n /**\n * Common error patterns for component failures\n */\n private static readonly ERROR_PATTERNS = [\n {\n // Component is not defined\n pattern: /ReferenceError: (\\w+) is not defined/,\n errorType: 'not_defined',\n extractComponent: (match: RegExpMatchArray) => match[1]\n },\n {\n // Cannot read property of undefined (component reference)\n pattern: /Cannot read propert(?:y|ies) '(\\w+)' of undefined/,\n errorType: 'property_error',\n extractComponent: (match: RegExpMatchArray) => match[1]\n },\n {\n // Component render errors\n pattern: /(\\w+)\\(\\.\\.\\.\\): Nothing was returned from render/,\n errorType: 'render_error',\n extractComponent: (match: RegExpMatchArray) => match[1]\n },\n {\n // Component in stack trace\n pattern: /at (\\w+Component\\w*)/,\n errorType: 'stack_trace',\n extractComponent: (match: RegExpMatchArray) => match[1]\n },\n {\n // React component errors\n pattern: /Error: Unable to find node on an unmounted component/,\n errorType: 'unmounted_component',\n extractComponent: () => null // Need to look at stack trace\n },\n {\n // Hook errors\n pattern: /Invalid hook call.*component (\\w+)/,\n errorType: 'invalid_hook',\n extractComponent: (match: RegExpMatchArray) => match[1]\n },\n {\n // Type errors in components\n pattern: /TypeError:.*in (\\w+) \\(at/,\n errorType: 'type_error',\n extractComponent: (match: RegExpMatchArray) => match[1]\n },\n {\n // Missing imports/components\n pattern: /Module not found: Error: Can't resolve '\\.\\/(\\w+)'/,\n errorType: 'missing_import',\n extractComponent: (match: RegExpMatchArray) => match[1]\n },\n {\n // Component is not a function\n pattern: /(\\w+) is not a function/,\n errorType: 'not_a_function',\n extractComponent: (match: RegExpMatchArray) => match[1]\n },\n {\n // Minified React error with component hint\n pattern: /Minified React error.*Visit.*for the full message.*component[: ](\\w+)/s,\n errorType: 'react_error',\n extractComponent: (match: RegExpMatchArray) => match[1]\n }\n ];\n\n /**\n * Analyzes error messages to identify which components failed\n * @param errors Array of error messages\n * @returns Array of failed component names\n */\n static IdentifyFailedComponents(errors: string[]): string[] {\n const failedComponents = new Set<string>();\n \n for (const error of errors) {\n const components = this.extractComponentsFromError(error);\n components.forEach(comp => failedComponents.add(comp));\n }\n \n return Array.from(failedComponents);\n }\n\n /** @deprecated Use {@link IdentifyFailedComponents}. */\n static identifyFailedComponents(errors: string[]): string[] {\n return this.IdentifyFailedComponents(errors);\n }\n\n /**\n * Analyzes errors and returns detailed information about failures\n * @param errors Array of error messages\n * @returns Array of detailed failure information\n */\n static AnalyzeComponentErrors(errors: string[]): FailedComponentInfo[] {\n const failures: FailedComponentInfo[] = [];\n \n for (const error of errors) {\n const failureInfo = this.analyzeError(error);\n failures.push(...failureInfo);\n }\n \n // Remove duplicates based on component name and error type\n const uniqueFailures = new Map<string, FailedComponentInfo>();\n failures.forEach(failure => {\n const key = `${failure.componentName}-${failure.errorType}`;\n if (!uniqueFailures.has(key)) {\n uniqueFailures.set(key, failure);\n }\n });\n \n return Array.from(uniqueFailures.values());\n }\n\n /** @deprecated Use {@link AnalyzeComponentErrors}. */\n static analyzeComponentErrors(errors: string[]): FailedComponentInfo[] {\n return this.AnalyzeComponentErrors(errors);\n }\n\n /**\n * Extract component names from a single error message\n */\n private static extractComponentsFromError(error: string): string[] {\n const components: string[] = [];\n \n for (const errorPattern of this.ERROR_PATTERNS) {\n const match = error.match(errorPattern.pattern);\n if (match) {\n const componentName = errorPattern.extractComponent(match);\n if (componentName && this.isLikelyComponentName(componentName)) {\n components.push(componentName);\n }\n }\n }\n \n // Also check for components in stack traces\n const stackComponents = this.extractComponentsFromStackTrace(error);\n components.push(...stackComponents);\n \n return components;\n }\n\n /**\n * Analyze a single error and return detailed information\n */\n private static analyzeError(error: string): FailedComponentInfo[] {\n const failures: FailedComponentInfo[] = [];\n \n for (const errorPattern of this.ERROR_PATTERNS) {\n const match = error.match(errorPattern.pattern);\n if (match) {\n const componentName = errorPattern.extractComponent(match);\n if (componentName && this.isLikelyComponentName(componentName)) {\n failures.push({\n componentName,\n errorType: errorPattern.errorType,\n errorMessage: error,\n lineNumber: this.extractLineNumber(error),\n context: this.extractContext(error)\n });\n }\n }\n }\n \n // If no specific pattern matched, try to extract from stack trace\n if (failures.length === 0) {\n const stackComponents = this.extractComponentsFromStackTrace(error);\n stackComponents.forEach(componentName => {\n failures.push({\n componentName,\n errorType: 'unknown',\n errorMessage: error,\n lineNumber: this.extractLineNumber(error)\n });\n });\n }\n \n return failures;\n }\n\n /**\n * Extract component names from stack trace\n */\n private static extractComponentsFromStackTrace(error: string): string[] {\n const components: string[] = [];\n \n // Look for React component patterns in stack traces\n const stackPatterns = [\n /at (\\w+Component\\w*)/g,\n /at (\\w+)\\s*\\(/g,\n /in (\\w+)\\s*\\(at/g,\n /in (\\w+)\\s*\\(created by/g\n ];\n \n for (const pattern of stackPatterns) {\n let match;\n while ((match = pattern.exec(error)) !== null) {\n const name = match[1];\n if (this.isLikelyComponentName(name)) {\n components.push(name);\n }\n }\n }\n \n return [...new Set(components)]; // Remove duplicates\n }\n\n /**\n * Check if a string is likely to be a React component name\n */\n private static isLikelyComponentName(name: string): boolean {\n // Component names typically:\n // - Start with uppercase letter\n // - Are not JavaScript built-ins\n // - Are not common non-component names\n \n const jsBuiltins = new Set([\n 'Object', 'Array', 'String', 'Number', 'Boolean', 'Function',\n 'Promise', 'Error', 'TypeError', 'ReferenceError', 'SyntaxError',\n 'undefined', 'null', 'console', 'window', 'document'\n ]);\n \n const nonComponents = new Set([\n 'render', 'setState', 'forceUpdate', 'props', 'state', 'context',\n 'componentDidMount', 'componentWillUnmount', 'useEffect', 'useState'\n ]);\n \n return (\n name.length > 0 &&\n /^[A-Z]/.test(name) && // Starts with uppercase\n !jsBuiltins.has(name) &&\n !nonComponents.has(name) &&\n !/^use[A-Z]/.test(name) // Not a hook\n );\n }\n\n /**\n * Extract line number from error message\n */\n private static extractLineNumber(error: string): number | undefined {\n // Look for patterns like \":12:34\" or \"line 12\"\n const patterns = [\n /:(\\d+):\\d+/,\n /line (\\d+)/i,\n /Line (\\d+)/\n ];\n \n for (const pattern of patterns) {\n const match = error.match(pattern);\n if (match) {\n return parseInt(match[1], 10);\n }\n }\n \n return undefined;\n }\n\n /**\n * Extract additional context from error\n */\n private static extractContext(error: string): string | undefined {\n // Extract file names or additional context\n const fileMatch = error.match(/\\(at ([^)]+)\\)/);\n if (fileMatch) {\n return fileMatch[1];\n }\n \n // Extract \"created by\" information\n const createdByMatch = error.match(/created by (\\w+)/);\n if (createdByMatch) {\n return `Created by ${createdByMatch[1]}`;\n }\n \n return undefined;\n }\n\n /**\n * Format error analysis results for logging\n */\n static FormatAnalysisResults(failures: FailedComponentInfo[]): string {\n if (failures.length === 0) {\n return 'No component failures detected';\n }\n \n let result = `Detected ${failures.length} component failure(s):\\n`;\n \n failures.forEach((failure, index) => {\n result += `\\n${index + 1}. Component: ${failure.componentName}\\n`;\n result += ` Error Type: ${failure.errorType}\\n`;\n if (failure.lineNumber) {\n result += ` Line: ${failure.lineNumber}\\n`;\n }\n if (failure.context) {\n result += ` Context: ${failure.context}\\n`;\n }\n result += ` Message: ${failure.errorMessage.substring(0, 200)}${failure.errorMessage.length > 200 ? '...' : ''}\\n`;\n });\n \n return result;\n }\n\n /** @deprecated Use {@link FormatAnalysisResults}. */\n static formatAnalysisResults(failures: FailedComponentInfo[]): string {\n return this.FormatAnalysisResults(failures);\n }\n}"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import { ComponentSpec } from '@memberjunction/interactive-component-types';
|
|
2
|
+
export declare function GenerateComponentHierarchyHash(spec: ComponentSpec): string;
|
|
2
3
|
export declare function generateComponentHierarchyHash(spec: ComponentSpec): string;
|
|
3
4
|
//# sourceMappingURL=component-hash.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-hash.d.ts","sourceRoot":"","sources":["../../src/utilities/component-hash.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAqB5E,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CA2B1E"}
|
|
1
|
+
{"version":3,"file":"component-hash.d.ts","sourceRoot":"","sources":["../../src/utilities/component-hash.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,6CAA6C,CAAC;AAqB5E,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CA2B1E;AAGD,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAE1E"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export function
|
|
1
|
+
export function GenerateComponentHierarchyHash(spec) {
|
|
2
2
|
const codeStrings = [];
|
|
3
3
|
const collectCode = (s) => {
|
|
4
4
|
if (s.code) {
|
|
@@ -21,4 +21,7 @@ export function generateComponentHierarchyHash(spec) {
|
|
|
21
21
|
const hexHash = Math.abs(hash).toString(16).padStart(8, '0').substring(0, 8);
|
|
22
22
|
return `v${hexHash}`;
|
|
23
23
|
}
|
|
24
|
+
export function generateComponentHierarchyHash(spec) {
|
|
25
|
+
return GenerateComponentHierarchyHash(spec);
|
|
26
|
+
}
|
|
24
27
|
//# sourceMappingURL=component-hash.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-hash.js","sourceRoot":"","sources":["../../src/utilities/component-hash.ts"],"names":[],"mappings":"AA0BA,MAAM,UAAU,8BAA8B,CAAC,IAAmB;IAChE,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,MAAM,WAAW,GAAG,CAAC,CAAgB,EAAQ,EAAE;QAC7C,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YACX,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;YACnB,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;gBACjC,WAAW,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,WAAW,CAAC,IAAI,CAAC,CAAC;IAGlB,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;QACnC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7E,OAAO,IAAI,OAAO,EAAE,CAAC;AACvB,CAAC","sourcesContent":["/**\n * @fileoverview Content hash for a component hierarchy, used as its registry version.\n * @module @memberjunction/react-runtime/utilities\n */\n\nimport { ComponentSpec } from '@memberjunction/interactive-component-types';\n\n/**\n * Computes a stable version key from every piece of code in a component hierarchy.\n *\n * `ComponentManager` keys its registry on `name + namespace + version + contentHash`. A spec that\n * carries no explicit `version` therefore needs one derived from its content, or two different\n * revisions of the same component name collide in the registry and the first one compiled wins\n * forever.\n *\n * The walk covers the root and every descendant, because a change confined to a child still\n * changes what the root renders.\n *\n * This lives in the runtime rather than in a host because the value must be identical across\n * hosts: an Angular surface and a React Native surface loading the same spec have to agree on its\n * version, or the same component is registered twice under two keys and each host silently gets a\n * different compiled instance.\n *\n * @param spec The root component spec.\n * @returns A short version string of the form `v1a2b3c4d`.\n */\nexport function
|
|
1
|
+
{"version":3,"file":"component-hash.js","sourceRoot":"","sources":["../../src/utilities/component-hash.ts"],"names":[],"mappings":"AA0BA,MAAM,UAAU,8BAA8B,CAAC,IAAmB;IAChE,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,MAAM,WAAW,GAAG,CAAC,CAAgB,EAAQ,EAAE;QAC7C,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YACX,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;YACnB,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;gBACjC,WAAW,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,WAAW,CAAC,IAAI,CAAC,CAAC;IAGlB,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;QACnC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7E,OAAO,IAAI,OAAO,EAAE,CAAC;AACvB,CAAC;AAGD,MAAM,UAAU,8BAA8B,CAAC,IAAmB;IAChE,OAAO,8BAA8B,CAAC,IAAI,CAAC,CAAC;AAC9C,CAAC","sourcesContent":["/**\n * @fileoverview Content hash for a component hierarchy, used as its registry version.\n * @module @memberjunction/react-runtime/utilities\n */\n\nimport { ComponentSpec } from '@memberjunction/interactive-component-types';\n\n/**\n * Computes a stable version key from every piece of code in a component hierarchy.\n *\n * `ComponentManager` keys its registry on `name + namespace + version + contentHash`. A spec that\n * carries no explicit `version` therefore needs one derived from its content, or two different\n * revisions of the same component name collide in the registry and the first one compiled wins\n * forever.\n *\n * The walk covers the root and every descendant, because a change confined to a child still\n * changes what the root renders.\n *\n * This lives in the runtime rather than in a host because the value must be identical across\n * hosts: an Angular surface and a React Native surface loading the same spec have to agree on its\n * version, or the same component is registered twice under two keys and each host silently gets a\n * different compiled instance.\n *\n * @param spec The root component spec.\n * @returns A short version string of the form `v1a2b3c4d`.\n */\nexport function GenerateComponentHierarchyHash(spec: ComponentSpec): string {\n const codeStrings: string[] = [];\n\n const collectCode = (s: ComponentSpec): void => {\n if (s.code) {\n codeStrings.push(s.code);\n }\n if (s.dependencies) {\n for (const dep of s.dependencies) {\n collectCode(dep);\n }\n }\n };\n\n collectCode(spec);\n\n // djb2-style 32-bit rolling hash. Not cryptographic — it only has to change when the code does.\n const fullCode = codeStrings.join('|');\n let hash = 0;\n for (let i = 0; i < fullCode.length; i++) {\n const char = fullCode.charCodeAt(i);\n hash = ((hash << 5) - hash) + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n\n const hexHash = Math.abs(hash).toString(16).padStart(8, '0').substring(0, 8);\n return `v${hexHash}`;\n}\n\n/** @deprecated Use {@link GenerateComponentHierarchyHash}. */\nexport function generateComponentHierarchyHash(spec: ComponentSpec): string {\n return GenerateComponentHierarchyHash(spec);\n}\n"]}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { ComponentStyles } from '@memberjunction/interactive-component-types';
|
|
2
|
+
export declare function BuildAntdThemeConfig(styles: Partial<ComponentStyles> | undefined, antdLib: unknown): Record<string, unknown>;
|
|
2
3
|
export declare function buildAntdThemeConfig(styles: Partial<ComponentStyles> | undefined, antdLib: unknown): Record<string, unknown>;
|
|
4
|
+
export declare function WrapWithLibraryThemeProviders(React: {
|
|
5
|
+
createElement: (type: unknown, props: unknown, ...children: unknown[]) => unknown;
|
|
6
|
+
}, element: unknown, libraries: Record<string, unknown> | undefined, styles: Partial<ComponentStyles> | undefined): unknown;
|
|
3
7
|
export declare function wrapWithLibraryThemeProviders(React: {
|
|
4
8
|
createElement: (type: unknown, props: unknown, ...children: unknown[]) => unknown;
|
|
5
9
|
}, element: unknown, libraries: Record<string, unknown> | undefined, styles: Partial<ComponentStyles> | undefined): unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-library-theming.d.ts","sourceRoot":"","sources":["../../src/utilities/component-library-theming.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAuC9E,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,EAC5C,OAAO,EAAE,OAAO,GACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAgCzB;AAcD,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE;IAAE,aAAa,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,KAAK,OAAO,CAAA;CAAE,EAC5F,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC9C,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,GAC3C,OAAO,CAaT"}
|
|
1
|
+
{"version":3,"file":"component-library-theming.d.ts","sourceRoot":"","sources":["../../src/utilities/component-library-theming.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAuC9E,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,EAC5C,OAAO,EAAE,OAAO,GACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAgCzB;AAGD,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,EAC5C,OAAO,EAAE,OAAO,GACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzB;AAcD,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE;IAAE,aAAa,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,KAAK,OAAO,CAAA;CAAE,EAC5F,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC9C,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,GAC3C,OAAO,CAaT;AAGD,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE;IAAE,aAAa,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,KAAK,OAAO,CAAA;CAAE,EAC5F,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC9C,MAAM,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,SAAS,GAC3C,OAAO,CAET"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { UnwrapLibraryComponent } from './component-unwrapper.js';
|
|
2
2
|
function colorLuminance(color) {
|
|
3
3
|
if (!color)
|
|
4
4
|
return 1;
|
|
@@ -34,9 +34,9 @@ function radiusToNumber(radius) {
|
|
|
34
34
|
const n = parseInt(String(raw), 10);
|
|
35
35
|
return Number.isNaN(n) ? undefined : n;
|
|
36
36
|
}
|
|
37
|
-
export function
|
|
37
|
+
export function BuildAntdThemeConfig(styles, antdLib) {
|
|
38
38
|
const colors = (styles?.colors || {});
|
|
39
|
-
const themeNS = antdLib ?
|
|
39
|
+
const themeNS = antdLib ? UnwrapLibraryComponent(antdLib, 'theme') : undefined;
|
|
40
40
|
const isDark = colorLuminance(colors['background']) < 0.5;
|
|
41
41
|
const token = {
|
|
42
42
|
colorPrimary: colors['primary'],
|
|
@@ -67,18 +67,24 @@ export function buildAntdThemeConfig(styles, antdLib) {
|
|
|
67
67
|
}
|
|
68
68
|
return config;
|
|
69
69
|
}
|
|
70
|
-
export function
|
|
70
|
+
export function buildAntdThemeConfig(styles, antdLib) {
|
|
71
|
+
return BuildAntdThemeConfig(styles, antdLib);
|
|
72
|
+
}
|
|
73
|
+
export function WrapWithLibraryThemeProviders(React, element, libraries, styles) {
|
|
71
74
|
const antdLib = libraries?.['antd'];
|
|
72
75
|
if (!antdLib)
|
|
73
76
|
return element;
|
|
74
|
-
const ConfigProvider =
|
|
77
|
+
const ConfigProvider = UnwrapLibraryComponent(antdLib, 'ConfigProvider');
|
|
75
78
|
if (!ConfigProvider)
|
|
76
79
|
return element;
|
|
77
80
|
try {
|
|
78
|
-
return React.createElement(ConfigProvider, { theme:
|
|
81
|
+
return React.createElement(ConfigProvider, { theme: BuildAntdThemeConfig(styles, antdLib) }, element);
|
|
79
82
|
}
|
|
80
83
|
catch {
|
|
81
84
|
return element;
|
|
82
85
|
}
|
|
83
86
|
}
|
|
87
|
+
export function wrapWithLibraryThemeProviders(React, element, libraries, styles) {
|
|
88
|
+
return WrapWithLibraryThemeProviders(React, element, libraries, styles);
|
|
89
|
+
}
|
|
84
90
|
//# sourceMappingURL=component-library-theming.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-library-theming.js","sourceRoot":"","sources":["../../src/utilities/component-library-theming.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Auto-themes component libraries (Ant Design) from the MJ theme so\n * their built-in components inherit light/dark just like custom `styles.*` elements\n * do. Library components (antd `Table`, `Input`, `Select`, …) do not read `styles.*`\n * on their own — without their theme provider they render in the library's built-in\n * LIGHT theme even when the host is in dark mode. The host wraps the mounted React\n * tree once, and the provider's context flows to every library component below.\n *\n * TYPE-SAFETY NOTE (`unknown` usage): React and antd reach this module as UMD\n * globals loaded at runtime by the library loader — there are no compile-time\n * types for them in this package, and adding @types deps for runtime-loaded UMD\n * bundles would lie about the actual contract. `unknown` here is the narrow,\n * honest boundary type for those module surfaces (mirroring the existing\n * `unwrapLibraryComponent`); every access is funneled through the unwrapper or\n * an explicit shape check rather than blind property access. Do NOT widen these\n * to `any` — and do not treat this as precedent outside runtime-loaded UMD\n * boundaries (see the no-`any`/`unknown` rule in the root CLAUDE.md).\n * @module @memberjunction/react-runtime/utilities\n */\n\nimport { ComponentStyles } from '@memberjunction/interactive-component-types';\nimport { unwrapLibraryComponent } from './component-unwrapper';\n\n/** Relative luminance (0 = black, 1 = white) of a hex or rgb()/rgba() color; 1 if unparseable. */\nfunction colorLuminance(color: string | undefined): number {\n if (!color) return 1;\n const s = String(color).trim();\n let r: number, g: number, b: number;\n const hex = /^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.exec(s);\n if (hex) {\n let h = hex[1];\n if (h.length === 3) h = h.split('').map((c) => c + c).join('');\n const n = parseInt(h, 16);\n r = (n >> 16) & 255; g = (n >> 8) & 255; b = n & 255;\n } else {\n const m = /rgba?\\(([^)]+)\\)/i.exec(s);\n if (!m) return 1;\n const p = m[1].split(',').map((x) => parseFloat(x));\n r = p[0]; g = p[1]; b = p[2];\n if ([r, g, b].some((v) => Number.isNaN(v))) return 1;\n }\n return (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255;\n}\n\n/** Parse a radius token (e.g. '8px' or a size map) into a number for antd's borderRadius. */\nfunction radiusToNumber(radius: ComponentStyles['borders']['radius'] | undefined): number | undefined {\n const raw = typeof radius === 'string' ? radius : (radius && (radius.md || radius.sm || radius.lg));\n if (!raw) return undefined;\n const n = parseInt(String(raw), 10);\n return Number.isNaN(n) ? undefined : n;\n}\n\n/**\n * Builds an Ant Design v5 `ConfigProvider` `theme` config from ComponentStyles:\n * maps the MJ color/typography tokens onto antd seed/map tokens and selects antd's\n * dark algorithm when the theme's background is dark. `antdLib` is the loaded antd\n * module (used only to read its `theme` algorithm namespace). Unmapped tokens are\n * omitted so antd falls back to its own defaults.\n */\nexport function buildAntdThemeConfig(\n styles: Partial<ComponentStyles> | undefined,\n antdLib: unknown,\n): Record<string, unknown> {\n const colors = (styles?.colors || {}) as Record<string, string | undefined>;\n const themeNS = antdLib ? unwrapLibraryComponent(antdLib, 'theme') : undefined;\n const isDark = colorLuminance(colors['background']) < 0.5;\n\n const token: Record<string, unknown> = {\n colorPrimary: colors['primary'],\n colorInfo: colors['info'] || colors['primary'],\n colorSuccess: colors['success'],\n colorWarning: colors['warning'],\n colorError: colors['error'],\n colorBgContainer: colors['surface'],\n colorBgElevated: colors['surface'],\n colorBgLayout: colors['background'],\n colorText: colors['text'],\n colorTextSecondary: colors['textSecondary'],\n colorBorder: colors['border'],\n colorBorderSecondary: colors['borderLight'] || colors['border'],\n fontFamily: styles?.typography?.fontFamily,\n };\n const radius = radiusToNumber(styles?.borders?.radius);\n if (radius !== undefined) token['borderRadius'] = radius;\n for (const k of Object.keys(token)) {\n if (token[k] == null) delete token[k];\n }\n\n const config: Record<string, unknown> = { token };\n const algorithm = themeNS && (isDark ? themeNS.darkAlgorithm : themeNS.defaultAlgorithm);\n if (algorithm) {\n config['algorithm'] = algorithm;\n }\n return config;\n}\n\n/**\n * Wraps a React element in loaded component libraries' theme providers so their\n * built-in components inherit the MJ theme (including dark mode). Currently themes\n * Ant Design via `ConfigProvider` when the `antd` library is loaded; otherwise\n * returns the element unchanged. Because `ConfigProvider` supplies React context,\n * one wrap at the root themes every antd component in the subtree — including those\n * inside child components. `libraries` is keyed by global-variable name (e.g. `antd`).\n *\n * A generated component that also wraps its own `ConfigProvider` simply nests under\n * this one (antd merges nested configs), so this is safe alongside component-level\n * theming.\n */\nexport function wrapWithLibraryThemeProviders(\n React: { createElement: (type: unknown, props: unknown, ...children: unknown[]) => unknown },\n element: unknown,\n libraries: Record<string, unknown> | undefined,\n styles: Partial<ComponentStyles> | undefined,\n): unknown {\n const antdLib = libraries?.['antd'];\n if (!antdLib) return element;\n\n const ConfigProvider = unwrapLibraryComponent(antdLib, 'ConfigProvider');\n if (!ConfigProvider) return element;\n\n try {\n return React.createElement(ConfigProvider, { theme: buildAntdThemeConfig(styles, antdLib) }, element);\n } catch {\n // Never let theming wrap break rendering — fall back to the unwrapped element.\n return element;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"component-library-theming.js","sourceRoot":"","sources":["../../src/utilities/component-library-theming.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAG/D,SAAS,cAAc,CAAC,KAAyB;IAC/C,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC;IACrB,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAS,EAAE,CAAS,EAAE,CAAS,CAAC;IACpC,MAAM,GAAG,GAAG,qCAAqC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1D,IAAI,GAAG,EAAE,CAAC;QACR,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACf,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/D,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1B,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC;QAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;QAAC,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QACjB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;AACtD,CAAC;AAGD,SAAS,cAAc,CAAC,MAAwD;IAC9E,MAAM,GAAG,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACpG,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACpC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AASD,MAAM,UAAU,oBAAoB,CAClC,MAA4C,EAC5C,OAAgB;IAEhB,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,CAAuC,CAAC;IAC5E,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/E,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,GAAG,CAAC;IAE1D,MAAM,KAAK,GAA4B;QACrC,YAAY,EAAE,MAAM,CAAC,SAAS,CAAC;QAC/B,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC;QAC9C,YAAY,EAAE,MAAM,CAAC,SAAS,CAAC;QAC/B,YAAY,EAAE,MAAM,CAAC,SAAS,CAAC;QAC/B,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC;QAC3B,gBAAgB,EAAE,MAAM,CAAC,SAAS,CAAC;QACnC,eAAe,EAAE,MAAM,CAAC,SAAS,CAAC;QAClC,aAAa,EAAE,MAAM,CAAC,YAAY,CAAC;QACnC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC;QACzB,kBAAkB,EAAE,MAAM,CAAC,eAAe,CAAC;QAC3C,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC;QAC7B,oBAAoB,EAAE,MAAM,CAAC,aAAa,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC;QAC/D,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU;KAC3C,CAAC;IACF,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACvD,IAAI,MAAM,KAAK,SAAS;QAAE,KAAK,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC;IACzD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,MAAM,GAA4B,EAAE,KAAK,EAAE,CAAC;IAClD,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACzF,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,CAAC,WAAW,CAAC,GAAG,SAAS,CAAC;IAClC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAGD,MAAM,UAAU,oBAAoB,CAClC,MAA4C,EAC5C,OAAgB;IAEhB,OAAO,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAcD,MAAM,UAAU,6BAA6B,CAC3C,KAA4F,EAC5F,OAAgB,EAChB,SAA8C,EAC9C,MAA4C;IAE5C,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC;IAE7B,MAAM,cAAc,GAAG,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IACzE,IAAI,CAAC,cAAc;QAAE,OAAO,OAAO,CAAC;IAEpC,IAAI,CAAC;QACH,OAAO,KAAK,CAAC,aAAa,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACxG,CAAC;IAAC,MAAM,CAAC;QAEP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAGD,MAAM,UAAU,6BAA6B,CAC3C,KAA4F,EAC5F,OAAgB,EAChB,SAA8C,EAC9C,MAA4C;IAE5C,OAAO,6BAA6B,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAC1E,CAAC","sourcesContent":["/**\n * @fileoverview Auto-themes component libraries (Ant Design) from the MJ theme so\n * their built-in components inherit light/dark just like custom `styles.*` elements\n * do. Library components (antd `Table`, `Input`, `Select`, …) do not read `styles.*`\n * on their own — without their theme provider they render in the library's built-in\n * LIGHT theme even when the host is in dark mode. The host wraps the mounted React\n * tree once, and the provider's context flows to every library component below.\n *\n * TYPE-SAFETY NOTE (`unknown` usage): React and antd reach this module as UMD\n * globals loaded at runtime by the library loader — there are no compile-time\n * types for them in this package, and adding @types deps for runtime-loaded UMD\n * bundles would lie about the actual contract. `unknown` here is the narrow,\n * honest boundary type for those module surfaces (mirroring the existing\n * `unwrapLibraryComponent`); every access is funneled through the unwrapper or\n * an explicit shape check rather than blind property access. Do NOT widen these\n * to `any` — and do not treat this as precedent outside runtime-loaded UMD\n * boundaries (see the no-`any`/`unknown` rule in the root CLAUDE.md).\n * @module @memberjunction/react-runtime/utilities\n */\n\nimport { ComponentStyles } from '@memberjunction/interactive-component-types';\nimport { UnwrapLibraryComponent } from './component-unwrapper';\n\n/** Relative luminance (0 = black, 1 = white) of a hex or rgb()/rgba() color; 1 if unparseable. */\nfunction colorLuminance(color: string | undefined): number {\n if (!color) return 1;\n const s = String(color).trim();\n let r: number, g: number, b: number;\n const hex = /^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.exec(s);\n if (hex) {\n let h = hex[1];\n if (h.length === 3) h = h.split('').map((c) => c + c).join('');\n const n = parseInt(h, 16);\n r = (n >> 16) & 255; g = (n >> 8) & 255; b = n & 255;\n } else {\n const m = /rgba?\\(([^)]+)\\)/i.exec(s);\n if (!m) return 1;\n const p = m[1].split(',').map((x) => parseFloat(x));\n r = p[0]; g = p[1]; b = p[2];\n if ([r, g, b].some((v) => Number.isNaN(v))) return 1;\n }\n return (0.2126 * r + 0.7152 * g + 0.0722 * b) / 255;\n}\n\n/** Parse a radius token (e.g. '8px' or a size map) into a number for antd's borderRadius. */\nfunction radiusToNumber(radius: ComponentStyles['borders']['radius'] | undefined): number | undefined {\n const raw = typeof radius === 'string' ? radius : (radius && (radius.md || radius.sm || radius.lg));\n if (!raw) return undefined;\n const n = parseInt(String(raw), 10);\n return Number.isNaN(n) ? undefined : n;\n}\n\n/**\n * Builds an Ant Design v5 `ConfigProvider` `theme` config from ComponentStyles:\n * maps the MJ color/typography tokens onto antd seed/map tokens and selects antd's\n * dark algorithm when the theme's background is dark. `antdLib` is the loaded antd\n * module (used only to read its `theme` algorithm namespace). Unmapped tokens are\n * omitted so antd falls back to its own defaults.\n */\nexport function BuildAntdThemeConfig(\n styles: Partial<ComponentStyles> | undefined,\n antdLib: unknown,\n): Record<string, unknown> {\n const colors = (styles?.colors || {}) as Record<string, string | undefined>;\n const themeNS = antdLib ? UnwrapLibraryComponent(antdLib, 'theme') : undefined;\n const isDark = colorLuminance(colors['background']) < 0.5;\n\n const token: Record<string, unknown> = {\n colorPrimary: colors['primary'],\n colorInfo: colors['info'] || colors['primary'],\n colorSuccess: colors['success'],\n colorWarning: colors['warning'],\n colorError: colors['error'],\n colorBgContainer: colors['surface'],\n colorBgElevated: colors['surface'],\n colorBgLayout: colors['background'],\n colorText: colors['text'],\n colorTextSecondary: colors['textSecondary'],\n colorBorder: colors['border'],\n colorBorderSecondary: colors['borderLight'] || colors['border'],\n fontFamily: styles?.typography?.fontFamily,\n };\n const radius = radiusToNumber(styles?.borders?.radius);\n if (radius !== undefined) token['borderRadius'] = radius;\n for (const k of Object.keys(token)) {\n if (token[k] == null) delete token[k];\n }\n\n const config: Record<string, unknown> = { token };\n const algorithm = themeNS && (isDark ? themeNS.darkAlgorithm : themeNS.defaultAlgorithm);\n if (algorithm) {\n config['algorithm'] = algorithm;\n }\n return config;\n}\n\n/** @deprecated Use {@link BuildAntdThemeConfig}. */\nexport function buildAntdThemeConfig(\n styles: Partial<ComponentStyles> | undefined,\n antdLib: unknown,\n): Record<string, unknown> {\n return BuildAntdThemeConfig(styles, antdLib);\n}\n\n/**\n * Wraps a React element in loaded component libraries' theme providers so their\n * built-in components inherit the MJ theme (including dark mode). Currently themes\n * Ant Design via `ConfigProvider` when the `antd` library is loaded; otherwise\n * returns the element unchanged. Because `ConfigProvider` supplies React context,\n * one wrap at the root themes every antd component in the subtree — including those\n * inside child components. `libraries` is keyed by global-variable name (e.g. `antd`).\n *\n * A generated component that also wraps its own `ConfigProvider` simply nests under\n * this one (antd merges nested configs), so this is safe alongside component-level\n * theming.\n */\nexport function WrapWithLibraryThemeProviders(\n React: { createElement: (type: unknown, props: unknown, ...children: unknown[]) => unknown },\n element: unknown,\n libraries: Record<string, unknown> | undefined,\n styles: Partial<ComponentStyles> | undefined,\n): unknown {\n const antdLib = libraries?.['antd'];\n if (!antdLib) return element;\n\n const ConfigProvider = UnwrapLibraryComponent(antdLib, 'ConfigProvider');\n if (!ConfigProvider) return element;\n\n try {\n return React.createElement(ConfigProvider, { theme: BuildAntdThemeConfig(styles, antdLib) }, element);\n } catch {\n // Never let theming wrap break rendering — fall back to the unwrapped element.\n return element;\n }\n}\n\n/** @deprecated Use {@link WrapWithLibraryThemeProviders}. */\nexport function wrapWithLibraryThemeProviders(\n React: { createElement: (type: unknown, props: unknown, ...children: unknown[]) => unknown },\n element: unknown,\n libraries: Record<string, unknown> | undefined,\n styles: Partial<ComponentStyles> | undefined,\n): unknown {\n return WrapWithLibraryThemeProviders(React, element, libraries, styles);\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ComponentStyles, StyleOverrides } from '@memberjunction/interactive-component-types';
|
|
2
2
|
export declare function SetupStyles(): ComponentStyles;
|
|
3
|
+
export declare const CreateDefaultComponentStyles: typeof SetupStyles;
|
|
3
4
|
export declare const createDefaultComponentStyles: typeof SetupStyles;
|
|
4
5
|
export type ThemeTokenReader = (token: string) => string | undefined;
|
|
5
6
|
export declare function BuildStylesFromTheme(source?: Element | ThemeTokenReader): ComponentStyles;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"component-styles.d.ts","sourceRoot":"","sources":["../../src/utilities/component-styles.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,6CAA6C,CAAC;AAO9F,wBAAgB,WAAW,IAAI,eAAe,CAyI7C;AAGD,eAAO,MAAM,4BAA4B,oBAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"component-styles.d.ts","sourceRoot":"","sources":["../../src/utilities/component-styles.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,6CAA6C,CAAC;AAO9F,wBAAgB,WAAW,IAAI,eAAe,CAyI7C;AAGD,eAAO,MAAM,4BAA4B,oBAAc,CAAC;AAGxD,eAAO,MAAM,4BAA4B,oBAA+B,CAAC;AAiEzE,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;AA0CrE,wBAAgB,oBAAoB,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,gBAAgB,GAAG,eAAe,CAiDzF;AA4CD,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,OAAO,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,EAAE,cAAc,GAAG,CAAC,CA0B9G"}
|
|
@@ -114,7 +114,8 @@ export function SetupStyles() {
|
|
|
114
114
|
},
|
|
115
115
|
};
|
|
116
116
|
}
|
|
117
|
-
export const
|
|
117
|
+
export const CreateDefaultComponentStyles = SetupStyles;
|
|
118
|
+
export const createDefaultComponentStyles = CreateDefaultComponentStyles;
|
|
118
119
|
const THEME_COLOR_TOKEN_MAP = {
|
|
119
120
|
primary: '--mj-brand-primary',
|
|
120
121
|
primaryHover: '--mj-brand-primary-hover',
|