@vestig/next 0.6.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/README.md +1 -1
  2. package/dist/__tests__/mocks/next-server.d.ts.map +1 -1
  3. package/dist/__tests__/mocks/next-server.js.map +1 -1
  4. package/dist/client/error-boundary.d.ts +80 -0
  5. package/dist/client/error-boundary.d.ts.map +1 -0
  6. package/dist/client/error-boundary.js +182 -0
  7. package/dist/client/error-boundary.js.map +1 -0
  8. package/dist/client/index.d.ts +2 -1
  9. package/dist/client/index.d.ts.map +1 -1
  10. package/dist/client/index.js +2 -0
  11. package/dist/client/index.js.map +1 -1
  12. package/dist/client/transport.d.ts +50 -0
  13. package/dist/client/transport.d.ts.map +1 -1
  14. package/dist/client/transport.js +200 -3
  15. package/dist/client/transport.js.map +1 -1
  16. package/dist/client.d.ts +2 -1
  17. package/dist/client.d.ts.map +1 -1
  18. package/dist/client.js +2 -0
  19. package/dist/client.js.map +1 -1
  20. package/dist/db/drizzle.d.ts +115 -0
  21. package/dist/db/drizzle.d.ts.map +1 -0
  22. package/dist/db/drizzle.js +174 -0
  23. package/dist/db/drizzle.js.map +1 -0
  24. package/dist/db/index.d.ts +49 -0
  25. package/dist/db/index.d.ts.map +1 -0
  26. package/dist/db/index.js +51 -0
  27. package/dist/db/index.js.map +1 -0
  28. package/dist/db/prisma.d.ts +114 -0
  29. package/dist/db/prisma.d.ts.map +1 -0
  30. package/dist/db/prisma.js +144 -0
  31. package/dist/db/prisma.js.map +1 -0
  32. package/dist/db/query-logger.d.ts +30 -0
  33. package/dist/db/query-logger.d.ts.map +1 -0
  34. package/dist/db/query-logger.js +169 -0
  35. package/dist/db/query-logger.js.map +1 -0
  36. package/dist/db/types.d.ts +102 -0
  37. package/dist/db/types.d.ts.map +1 -0
  38. package/dist/db/types.js +28 -0
  39. package/dist/db/types.js.map +1 -0
  40. package/dist/dev/api/index.d.ts +13 -0
  41. package/dist/dev/api/index.d.ts.map +1 -0
  42. package/dist/dev/api/index.js +13 -0
  43. package/dist/dev/api/index.js.map +1 -0
  44. package/dist/dev/api/logs-stream.d.ts +119 -0
  45. package/dist/dev/api/logs-stream.d.ts.map +1 -0
  46. package/dist/dev/api/logs-stream.js +156 -0
  47. package/dist/dev/api/logs-stream.js.map +1 -0
  48. package/dist/dev/filters.d.ts +17 -0
  49. package/dist/dev/filters.d.ts.map +1 -0
  50. package/dist/dev/filters.js +100 -0
  51. package/dist/dev/filters.js.map +1 -0
  52. package/dist/dev/hooks/use-logs.d.ts +55 -0
  53. package/dist/dev/hooks/use-logs.d.ts.map +1 -0
  54. package/dist/dev/hooks/use-logs.js +202 -0
  55. package/dist/dev/hooks/use-logs.js.map +1 -0
  56. package/dist/dev/index.d.ts +35 -0
  57. package/dist/dev/index.d.ts.map +1 -0
  58. package/dist/dev/index.js +41 -0
  59. package/dist/dev/index.js.map +1 -0
  60. package/dist/dev/log-entry.d.ts +12 -0
  61. package/dist/dev/log-entry.d.ts.map +1 -0
  62. package/dist/dev/log-entry.js +152 -0
  63. package/dist/dev/log-entry.js.map +1 -0
  64. package/dist/dev/log-viewer.d.ts +11 -0
  65. package/dist/dev/log-viewer.d.ts.map +1 -0
  66. package/dist/dev/log-viewer.js +49 -0
  67. package/dist/dev/log-viewer.js.map +1 -0
  68. package/dist/dev/metrics-card.d.ts +18 -0
  69. package/dist/dev/metrics-card.d.ts.map +1 -0
  70. package/dist/dev/metrics-card.js +75 -0
  71. package/dist/dev/metrics-card.js.map +1 -0
  72. package/dist/dev/metrics-histogram.d.ts +12 -0
  73. package/dist/dev/metrics-histogram.d.ts.map +1 -0
  74. package/dist/dev/metrics-histogram.js +69 -0
  75. package/dist/dev/metrics-histogram.js.map +1 -0
  76. package/dist/dev/metrics-panel.d.ts +10 -0
  77. package/dist/dev/metrics-panel.d.ts.map +1 -0
  78. package/dist/dev/metrics-panel.js +84 -0
  79. package/dist/dev/metrics-panel.js.map +1 -0
  80. package/dist/dev/overlay.d.ts +55 -0
  81. package/dist/dev/overlay.d.ts.map +1 -0
  82. package/dist/dev/overlay.js +216 -0
  83. package/dist/dev/overlay.js.map +1 -0
  84. package/dist/dev/store.d.ts +126 -0
  85. package/dist/dev/store.d.ts.map +1 -0
  86. package/dist/dev/store.js +210 -0
  87. package/dist/dev/store.js.map +1 -0
  88. package/dist/error/boundary.d.ts +36 -0
  89. package/dist/error/boundary.d.ts.map +1 -0
  90. package/dist/error/boundary.js +263 -0
  91. package/dist/error/boundary.js.map +1 -0
  92. package/dist/error/breadcrumbs.d.ts +95 -0
  93. package/dist/error/breadcrumbs.d.ts.map +1 -0
  94. package/dist/error/breadcrumbs.js +273 -0
  95. package/dist/error/breadcrumbs.js.map +1 -0
  96. package/dist/error/fingerprint.d.ts +42 -0
  97. package/dist/error/fingerprint.d.ts.map +1 -0
  98. package/dist/error/fingerprint.js +135 -0
  99. package/dist/error/fingerprint.js.map +1 -0
  100. package/dist/error/index.d.ts +52 -0
  101. package/dist/error/index.d.ts.map +1 -0
  102. package/dist/error/index.js +56 -0
  103. package/dist/error/index.js.map +1 -0
  104. package/dist/error/stack-parser.d.ts +43 -0
  105. package/dist/error/stack-parser.d.ts.map +1 -0
  106. package/dist/error/stack-parser.js +166 -0
  107. package/dist/error/stack-parser.js.map +1 -0
  108. package/dist/error/types.d.ts +152 -0
  109. package/dist/error/types.d.ts.map +1 -0
  110. package/dist/error/types.js +10 -0
  111. package/dist/error/types.js.map +1 -0
  112. package/dist/metrics/hooks/use-route-metrics.d.ts +93 -0
  113. package/dist/metrics/hooks/use-route-metrics.d.ts.map +1 -0
  114. package/dist/metrics/hooks/use-route-metrics.js +217 -0
  115. package/dist/metrics/hooks/use-route-metrics.js.map +1 -0
  116. package/dist/metrics/hooks/use-web-vitals.d.ts +73 -0
  117. package/dist/metrics/hooks/use-web-vitals.d.ts.map +1 -0
  118. package/dist/metrics/hooks/use-web-vitals.js +141 -0
  119. package/dist/metrics/hooks/use-web-vitals.js.map +1 -0
  120. package/dist/metrics/index.d.ts +51 -0
  121. package/dist/metrics/index.d.ts.map +1 -0
  122. package/dist/metrics/index.js +56 -0
  123. package/dist/metrics/index.js.map +1 -0
  124. package/dist/metrics/reporter.d.ts +87 -0
  125. package/dist/metrics/reporter.d.ts.map +1 -0
  126. package/dist/metrics/reporter.js +178 -0
  127. package/dist/metrics/reporter.js.map +1 -0
  128. package/dist/metrics/store.d.ts +67 -0
  129. package/dist/metrics/store.d.ts.map +1 -0
  130. package/dist/metrics/store.js +187 -0
  131. package/dist/metrics/store.js.map +1 -0
  132. package/dist/metrics/thresholds.d.ts +84 -0
  133. package/dist/metrics/thresholds.d.ts.map +1 -0
  134. package/dist/metrics/thresholds.js +148 -0
  135. package/dist/metrics/thresholds.js.map +1 -0
  136. package/dist/metrics/types.d.ts +215 -0
  137. package/dist/metrics/types.d.ts.map +1 -0
  138. package/dist/metrics/types.js +10 -0
  139. package/dist/metrics/types.js.map +1 -0
  140. package/dist/metrics/web-vitals.d.ts +72 -0
  141. package/dist/metrics/web-vitals.d.ts.map +1 -0
  142. package/dist/metrics/web-vitals.js +89 -0
  143. package/dist/metrics/web-vitals.js.map +1 -0
  144. package/package.json +28 -6
@@ -0,0 +1,210 @@
1
+ /**
2
+ * Dev Overlay Log Store
3
+ *
4
+ * Simple pub/sub store for dev logs.
5
+ * Uses class-based architecture for clarity and reliability.
6
+ */
7
+ /**
8
+ * Simple log store - no useSyncExternalStore needed
9
+ */
10
+ class SimpleLogStore {
11
+ state = {
12
+ logs: [],
13
+ filters: {
14
+ levels: new Set(['trace', 'debug', 'info', 'warn', 'error']),
15
+ namespaces: new Set(),
16
+ search: '',
17
+ source: 'all',
18
+ },
19
+ isOpen: false,
20
+ maxLogs: 500,
21
+ };
22
+ listeners = new Set();
23
+ /**
24
+ * Subscribe to store changes
25
+ */
26
+ subscribe(listener) {
27
+ this.listeners.add(listener);
28
+ return () => this.listeners.delete(listener);
29
+ }
30
+ notify() {
31
+ for (const listener of this.listeners) {
32
+ try {
33
+ listener();
34
+ }
35
+ catch (error) {
36
+ console.error('[vestig-dev] Listener error:', error);
37
+ }
38
+ }
39
+ }
40
+ /**
41
+ * Get current state snapshot
42
+ */
43
+ getSnapshot() {
44
+ return this.state;
45
+ }
46
+ /**
47
+ * Get filtered logs
48
+ */
49
+ getFilteredLogs() {
50
+ return this.state.logs.filter((log) => {
51
+ if (!this.state.filters.levels.has(log.level))
52
+ return false;
53
+ if (this.state.filters.source !== 'all' && log.source !== this.state.filters.source) {
54
+ return false;
55
+ }
56
+ if (this.state.filters.namespaces.size > 0 && log.namespace) {
57
+ if (!this.state.filters.namespaces.has(log.namespace))
58
+ return false;
59
+ }
60
+ if (this.state.filters.search) {
61
+ const searchLower = this.state.filters.search.toLowerCase();
62
+ const matchesMessage = log.message.toLowerCase().includes(searchLower);
63
+ const matchesNamespace = log.namespace?.toLowerCase().includes(searchLower);
64
+ const matchesMetadata = JSON.stringify(log.metadata ?? {})
65
+ .toLowerCase()
66
+ .includes(searchLower);
67
+ if (!matchesMessage && !matchesNamespace && !matchesMetadata) {
68
+ return false;
69
+ }
70
+ }
71
+ return true;
72
+ });
73
+ }
74
+ generateId() {
75
+ return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
76
+ }
77
+ /**
78
+ * Add a log entry
79
+ */
80
+ addLog(entry) {
81
+ const log = {
82
+ ...entry,
83
+ id: this.generateId(),
84
+ };
85
+ this.state.logs.push(log);
86
+ while (this.state.logs.length > this.state.maxLogs) {
87
+ this.state.logs.shift();
88
+ }
89
+ this.notify();
90
+ }
91
+ /**
92
+ * Add multiple log entries
93
+ */
94
+ addLogs(entries) {
95
+ for (const entry of entries) {
96
+ this.state.logs.push({
97
+ ...entry,
98
+ id: this.generateId(),
99
+ });
100
+ }
101
+ while (this.state.logs.length > this.state.maxLogs) {
102
+ this.state.logs.shift();
103
+ }
104
+ this.notify();
105
+ }
106
+ /**
107
+ * Clear all logs
108
+ */
109
+ clearLogs() {
110
+ this.state.logs = [];
111
+ this.notify();
112
+ }
113
+ /**
114
+ * Toggle overlay visibility
115
+ */
116
+ toggleOpen() {
117
+ this.state.isOpen = !this.state.isOpen;
118
+ this.notify();
119
+ }
120
+ /**
121
+ * Set overlay visibility
122
+ */
123
+ setOpen(isOpen) {
124
+ this.state.isOpen = isOpen;
125
+ this.notify();
126
+ }
127
+ /**
128
+ * Update filter levels
129
+ */
130
+ setLevelFilter(level, enabled) {
131
+ if (enabled) {
132
+ this.state.filters.levels.add(level);
133
+ }
134
+ else {
135
+ this.state.filters.levels.delete(level);
136
+ }
137
+ this.notify();
138
+ }
139
+ /**
140
+ * Toggle all levels
141
+ */
142
+ toggleAllLevels(enabled) {
143
+ if (enabled) {
144
+ this.state.filters.levels = new Set(['trace', 'debug', 'info', 'warn', 'error']);
145
+ }
146
+ else {
147
+ this.state.filters.levels.clear();
148
+ }
149
+ this.notify();
150
+ }
151
+ /**
152
+ * Set namespace filter
153
+ */
154
+ setNamespaceFilter(namespace, enabled) {
155
+ if (enabled) {
156
+ this.state.filters.namespaces.add(namespace);
157
+ }
158
+ else {
159
+ this.state.filters.namespaces.delete(namespace);
160
+ }
161
+ this.notify();
162
+ }
163
+ /**
164
+ * Set search query
165
+ */
166
+ setSearch(search) {
167
+ this.state.filters.search = search;
168
+ this.notify();
169
+ }
170
+ /**
171
+ * Set source filter
172
+ */
173
+ setSourceFilter(source) {
174
+ this.state.filters.source = source;
175
+ this.notify();
176
+ }
177
+ /**
178
+ * Get all unique namespaces
179
+ */
180
+ getNamespaces() {
181
+ const namespaces = new Set();
182
+ for (const log of this.state.logs) {
183
+ if (log.namespace) {
184
+ namespaces.add(log.namespace);
185
+ }
186
+ }
187
+ return Array.from(namespaces).sort();
188
+ }
189
+ /**
190
+ * Get log counts by level
191
+ */
192
+ getLevelCounts() {
193
+ const counts = {
194
+ trace: 0,
195
+ debug: 0,
196
+ info: 0,
197
+ warn: 0,
198
+ error: 0,
199
+ };
200
+ for (const log of this.state.logs) {
201
+ counts[log.level]++;
202
+ }
203
+ return counts;
204
+ }
205
+ }
206
+ /**
207
+ * Singleton store instance
208
+ */
209
+ export const logStore = new SimpleLogStore();
210
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/dev/store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgDH;;GAEG;AACH,MAAM,cAAc;IACX,KAAK,GAAkB;QAC9B,IAAI,EAAE,EAAE;QACR,OAAO,EAAE;YACR,MAAM,EAAE,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC5D,UAAU,EAAE,IAAI,GAAG,EAAE;YACrB,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,KAAK;SACb;QACD,MAAM,EAAE,KAAK;QACb,OAAO,EAAE,GAAG;KACZ,CAAA;IAEO,SAAS,GAAG,IAAI,GAAG,EAAY,CAAA;IAEvC;;OAEG;IACH,SAAS,CAAC,QAAkB;QAC3B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC5B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IAC7C,CAAC;IAEO,MAAM;QACb,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACvC,IAAI,CAAC;gBACJ,QAAQ,EAAE,CAAA;YACX,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAA;YACrD,CAAC;QACF,CAAC;IACF,CAAC;IAED;;OAEG;IACH,WAAW;QACV,OAAO,IAAI,CAAC,KAAK,CAAA;IAClB,CAAC;IAED;;OAEG;IACH,eAAe;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YACrC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAA;YAE3D,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBACrF,OAAO,KAAK,CAAA;YACb,CAAC;YAED,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBAC7D,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC;oBAAE,OAAO,KAAK,CAAA;YACpE,CAAC;YAED,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC/B,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,CAAA;gBAC3D,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;gBACtE,MAAM,gBAAgB,GAAG,GAAG,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;gBAC3E,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC;qBACxD,WAAW,EAAE;qBACb,QAAQ,CAAC,WAAW,CAAC,CAAA;gBAEvB,IAAI,CAAC,cAAc,IAAI,CAAC,gBAAgB,IAAI,CAAC,eAAe,EAAE,CAAC;oBAC9D,OAAO,KAAK,CAAA;gBACb,CAAC;YACF,CAAC;YAED,OAAO,IAAI,CAAA;QACZ,CAAC,CAAC,CAAA;IACH,CAAC;IAEO,UAAU;QACjB,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAA;IACjE,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAA8B;QACpC,MAAM,GAAG,GAAgB;YACxB,GAAG,KAAK;YACR,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE;SACrB,CAAA;QAED,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAEzB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACpD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;QACxB,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAA;IACd,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,OAAuC;QAC9C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;gBACpB,GAAG,KAAK;gBACR,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE;aACrB,CAAC,CAAA;QACH,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YACpD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;QACxB,CAAC;QAED,IAAI,CAAC,MAAM,EAAE,CAAA;IACd,CAAC;IAED;;OAEG;IACH,SAAS;QACR,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAA;QACpB,IAAI,CAAC,MAAM,EAAE,CAAA;IACd,CAAC;IAED;;OAEG;IACH,UAAU;QACT,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAA;QACtC,IAAI,CAAC,MAAM,EAAE,CAAA;IACd,CAAC;IAED;;OAEG;IACH,OAAO,CAAC,MAAe;QACtB,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAA;QAC1B,IAAI,CAAC,MAAM,EAAE,CAAA;IACd,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,KAAe,EAAE,OAAgB;QAC/C,IAAI,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACrC,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QACxC,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAA;IACd,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,OAAgB;QAC/B,IAAI,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;QACjF,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;QAClC,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAA;IACd,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,SAAiB,EAAE,OAAgB;QACrD,IAAI,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC7C,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;QAChD,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,CAAA;IACd,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,MAAc;QACvB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAA;QAClC,IAAI,CAAC,MAAM,EAAE,CAAA;IACd,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,MAAmC;QAClD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAA;QAClC,IAAI,CAAC,MAAM,EAAE,CAAA;IACd,CAAC;IAED;;OAEG;IACH,aAAa;QACZ,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAA;QACpC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACnC,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBACnB,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YAC9B,CAAC;QACF,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAA;IACrC,CAAC;IAED;;OAEG;IACH,cAAc;QACb,MAAM,MAAM,GAA6B;YACxC,KAAK,EAAE,CAAC;YACR,KAAK,EAAE,CAAC;YACR,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,CAAC;YACP,KAAK,EAAE,CAAC;SACR,CAAA;QAED,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAA;QACpB,CAAC;QAED,OAAO,MAAM,CAAA;IACd,CAAC;CACD;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAA"}
@@ -0,0 +1,36 @@
1
+ import { Component, type ErrorInfo, type ReactNode } from 'react';
2
+ import type { EnhancedErrorBoundaryProps, EnhancedErrorBoundaryState } from './types';
3
+ /**
4
+ * Enhanced Error Boundary Component
5
+ *
6
+ * Provides rich error context including:
7
+ * - Parsed stack traces with app code highlighted
8
+ * - Breadcrumb trail of events before the error
9
+ * - React component tree
10
+ * - Error fingerprinting for grouping
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * import { EnhancedErrorBoundary } from '@vestig/next/error'
15
+ *
16
+ * export default function Layout({ children }) {
17
+ * return (
18
+ * <EnhancedErrorBoundary
19
+ * showBreadcrumbs
20
+ * onError={(err) => sendToErrorService(err)}
21
+ * >
22
+ * {children}
23
+ * </EnhancedErrorBoundary>
24
+ * )
25
+ * }
26
+ * ```
27
+ */
28
+ export declare class EnhancedErrorBoundary extends Component<EnhancedErrorBoundaryProps, EnhancedErrorBoundaryState> {
29
+ constructor(props: EnhancedErrorBoundaryProps);
30
+ static getDerivedStateFromError(error: Error): Partial<EnhancedErrorBoundaryState>;
31
+ componentDidCatch(error: Error, errorInfo: ErrorInfo): void;
32
+ private reportError;
33
+ private handleReset;
34
+ render(): ReactNode;
35
+ }
36
+ //# sourceMappingURL=boundary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boundary.d.ts","sourceRoot":"","sources":["../../src/error/boundary.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAsB,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAIrF,OAAO,KAAK,EAEX,0BAA0B,EAC1B,0BAA0B,EAE1B,MAAM,SAAS,CAAA;AA0RhB;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,qBAAsB,SAAQ,SAAS,CACnD,0BAA0B,EAC1B,0BAA0B,CAC1B;gBACY,KAAK,EAAE,0BAA0B;IAa7C,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAIzE,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;YActD,WAAW;IAyBzB,OAAO,CAAC,WAAW,CAMlB;IAEQ,MAAM,IAAI,SAAS;CA8B5B"}
@@ -0,0 +1,263 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Component } from 'react';
4
+ import { breadcrumbStore, getCategoryIcon } from './breadcrumbs';
5
+ import { generateFingerprint } from './fingerprint';
6
+ import { getMostRelevantFrame, parseComponentStack, parseStackTrace } from './stack-parser';
7
+ /**
8
+ * Create an enhanced error object with all context
9
+ */
10
+ function createEnhancedError(error, errorInfo) {
11
+ const frames = parseStackTrace(error.stack);
12
+ const fingerprint = generateFingerprint(error, frames);
13
+ const breadcrumbs = breadcrumbStore.getAll();
14
+ return {
15
+ error,
16
+ fingerprint,
17
+ frames,
18
+ componentStack: errorInfo.componentStack ?? undefined,
19
+ breadcrumbs,
20
+ timestamp: new Date().toISOString(),
21
+ environment: {
22
+ userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : 'unknown',
23
+ url: typeof window !== 'undefined' ? window.location.href : 'unknown',
24
+ pathname: typeof window !== 'undefined' ? window.location.pathname : 'unknown',
25
+ },
26
+ };
27
+ }
28
+ /**
29
+ * Development Error UI Component
30
+ */
31
+ function DevErrorUI({ enhancedError, onReset, showBreadcrumbs = true, }) {
32
+ const { error, frames, componentStack, breadcrumbs, fingerprint } = enhancedError;
33
+ const relevantFrame = getMostRelevantFrame(frames);
34
+ const componentNames = parseComponentStack(componentStack);
35
+ const containerStyle = {
36
+ position: 'fixed',
37
+ inset: 0,
38
+ backgroundColor: 'rgba(0, 0, 0, 0.85)',
39
+ zIndex: 99999,
40
+ overflow: 'auto',
41
+ fontFamily: 'system-ui, -apple-system, sans-serif',
42
+ };
43
+ const contentStyle = {
44
+ maxWidth: '900px',
45
+ margin: '40px auto',
46
+ padding: '24px',
47
+ backgroundColor: '#1a1a2e',
48
+ borderRadius: '12px',
49
+ color: '#e4e4e7',
50
+ };
51
+ const headerStyle = {
52
+ display: 'flex',
53
+ alignItems: 'flex-start',
54
+ gap: '16px',
55
+ marginBottom: '24px',
56
+ paddingBottom: '16px',
57
+ borderBottom: '1px solid rgba(255, 255, 255, 0.1)',
58
+ };
59
+ const errorIconStyle = {
60
+ width: '48px',
61
+ height: '48px',
62
+ borderRadius: '50%',
63
+ backgroundColor: '#dc2626',
64
+ display: 'flex',
65
+ alignItems: 'center',
66
+ justifyContent: 'center',
67
+ fontSize: '24px',
68
+ flexShrink: 0,
69
+ };
70
+ const errorTitleStyle = {
71
+ fontSize: '20px',
72
+ fontWeight: 700,
73
+ color: '#fca5a5',
74
+ margin: 0,
75
+ };
76
+ const errorMessageStyle = {
77
+ fontSize: '16px',
78
+ color: '#e4e4e7',
79
+ margin: '8px 0 0',
80
+ lineHeight: 1.5,
81
+ };
82
+ const sectionStyle = {
83
+ marginBottom: '20px',
84
+ };
85
+ const sectionTitleStyle = {
86
+ fontSize: '12px',
87
+ fontWeight: 600,
88
+ textTransform: 'uppercase',
89
+ letterSpacing: '0.05em',
90
+ color: '#a1a1aa',
91
+ marginBottom: '8px',
92
+ };
93
+ const codeBlockStyle = {
94
+ backgroundColor: '#0f0f1a',
95
+ borderRadius: '8px',
96
+ padding: '12px',
97
+ fontSize: '13px',
98
+ fontFamily: 'ui-monospace, SFMono-Regular, Menlo, monospace',
99
+ overflow: 'auto',
100
+ maxHeight: '200px',
101
+ };
102
+ const frameStyle = (isAppCode) => ({
103
+ padding: '4px 0',
104
+ color: isAppCode ? '#93c5fd' : '#71717a',
105
+ borderLeft: isAppCode ? '2px solid #3b82f6' : '2px solid transparent',
106
+ paddingLeft: '8px',
107
+ });
108
+ const componentStyle = {
109
+ display: 'inline-block',
110
+ padding: '2px 8px',
111
+ margin: '2px',
112
+ backgroundColor: 'rgba(139, 92, 246, 0.2)',
113
+ borderRadius: '4px',
114
+ fontSize: '12px',
115
+ color: '#c4b5fd',
116
+ };
117
+ const breadcrumbStyle = {
118
+ display: 'flex',
119
+ alignItems: 'flex-start',
120
+ gap: '8px',
121
+ padding: '6px 0',
122
+ borderBottom: '1px solid rgba(255, 255, 255, 0.05)',
123
+ fontSize: '12px',
124
+ };
125
+ const buttonStyle = {
126
+ padding: '10px 20px',
127
+ backgroundColor: '#3b82f6',
128
+ color: 'white',
129
+ border: 'none',
130
+ borderRadius: '6px',
131
+ fontSize: '14px',
132
+ fontWeight: 500,
133
+ cursor: 'pointer',
134
+ };
135
+ const fingerprintStyle = {
136
+ fontSize: '11px',
137
+ color: '#71717a',
138
+ fontFamily: 'monospace',
139
+ };
140
+ return (_jsx("div", { style: containerStyle, children: _jsxs("div", { style: contentStyle, children: [_jsxs("div", { style: headerStyle, children: [_jsx("div", { style: errorIconStyle, children: "\uD83D\uDCA5" }), _jsxs("div", { style: { flex: 1 }, children: [_jsx("h1", { style: errorTitleStyle, children: error.name }), _jsx("p", { style: errorMessageStyle, children: error.message }), relevantFrame && (_jsxs("p", { style: { ...fingerprintStyle, marginTop: '8px' }, children: [relevantFrame.fileName, ":", relevantFrame.lineNumber] }))] }), _jsx("button", { style: buttonStyle, onClick: onReset, children: "Try Again" })] }), componentNames.length > 0 && (_jsxs("div", { style: sectionStyle, children: [_jsx("div", { style: sectionTitleStyle, children: "Component Tree" }), _jsx("div", { children: componentNames.map((name, i) => (_jsx("span", { style: componentStyle, children: name }, i))) })] })), _jsxs("div", { style: sectionStyle, children: [_jsx("div", { style: sectionTitleStyle, children: "Stack Trace" }), _jsx("div", { style: codeBlockStyle, children: frames.slice(0, 10).map((frame, i) => (_jsxs("div", { style: frameStyle(frame.isAppCode), children: [frame.functionName || '<anonymous>', ' ', _jsxs("span", { style: { color: '#52525b' }, children: ["(", frame.fileName, ":", frame.lineNumber, ")"] })] }, i))) })] }), showBreadcrumbs && breadcrumbs.length > 0 && (_jsxs("div", { style: sectionStyle, children: [_jsxs("div", { style: sectionTitleStyle, children: ["Breadcrumbs (", breadcrumbs.length, " events before crash)"] }), _jsx("div", { style: { ...codeBlockStyle, maxHeight: '250px' }, children: breadcrumbs.slice(-15).map((bc) => (_jsxs("div", { style: breadcrumbStyle, children: [_jsx("span", { style: { flexShrink: 0 }, children: getCategoryIcon(bc.category) }), _jsx("span", { style: { color: '#a1a1aa', flexShrink: 0, width: '70px' }, children: new Date(bc.timestamp).toLocaleTimeString() }), _jsx("span", { style: { flex: 1 }, children: bc.message })] }, bc.id))) })] })), _jsx("div", { style: { ...sectionStyle, marginBottom: 0 }, children: _jsxs("div", { style: fingerprintStyle, children: ["Error fingerprint: ", fingerprint] }) })] }) }));
141
+ }
142
+ /**
143
+ * Production Error UI Component
144
+ */
145
+ function ProdErrorUI({ error, onReset, }) {
146
+ return (_jsxs("div", { role: "alert", style: {
147
+ padding: '40px 20px',
148
+ textAlign: 'center',
149
+ fontFamily: 'system-ui, sans-serif',
150
+ }, children: [_jsx("div", { style: { fontSize: '48px', marginBottom: '16px' }, children: "\uD83D\uDE35" }), _jsx("h1", { style: { fontSize: '24px', margin: '0 0 8px', color: '#1f2937' }, children: "Something went wrong" }), _jsx("p", { style: { color: '#6b7280', marginBottom: '24px' }, children: "We've been notified and are working on a fix." }), _jsx("button", { onClick: onReset, style: {
151
+ padding: '12px 24px',
152
+ backgroundColor: '#3b82f6',
153
+ color: 'white',
154
+ border: 'none',
155
+ borderRadius: '8px',
156
+ fontSize: '16px',
157
+ cursor: 'pointer',
158
+ }, children: "Try Again" })] }));
159
+ }
160
+ /**
161
+ * Enhanced Error Boundary Component
162
+ *
163
+ * Provides rich error context including:
164
+ * - Parsed stack traces with app code highlighted
165
+ * - Breadcrumb trail of events before the error
166
+ * - React component tree
167
+ * - Error fingerprinting for grouping
168
+ *
169
+ * @example
170
+ * ```tsx
171
+ * import { EnhancedErrorBoundary } from '@vestig/next/error'
172
+ *
173
+ * export default function Layout({ children }) {
174
+ * return (
175
+ * <EnhancedErrorBoundary
176
+ * showBreadcrumbs
177
+ * onError={(err) => sendToErrorService(err)}
178
+ * >
179
+ * {children}
180
+ * </EnhancedErrorBoundary>
181
+ * )
182
+ * }
183
+ * ```
184
+ */
185
+ export class EnhancedErrorBoundary extends Component {
186
+ constructor(props) {
187
+ super(props);
188
+ this.state = {
189
+ hasError: false,
190
+ enhancedError: null,
191
+ };
192
+ // Set max breadcrumbs
193
+ if (props.maxBreadcrumbs) {
194
+ breadcrumbStore.setMaxSize(props.maxBreadcrumbs);
195
+ }
196
+ }
197
+ static getDerivedStateFromError(error) {
198
+ return { hasError: true };
199
+ }
200
+ componentDidCatch(error, errorInfo) {
201
+ const enhancedError = createEnhancedError(error, errorInfo);
202
+ this.setState({ enhancedError });
203
+ // Call onError callback
204
+ this.props.onError?.(enhancedError);
205
+ // Report to endpoint if configured
206
+ if (this.props.reportEndpoint) {
207
+ this.reportError(enhancedError);
208
+ }
209
+ }
210
+ async reportError(enhancedError) {
211
+ if (!this.props.reportEndpoint)
212
+ return;
213
+ try {
214
+ await fetch(this.props.reportEndpoint, {
215
+ method: 'POST',
216
+ headers: { 'Content-Type': 'application/json' },
217
+ body: JSON.stringify({
218
+ fingerprint: enhancedError.fingerprint,
219
+ error: {
220
+ name: enhancedError.error.name,
221
+ message: enhancedError.error.message,
222
+ stack: enhancedError.error.stack,
223
+ },
224
+ frames: enhancedError.frames,
225
+ breadcrumbs: enhancedError.breadcrumbs,
226
+ environment: enhancedError.environment,
227
+ timestamp: enhancedError.timestamp,
228
+ }),
229
+ });
230
+ }
231
+ catch {
232
+ // Silently fail - don't want to cause more errors
233
+ }
234
+ }
235
+ handleReset = () => {
236
+ this.setState({
237
+ hasError: false,
238
+ enhancedError: null,
239
+ });
240
+ breadcrumbStore.clear();
241
+ };
242
+ render() {
243
+ const { hasError, enhancedError } = this.state;
244
+ const { children, fallback, showBreadcrumbs = true } = this.props;
245
+ if (hasError && enhancedError) {
246
+ // Custom fallback
247
+ if (typeof fallback === 'function') {
248
+ return fallback(enhancedError);
249
+ }
250
+ if (fallback !== undefined) {
251
+ return fallback;
252
+ }
253
+ // Development UI
254
+ if (process.env.NODE_ENV === 'development') {
255
+ return (_jsx(DevErrorUI, { enhancedError: enhancedError, onReset: this.handleReset, showBreadcrumbs: showBreadcrumbs }));
256
+ }
257
+ // Production UI
258
+ return _jsx(ProdErrorUI, { error: enhancedError.error, onReset: this.handleReset });
259
+ }
260
+ return children;
261
+ }
262
+ }
263
+ //# sourceMappingURL=boundary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boundary.js","sourceRoot":"","sources":["../../src/error/boundary.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Breadcrumb System
3
+ *
4
+ * Captures user actions and events leading up to an error.
5
+ * Provides context for debugging by showing what happened before the crash.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import type { Breadcrumb, BreadcrumbCategory, BreadcrumbStore } from './types';
10
+ /**
11
+ * Global breadcrumb store singleton
12
+ */
13
+ export declare const breadcrumbStore: BreadcrumbStore;
14
+ /**
15
+ * Add a log breadcrumb
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * addLogBreadcrumb('info', 'User clicked button', 'ui')
20
+ * ```
21
+ */
22
+ export declare function addLogBreadcrumb(level: Breadcrumb['level'], message: string, namespace?: string, data?: Record<string, unknown>): void;
23
+ /**
24
+ * Add a navigation breadcrumb
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * addNavigationBreadcrumb('/dashboard', '/settings')
29
+ * ```
30
+ */
31
+ export declare function addNavigationBreadcrumb(from: string, to: string): void;
32
+ /**
33
+ * Add a click breadcrumb
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * addClickBreadcrumb('Submit button', 'button#submit')
38
+ * ```
39
+ */
40
+ export declare function addClickBreadcrumb(elementDescription: string, selector?: string): void;
41
+ /**
42
+ * Add an input breadcrumb (sanitizes sensitive data)
43
+ *
44
+ * @example
45
+ * ```ts
46
+ * addInputBreadcrumb('email', 'user@example.com', 'input#email')
47
+ * ```
48
+ */
49
+ export declare function addInputBreadcrumb(fieldName: string, value?: string, selector?: string): void;
50
+ /**
51
+ * Add a fetch/API breadcrumb
52
+ *
53
+ * @example
54
+ * ```ts
55
+ * addFetchBreadcrumb('GET', '/api/users', 200, 150)
56
+ * ```
57
+ */
58
+ export declare function addFetchBreadcrumb(method: string, url: string, status?: number, durationMs?: number): void;
59
+ /**
60
+ * Add an error breadcrumb (for non-fatal errors)
61
+ *
62
+ * @example
63
+ * ```ts
64
+ * addErrorBreadcrumb('Failed to load user preferences', error)
65
+ * ```
66
+ */
67
+ export declare function addErrorBreadcrumb(message: string, error?: Error): void;
68
+ /**
69
+ * Add a custom breadcrumb
70
+ *
71
+ * @example
72
+ * ```ts
73
+ * addCustomBreadcrumb('Feature flag enabled', { flag: 'new-dashboard' })
74
+ * ```
75
+ */
76
+ export declare function addCustomBreadcrumb(message: string, data?: Record<string, unknown>): void;
77
+ /**
78
+ * Setup automatic click tracking
79
+ * Call this once in your app to capture click breadcrumbs
80
+ */
81
+ export declare function setupClickTracking(): () => void;
82
+ /**
83
+ * Setup automatic fetch tracking
84
+ * Patches global fetch to capture API call breadcrumbs
85
+ */
86
+ export declare function setupFetchTracking(): () => void;
87
+ /**
88
+ * Format breadcrumbs for display
89
+ */
90
+ export declare function formatBreadcrumbs(breadcrumbs: Breadcrumb[]): string;
91
+ /**
92
+ * Get category icon for display
93
+ */
94
+ export declare function getCategoryIcon(category: BreadcrumbCategory): string;
95
+ //# sourceMappingURL=breadcrumbs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"breadcrumbs.d.ts","sourceRoot":"","sources":["../../src/error/breadcrumbs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAqD9E;;GAEG;AACH,eAAO,MAAM,eAAe,iBAA0B,CAAA;AAEtD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC/B,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,EAC1B,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,IAAI,CAQN;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAMtE;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,kBAAkB,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAMtF;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAc7F;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CACjC,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,GACjB,IAAI,CAWN;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAYvE;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAMzF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,IAAI,CAoC/C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,IAAI,CA2B/C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,CAQnE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CAWpE"}