@mandujs/core 0.12.1 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +304 -304
- package/README.md +653 -653
- package/package.json +8 -8
- package/src/brain/architecture/analyzer.ts +28 -26
- package/src/brain/doctor/analyzer.ts +1 -1
- package/src/bundler/build.ts +91 -91
- package/src/bundler/css.ts +302 -302
- package/src/bundler/dev.ts +0 -1
- package/src/change/history.ts +3 -3
- package/src/change/snapshot.ts +10 -9
- package/src/change/transaction.ts +2 -2
- package/src/client/Link.tsx +227 -227
- package/src/client/globals.ts +44 -44
- package/src/client/hooks.ts +267 -267
- package/src/client/index.ts +5 -5
- package/src/client/island.ts +8 -8
- package/src/client/router.ts +435 -435
- package/src/client/runtime.ts +23 -23
- package/src/client/serialize.ts +404 -404
- package/src/client/window-state.ts +101 -101
- package/src/config/mandu.ts +94 -96
- package/src/config/validate.ts +213 -215
- package/src/config/watcher.ts +311 -311
- package/src/constants.ts +40 -40
- package/src/content/content-layer.ts +314 -314
- package/src/content/content.test.ts +433 -433
- package/src/content/data-store.ts +245 -245
- package/src/content/digest.ts +133 -133
- package/src/content/index.ts +164 -164
- package/src/content/loader-context.ts +172 -172
- package/src/content/loaders/api.ts +216 -216
- package/src/content/loaders/file.ts +169 -169
- package/src/content/loaders/glob.ts +252 -252
- package/src/content/loaders/index.ts +34 -34
- package/src/content/loaders/types.ts +137 -137
- package/src/content/meta-store.ts +209 -209
- package/src/content/types.ts +282 -282
- package/src/content/watcher.ts +135 -135
- package/src/contract/client-safe.test.ts +42 -42
- package/src/contract/client-safe.ts +114 -114
- package/src/contract/client.ts +16 -16
- package/src/contract/define.ts +459 -459
- package/src/contract/handler.ts +10 -10
- package/src/contract/normalize.test.ts +276 -276
- package/src/contract/normalize.ts +404 -404
- package/src/contract/registry.test.ts +206 -206
- package/src/contract/registry.ts +568 -568
- package/src/contract/schema.ts +48 -48
- package/src/contract/types.ts +58 -58
- package/src/contract/validator.ts +32 -32
- package/src/devtools/ai/context-builder.ts +375 -375
- package/src/devtools/ai/index.ts +25 -25
- package/src/devtools/ai/mcp-connector.ts +465 -465
- package/src/devtools/client/catchers/error-catcher.ts +327 -327
- package/src/devtools/client/catchers/index.ts +18 -18
- package/src/devtools/client/catchers/network-proxy.ts +363 -363
- package/src/devtools/client/components/index.ts +39 -39
- package/src/devtools/client/components/kitchen-root.tsx +362 -362
- package/src/devtools/client/components/mandu-character.tsx +241 -241
- package/src/devtools/client/components/overlay.tsx +368 -368
- package/src/devtools/client/components/panel/errors-panel.tsx +259 -259
- package/src/devtools/client/components/panel/guard-panel.tsx +244 -244
- package/src/devtools/client/components/panel/index.ts +32 -32
- package/src/devtools/client/components/panel/islands-panel.tsx +304 -304
- package/src/devtools/client/components/panel/network-panel.tsx +292 -292
- package/src/devtools/client/components/panel/panel-container.tsx +259 -259
- package/src/devtools/client/filters/context-filters.ts +282 -282
- package/src/devtools/client/filters/index.ts +16 -16
- package/src/devtools/client/index.ts +63 -63
- package/src/devtools/client/persistence.ts +335 -335
- package/src/devtools/client/state-manager.ts +478 -478
- package/src/devtools/design-tokens.ts +263 -263
- package/src/devtools/hook/create-hook.ts +207 -207
- package/src/devtools/hook/index.ts +13 -13
- package/src/devtools/index.ts +439 -439
- package/src/devtools/init.ts +266 -266
- package/src/devtools/protocol.ts +237 -237
- package/src/devtools/server/index.ts +17 -17
- package/src/devtools/server/source-context.ts +444 -444
- package/src/devtools/types.ts +319 -319
- package/src/devtools/worker/index.ts +25 -25
- package/src/devtools/worker/redaction-worker.ts +222 -222
- package/src/devtools/worker/worker-manager.ts +409 -409
- package/src/error/classifier.ts +2 -2
- package/src/error/domains.ts +265 -265
- package/src/error/formatter.ts +32 -32
- package/src/error/result.ts +46 -46
- package/src/error/stack-analyzer.ts +5 -0
- package/src/error/types.ts +6 -6
- package/src/errors/extractor.ts +409 -409
- package/src/errors/index.ts +19 -19
- package/src/filling/auth.ts +308 -308
- package/src/filling/context.ts +569 -569
- package/src/filling/deps.ts +238 -238
- package/src/generator/contract-glue.ts +2 -1
- package/src/generator/generate.ts +12 -10
- package/src/generator/index.ts +3 -3
- package/src/generator/templates.ts +80 -79
- package/src/guard/analyzer.ts +360 -360
- package/src/guard/ast-analyzer.ts +806 -806
- package/src/guard/auto-correct.ts +1 -1
- package/src/guard/check.ts +128 -128
- package/src/guard/contract-guard.ts +9 -9
- package/src/guard/file-type.test.ts +24 -24
- package/src/guard/healing.ts +2 -0
- package/src/guard/index.ts +2 -0
- package/src/guard/negotiation.ts +430 -4
- package/src/guard/presets/atomic.ts +70 -70
- package/src/guard/presets/clean.ts +77 -77
- package/src/guard/presets/cqrs.test.ts +175 -0
- package/src/guard/presets/cqrs.ts +107 -0
- package/src/guard/presets/fsd.ts +79 -79
- package/src/guard/presets/hexagonal.ts +68 -68
- package/src/guard/presets/index.ts +291 -288
- package/src/guard/reporter.ts +445 -445
- package/src/guard/rules.ts +12 -12
- package/src/guard/statistics.ts +578 -578
- package/src/guard/suggestions.ts +358 -352
- package/src/guard/types.ts +348 -347
- package/src/guard/validator.ts +834 -834
- package/src/guard/watcher.ts +404 -404
- package/src/index.ts +1 -0
- package/src/intent/index.ts +310 -310
- package/src/island/index.ts +304 -304
- package/src/logging/index.ts +22 -22
- package/src/logging/transports.ts +365 -365
- package/src/paths.test.ts +47 -0
- package/src/paths.ts +47 -0
- package/src/plugins/index.ts +38 -38
- package/src/plugins/registry.ts +377 -377
- package/src/plugins/types.ts +363 -363
- package/src/report/build.ts +1 -1
- package/src/report/index.ts +1 -1
- package/src/router/fs-patterns.ts +387 -387
- package/src/router/fs-routes.ts +344 -401
- package/src/router/fs-scanner.ts +497 -497
- package/src/router/fs-types.ts +270 -278
- package/src/router/index.ts +81 -81
- package/src/runtime/boundary.tsx +232 -232
- package/src/runtime/compose.ts +222 -222
- package/src/runtime/lifecycle.ts +381 -381
- package/src/runtime/logger.test.ts +345 -345
- package/src/runtime/logger.ts +677 -677
- package/src/runtime/router.test.ts +476 -476
- package/src/runtime/router.ts +105 -105
- package/src/runtime/security.ts +155 -155
- package/src/runtime/server.ts +24 -24
- package/src/runtime/session-key.ts +328 -328
- package/src/runtime/ssr.ts +367 -367
- package/src/runtime/streaming-ssr.ts +1245 -1245
- package/src/runtime/trace.ts +144 -144
- package/src/seo/index.ts +214 -214
- package/src/seo/integration/ssr.ts +307 -307
- package/src/seo/render/basic.ts +427 -427
- package/src/seo/render/index.ts +143 -143
- package/src/seo/render/jsonld.ts +539 -539
- package/src/seo/render/opengraph.ts +191 -191
- package/src/seo/render/robots.ts +116 -116
- package/src/seo/render/sitemap.ts +137 -137
- package/src/seo/render/twitter.ts +126 -126
- package/src/seo/resolve/index.ts +353 -353
- package/src/seo/resolve/opengraph.ts +143 -143
- package/src/seo/resolve/robots.ts +73 -73
- package/src/seo/resolve/title.ts +94 -94
- package/src/seo/resolve/twitter.ts +73 -73
- package/src/seo/resolve/url.ts +97 -97
- package/src/seo/routes/index.ts +290 -290
- package/src/seo/types.ts +575 -575
- package/src/slot/validator.ts +39 -39
- package/src/spec/index.ts +3 -3
- package/src/spec/load.ts +76 -76
- package/src/spec/lock.ts +56 -56
- package/src/utils/bun.ts +8 -8
- package/src/utils/lru-cache.ts +75 -75
- package/src/utils/safe-io.ts +188 -188
- package/src/utils/string-safe.ts +298 -298
- package/src/watcher/rules.ts +5 -5
package/src/devtools/protocol.ts
CHANGED
|
@@ -1,237 +1,237 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Mandu Kitchen DevTools - Event Protocol
|
|
3
|
-
* @version 1.0.3
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import type {
|
|
7
|
-
KitchenEvent,
|
|
8
|
-
NormalizedError,
|
|
9
|
-
IslandSnapshot,
|
|
10
|
-
NetworkRequest,
|
|
11
|
-
GuardViolation,
|
|
12
|
-
} from './types';
|
|
13
|
-
|
|
14
|
-
// ============================================================================
|
|
15
|
-
// Event Type Definitions
|
|
16
|
-
// ============================================================================
|
|
17
|
-
|
|
18
|
-
export type KitchenEvents =
|
|
19
|
-
// Error events
|
|
20
|
-
| KitchenEvent<'error', NormalizedError>
|
|
21
|
-
| KitchenEvent<'error:clear', { id?: string }>
|
|
22
|
-
|
|
23
|
-
// Island events
|
|
24
|
-
| KitchenEvent<'island:register', IslandSnapshot>
|
|
25
|
-
| KitchenEvent<'island:hydrate:start', { id: string }>
|
|
26
|
-
| KitchenEvent<'island:hydrate:end', { id: string; time: number }>
|
|
27
|
-
| KitchenEvent<'island:error', { id: string; error: NormalizedError }>
|
|
28
|
-
|
|
29
|
-
// Network events
|
|
30
|
-
| KitchenEvent<'network:request', NetworkRequest>
|
|
31
|
-
| KitchenEvent<'network:response', { id: string; status: number; endTime: number }>
|
|
32
|
-
| KitchenEvent<'network:chunk', { id: string; chunkIndex: number; size: number }>
|
|
33
|
-
| KitchenEvent<'network:error', { id: string; error: string }>
|
|
34
|
-
|
|
35
|
-
// Guard events
|
|
36
|
-
| KitchenEvent<'guard:violation', GuardViolation>
|
|
37
|
-
| KitchenEvent<'guard:clear', { ruleId?: string }>
|
|
38
|
-
|
|
39
|
-
// HMR events
|
|
40
|
-
| KitchenEvent<'hmr:update', { routeId: string; timestamp: number }>
|
|
41
|
-
| KitchenEvent<'hmr:error', { message: string; stack?: string }>
|
|
42
|
-
| KitchenEvent<'hmr:connected', { url: string }>
|
|
43
|
-
| KitchenEvent<'hmr:disconnected', { reason?: string }>;
|
|
44
|
-
|
|
45
|
-
// ============================================================================
|
|
46
|
-
// Event Type Guards
|
|
47
|
-
// ============================================================================
|
|
48
|
-
|
|
49
|
-
export function isErrorEvent(
|
|
50
|
-
event: KitchenEvent
|
|
51
|
-
): event is KitchenEvent<'error', NormalizedError> {
|
|
52
|
-
return event.type === 'error';
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export function isIslandEvent(
|
|
56
|
-
event: KitchenEvent
|
|
57
|
-
): event is KitchenEvent<'island:register', IslandSnapshot> {
|
|
58
|
-
return event.type.startsWith('island:');
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export function isNetworkEvent(event: KitchenEvent): boolean {
|
|
62
|
-
return event.type.startsWith('network:');
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export function isGuardEvent(event: KitchenEvent): boolean {
|
|
66
|
-
return event.type.startsWith('guard:');
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export function isHmrEvent(event: KitchenEvent): boolean {
|
|
70
|
-
return event.type.startsWith('hmr:');
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// ============================================================================
|
|
74
|
-
// Event Factory Functions
|
|
75
|
-
// ============================================================================
|
|
76
|
-
|
|
77
|
-
let eventIdCounter = 0;
|
|
78
|
-
|
|
79
|
-
function generateEventId(): string {
|
|
80
|
-
return `mk-${Date.now()}-${++eventIdCounter}`;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
export function createErrorEvent(error: Omit<NormalizedError, 'id' | 'timestamp'>): KitchenEvents {
|
|
84
|
-
return {
|
|
85
|
-
type: 'error',
|
|
86
|
-
timestamp: Date.now(),
|
|
87
|
-
data: {
|
|
88
|
-
...error,
|
|
89
|
-
id: generateEventId(),
|
|
90
|
-
timestamp: Date.now(),
|
|
91
|
-
},
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
export function createIslandRegisterEvent(island: Omit<IslandSnapshot, 'id'>): KitchenEvents {
|
|
96
|
-
return {
|
|
97
|
-
type: 'island:register',
|
|
98
|
-
timestamp: Date.now(),
|
|
99
|
-
data: {
|
|
100
|
-
...island,
|
|
101
|
-
id: generateEventId(),
|
|
102
|
-
},
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
export function createIslandHydrateStartEvent(id: string): KitchenEvents {
|
|
107
|
-
return {
|
|
108
|
-
type: 'island:hydrate:start',
|
|
109
|
-
timestamp: Date.now(),
|
|
110
|
-
data: { id },
|
|
111
|
-
};
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
export function createIslandHydrateEndEvent(id: string, time: number): KitchenEvents {
|
|
115
|
-
return {
|
|
116
|
-
type: 'island:hydrate:end',
|
|
117
|
-
timestamp: Date.now(),
|
|
118
|
-
data: { id, time },
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
export function createNetworkRequestEvent(
|
|
123
|
-
request: Omit<NetworkRequest, 'id' | 'startTime'>
|
|
124
|
-
): KitchenEvents {
|
|
125
|
-
return {
|
|
126
|
-
type: 'network:request',
|
|
127
|
-
timestamp: Date.now(),
|
|
128
|
-
data: {
|
|
129
|
-
...request,
|
|
130
|
-
id: generateEventId(),
|
|
131
|
-
startTime: Date.now(),
|
|
132
|
-
},
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
export function createNetworkResponseEvent(
|
|
137
|
-
id: string,
|
|
138
|
-
status: number
|
|
139
|
-
): KitchenEvents {
|
|
140
|
-
return {
|
|
141
|
-
type: 'network:response',
|
|
142
|
-
timestamp: Date.now(),
|
|
143
|
-
data: { id, status, endTime: Date.now() },
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
export function createGuardViolationEvent(
|
|
148
|
-
violation: Omit<GuardViolation, 'id' | 'timestamp'>
|
|
149
|
-
): KitchenEvents {
|
|
150
|
-
return {
|
|
151
|
-
type: 'guard:violation',
|
|
152
|
-
timestamp: Date.now(),
|
|
153
|
-
data: {
|
|
154
|
-
...violation,
|
|
155
|
-
id: generateEventId(),
|
|
156
|
-
timestamp: Date.now(),
|
|
157
|
-
},
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
export function createHmrUpdateEvent(routeId: string): KitchenEvents {
|
|
162
|
-
return {
|
|
163
|
-
type: 'hmr:update',
|
|
164
|
-
timestamp: Date.now(),
|
|
165
|
-
data: { routeId, timestamp: Date.now() },
|
|
166
|
-
};
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
export function createHmrErrorEvent(message: string, stack?: string): KitchenEvents {
|
|
170
|
-
return {
|
|
171
|
-
type: 'hmr:error',
|
|
172
|
-
timestamp: Date.now(),
|
|
173
|
-
data: { message, stack },
|
|
174
|
-
};
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
// ============================================================================
|
|
178
|
-
// Constants
|
|
179
|
-
// ============================================================================
|
|
180
|
-
|
|
181
|
-
export const DEVTOOLS_VERSION = '1.0.3';
|
|
182
|
-
|
|
183
|
-
export const DEFAULT_CONFIG = {
|
|
184
|
-
enabled: true,
|
|
185
|
-
position: 'bottom-right' as const,
|
|
186
|
-
defaultOpen: false,
|
|
187
|
-
theme: 'auto' as const,
|
|
188
|
-
features: {
|
|
189
|
-
errorOverlay: true,
|
|
190
|
-
islandsInspector: true,
|
|
191
|
-
networkMonitor: true,
|
|
192
|
-
guardViewer: true,
|
|
193
|
-
},
|
|
194
|
-
dataSafety: {
|
|
195
|
-
stringMode: 'smart' as const,
|
|
196
|
-
collectUserActions: false,
|
|
197
|
-
collectCodeContext: false,
|
|
198
|
-
customRedactPatterns: [],
|
|
199
|
-
},
|
|
200
|
-
network: {
|
|
201
|
-
collectBody: false,
|
|
202
|
-
bodyMaxBytes: 10_000,
|
|
203
|
-
},
|
|
204
|
-
persistence: {
|
|
205
|
-
enabled: true,
|
|
206
|
-
maxPersistEvents: 50,
|
|
207
|
-
maxPersistBytes: 2_000_000,
|
|
208
|
-
priority: 'errors-first' as const,
|
|
209
|
-
incremental: {
|
|
210
|
-
enabled: true,
|
|
211
|
-
idleSyncMs: 300,
|
|
212
|
-
},
|
|
213
|
-
},
|
|
214
|
-
};
|
|
215
|
-
|
|
216
|
-
// ============================================================================
|
|
217
|
-
// Header Allowlist/Blocklist for Network Masking
|
|
218
|
-
// ============================================================================
|
|
219
|
-
|
|
220
|
-
export const ALLOWED_HEADERS = new Set([
|
|
221
|
-
'content-type',
|
|
222
|
-
'content-length',
|
|
223
|
-
'accept',
|
|
224
|
-
'cache-control',
|
|
225
|
-
'accept-language',
|
|
226
|
-
'accept-encoding',
|
|
227
|
-
'user-agent',
|
|
228
|
-
]);
|
|
229
|
-
|
|
230
|
-
export const BLOCKED_HEADERS = new Set([
|
|
231
|
-
'authorization',
|
|
232
|
-
'cookie',
|
|
233
|
-
'set-cookie',
|
|
234
|
-
'x-csrf-token',
|
|
235
|
-
'x-api-key',
|
|
236
|
-
'x-auth-token',
|
|
237
|
-
]);
|
|
1
|
+
/**
|
|
2
|
+
* Mandu Kitchen DevTools - Event Protocol
|
|
3
|
+
* @version 1.0.3
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type {
|
|
7
|
+
KitchenEvent,
|
|
8
|
+
NormalizedError,
|
|
9
|
+
IslandSnapshot,
|
|
10
|
+
NetworkRequest,
|
|
11
|
+
GuardViolation,
|
|
12
|
+
} from './types';
|
|
13
|
+
|
|
14
|
+
// ============================================================================
|
|
15
|
+
// Event Type Definitions
|
|
16
|
+
// ============================================================================
|
|
17
|
+
|
|
18
|
+
export type KitchenEvents =
|
|
19
|
+
// Error events
|
|
20
|
+
| KitchenEvent<'error', NormalizedError>
|
|
21
|
+
| KitchenEvent<'error:clear', { id?: string }>
|
|
22
|
+
|
|
23
|
+
// Island events
|
|
24
|
+
| KitchenEvent<'island:register', IslandSnapshot>
|
|
25
|
+
| KitchenEvent<'island:hydrate:start', { id: string }>
|
|
26
|
+
| KitchenEvent<'island:hydrate:end', { id: string; time: number }>
|
|
27
|
+
| KitchenEvent<'island:error', { id: string; error: NormalizedError }>
|
|
28
|
+
|
|
29
|
+
// Network events
|
|
30
|
+
| KitchenEvent<'network:request', NetworkRequest>
|
|
31
|
+
| KitchenEvent<'network:response', { id: string; status: number; endTime: number }>
|
|
32
|
+
| KitchenEvent<'network:chunk', { id: string; chunkIndex: number; size: number }>
|
|
33
|
+
| KitchenEvent<'network:error', { id: string; error: string }>
|
|
34
|
+
|
|
35
|
+
// Guard events
|
|
36
|
+
| KitchenEvent<'guard:violation', GuardViolation>
|
|
37
|
+
| KitchenEvent<'guard:clear', { ruleId?: string }>
|
|
38
|
+
|
|
39
|
+
// HMR events
|
|
40
|
+
| KitchenEvent<'hmr:update', { routeId: string; timestamp: number }>
|
|
41
|
+
| KitchenEvent<'hmr:error', { message: string; stack?: string }>
|
|
42
|
+
| KitchenEvent<'hmr:connected', { url: string }>
|
|
43
|
+
| KitchenEvent<'hmr:disconnected', { reason?: string }>;
|
|
44
|
+
|
|
45
|
+
// ============================================================================
|
|
46
|
+
// Event Type Guards
|
|
47
|
+
// ============================================================================
|
|
48
|
+
|
|
49
|
+
export function isErrorEvent(
|
|
50
|
+
event: KitchenEvent
|
|
51
|
+
): event is KitchenEvent<'error', NormalizedError> {
|
|
52
|
+
return event.type === 'error';
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function isIslandEvent(
|
|
56
|
+
event: KitchenEvent
|
|
57
|
+
): event is KitchenEvent<'island:register', IslandSnapshot> {
|
|
58
|
+
return event.type.startsWith('island:');
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function isNetworkEvent(event: KitchenEvent): boolean {
|
|
62
|
+
return event.type.startsWith('network:');
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function isGuardEvent(event: KitchenEvent): boolean {
|
|
66
|
+
return event.type.startsWith('guard:');
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export function isHmrEvent(event: KitchenEvent): boolean {
|
|
70
|
+
return event.type.startsWith('hmr:');
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// ============================================================================
|
|
74
|
+
// Event Factory Functions
|
|
75
|
+
// ============================================================================
|
|
76
|
+
|
|
77
|
+
let eventIdCounter = 0;
|
|
78
|
+
|
|
79
|
+
function generateEventId(): string {
|
|
80
|
+
return `mk-${Date.now()}-${++eventIdCounter}`;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function createErrorEvent(error: Omit<NormalizedError, 'id' | 'timestamp'>): KitchenEvents {
|
|
84
|
+
return {
|
|
85
|
+
type: 'error',
|
|
86
|
+
timestamp: Date.now(),
|
|
87
|
+
data: {
|
|
88
|
+
...error,
|
|
89
|
+
id: generateEventId(),
|
|
90
|
+
timestamp: Date.now(),
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export function createIslandRegisterEvent(island: Omit<IslandSnapshot, 'id'>): KitchenEvents {
|
|
96
|
+
return {
|
|
97
|
+
type: 'island:register',
|
|
98
|
+
timestamp: Date.now(),
|
|
99
|
+
data: {
|
|
100
|
+
...island,
|
|
101
|
+
id: generateEventId(),
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export function createIslandHydrateStartEvent(id: string): KitchenEvents {
|
|
107
|
+
return {
|
|
108
|
+
type: 'island:hydrate:start',
|
|
109
|
+
timestamp: Date.now(),
|
|
110
|
+
data: { id },
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export function createIslandHydrateEndEvent(id: string, time: number): KitchenEvents {
|
|
115
|
+
return {
|
|
116
|
+
type: 'island:hydrate:end',
|
|
117
|
+
timestamp: Date.now(),
|
|
118
|
+
data: { id, time },
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export function createNetworkRequestEvent(
|
|
123
|
+
request: Omit<NetworkRequest, 'id' | 'startTime'>
|
|
124
|
+
): KitchenEvents {
|
|
125
|
+
return {
|
|
126
|
+
type: 'network:request',
|
|
127
|
+
timestamp: Date.now(),
|
|
128
|
+
data: {
|
|
129
|
+
...request,
|
|
130
|
+
id: generateEventId(),
|
|
131
|
+
startTime: Date.now(),
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function createNetworkResponseEvent(
|
|
137
|
+
id: string,
|
|
138
|
+
status: number
|
|
139
|
+
): KitchenEvents {
|
|
140
|
+
return {
|
|
141
|
+
type: 'network:response',
|
|
142
|
+
timestamp: Date.now(),
|
|
143
|
+
data: { id, status, endTime: Date.now() },
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export function createGuardViolationEvent(
|
|
148
|
+
violation: Omit<GuardViolation, 'id' | 'timestamp'>
|
|
149
|
+
): KitchenEvents {
|
|
150
|
+
return {
|
|
151
|
+
type: 'guard:violation',
|
|
152
|
+
timestamp: Date.now(),
|
|
153
|
+
data: {
|
|
154
|
+
...violation,
|
|
155
|
+
id: generateEventId(),
|
|
156
|
+
timestamp: Date.now(),
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export function createHmrUpdateEvent(routeId: string): KitchenEvents {
|
|
162
|
+
return {
|
|
163
|
+
type: 'hmr:update',
|
|
164
|
+
timestamp: Date.now(),
|
|
165
|
+
data: { routeId, timestamp: Date.now() },
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export function createHmrErrorEvent(message: string, stack?: string): KitchenEvents {
|
|
170
|
+
return {
|
|
171
|
+
type: 'hmr:error',
|
|
172
|
+
timestamp: Date.now(),
|
|
173
|
+
data: { message, stack },
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// ============================================================================
|
|
178
|
+
// Constants
|
|
179
|
+
// ============================================================================
|
|
180
|
+
|
|
181
|
+
export const DEVTOOLS_VERSION = '1.0.3';
|
|
182
|
+
|
|
183
|
+
export const DEFAULT_CONFIG = {
|
|
184
|
+
enabled: true,
|
|
185
|
+
position: 'bottom-right' as const,
|
|
186
|
+
defaultOpen: false,
|
|
187
|
+
theme: 'auto' as const,
|
|
188
|
+
features: {
|
|
189
|
+
errorOverlay: true,
|
|
190
|
+
islandsInspector: true,
|
|
191
|
+
networkMonitor: true,
|
|
192
|
+
guardViewer: true,
|
|
193
|
+
},
|
|
194
|
+
dataSafety: {
|
|
195
|
+
stringMode: 'smart' as const,
|
|
196
|
+
collectUserActions: false,
|
|
197
|
+
collectCodeContext: false,
|
|
198
|
+
customRedactPatterns: [],
|
|
199
|
+
},
|
|
200
|
+
network: {
|
|
201
|
+
collectBody: false,
|
|
202
|
+
bodyMaxBytes: 10_000,
|
|
203
|
+
},
|
|
204
|
+
persistence: {
|
|
205
|
+
enabled: true,
|
|
206
|
+
maxPersistEvents: 50,
|
|
207
|
+
maxPersistBytes: 2_000_000,
|
|
208
|
+
priority: 'errors-first' as const,
|
|
209
|
+
incremental: {
|
|
210
|
+
enabled: true,
|
|
211
|
+
idleSyncMs: 300,
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
// ============================================================================
|
|
217
|
+
// Header Allowlist/Blocklist for Network Masking
|
|
218
|
+
// ============================================================================
|
|
219
|
+
|
|
220
|
+
export const ALLOWED_HEADERS = new Set([
|
|
221
|
+
'content-type',
|
|
222
|
+
'content-length',
|
|
223
|
+
'accept',
|
|
224
|
+
'cache-control',
|
|
225
|
+
'accept-language',
|
|
226
|
+
'accept-encoding',
|
|
227
|
+
'user-agent',
|
|
228
|
+
]);
|
|
229
|
+
|
|
230
|
+
export const BLOCKED_HEADERS = new Set([
|
|
231
|
+
'authorization',
|
|
232
|
+
'cookie',
|
|
233
|
+
'set-cookie',
|
|
234
|
+
'x-csrf-token',
|
|
235
|
+
'x-api-key',
|
|
236
|
+
'x-auth-token',
|
|
237
|
+
]);
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Mandu Kitchen DevTools - Server Module
|
|
3
|
-
* @version 1.1.0
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
export {
|
|
7
|
-
// Source Context Provider
|
|
8
|
-
SourceContextProvider,
|
|
9
|
-
SourcemapParser,
|
|
10
|
-
createViteMiddleware,
|
|
11
|
-
manduSourceContextPlugin,
|
|
12
|
-
type SourceContextRequest,
|
|
13
|
-
type SourceContextResponse,
|
|
14
|
-
type SourceContextProviderOptions,
|
|
15
|
-
type SourcemapPosition,
|
|
16
|
-
type SourcemapParseResult,
|
|
17
|
-
} from './source-context';
|
|
1
|
+
/**
|
|
2
|
+
* Mandu Kitchen DevTools - Server Module
|
|
3
|
+
* @version 1.1.0
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export {
|
|
7
|
+
// Source Context Provider
|
|
8
|
+
SourceContextProvider,
|
|
9
|
+
SourcemapParser,
|
|
10
|
+
createViteMiddleware,
|
|
11
|
+
manduSourceContextPlugin,
|
|
12
|
+
type SourceContextRequest,
|
|
13
|
+
type SourceContextResponse,
|
|
14
|
+
type SourceContextProviderOptions,
|
|
15
|
+
type SourcemapPosition,
|
|
16
|
+
type SourcemapParseResult,
|
|
17
|
+
} from './source-context';
|