@blac/core 2.0.0-rc-16 → 2.0.0-rc.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.
Files changed (157) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/Blac.d.ts +246 -0
  3. package/dist/Blac.d.ts.map +1 -0
  4. package/dist/Blac.js +624 -0
  5. package/dist/Blac.js.map +1 -0
  6. package/dist/Bloc.d.ts +41 -0
  7. package/dist/Bloc.d.ts.map +1 -0
  8. package/dist/Bloc.js +140 -0
  9. package/dist/Bloc.js.map +1 -0
  10. package/dist/BlocBase.d.ts +110 -0
  11. package/dist/BlocBase.d.ts.map +1 -0
  12. package/dist/BlocBase.js +287 -0
  13. package/dist/BlocBase.js.map +1 -0
  14. package/dist/Cubit.d.ts +25 -0
  15. package/dist/Cubit.d.ts.map +1 -0
  16. package/dist/Cubit.js +64 -0
  17. package/dist/Cubit.js.map +1 -0
  18. package/dist/adapter/BlacAdapter.d.ts +67 -0
  19. package/dist/adapter/BlacAdapter.d.ts.map +1 -0
  20. package/dist/adapter/BlacAdapter.js +263 -0
  21. package/dist/adapter/BlacAdapter.js.map +1 -0
  22. package/dist/adapter/ProxyFactory.d.ts +50 -0
  23. package/dist/adapter/ProxyFactory.d.ts.map +1 -0
  24. package/dist/adapter/ProxyFactory.js +150 -0
  25. package/dist/adapter/ProxyFactory.js.map +1 -0
  26. package/{src/adapter/index.ts → dist/adapter/index.d.ts} +1 -0
  27. package/dist/adapter/index.d.ts.map +1 -0
  28. package/dist/adapter/index.js +19 -0
  29. package/dist/adapter/index.js.map +1 -0
  30. package/dist/errors/BlacError.d.ts +38 -0
  31. package/dist/errors/BlacError.d.ts.map +1 -0
  32. package/dist/errors/BlacError.js +55 -0
  33. package/dist/errors/BlacError.js.map +1 -0
  34. package/dist/errors/ErrorManager.d.ts +39 -0
  35. package/dist/errors/ErrorManager.d.ts.map +1 -0
  36. package/dist/errors/ErrorManager.js +91 -0
  37. package/dist/errors/ErrorManager.js.map +1 -0
  38. package/dist/errors/handleError.d.ts +24 -0
  39. package/dist/errors/handleError.d.ts.map +1 -0
  40. package/dist/errors/handleError.js +62 -0
  41. package/dist/errors/handleError.js.map +1 -0
  42. package/dist/errors/index.d.ts +5 -0
  43. package/dist/errors/index.d.ts.map +1 -0
  44. package/dist/errors/index.js +13 -0
  45. package/dist/errors/index.js.map +1 -0
  46. package/{src/events.ts → dist/events.d.ts} +4 -2
  47. package/dist/events.d.ts.map +1 -0
  48. package/dist/events.js +17 -0
  49. package/dist/events.js.map +1 -0
  50. package/dist/index.cjs +38 -0
  51. package/{src/index.ts → dist/index.d.ts} +1 -10
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +38 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/lifecycle/BlocLifecycle.d.ts +51 -0
  56. package/dist/lifecycle/BlocLifecycle.d.ts.map +1 -0
  57. package/dist/lifecycle/BlocLifecycle.js +123 -0
  58. package/dist/lifecycle/BlocLifecycle.js.map +1 -0
  59. package/dist/lifecycle/index.d.ts +2 -0
  60. package/dist/lifecycle/index.d.ts.map +1 -0
  61. package/dist/lifecycle/index.js +18 -0
  62. package/dist/lifecycle/index.js.map +1 -0
  63. package/dist/plugins/BlocPluginRegistry.d.ts +58 -0
  64. package/dist/plugins/BlocPluginRegistry.d.ts.map +1 -0
  65. package/dist/plugins/BlocPluginRegistry.js +201 -0
  66. package/dist/plugins/BlocPluginRegistry.js.map +1 -0
  67. package/dist/plugins/SystemPluginRegistry.d.ts +79 -0
  68. package/dist/plugins/SystemPluginRegistry.d.ts.map +1 -0
  69. package/dist/plugins/SystemPluginRegistry.js +184 -0
  70. package/dist/plugins/SystemPluginRegistry.js.map +1 -0
  71. package/{src/plugins/index.ts → dist/plugins/index.d.ts} +1 -5
  72. package/dist/plugins/index.d.ts.map +1 -0
  73. package/dist/plugins/index.js +26 -0
  74. package/dist/plugins/index.js.map +1 -0
  75. package/dist/plugins/types.d.ts +103 -0
  76. package/dist/plugins/types.d.ts.map +1 -0
  77. package/dist/plugins/types.js +3 -0
  78. package/dist/plugins/types.js.map +1 -0
  79. package/dist/subscription/SubscriptionManager.d.ts +67 -0
  80. package/dist/subscription/SubscriptionManager.d.ts.map +1 -0
  81. package/dist/subscription/SubscriptionManager.js +317 -0
  82. package/dist/subscription/SubscriptionManager.js.map +1 -0
  83. package/{src/subscription/index.ts → dist/subscription/index.d.ts} +1 -0
  84. package/dist/subscription/index.d.ts.map +1 -0
  85. package/dist/subscription/index.js +19 -0
  86. package/dist/subscription/index.js.map +1 -0
  87. package/dist/subscription/types.d.ts +65 -0
  88. package/dist/subscription/types.d.ts.map +1 -0
  89. package/dist/subscription/types.js +3 -0
  90. package/dist/subscription/types.js.map +1 -0
  91. package/dist/testing.d.ts +33 -0
  92. package/dist/testing.d.ts.map +1 -0
  93. package/dist/testing.js +68 -0
  94. package/dist/testing.js.map +1 -0
  95. package/{src/types.ts → dist/types.d.ts} +11 -28
  96. package/dist/types.d.ts.map +1 -0
  97. package/dist/types.js +3 -0
  98. package/dist/types.js.map +1 -0
  99. package/dist/utils/BatchingManager.d.ts +28 -0
  100. package/dist/utils/BatchingManager.d.ts.map +1 -0
  101. package/dist/utils/BatchingManager.js +48 -0
  102. package/dist/utils/BatchingManager.js.map +1 -0
  103. package/dist/utils/RerenderLogger.d.ts +60 -0
  104. package/dist/utils/RerenderLogger.d.ts.map +1 -0
  105. package/dist/utils/RerenderLogger.js +205 -0
  106. package/dist/utils/RerenderLogger.js.map +1 -0
  107. package/dist/utils/generateInstanceId.d.ts +11 -0
  108. package/dist/utils/generateInstanceId.d.ts.map +1 -0
  109. package/dist/utils/generateInstanceId.js +50 -0
  110. package/dist/utils/generateInstanceId.js.map +1 -0
  111. package/dist/utils/shallowEqual.d.ts +9 -0
  112. package/dist/utils/shallowEqual.d.ts.map +1 -0
  113. package/dist/utils/shallowEqual.js +35 -0
  114. package/dist/utils/shallowEqual.js.map +1 -0
  115. package/dist/utils/uuid.d.ts +10 -0
  116. package/dist/utils/uuid.d.ts.map +1 -0
  117. package/dist/utils/uuid.js +24 -0
  118. package/dist/utils/uuid.js.map +1 -0
  119. package/package.json +19 -6
  120. package/src/Blac.ts +0 -802
  121. package/src/Bloc.ts +0 -180
  122. package/src/BlocBase.ts +0 -398
  123. package/src/Cubit.ts +0 -68
  124. package/src/__tests__/Blac.config.test.ts +0 -79
  125. package/src/__tests__/Bloc.event.test.ts +0 -394
  126. package/src/__tests__/BlocBase.subscription.test.ts +0 -349
  127. package/src/__tests__/Cubit.test.ts +0 -462
  128. package/src/__tests__/memory-leaks.test.ts +0 -383
  129. package/src/__tests__/plugins.test.ts +0 -464
  130. package/src/adapter/BlacAdapter.ts +0 -467
  131. package/src/adapter/ProxyFactory.ts +0 -249
  132. package/src/adapter/__tests__/BlacAdapter.test.ts +0 -555
  133. package/src/adapter/__tests__/ProxyFactory.test.ts +0 -655
  134. package/src/errors/BlacError.ts +0 -69
  135. package/src/errors/ErrorManager.ts +0 -101
  136. package/src/errors/handleError.ts +0 -114
  137. package/src/errors/index.ts +0 -13
  138. package/src/lifecycle/BlocLifecycle.ts +0 -156
  139. package/src/lifecycle/index.ts +0 -1
  140. package/src/plugins/BlocPluginRegistry.ts +0 -240
  141. package/src/plugins/SystemPluginRegistry.ts +0 -242
  142. package/src/plugins/__tests__/BlocPluginRegistry.test.ts +0 -450
  143. package/src/plugins/__tests__/SystemPluginRegistry.test.ts +0 -404
  144. package/src/plugins/types.ts +0 -129
  145. package/src/subscription/README.md +0 -132
  146. package/src/subscription/SubscriptionManager.ts +0 -395
  147. package/src/subscription/__tests__/SubscriptionManager.test.ts +0 -355
  148. package/src/subscription/types.ts +0 -90
  149. package/src/testing.ts +0 -246
  150. package/src/utils/BatchingManager.ts +0 -59
  151. package/src/utils/RerenderLogger.ts +0 -265
  152. package/src/utils/__tests__/generateInstanceId.test.ts +0 -104
  153. package/src/utils/__tests__/shallowEqual.test.ts +0 -171
  154. package/src/utils/__tests__/uuid.test.ts +0 -144
  155. package/src/utils/generateInstanceId.ts +0 -54
  156. package/src/utils/shallowEqual.ts +0 -40
  157. package/src/utils/uuid.ts +0 -22
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Manages batching of state updates to optimize performance
3
+ */
4
+ export declare class BatchingManager<S> {
5
+ private pendingUpdates;
6
+ private isBatching;
7
+ /**
8
+ * Execute a callback with batched updates
9
+ */
10
+ batchUpdates(callback: () => void, onFlush: (finalUpdate: {
11
+ newState: S;
12
+ oldState: S;
13
+ action?: unknown;
14
+ }) => void): void;
15
+ /**
16
+ * Add an update to the batch
17
+ */
18
+ addUpdate(update: {
19
+ newState: S;
20
+ oldState: S;
21
+ action?: unknown;
22
+ }): void;
23
+ /**
24
+ * Check if currently batching
25
+ */
26
+ get isCurrentlyBatching(): boolean;
27
+ }
28
+ //# sourceMappingURL=BatchingManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BatchingManager.d.ts","sourceRoot":"","sources":["../../src/utils/BatchingManager.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,eAAe,CAAC,CAAC;IAC5B,OAAO,CAAC,cAAc,CAId;IACR,OAAO,CAAC,UAAU,CAAS;IAE3B;;OAEG;IACH,YAAY,CACV,QAAQ,EAAE,MAAM,IAAI,EACpB,OAAO,EAAE,CAAC,WAAW,EAAE;QACrB,QAAQ,EAAE,CAAC,CAAC;QACZ,QAAQ,EAAE,CAAC,CAAC;QACZ,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,KAAK,IAAI,GACT,IAAI;IAsBP;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,CAAC,CAAC;QAAC,QAAQ,EAAE,CAAC,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAMvE;;OAEG;IACH,IAAI,mBAAmB,IAAI,OAAO,CAEjC;CACF"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BatchingManager = void 0;
4
+ /**
5
+ * Manages batching of state updates to optimize performance
6
+ */
7
+ class BatchingManager {
8
+ pendingUpdates = [];
9
+ isBatching = false;
10
+ /**
11
+ * Execute a callback with batched updates
12
+ */
13
+ batchUpdates(callback, onFlush) {
14
+ if (this.isBatching) {
15
+ callback();
16
+ return;
17
+ }
18
+ this.isBatching = true;
19
+ this.pendingUpdates = [];
20
+ try {
21
+ callback();
22
+ if (this.pendingUpdates.length > 0) {
23
+ const finalUpdate = this.pendingUpdates[this.pendingUpdates.length - 1];
24
+ onFlush(finalUpdate);
25
+ }
26
+ }
27
+ finally {
28
+ this.isBatching = false;
29
+ this.pendingUpdates = [];
30
+ }
31
+ }
32
+ /**
33
+ * Add an update to the batch
34
+ */
35
+ addUpdate(update) {
36
+ if (this.isBatching) {
37
+ this.pendingUpdates.push(update);
38
+ }
39
+ }
40
+ /**
41
+ * Check if currently batching
42
+ */
43
+ get isCurrentlyBatching() {
44
+ return this.isBatching;
45
+ }
46
+ }
47
+ exports.BatchingManager = BatchingManager;
48
+ //# sourceMappingURL=BatchingManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BatchingManager.js","sourceRoot":"","sources":["../../src/utils/BatchingManager.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAa,eAAe;IAClB,cAAc,GAIjB,EAAE,CAAC;IACA,UAAU,GAAG,KAAK,CAAC;IAE3B;;OAEG;IACH,YAAY,CACV,QAAoB,EACpB,OAIU;QAEV,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,QAAQ,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QAEzB,IAAI,CAAC;YACH,QAAQ,EAAE,CAAC;YAEX,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnC,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACxE,OAAO,CAAC,WAAW,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,MAAsD;QAC9D,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI,mBAAmB;QACrB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF;AAvDD,0CAuDC"}
@@ -0,0 +1,60 @@
1
+ export interface RerenderInfo {
2
+ componentName: string;
3
+ blocName: string;
4
+ blocId: string;
5
+ renderCount: number;
6
+ reason: RerenderReason;
7
+ timestamp: number;
8
+ duration?: number;
9
+ stackTrace?: string;
10
+ }
11
+ export interface RerenderReason {
12
+ type: 'state-change' | 'dependency-change' | 'mount' | 'props-change' | 'unknown';
13
+ changedPaths?: string[];
14
+ oldValues?: Record<string, any>;
15
+ newValues?: Record<string, any>;
16
+ dependencies?: string[];
17
+ description?: string;
18
+ }
19
+ /**
20
+ * Utility class for logging component rerenders with detailed debugging information
21
+ */
22
+ export declare class RerenderLogger {
23
+ private static componentRenderCounts;
24
+ private static lastRenderTimestamps;
25
+ private static groupedLogs;
26
+ private static groupTimeouts;
27
+ /**
28
+ * Log a component rerender with detailed information
29
+ */
30
+ static logRerender(info: RerenderInfo): void;
31
+ /**
32
+ * Parse the logging configuration
33
+ */
34
+ private static parseConfig;
35
+ /**
36
+ * Log immediately without grouping
37
+ */
38
+ private static logImmediate;
39
+ /**
40
+ * Log with grouping (batch multiple rerenders)
41
+ */
42
+ private static logGrouped;
43
+ /**
44
+ * Format the log message based on level
45
+ */
46
+ private static formatMessage;
47
+ /**
48
+ * Get emoji for reason type
49
+ */
50
+ private static getReasonEmoji;
51
+ /**
52
+ * Clear all tracking data
53
+ */
54
+ static clear(): void;
55
+ /**
56
+ * Get render count for a component
57
+ */
58
+ static getRenderCount(componentName: string, blocId: string): number;
59
+ }
60
+ //# sourceMappingURL=RerenderLogger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RerenderLogger.d.ts","sourceRoot":"","sources":["../../src/utils/RerenderLogger.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,cAAc,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EACA,cAAc,GACd,mBAAmB,GACnB,OAAO,GACP,cAAc,GACd,SAAS,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAA6B;IACjE,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAA6B;IAChE,OAAO,CAAC,MAAM,CAAC,WAAW,CAAqC;IAC/D,OAAO,CAAC,MAAM,CAAC,aAAa,CAAqC;IAEjE;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IA+C5C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAoB1B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAiB3B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;IAwCzB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAqD5B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAe7B;;OAEG;IACH,MAAM,CAAC,KAAK,IAAI,IAAI;IAQpB;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;CAGrE"}
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RerenderLogger = void 0;
4
+ const Blac_1 = require("../Blac");
5
+ /**
6
+ * Utility class for logging component rerenders with detailed debugging information
7
+ */
8
+ class RerenderLogger {
9
+ static componentRenderCounts = new Map();
10
+ static lastRenderTimestamps = new Map();
11
+ static groupedLogs = new Map();
12
+ static groupTimeouts = new Map();
13
+ /**
14
+ * Log a component rerender with detailed information
15
+ */
16
+ static logRerender(info) {
17
+ // RerenderLogger is now controlled by the RenderLoggingPlugin
18
+ // This method is called by the plugin which already handles configuration
19
+ const config = Blac_1.Blac._config?.rerenderLogging;
20
+ if (!config)
21
+ return;
22
+ // Parse config
23
+ const loggingConfig = this.parseConfig(config);
24
+ if (!loggingConfig.enabled)
25
+ return;
26
+ // Apply filter if provided
27
+ if (loggingConfig.filter &&
28
+ !loggingConfig.filter({
29
+ componentName: info.componentName,
30
+ blocName: info.blocName,
31
+ })) {
32
+ return;
33
+ }
34
+ // Track render count
35
+ const key = `${info.componentName}-${info.blocId}`;
36
+ const currentCount = this.componentRenderCounts.get(key) || 0;
37
+ this.componentRenderCounts.set(key, currentCount + 1);
38
+ info.renderCount = currentCount + 1;
39
+ // Calculate duration if possible
40
+ const lastTimestamp = this.lastRenderTimestamps.get(key);
41
+ if (lastTimestamp) {
42
+ info.duration = info.timestamp - lastTimestamp;
43
+ }
44
+ this.lastRenderTimestamps.set(key, info.timestamp);
45
+ // Add stack trace if requested
46
+ if (loggingConfig.includeStackTrace && loggingConfig.level === 'detailed') {
47
+ info.stackTrace = new Error().stack;
48
+ }
49
+ // Handle grouping
50
+ if (loggingConfig.groupRerenders) {
51
+ this.logGrouped(info, loggingConfig);
52
+ }
53
+ else {
54
+ this.logImmediate(info, loggingConfig);
55
+ }
56
+ }
57
+ /**
58
+ * Parse the logging configuration
59
+ */
60
+ static parseConfig(config) {
61
+ if (config === true) {
62
+ return { enabled: true, level: 'normal' };
63
+ }
64
+ if (typeof config === 'string') {
65
+ return {
66
+ enabled: true,
67
+ level: config === 'minimal' ? 'minimal' : 'detailed',
68
+ };
69
+ }
70
+ return {
71
+ enabled: config.enabled,
72
+ level: config.level || 'normal',
73
+ filter: config.filter,
74
+ includeStackTrace: config.includeStackTrace,
75
+ groupRerenders: config.groupRerenders,
76
+ };
77
+ }
78
+ /**
79
+ * Log immediately without grouping
80
+ */
81
+ static logImmediate(info, config) {
82
+ const message = this.formatMessage(info, config.level);
83
+ if (config.level === 'detailed') {
84
+ console.group(message.header);
85
+ if (message.details)
86
+ console.log(message.details);
87
+ if (message.values)
88
+ console.table(message.values);
89
+ if (info.stackTrace)
90
+ console.log('Stack trace:', info.stackTrace);
91
+ console.groupEnd();
92
+ }
93
+ else {
94
+ console.log(message.header, message.details || '');
95
+ }
96
+ }
97
+ /**
98
+ * Log with grouping (batch multiple rerenders)
99
+ */
100
+ static logGrouped(info, config) {
101
+ const groupKey = `${info.componentName}-${info.blocId}`;
102
+ // Clear existing timeout
103
+ const existingTimeout = this.groupTimeouts.get(groupKey);
104
+ if (existingTimeout) {
105
+ clearTimeout(existingTimeout);
106
+ }
107
+ // Add to group
108
+ const group = this.groupedLogs.get(groupKey) || [];
109
+ group.push(info);
110
+ this.groupedLogs.set(groupKey, group);
111
+ // Set new timeout
112
+ const timeout = setTimeout(() => {
113
+ const logs = this.groupedLogs.get(groupKey) || [];
114
+ this.groupedLogs.delete(groupKey);
115
+ this.groupTimeouts.delete(groupKey);
116
+ if (logs.length === 1) {
117
+ this.logImmediate(logs[0], config);
118
+ }
119
+ else {
120
+ console.group(`🔄 ${info.componentName} rendered ${logs.length} times (${info.blocName})`);
121
+ logs.forEach((log, index) => {
122
+ const message = this.formatMessage(log, config.level);
123
+ console.log(` ${index + 1}. ${message.details || message.header}`);
124
+ });
125
+ console.groupEnd();
126
+ }
127
+ }, 50); // 50ms debounce
128
+ this.groupTimeouts.set(groupKey, timeout);
129
+ }
130
+ /**
131
+ * Format the log message based on level
132
+ */
133
+ static formatMessage(info, level) {
134
+ const emoji = this.getReasonEmoji(info.reason.type);
135
+ if (level === 'minimal') {
136
+ return {
137
+ header: `${emoji} ${info.componentName} #${info.renderCount}`,
138
+ details: null,
139
+ values: null,
140
+ };
141
+ }
142
+ const header = `${emoji} ${info.componentName} rerender #${info.renderCount} (${info.blocName})`;
143
+ let details = `Reason: ${info.reason.description || info.reason.type}`;
144
+ if (info.duration !== undefined) {
145
+ details += ` | Time since last: ${info.duration}ms`;
146
+ }
147
+ if (level === 'normal' &&
148
+ info.reason.changedPaths &&
149
+ info.reason.changedPaths.length > 0) {
150
+ details += ` | Changed: ${info.reason.changedPaths.join(', ')}`;
151
+ }
152
+ let values = null;
153
+ if (level === 'detailed' &&
154
+ info.reason.changedPaths &&
155
+ info.reason.changedPaths.length > 0) {
156
+ values = {};
157
+ info.reason.changedPaths.forEach((path) => {
158
+ values[path] = {
159
+ old: info.reason.oldValues?.[path],
160
+ new: info.reason.newValues?.[path],
161
+ };
162
+ });
163
+ // If we have values to show in detailed mode, ensure they're not empty
164
+ if (Object.keys(values).length === 0) {
165
+ values = null;
166
+ }
167
+ }
168
+ return { header, details, values };
169
+ }
170
+ /**
171
+ * Get emoji for reason type
172
+ */
173
+ static getReasonEmoji(type) {
174
+ switch (type) {
175
+ case 'state-change':
176
+ return '📊';
177
+ case 'dependency-change':
178
+ return '🔗';
179
+ case 'mount':
180
+ return '🚀';
181
+ case 'props-change':
182
+ return '📦';
183
+ default:
184
+ return '🔄';
185
+ }
186
+ }
187
+ /**
188
+ * Clear all tracking data
189
+ */
190
+ static clear() {
191
+ this.componentRenderCounts.clear();
192
+ this.lastRenderTimestamps.clear();
193
+ this.groupedLogs.clear();
194
+ this.groupTimeouts.forEach((timeout) => clearTimeout(timeout));
195
+ this.groupTimeouts.clear();
196
+ }
197
+ /**
198
+ * Get render count for a component
199
+ */
200
+ static getRenderCount(componentName, blocId) {
201
+ return this.componentRenderCounts.get(`${componentName}-${blocId}`) || 0;
202
+ }
203
+ }
204
+ exports.RerenderLogger = RerenderLogger;
205
+ //# sourceMappingURL=RerenderLogger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RerenderLogger.js","sourceRoot":"","sources":["../../src/utils/RerenderLogger.ts"],"names":[],"mappings":";;;AAAA,kCAA+B;AA2B/B;;GAEG;AACH,MAAa,cAAc;IACjB,MAAM,CAAC,qBAAqB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzD,MAAM,CAAC,oBAAoB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxD,MAAM,CAAC,WAAW,GAAG,IAAI,GAAG,EAA0B,CAAC;IACvD,MAAM,CAAC,aAAa,GAAG,IAAI,GAAG,EAA0B,CAAC;IAEjE;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,IAAkB;QACnC,8DAA8D;QAC9D,0EAA0E;QAC1E,MAAM,MAAM,GAAI,WAAY,CAAC,OAAO,EAAE,eAAe,CAAC;QACtD,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,eAAe;QACf,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,aAAa,CAAC,OAAO;YAAE,OAAO;QAEnC,2BAA2B;QAC3B,IACE,aAAa,CAAC,MAAM;YACpB,CAAC,aAAa,CAAC,MAAM,CAAC;gBACpB,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC,EACF,CAAC;YACD,OAAO;QACT,CAAC;QAED,qBAAqB;QACrB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACnD,MAAM,YAAY,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9D,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,WAAW,GAAG,YAAY,GAAG,CAAC,CAAC;QAEpC,iCAAiC;QACjC,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzD,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC;QACjD,CAAC;QACD,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAEnD,+BAA+B;QAC/B,IAAI,aAAa,CAAC,iBAAiB,IAAI,aAAa,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YAC1E,IAAI,CAAC,UAAU,GAAG,IAAI,KAAK,EAAE,CAAC,KAAK,CAAC;QACtC,CAAC;QAED,kBAAkB;QAClB,IAAI,aAAa,CAAC,cAAc,EAAE,CAAC;YACjC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,WAAW,CAAC,MAAW;QACpC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAiB,EAAE,CAAC;QACrD,CAAC;QACD,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,KAAK,EACH,MAAM,KAAK,SAAS,CAAC,CAAC,CAAE,SAAmB,CAAC,CAAC,CAAE,UAAoB;aACtE,CAAC;QACJ,CAAC;QACD,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAK,QAAkB;YAC1C,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,cAAc,EAAE,MAAM,CAAC,cAAc;SACtC,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,YAAY,CACzB,IAAkB,EAClB,MAAqD;QAErD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,KAAM,CAAC,CAAC;QAExD,IAAI,MAAM,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC9B,IAAI,OAAO,CAAC,OAAO;gBAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAClD,IAAI,OAAO,CAAC,MAAM;gBAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAClD,IAAI,IAAI,CAAC,UAAU;gBAAE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAClE,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,UAAU,CACvB,IAAkB,EAClB,MAAqD;QAErD,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAExD,yBAAyB;QACzB,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACzD,IAAI,eAAe,EAAE,CAAC;YACpB,YAAY,CAAC,eAAe,CAAC,CAAC;QAChC,CAAC;QAED,eAAe;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAEtC,kBAAkB;QAClB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAClD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAClC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAEpC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CACX,MAAM,IAAI,CAAC,aAAa,aAAa,IAAI,CAAC,MAAM,WAAW,IAAI,CAAC,QAAQ,GAAG,CAC5E,CAAC;gBACF,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;oBAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,KAAM,CAAC,CAAC;oBACvD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;gBACtE,CAAC,CAAC,CAAC;gBACH,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,CAAC;QACH,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB;QAExB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,aAAa,CAC1B,IAAkB,EAClB,KAAwC;QAExC,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEpD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO;gBACL,MAAM,EAAE,GAAG,KAAK,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,WAAW,EAAE;gBAC7D,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,IAAI;aACb,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,GAAG,KAAK,IAAI,IAAI,CAAC,aAAa,cAAc,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,QAAQ,GAAG,CAAC;QAEjG,IAAI,OAAO,GAAG,WAAW,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAEvE,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAChC,OAAO,IAAI,uBAAuB,IAAI,CAAC,QAAQ,IAAI,CAAC;QACtD,CAAC;QAED,IACE,KAAK,KAAK,QAAQ;YAClB,IAAI,CAAC,MAAM,CAAC,YAAY;YACxB,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EACnC,CAAC;YACD,OAAO,IAAI,eAAe,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAClE,CAAC;QAED,IAAI,MAAM,GAAkD,IAAI,CAAC;QACjE,IACE,KAAK,KAAK,UAAU;YACpB,IAAI,CAAC,MAAM,CAAC,YAAY;YACxB,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EACnC,CAAC;YACD,MAAM,GAAG,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBACxC,MAAO,CAAC,IAAI,CAAC,GAAG;oBACd,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC;oBAClC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC;iBACnC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,uEAAuE;YACvE,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACrC,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;QACH,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACrC,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,cAAc,CAAC,IAA4B;QACxD,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,cAAc;gBACjB,OAAO,IAAI,CAAC;YACd,KAAK,mBAAmB;gBACtB,OAAO,IAAI,CAAC;YACd,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC;YACd,KAAK,cAAc;gBACjB,OAAO,IAAI,CAAC;YACd;gBACE,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK;QACV,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;QACnC,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,aAAqB,EAAE,MAAc;QACzD,OAAO,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,aAAa,IAAI,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;IAC3E,CAAC;;AAxOH,wCAyOC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Generates a deterministic instance ID from static props by extracting primitive values
3
+ *
4
+ * Rules:
5
+ * 1. Only considers primitive types: string, number, boolean, null, undefined
6
+ * 2. Ignores complex types: objects, arrays, functions, symbols
7
+ * 3. Sorts keys alphabetically for deterministic output
8
+ * 4. Returns undefined if no primitives found (caller should use default ID)
9
+ */
10
+ export declare function generateInstanceIdFromProps(props: unknown): string | undefined;
11
+ //# sourceMappingURL=generateInstanceId.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateInstanceId.d.ts","sourceRoot":"","sources":["../../src/utils/generateInstanceId.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,OAAO,GACb,MAAM,GAAG,SAAS,CA0CpB"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateInstanceIdFromProps = generateInstanceIdFromProps;
4
+ /**
5
+ * Generates a deterministic instance ID from static props by extracting primitive values
6
+ *
7
+ * Rules:
8
+ * 1. Only considers primitive types: string, number, boolean, null, undefined
9
+ * 2. Ignores complex types: objects, arrays, functions, symbols
10
+ * 3. Sorts keys alphabetically for deterministic output
11
+ * 4. Returns undefined if no primitives found (caller should use default ID)
12
+ */
13
+ function generateInstanceIdFromProps(props) {
14
+ if (!props || typeof props !== 'object') {
15
+ return undefined;
16
+ }
17
+ const primitives = [];
18
+ // Extract primitive values
19
+ for (const [key, value] of Object.entries(props)) {
20
+ const type = typeof value;
21
+ if (type === 'string' ||
22
+ type === 'number' ||
23
+ type === 'boolean' ||
24
+ value === null ||
25
+ value === undefined) {
26
+ primitives.push([key, value]);
27
+ }
28
+ }
29
+ // No primitives found
30
+ if (primitives.length === 0) {
31
+ return undefined;
32
+ }
33
+ // Sort by key for deterministic output
34
+ primitives.sort(([a], [b]) => a.localeCompare(b));
35
+ // Create instance ID
36
+ const parts = [];
37
+ for (const [key, value] of primitives) {
38
+ if (value === null) {
39
+ parts.push(`${key}:null`);
40
+ }
41
+ else if (value === undefined) {
42
+ parts.push(`${key}:undefined`);
43
+ }
44
+ else {
45
+ parts.push(`${key}:${String(value)}`);
46
+ }
47
+ }
48
+ return parts.join('|');
49
+ }
50
+ //# sourceMappingURL=generateInstanceId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generateInstanceId.js","sourceRoot":"","sources":["../../src/utils/generateInstanceId.ts"],"names":[],"mappings":";;AASA,kEA4CC;AArDD;;;;;;;;GAQG;AACH,SAAgB,2BAA2B,CACzC,KAAc;IAEd,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,UAAU,GAA6B,EAAE,CAAC;IAEhD,2BAA2B;IAC3B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC;QAC1B,IACE,IAAI,KAAK,QAAQ;YACjB,IAAI,KAAK,QAAQ;YACjB,IAAI,KAAK,SAAS;YAClB,KAAK,KAAK,IAAI;YACd,KAAK,KAAK,SAAS,EACnB,CAAC;YACD,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,uCAAuC;IACvC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAElD,qBAAqB;IACrB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,UAAU,EAAE,CAAC;QACtC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,CAAC;QAC5B,CAAC;aAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Performs a shallow equality comparison between two values.
3
+ * For objects, it checks if all top-level properties are equal using Object.is.
4
+ * @param a First value to compare
5
+ * @param b Second value to compare
6
+ * @returns true if values are shallowly equal, false otherwise
7
+ */
8
+ export declare function shallowEqual(a: any, b: any): boolean;
9
+ //# sourceMappingURL=shallowEqual.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shallowEqual.d.ts","sourceRoot":"","sources":["../../src/utils/shallowEqual.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,GAAG,OAAO,CAgCpD"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.shallowEqual = shallowEqual;
4
+ /**
5
+ * Performs a shallow equality comparison between two values.
6
+ * For objects, it checks if all top-level properties are equal using Object.is.
7
+ * @param a First value to compare
8
+ * @param b Second value to compare
9
+ * @returns true if values are shallowly equal, false otherwise
10
+ */
11
+ function shallowEqual(a, b) {
12
+ if (Object.is(a, b)) {
13
+ return true;
14
+ }
15
+ if (typeof a !== 'object' ||
16
+ a === null ||
17
+ typeof b !== 'object' ||
18
+ b === null) {
19
+ return false;
20
+ }
21
+ const keysA = Object.keys(a);
22
+ const keysB = Object.keys(b);
23
+ if (keysA.length !== keysB.length) {
24
+ return false;
25
+ }
26
+ for (let i = 0; i < keysA.length; i++) {
27
+ const key = keysA[i];
28
+ if (!Object.prototype.hasOwnProperty.call(b, key) ||
29
+ !Object.is(a[key], b[key])) {
30
+ return false;
31
+ }
32
+ }
33
+ return true;
34
+ }
35
+ //# sourceMappingURL=shallowEqual.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shallowEqual.js","sourceRoot":"","sources":["../../src/utils/shallowEqual.ts"],"names":[],"mappings":";;AAOA,oCAgCC;AAvCD;;;;;;GAMG;AACH,SAAgB,YAAY,CAAC,CAAM,EAAE,CAAM;IACzC,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IACE,OAAO,CAAC,KAAK,QAAQ;QACrB,CAAC,KAAK,IAAI;QACV,OAAO,CAAC,KAAK,QAAQ;QACrB,CAAC,KAAK,IAAI,EACV,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE7B,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;QAClC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,IACE,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC;YAC7C,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAC1B,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Cross-platform UUID v4 generator that works in all environments including React Native/Hermes
3
+ * Falls back to crypto.randomUUID() when available, otherwise uses Math.random()
4
+ */
5
+ /**
6
+ * Generates a UUID v4 string compatible with all JavaScript environments
7
+ * @returns A UUID v4 string in the format xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
8
+ */
9
+ export declare function generateUUID(): string;
10
+ //# sourceMappingURL=uuid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uuid.d.ts","sourceRoot":"","sources":["../../src/utils/uuid.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAYrC"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ /**
3
+ * Cross-platform UUID v4 generator that works in all environments including React Native/Hermes
4
+ * Falls back to crypto.randomUUID() when available, otherwise uses Math.random()
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.generateUUID = generateUUID;
8
+ /**
9
+ * Generates a UUID v4 string compatible with all JavaScript environments
10
+ * @returns A UUID v4 string in the format xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
11
+ */
12
+ function generateUUID() {
13
+ // Try to use crypto.randomUUID() if available (Node.js 16+, modern browsers)
14
+ if (typeof crypto !== 'undefined' && crypto.randomUUID) {
15
+ return crypto.randomUUID();
16
+ }
17
+ // Fallback implementation for React Native/Hermes and older environments
18
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
19
+ const r = (Math.random() * 16) | 0;
20
+ const v = c === 'x' ? r : (r & 0x3) | 0x8;
21
+ return v.toString(16);
22
+ });
23
+ }
24
+ //# sourceMappingURL=uuid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uuid.js","sourceRoot":"","sources":["../../src/utils/uuid.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAMH,oCAYC;AAhBD;;;GAGG;AACH,SAAgB,YAAY;IAC1B,6EAA6E;IAC7E,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;QACvD,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;IAC7B,CAAC;IAED,yEAAyE;IACzE,OAAO,sCAAsC,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC;QACxE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;QAC1C,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,14 +1,20 @@
1
1
  {
2
2
  "name": "@blac/core",
3
- "version": "2.0.0-rc-16",
3
+ "version": "2.0.0-rc.1",
4
4
  "license": "MIT",
5
5
  "author": "Brendan Mullins <jsnanigans@gmail.com>",
6
- "main": "src/index.ts",
7
- "module": "src/index.ts",
8
- "typings": "src/index.ts",
9
- "types": "src/index.ts",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ }
15
+ },
10
16
  "files": [
11
- "src",
17
+ "dist",
12
18
  "README.md",
13
19
  "LICENSE"
14
20
  ],
@@ -32,7 +38,14 @@
32
38
  "vitest": "^3.2.4"
33
39
  },
34
40
  "scripts": {
41
+ "dev": "tsc --watch --project tsconfig.build.json",
42
+ "build": "pnpm run clean && pnpm run build:esm && pnpm run build:cjs",
43
+ "build:esm": "tsc --project tsconfig.build.json",
44
+ "build:cjs": "tsc --project tsconfig.build.json --module commonjs --outDir dist --declaration false --declarationMap false && cp dist/index.js dist/index.cjs",
45
+ "clean": "rm -rf dist",
35
46
  "format": "prettier --write \".\"",
47
+ "lint": "eslint src --ext .ts,.tsx",
48
+ "lint:fix": "eslint src --ext .ts,.tsx --fix",
36
49
  "test": "vitest run",
37
50
  "test:watch": "vitest --watch",
38
51
  "coverage": "vitest run --coverage",