@devlens/core 1.0.0 → 2.0.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.
package/README.md ADDED
@@ -0,0 +1,182 @@
1
+ # @devlens/core
2
+
3
+ **Stop wasting 30 minutes hunting silent failures. DevLens finds them for you -- automatically.**
4
+
5
+ Your UI renders blank. No error in console. You add `console.log` everywhere until you discover `user.profile.settings` is `undefined` because the API silently returned a 500. Sound familiar?
6
+
7
+ DevLens detects these failures the moment they happen and tells you exactly what went wrong, where, and how to fix it.
8
+
9
+ ## What It Catches
10
+
11
+ | Category | What It Detects | Example |
12
+ |----------|----------------|---------|
13
+ | **Network** | Failed API calls, 4xx/5xx responses, timeouts | `POST /api/users returned 500` |
14
+ | **Null Access** | Property access on null objects | `user.profile.avatar is null` |
15
+ | **Undefined Data** | Accessing undefined properties | `settings.theme is undefined` |
16
+ | **Render Data** | State values your UI depends on that are nullish | `"posts" is undefined in Dashboard` |
17
+ | **Unhandled Errors** | Uncaught exceptions and promise rejections | `TypeError: Cannot read property...` |
18
+ | **Type Mismatch** | Unexpected data types at runtime | `Expected string, got number` |
19
+
20
+ ## Installation
21
+
22
+ ```bash
23
+ npm install @devlens/core
24
+ ```
25
+
26
+ ## Quick Start -- 4 Lines to Full Coverage
27
+
28
+ ```ts
29
+ import {
30
+ createDetectionEngine,
31
+ createNetworkInterceptor,
32
+ createGlobalCatcher,
33
+ createDataGuardian,
34
+ } from '@devlens/core';
35
+
36
+ // 1. Create the engine
37
+ const engine = createDetectionEngine();
38
+
39
+ // 2. Auto-detect failed API calls (fetch + XHR)
40
+ const network = createNetworkInterceptor(engine);
41
+ network.install();
42
+
43
+ // 3. Catch uncaught errors + unhandled promise rejections
44
+ const catcher = createGlobalCatcher(engine);
45
+ catcher.install();
46
+
47
+ // 4. Detect null/undefined property access on any object
48
+ const guardian = createDataGuardian(engine);
49
+ const data = guardian.guard(apiResponse, 'apiResponse');
50
+
51
+ // Now this silently-failing access gets logged with full context:
52
+ console.log(data.user.profile.avatar);
53
+ ```
54
+
55
+ ## What You See in Console
56
+
57
+ Instead of silence or a cryptic error, DevLens gives you:
58
+
59
+ ```
60
+ [NET] DevLens [ERROR] network: POST /api/users returned 500 Internal Server Error
61
+ |- Status: 500
62
+ |- Duration: 1234ms
63
+ |- Suggestion: Server returned 500 -- check server logs
64
+ \- Source: NetworkInterceptor
65
+
66
+ [NULL] DevLens [WARN] null-access: Property "avatar" is null at path "user.profile.avatar"
67
+ |- Path: user.profile.avatar
68
+ |- Value: null
69
+ |- Source: UserProfile
70
+ \- Suggestion: Check if "avatar" is loaded/initialized before accessing
71
+ ```
72
+
73
+ Every issue includes: **what** happened, **where** it happened, the actual **value** found, and a **suggestion** to fix it.
74
+
75
+ ## Configuration
76
+
77
+ ```ts
78
+ const engine = createDetectionEngine({
79
+ enabled: true, // auto-disabled in production
80
+ minSeverity: 'warn', // 'error' | 'warn' | 'info'
81
+ throttleMs: 1000, // prevent log spam
82
+ maxIssues: 100, // memory buffer limit
83
+ modules: {
84
+ network: {
85
+ fetch: true, // intercept fetch()
86
+ xhr: true, // intercept XMLHttpRequest
87
+ ignoreUrls: ['/health', /\.hot-update\./],
88
+ logSuccess: false, // only log failures
89
+ },
90
+ guardian: {
91
+ maxDepth: 5, // proxy depth limit
92
+ ignorePaths: ['_internal'],
93
+ },
94
+ catcher: {
95
+ windowErrors: true, // window.onerror
96
+ unhandledRejections: true, // unhandled promises
97
+ consoleErrors: false, // console.error interception
98
+ },
99
+ },
100
+ ignore: {
101
+ urls: ['/analytics'],
102
+ messages: [/ResizeObserver/],
103
+ },
104
+ });
105
+ ```
106
+
107
+ ## API Reference
108
+
109
+ ### Functions
110
+
111
+ | Export | Description |
112
+ |--------|-------------|
113
+ | `createDetectionEngine(config?)` | Creates the core engine that coordinates all detection modules |
114
+ | `createNetworkInterceptor(engine, config?)` | Intercepts `fetch()` and `XMLHttpRequest` to detect API failures |
115
+ | `createDataGuardian(engine, config?)` | Wraps objects in ES6 Proxy to detect null/undefined property access |
116
+ | `createGlobalCatcher(engine, config?)` | Captures `window.onerror` and unhandled promise rejections |
117
+ | `createConsoleReporter()` | Formatted console output with severity colors and structured details |
118
+
119
+ ### Types
120
+
121
+ | Export | Description |
122
+ |--------|-------------|
123
+ | `DetectedIssue` | Full issue object with id, severity, category, message, path, suggestion, stack |
124
+ | `DevLensConfig` | Engine configuration |
125
+ | `DevLensEngine` | Engine instance interface (report, subscribe, getIssues, isEnabled) |
126
+ | `Reporter` | Custom reporter interface -- implement to send issues anywhere |
127
+ | `Severity` | `'error' \| 'warn' \| 'info'` |
128
+ | `IssueCategory` | `'network' \| 'null-access' \| 'undefined-data' \| 'render-data' \| ...` |
129
+ | `NetworkInterceptorConfig` | Network module config |
130
+ | `DataGuardianConfig` | Guardian module config |
131
+ | `GlobalCatcherConfig` | Catcher module config |
132
+
133
+ ## Custom Reporter
134
+
135
+ Send issues to your own logging service:
136
+
137
+ ```ts
138
+ import type { Reporter, DetectedIssue } from '@devlens/core';
139
+
140
+ const myReporter: Reporter = {
141
+ report(issue: DetectedIssue) {
142
+ fetch('/api/logs', {
143
+ method: 'POST',
144
+ body: JSON.stringify(issue),
145
+ });
146
+ },
147
+ };
148
+
149
+ const engine = createDetectionEngine({ reporter: myReporter });
150
+ ```
151
+
152
+ ## Framework Adapters
153
+
154
+ | Package | Framework | What It Adds |
155
+ |---------|-----------|-------------|
156
+ | [@devlens/react](https://www.npmjs.com/package/@devlens/react) | React 17+ | Provider, ErrorBoundary, guarded hooks |
157
+ | [@devlens/vue](https://www.npmjs.com/package/@devlens/vue) | Vue 3.3+ | Plugin, auto error/warn handlers, guarded composables |
158
+ | [@devlens/ui](https://www.npmjs.com/package/@devlens/ui) | Any | Visual debug panel overlay |
159
+
160
+ ## Why @devlens/core
161
+
162
+ - **Zero dependencies** -- nothing to audit, nothing to break
163
+ - **~20KB** ESM bundle, tree-shakeable
164
+ - **Dual ESM + CJS** output with full TypeScript declarations
165
+ - **Production-safe** -- auto-disabled when `NODE_ENV === 'production'`, zero overhead
166
+ - **Framework-agnostic** -- works with React, Vue, Svelte, vanilla JS, anything
167
+ - **Pluggable** -- custom reporters, custom validators, ignore patterns
168
+ - **Non-invasive** -- no global state pollution, clean install/uninstall lifecycle
169
+
170
+
171
+ ## Roadmap
172
+
173
+ | Version | Feature | Status |
174
+ |---------|---------|--------|
175
+ | v2.0 | Detection engine with network interceptor, data guardian, global catcher, console reporter | Current |
176
+ | v3.0 | AI-powered analysis -- integrate Claude and Gemini models to analyze detected issues, identify root-cause patterns across your issue history, and generate actionable fix suggestions | Planned |
177
+
178
+ The v3.0 AI integration will analyze patterns across your detected issues, identify root causes, and suggest fixes -- directly in your dev console or UI panel.
179
+
180
+ ## License
181
+
182
+ MIT -- [GitHub](https://github.com/crashsense/devlens) -- [Changelog](https://github.com/crashsense/devlens/blob/main/CHANGELOG.md)
package/dist/index.js CHANGED
@@ -450,14 +450,14 @@ function createGlobalCatcher(engine, config) {
450
450
  }
451
451
 
452
452
  // src/reporter/console-reporter.ts
453
- var CATEGORY_ICONS = {
454
- "network": "\u{1F310}",
455
- "null-access": "\u{1F480}",
456
- "undefined-data": "\u{1F47B}",
457
- "render-data": "\u{1F3A8}",
458
- "unhandled-error": "\u{1F4A5}",
459
- "unhandled-rejection": "\u26A1",
460
- "type-mismatch": "\u{1F500}"
453
+ var CATEGORY_LABELS = {
454
+ "network": "[NET]",
455
+ "null-access": "[NULL]",
456
+ "undefined-data": "[UNDEF]",
457
+ "render-data": "[RENDER]",
458
+ "unhandled-error": "[ERR]",
459
+ "unhandled-rejection": "[REJ]",
460
+ "type-mismatch": "[TYPE]"
461
461
  };
462
462
  var SEVERITY_COLORS = {
463
463
  error: "#ff4444",
@@ -472,41 +472,41 @@ var SEVERITY_LABELS = {
472
472
  function formatDetails(issue) {
473
473
  const lines = [];
474
474
  if (issue.path) {
475
- lines.push(` \u251C\u2500 Path: ${issue.path}`);
475
+ lines.push(` |- Path: ${issue.path}`);
476
476
  }
477
477
  if (issue.foundValue !== void 0) {
478
478
  lines.push(
479
- ` \u251C\u2500 Value: ${issue.foundValue === null ? "null" : String(issue.foundValue)}`
479
+ ` |- Value: ${issue.foundValue === null ? "null" : String(issue.foundValue)}`
480
480
  );
481
481
  }
482
482
  if (issue.details) {
483
483
  const entries = Object.entries(issue.details);
484
484
  for (const [key, value] of entries) {
485
- lines.push(` \u251C\u2500 ${key}: ${typeof value === "string" ? value : JSON.stringify(value)}`);
485
+ lines.push(` |- ${key}: ${typeof value === "string" ? value : JSON.stringify(value)}`);
486
486
  }
487
487
  }
488
488
  if (issue.source) {
489
- lines.push(` \u251C\u2500 Source: ${issue.source}`);
489
+ lines.push(` |- Source: ${issue.source}`);
490
490
  }
491
491
  if (issue.suggestion) {
492
- lines.push(` \u251C\u2500 Suggestion: ${issue.suggestion}`);
492
+ lines.push(` |- Suggestion: ${issue.suggestion}`);
493
493
  }
494
494
  if (issue.stack) {
495
495
  const stackPreview = issue.stack.split("\n").slice(0, 3).join("\n");
496
- lines.push(` \u2514\u2500 Stack:
496
+ lines.push(` \\- Stack:
497
497
  ${stackPreview}`);
498
498
  } else if (lines.length > 0) {
499
499
  const lastIdx = lines.length - 1;
500
- lines[lastIdx] = lines[lastIdx].replace("\u251C\u2500", "\u2514\u2500");
500
+ lines[lastIdx] = lines[lastIdx].replace("|-", "\\-");
501
501
  }
502
502
  return lines;
503
503
  }
504
504
  function createConsoleReporter() {
505
505
  function report(issue) {
506
- const icon = CATEGORY_ICONS[issue.category] ?? "\u{1F50D}";
506
+ const categoryLabel = CATEGORY_LABELS[issue.category] ?? "[DL]";
507
507
  const color = SEVERITY_COLORS[issue.severity];
508
508
  const label = SEVERITY_LABELS[issue.severity];
509
- const header = `${icon} DevLens [${label}] ${issue.category}: ${issue.message}`;
509
+ const header = `${categoryLabel} DevLens [${label}] ${issue.category}: ${issue.message}`;
510
510
  const details = formatDetails(issue);
511
511
  const consoleFn = issue.severity === "error" ? console.error : issue.severity === "warn" ? console.warn : console.log;
512
512
  console.groupCollapsed(
@@ -525,7 +525,7 @@ function createConsoleReporter() {
525
525
  function reportBatch(issues) {
526
526
  if (issues.length === 0) return;
527
527
  console.groupCollapsed(
528
- `%c\u{1F50D} DevLens \u2014 ${issues.length} issue(s) detected`,
528
+ `%c[DL] DevLens -- ${issues.length} issue(s) detected`,
529
529
  "color: #ff4444; font-weight: bold; font-size: 12px;"
530
530
  );
531
531
  for (const issue of issues) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/network/interceptor.ts","../src/guardian/data-guardian.ts","../src/catcher/global-catcher.ts","../src/reporter/console-reporter.ts","../src/engine/detection-engine.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type {\n DevLensEngine,\n NetworkInterceptorConfig,\n DetectedIssue,\n Severity,\n} from '../types';\n\nfunction matchesPattern(url: string, patterns: (string | RegExp)[]): boolean {\n return patterns.some((p) =>\n typeof p === 'string' ? url.includes(p) : p.test(url),\n );\n}\n\nfunction generateIssueId(method: string, url: string, status: number): string {\n return `network:${method}:${url}:${status}`;\n}\n\nfunction severityFromStatus(status: number): Severity {\n if (status >= 500) return 'error';\n if (status >= 400) return 'warn';\n return 'info';\n}\n\nfunction buildSuggestion(\n method: string,\n url: string,\n status: number,\n): string {\n if (status >= 500)\n return `Server returned ${status} for ${method} ${url} — check server logs`;\n if (status === 404)\n return `Endpoint ${url} not found — verify the URL is correct`;\n if (status === 401 || status === 403)\n return `Authentication/authorization failed for ${url} — check credentials or permissions`;\n if (status >= 400)\n return `Client error ${status} for ${method} ${url} — check request parameters`;\n return `Request to ${url} completed with status ${status}`;\n}\n\nexport function createNetworkInterceptor(\n engine: DevLensEngine,\n config?: NetworkInterceptorConfig | boolean,\n) {\n const resolvedConfig: NetworkInterceptorConfig =\n typeof config === 'boolean' || config === undefined\n ? {}\n : config;\n\n const interceptFetch = resolvedConfig.fetch !== false;\n const interceptXhr = resolvedConfig.xhr !== false;\n const ignoreUrls = resolvedConfig.ignoreUrls ?? [];\n const logSuccess = resolvedConfig.logSuccess ?? false;\n\n let originalFetch: typeof globalThis.fetch | null = null;\n let originalXhrOpen: typeof XMLHttpRequest.prototype.open | null = null;\n let originalXhrSend: typeof XMLHttpRequest.prototype.send | null = null;\n\n function shouldIgnore(url: string): boolean {\n return ignoreUrls.length > 0 && matchesPattern(url, ignoreUrls);\n }\n\n function reportNetworkIssue(\n method: string,\n url: string,\n status: number,\n statusText: string,\n duration: number,\n error?: Error,\n ): void {\n if (!engine.isEnabled()) return;\n\n const severity = error ? 'error' : severityFromStatus(status);\n if (severity === 'info' && !logSuccess) return;\n\n const issue: DetectedIssue = {\n id: generateIssueId(method, url, status),\n timestamp: Date.now(),\n severity,\n category: 'network',\n message: error\n ? `${method} ${url} failed: ${error.message}`\n : `${method} ${url} returned ${status} ${statusText}`,\n details: {\n url,\n method,\n status,\n statusText,\n duration: `${duration}ms`,\n },\n suggestion: error\n ? `Network request to ${url} failed — check if the server is running and the URL is correct`\n : buildSuggestion(method, url, status),\n stack: error?.stack,\n source: 'NetworkInterceptor',\n };\n\n engine.report(issue);\n }\n\n function installFetchInterceptor(): void {\n if (typeof globalThis.fetch === 'undefined') return;\n originalFetch = globalThis.fetch;\n\n const savedFetch = originalFetch;\n globalThis.fetch = async function devlensFetch(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n const url =\n typeof input === 'string'\n ? input\n : input instanceof URL\n ? input.toString()\n : input.url;\n\n const method = init?.method ?? 'GET';\n\n if (shouldIgnore(url)) {\n return savedFetch.call(globalThis, input, init);\n }\n\n const start = performance.now();\n\n try {\n const response = await savedFetch.call(globalThis, input, init);\n const duration = Math.round(performance.now() - start);\n\n if (!response.ok || logSuccess) {\n reportNetworkIssue(\n method.toUpperCase(),\n url,\n response.status,\n response.statusText,\n duration,\n );\n }\n\n return response;\n } catch (err) {\n const duration = Math.round(performance.now() - start);\n reportNetworkIssue(\n method.toUpperCase(),\n url,\n 0,\n 'Network Error',\n duration,\n err instanceof Error ? err : new Error(String(err)),\n );\n throw err;\n }\n };\n }\n\n function installXhrInterceptor(): void {\n if (typeof XMLHttpRequest === 'undefined') return;\n\n originalXhrOpen = XMLHttpRequest.prototype.open;\n originalXhrSend = XMLHttpRequest.prototype.send;\n\n const savedOpen = originalXhrOpen;\n const savedSend = originalXhrSend;\n\n XMLHttpRequest.prototype.open = function devlensXhrOpen(\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ): void {\n (this as XMLHttpRequest & { _devlens_method: string })._devlens_method =\n method;\n (this as XMLHttpRequest & { _devlens_url: string })._devlens_url =\n typeof url === 'string' ? url : url.toString();\n return savedOpen.apply(\n this,\n [method, url, ...rest] as Parameters<typeof savedOpen>,\n );\n };\n\n XMLHttpRequest.prototype.send = function devlensXhrSend(\n body?: Document | XMLHttpRequestBodyInit | null,\n ): void {\n const xhr = this as XMLHttpRequest & {\n _devlens_method: string;\n _devlens_url: string;\n };\n const method = xhr._devlens_method ?? 'GET';\n const url = xhr._devlens_url ?? '';\n\n if (shouldIgnore(url)) {\n return savedSend.call(this, body);\n }\n\n const start = performance.now();\n\n const onLoadEnd = (): void => {\n const duration = Math.round(performance.now() - start);\n if (xhr.status >= 400 || logSuccess) {\n reportNetworkIssue(\n method.toUpperCase(),\n url,\n xhr.status,\n xhr.statusText,\n duration,\n );\n }\n xhr.removeEventListener('loadend', onLoadEnd);\n xhr.removeEventListener('error', onError);\n };\n\n const onError = (): void => {\n const duration = Math.round(performance.now() - start);\n reportNetworkIssue(\n method.toUpperCase(),\n url,\n 0,\n 'Network Error',\n duration,\n new Error('XMLHttpRequest network error'),\n );\n xhr.removeEventListener('loadend', onLoadEnd);\n xhr.removeEventListener('error', onError);\n };\n\n xhr.addEventListener('loadend', onLoadEnd);\n xhr.addEventListener('error', onError);\n\n return savedSend.call(this, body);\n };\n }\n\n function install(): void {\n if (typeof window === 'undefined') return;\n if (interceptFetch) installFetchInterceptor();\n if (interceptXhr) installXhrInterceptor();\n }\n\n function uninstall(): void {\n if (originalFetch) {\n globalThis.fetch = originalFetch;\n originalFetch = null;\n }\n if (originalXhrOpen) {\n XMLHttpRequest.prototype.open = originalXhrOpen;\n originalXhrOpen = null;\n }\n if (originalXhrSend) {\n XMLHttpRequest.prototype.send = originalXhrSend;\n originalXhrSend = null;\n }\n }\n\n return { install, uninstall };\n}\n","import type {\n DevLensEngine,\n DataGuardianConfig,\n DetectedIssue,\n IssueCategory,\n} from '../types';\n\nconst SKIP_PROPERTIES = new Set([\n 'constructor',\n 'prototype',\n '__proto__',\n 'toJSON',\n 'toString',\n 'valueOf',\n 'length',\n 'then',\n 'catch',\n 'finally',\n '$$typeof',\n '_owner',\n '_store',\n 'ref',\n 'key',\n '_self',\n '_source',\n 'displayName',\n 'nodeType',\n]);\n\nconst NON_PROXYABLE_TYPES = new Set([\n '[object Date]',\n '[object RegExp]',\n '[object Map]',\n '[object Set]',\n '[object WeakMap]',\n '[object WeakSet]',\n '[object Error]',\n '[object Promise]',\n '[object ArrayBuffer]',\n '[object DataView]',\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Float32Array]',\n '[object Float64Array]',\n]);\n\nfunction isProxyable(value: unknown): value is object {\n if (value === null || value === undefined) return false;\n if (typeof value !== 'object' && typeof value !== 'function') return false;\n const tag = Object.prototype.toString.call(value);\n return !NON_PROXYABLE_TYPES.has(tag);\n}\n\nexport function createDataGuardian(\n engine: DevLensEngine,\n config?: DataGuardianConfig | boolean,\n) {\n const resolvedConfig: DataGuardianConfig =\n typeof config === 'boolean' || config === undefined ? {} : config;\n\n const maxDepth = resolvedConfig.maxDepth ?? 5;\n const ignorePaths = new Set(resolvedConfig.ignorePaths ?? []);\n const verbose = resolvedConfig.verbose ?? false;\n\n const proxyCache = new WeakMap<object, object>();\n\n function shouldIgnorePath(path: string): boolean {\n if (ignorePaths.size === 0) return false;\n return ignorePaths.has(path);\n }\n\n function reportAccess(\n path: string,\n value: null | undefined,\n label: string,\n ): void {\n if (!engine.isEnabled()) return;\n if (shouldIgnorePath(path)) return;\n\n const isNull = value === null;\n const category: IssueCategory = isNull ? 'null-access' : 'undefined-data';\n const prop = path.split('.').pop() ?? path;\n\n const issue: DetectedIssue = {\n id: `${category}:${path}`,\n timestamp: Date.now(),\n severity: 'warn',\n category,\n message: `Property \"${prop}\" is ${isNull ? 'null' : 'undefined'} at path \"${path}\"`,\n path,\n foundValue: value,\n expectedType: 'non-nullish value',\n source: label,\n suggestion: `Check if \"${prop}\" is loaded/initialized before accessing. Full path: ${path}`,\n };\n\n engine.report(issue);\n }\n\n function createProxy<T extends object>(\n target: T,\n label: string,\n parentPath: string,\n depth: number,\n ): T {\n if (depth > maxDepth) return target;\n\n const cached = proxyCache.get(target);\n if (cached) return cached as T;\n\n const proxy = new Proxy(target, {\n get(obj, prop, receiver): unknown {\n if (typeof prop === 'symbol') {\n return Reflect.get(obj, prop, receiver);\n }\n\n if (SKIP_PROPERTIES.has(prop)) {\n return Reflect.get(obj, prop, receiver);\n }\n\n const currentPath = parentPath ? `${parentPath}.${prop}` : prop;\n const value = Reflect.get(obj, prop, receiver);\n\n if (value === null || value === undefined) {\n const hasOwn =\n Object.prototype.hasOwnProperty.call(obj, prop) ||\n prop in obj;\n if (hasOwn) {\n reportAccess(currentPath, value as null | undefined, label);\n } else if (verbose) {\n reportAccess(currentPath, value as null | undefined, label);\n }\n return value;\n }\n\n if (typeof value === 'function') {\n return value;\n }\n\n if (isProxyable(value)) {\n return createProxy(\n value as object,\n label,\n currentPath,\n depth + 1,\n );\n }\n\n return value;\n },\n\n has(obj, prop): boolean {\n return Reflect.has(obj, prop);\n },\n\n ownKeys(obj): (string | symbol)[] {\n return Reflect.ownKeys(obj);\n },\n\n getOwnPropertyDescriptor(\n obj,\n prop,\n ): PropertyDescriptor | undefined {\n return Reflect.getOwnPropertyDescriptor(obj, prop);\n },\n\n set(obj, prop, value, receiver): boolean {\n return Reflect.set(obj, prop, value, receiver);\n },\n\n deleteProperty(obj, prop): boolean {\n return Reflect.deleteProperty(obj, prop);\n },\n });\n\n proxyCache.set(target, proxy);\n return proxy as T;\n }\n\n function guard<T extends object>(target: T, label?: string): T {\n if (target === null || target === undefined) {\n const nullLabel = label ?? 'unknown';\n const issue: DetectedIssue = {\n id: `null-access:${nullLabel}:root`,\n timestamp: Date.now(),\n severity: 'error',\n category: target === null ? 'null-access' : 'undefined-data',\n message: `Attempted to guard a ${target === null ? 'null' : 'undefined'} value (label: \"${nullLabel}\")`,\n path: nullLabel,\n foundValue: target,\n source: nullLabel,\n suggestion: `The value passed to guard() is ${target === null ? 'null' : 'undefined'}. Ensure data is loaded before guarding.`,\n };\n engine.report(issue);\n return target;\n }\n\n if (!isProxyable(target)) return target;\n return createProxy(target, label ?? 'guarded', '', 0);\n }\n\n function guardDeep<T extends object>(target: T, label?: string): T {\n if (target === null || target === undefined) return guard(target, label);\n if (!isProxyable(target)) return target;\n\n const seen = new WeakSet<object>();\n const resolvedLabel = label ?? 'guarded';\n\n function walkAndProxy(obj: object, path: string, depth: number): void {\n if (depth > maxDepth) return;\n if (seen.has(obj)) return;\n seen.add(obj);\n\n const keys = Object.keys(obj);\n for (const key of keys) {\n const value = (obj as Record<string, unknown>)[key];\n if (value !== null && value !== undefined && isProxyable(value)) {\n const childPath = path ? `${path}.${key}` : key;\n createProxy(value as object, resolvedLabel, childPath, depth + 1);\n walkAndProxy(value as object, childPath, depth + 1);\n }\n }\n }\n\n walkAndProxy(target, '', 0);\n return createProxy(target, resolvedLabel, '', 0);\n }\n\n function unguardAll(): void {\n }\n\n return { guard, guardDeep, unguardAll };\n}\n","import type { DevLensEngine, GlobalCatcherConfig, DetectedIssue } from '../types';\n\nexport function createGlobalCatcher(\n engine: DevLensEngine,\n config?: GlobalCatcherConfig | boolean,\n) {\n const resolvedConfig: GlobalCatcherConfig =\n typeof config === 'boolean' || config === undefined ? {} : config;\n\n const catchWindowErrors = resolvedConfig.windowErrors !== false;\n const catchRejections = resolvedConfig.unhandledRejections !== false;\n const catchConsoleErrors = resolvedConfig.consoleErrors === true;\n\n let originalConsoleError: typeof console.error | null = null;\n\n function handleWindowError(event: ErrorEvent): void {\n if (!engine.isEnabled()) return;\n\n const issue: DetectedIssue = {\n id: `unhandled-error:${event.message}:${event.filename ?? ''}:${event.lineno ?? 0}`,\n timestamp: Date.now(),\n severity: 'error',\n category: 'unhandled-error',\n message: event.message || 'Unknown error',\n details: {\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n },\n stack: event.error?.stack,\n source: event.filename\n ? `${event.filename}:${event.lineno}:${event.colno}`\n : 'unknown',\n suggestion: event.filename\n ? `Unhandled error at ${event.filename}:${event.lineno} — wrap in try/catch or add error boundary`\n : 'Unhandled error — add error handling to locate the source',\n };\n\n engine.report(issue);\n }\n\n function handleUnhandledRejection(event: PromiseRejectionEvent): void {\n if (!engine.isEnabled()) return;\n\n const reason = event.reason;\n const message =\n reason instanceof Error\n ? reason.message\n : typeof reason === 'string'\n ? reason\n : 'Unknown rejection reason';\n\n const issue: DetectedIssue = {\n id: `unhandled-rejection:${message}`,\n timestamp: Date.now(),\n severity: 'error',\n category: 'unhandled-rejection',\n message: `Unhandled Promise rejection: ${message}`,\n details: {\n reason:\n reason instanceof Error\n ? { name: reason.name, message: reason.message }\n : reason,\n },\n stack: reason instanceof Error ? reason.stack : undefined,\n source: 'Promise',\n suggestion:\n 'Add .catch() to the Promise or use try/catch with await',\n };\n\n engine.report(issue);\n }\n\n function installConsoleInterceptor(): void {\n if (typeof console === 'undefined') return;\n originalConsoleError = console.error;\n\n const saved = originalConsoleError;\n console.error = function devlensConsoleError(\n ...args: unknown[]\n ): void {\n saved.apply(console, args);\n\n if (!engine.isEnabled()) return;\n\n const message = args\n .map((arg) =>\n typeof arg === 'string' ? arg : JSON.stringify(arg),\n )\n .join(' ');\n\n const issue: DetectedIssue = {\n id: `unhandled-error:console:${message.slice(0, 100)}`,\n timestamp: Date.now(),\n severity: 'error',\n category: 'unhandled-error',\n message: `console.error: ${message}`,\n details: { args },\n source: 'console.error',\n suggestion:\n 'A console.error was detected — investigate the error above',\n };\n\n engine.report(issue);\n };\n }\n\n function install(): void {\n if (typeof window === 'undefined') return;\n\n if (catchWindowErrors) {\n window.addEventListener('error', handleWindowError);\n }\n if (catchRejections) {\n window.addEventListener(\n 'unhandledrejection',\n handleUnhandledRejection,\n );\n }\n if (catchConsoleErrors) {\n installConsoleInterceptor();\n }\n }\n\n function uninstall(): void {\n if (typeof window !== 'undefined') {\n window.removeEventListener('error', handleWindowError);\n window.removeEventListener(\n 'unhandledrejection',\n handleUnhandledRejection,\n );\n }\n if (originalConsoleError) {\n console.error = originalConsoleError;\n originalConsoleError = null;\n }\n }\n\n return { install, uninstall };\n}\n","import type { Reporter, DetectedIssue, Severity, IssueCategory } from '../types';\n\nconst CATEGORY_ICONS: Record<IssueCategory, string> = {\n 'network': '\\u{1F310}',\n 'null-access': '\\u{1F480}',\n 'undefined-data': '\\u{1F47B}',\n 'render-data': '\\u{1F3A8}',\n 'unhandled-error': '\\u{1F4A5}',\n 'unhandled-rejection': '\\u26A1',\n 'type-mismatch': '\\u{1F500}',\n};\n\nconst SEVERITY_COLORS: Record<Severity, string> = {\n error: '#ff4444',\n warn: '#ffaa00',\n info: '#4488ff',\n};\n\nconst SEVERITY_LABELS: Record<Severity, string> = {\n error: 'ERROR',\n warn: 'WARN',\n info: 'INFO',\n};\n\nfunction formatDetails(issue: DetectedIssue): string[] {\n const lines: string[] = [];\n\n if (issue.path) {\n lines.push(` \\u251C\\u2500 Path: ${issue.path}`);\n }\n\n if (issue.foundValue !== undefined) {\n lines.push(\n ` \\u251C\\u2500 Value: ${issue.foundValue === null ? 'null' : String(issue.foundValue)}`,\n );\n }\n\n if (issue.details) {\n const entries = Object.entries(issue.details);\n for (const [key, value] of entries) {\n lines.push(` \\u251C\\u2500 ${key}: ${typeof value === 'string' ? value : JSON.stringify(value)}`);\n }\n }\n\n if (issue.source) {\n lines.push(` \\u251C\\u2500 Source: ${issue.source}`);\n }\n\n if (issue.suggestion) {\n lines.push(` \\u251C\\u2500 Suggestion: ${issue.suggestion}`);\n }\n\n if (issue.stack) {\n const stackPreview = issue.stack.split('\\n').slice(0, 3).join('\\n');\n lines.push(` \\u2514\\u2500 Stack:\\n${stackPreview}`);\n } else if (lines.length > 0) {\n const lastIdx = lines.length - 1;\n lines[lastIdx] = lines[lastIdx].replace('\\u251C\\u2500', '\\u2514\\u2500');\n }\n\n return lines;\n}\n\nexport function createConsoleReporter(): Reporter {\n function report(issue: DetectedIssue): void {\n const icon = CATEGORY_ICONS[issue.category] ?? '\\u{1F50D}';\n const color = SEVERITY_COLORS[issue.severity];\n const label = SEVERITY_LABELS[issue.severity];\n\n const header = `${icon} DevLens [${label}] ${issue.category}: ${issue.message}`;\n const details = formatDetails(issue);\n\n const consoleFn =\n issue.severity === 'error'\n ? console.error\n : issue.severity === 'warn'\n ? console.warn\n : console.log;\n\n console.groupCollapsed(\n `%c${header}`,\n `color: ${color}; font-weight: bold;`,\n );\n\n for (const line of details) {\n consoleFn(line);\n }\n\n consoleFn(\n `%cTimestamp: ${new Date(issue.timestamp).toISOString()}`,\n 'color: #888;',\n );\n\n console.groupEnd();\n }\n\n function reportBatch(issues: DetectedIssue[]): void {\n if (issues.length === 0) return;\n\n console.groupCollapsed(\n `%c\\u{1F50D} DevLens — ${issues.length} issue(s) detected`,\n 'color: #ff4444; font-weight: bold; font-size: 12px;',\n );\n\n for (const issue of issues) {\n report(issue);\n }\n\n console.groupEnd();\n }\n\n function clear(): void {\n console.clear();\n }\n\n return { report, reportBatch, clear };\n}\n","import type {\n DevLensConfig,\n DevLensEngine,\n DetectedIssue,\n Reporter,\n Severity,\n} from '../types';\nimport { createConsoleReporter } from '../reporter/console-reporter';\n\nconst SEVERITY_RANK: Record<Severity, number> = {\n info: 0,\n warn: 1,\n error: 2,\n};\n\nfunction matchesAnyPattern(\n value: string | undefined,\n patterns: (string | RegExp)[],\n): boolean {\n if (!value || patterns.length === 0) return false;\n return patterns.some((p) =>\n typeof p === 'string' ? value.includes(p) : p.test(value),\n );\n}\n\nexport function createDetectionEngine(\n config: DevLensConfig = {},\n): DevLensEngine {\n const resolvedConfig: Required<\n Pick<DevLensConfig, 'enabled' | 'minSeverity' | 'throttleMs' | 'maxIssues'>\n > &\n DevLensConfig = {\n enabled: config.enabled ?? true,\n minSeverity: config.minSeverity ?? 'info',\n throttleMs: config.throttleMs ?? 1000,\n maxIssues: config.maxIssues ?? 100,\n ...config,\n };\n\n const reporter: Reporter =\n resolvedConfig.reporter ?? createConsoleReporter();\n const issues: DetectedIssue[] = [];\n const subscribers = new Set<(issue: DetectedIssue) => void>();\n const lastReportedAt = new Map<string, number>();\n\n function isEnabled(): boolean {\n if (!resolvedConfig.enabled) return false;\n if (typeof window === 'undefined') return false;\n try {\n if (\n typeof process !== 'undefined' &&\n process.env?.NODE_ENV === 'production'\n ) {\n return false;\n }\n } catch {\n // process may not be defined in browser\n }\n return true;\n }\n\n function meetsMinSeverity(severity: Severity): boolean {\n return (\n SEVERITY_RANK[severity] >= SEVERITY_RANK[resolvedConfig.minSeverity]\n );\n }\n\n function isThrottled(id: string, now: number): boolean {\n const lastTime = lastReportedAt.get(id);\n if (lastTime === undefined) return false;\n return now - lastTime < resolvedConfig.throttleMs;\n }\n\n function isIgnored(issue: DetectedIssue): boolean {\n const ignore = resolvedConfig.ignore;\n if (!ignore) return false;\n\n if (\n ignore.urls &&\n matchesAnyPattern(\n issue.details?.url as string | undefined,\n ignore.urls,\n )\n ) {\n return true;\n }\n\n if (ignore.paths && matchesAnyPattern(issue.path, ignore.paths)) {\n return true;\n }\n\n if (ignore.messages && matchesAnyPattern(issue.message, ignore.messages)) {\n return true;\n }\n\n return false;\n }\n\n function addToBuffer(issue: DetectedIssue): void {\n issues.push(issue);\n if (issues.length > resolvedConfig.maxIssues) {\n issues.shift();\n }\n }\n\n function report(issue: DetectedIssue): void {\n if (!isEnabled()) return;\n if (!meetsMinSeverity(issue.severity)) return;\n\n const now = Date.now();\n if (isThrottled(issue.id, now)) return;\n if (isIgnored(issue)) return;\n\n lastReportedAt.set(issue.id, now);\n addToBuffer(issue);\n\n reporter.report(issue);\n\n for (const callback of subscribers) {\n try {\n callback(issue);\n } catch {\n // subscriber errors should not break the engine\n }\n }\n }\n\n function getConfig(): Readonly<DevLensConfig> {\n return Object.freeze({ ...resolvedConfig });\n }\n\n function getIssues(): readonly DetectedIssue[] {\n return [...issues];\n }\n\n function subscribe(\n callback: (issue: DetectedIssue) => void,\n ): () => void {\n subscribers.add(callback);\n return () => {\n subscribers.delete(callback);\n };\n }\n\n return {\n report,\n getConfig,\n getIssues,\n subscribe,\n isEnabled,\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/network/interceptor.ts","../src/guardian/data-guardian.ts","../src/catcher/global-catcher.ts","../src/reporter/console-reporter.ts","../src/engine/detection-engine.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type {\n DevLensEngine,\n NetworkInterceptorConfig,\n DetectedIssue,\n Severity,\n} from '../types';\n\nfunction matchesPattern(url: string, patterns: (string | RegExp)[]): boolean {\n return patterns.some((p) =>\n typeof p === 'string' ? url.includes(p) : p.test(url),\n );\n}\n\nfunction generateIssueId(method: string, url: string, status: number): string {\n return `network:${method}:${url}:${status}`;\n}\n\nfunction severityFromStatus(status: number): Severity {\n if (status >= 500) return 'error';\n if (status >= 400) return 'warn';\n return 'info';\n}\n\nfunction buildSuggestion(\n method: string,\n url: string,\n status: number,\n): string {\n if (status >= 500)\n return `Server returned ${status} for ${method} ${url} — check server logs`;\n if (status === 404)\n return `Endpoint ${url} not found — verify the URL is correct`;\n if (status === 401 || status === 403)\n return `Authentication/authorization failed for ${url} — check credentials or permissions`;\n if (status >= 400)\n return `Client error ${status} for ${method} ${url} — check request parameters`;\n return `Request to ${url} completed with status ${status}`;\n}\n\nexport function createNetworkInterceptor(\n engine: DevLensEngine,\n config?: NetworkInterceptorConfig | boolean,\n) {\n const resolvedConfig: NetworkInterceptorConfig =\n typeof config === 'boolean' || config === undefined\n ? {}\n : config;\n\n const interceptFetch = resolvedConfig.fetch !== false;\n const interceptXhr = resolvedConfig.xhr !== false;\n const ignoreUrls = resolvedConfig.ignoreUrls ?? [];\n const logSuccess = resolvedConfig.logSuccess ?? false;\n\n let originalFetch: typeof globalThis.fetch | null = null;\n let originalXhrOpen: typeof XMLHttpRequest.prototype.open | null = null;\n let originalXhrSend: typeof XMLHttpRequest.prototype.send | null = null;\n\n function shouldIgnore(url: string): boolean {\n return ignoreUrls.length > 0 && matchesPattern(url, ignoreUrls);\n }\n\n function reportNetworkIssue(\n method: string,\n url: string,\n status: number,\n statusText: string,\n duration: number,\n error?: Error,\n ): void {\n if (!engine.isEnabled()) return;\n\n const severity = error ? 'error' : severityFromStatus(status);\n if (severity === 'info' && !logSuccess) return;\n\n const issue: DetectedIssue = {\n id: generateIssueId(method, url, status),\n timestamp: Date.now(),\n severity,\n category: 'network',\n message: error\n ? `${method} ${url} failed: ${error.message}`\n : `${method} ${url} returned ${status} ${statusText}`,\n details: {\n url,\n method,\n status,\n statusText,\n duration: `${duration}ms`,\n },\n suggestion: error\n ? `Network request to ${url} failed — check if the server is running and the URL is correct`\n : buildSuggestion(method, url, status),\n stack: error?.stack,\n source: 'NetworkInterceptor',\n };\n\n engine.report(issue);\n }\n\n function installFetchInterceptor(): void {\n if (typeof globalThis.fetch === 'undefined') return;\n originalFetch = globalThis.fetch;\n\n const savedFetch = originalFetch;\n globalThis.fetch = async function devlensFetch(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n const url =\n typeof input === 'string'\n ? input\n : input instanceof URL\n ? input.toString()\n : input.url;\n\n const method = init?.method ?? 'GET';\n\n if (shouldIgnore(url)) {\n return savedFetch.call(globalThis, input, init);\n }\n\n const start = performance.now();\n\n try {\n const response = await savedFetch.call(globalThis, input, init);\n const duration = Math.round(performance.now() - start);\n\n if (!response.ok || logSuccess) {\n reportNetworkIssue(\n method.toUpperCase(),\n url,\n response.status,\n response.statusText,\n duration,\n );\n }\n\n return response;\n } catch (err) {\n const duration = Math.round(performance.now() - start);\n reportNetworkIssue(\n method.toUpperCase(),\n url,\n 0,\n 'Network Error',\n duration,\n err instanceof Error ? err : new Error(String(err)),\n );\n throw err;\n }\n };\n }\n\n function installXhrInterceptor(): void {\n if (typeof XMLHttpRequest === 'undefined') return;\n\n originalXhrOpen = XMLHttpRequest.prototype.open;\n originalXhrSend = XMLHttpRequest.prototype.send;\n\n const savedOpen = originalXhrOpen;\n const savedSend = originalXhrSend;\n\n XMLHttpRequest.prototype.open = function devlensXhrOpen(\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ): void {\n (this as XMLHttpRequest & { _devlens_method: string })._devlens_method =\n method;\n (this as XMLHttpRequest & { _devlens_url: string })._devlens_url =\n typeof url === 'string' ? url : url.toString();\n return savedOpen.apply(\n this,\n [method, url, ...rest] as Parameters<typeof savedOpen>,\n );\n };\n\n XMLHttpRequest.prototype.send = function devlensXhrSend(\n body?: Document | XMLHttpRequestBodyInit | null,\n ): void {\n const xhr = this as XMLHttpRequest & {\n _devlens_method: string;\n _devlens_url: string;\n };\n const method = xhr._devlens_method ?? 'GET';\n const url = xhr._devlens_url ?? '';\n\n if (shouldIgnore(url)) {\n return savedSend.call(this, body);\n }\n\n const start = performance.now();\n\n const onLoadEnd = (): void => {\n const duration = Math.round(performance.now() - start);\n if (xhr.status >= 400 || logSuccess) {\n reportNetworkIssue(\n method.toUpperCase(),\n url,\n xhr.status,\n xhr.statusText,\n duration,\n );\n }\n xhr.removeEventListener('loadend', onLoadEnd);\n xhr.removeEventListener('error', onError);\n };\n\n const onError = (): void => {\n const duration = Math.round(performance.now() - start);\n reportNetworkIssue(\n method.toUpperCase(),\n url,\n 0,\n 'Network Error',\n duration,\n new Error('XMLHttpRequest network error'),\n );\n xhr.removeEventListener('loadend', onLoadEnd);\n xhr.removeEventListener('error', onError);\n };\n\n xhr.addEventListener('loadend', onLoadEnd);\n xhr.addEventListener('error', onError);\n\n return savedSend.call(this, body);\n };\n }\n\n function install(): void {\n if (typeof window === 'undefined') return;\n if (interceptFetch) installFetchInterceptor();\n if (interceptXhr) installXhrInterceptor();\n }\n\n function uninstall(): void {\n if (originalFetch) {\n globalThis.fetch = originalFetch;\n originalFetch = null;\n }\n if (originalXhrOpen) {\n XMLHttpRequest.prototype.open = originalXhrOpen;\n originalXhrOpen = null;\n }\n if (originalXhrSend) {\n XMLHttpRequest.prototype.send = originalXhrSend;\n originalXhrSend = null;\n }\n }\n\n return { install, uninstall };\n}\n","import type {\n DevLensEngine,\n DataGuardianConfig,\n DetectedIssue,\n IssueCategory,\n} from '../types';\n\nconst SKIP_PROPERTIES = new Set([\n 'constructor',\n 'prototype',\n '__proto__',\n 'toJSON',\n 'toString',\n 'valueOf',\n 'length',\n 'then',\n 'catch',\n 'finally',\n '$$typeof',\n '_owner',\n '_store',\n 'ref',\n 'key',\n '_self',\n '_source',\n 'displayName',\n 'nodeType',\n]);\n\nconst NON_PROXYABLE_TYPES = new Set([\n '[object Date]',\n '[object RegExp]',\n '[object Map]',\n '[object Set]',\n '[object WeakMap]',\n '[object WeakSet]',\n '[object Error]',\n '[object Promise]',\n '[object ArrayBuffer]',\n '[object DataView]',\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Float32Array]',\n '[object Float64Array]',\n]);\n\nfunction isProxyable(value: unknown): value is object {\n if (value === null || value === undefined) return false;\n if (typeof value !== 'object' && typeof value !== 'function') return false;\n const tag = Object.prototype.toString.call(value);\n return !NON_PROXYABLE_TYPES.has(tag);\n}\n\nexport function createDataGuardian(\n engine: DevLensEngine,\n config?: DataGuardianConfig | boolean,\n) {\n const resolvedConfig: DataGuardianConfig =\n typeof config === 'boolean' || config === undefined ? {} : config;\n\n const maxDepth = resolvedConfig.maxDepth ?? 5;\n const ignorePaths = new Set(resolvedConfig.ignorePaths ?? []);\n const verbose = resolvedConfig.verbose ?? false;\n\n const proxyCache = new WeakMap<object, object>();\n\n function shouldIgnorePath(path: string): boolean {\n if (ignorePaths.size === 0) return false;\n return ignorePaths.has(path);\n }\n\n function reportAccess(\n path: string,\n value: null | undefined,\n label: string,\n ): void {\n if (!engine.isEnabled()) return;\n if (shouldIgnorePath(path)) return;\n\n const isNull = value === null;\n const category: IssueCategory = isNull ? 'null-access' : 'undefined-data';\n const prop = path.split('.').pop() ?? path;\n\n const issue: DetectedIssue = {\n id: `${category}:${path}`,\n timestamp: Date.now(),\n severity: 'warn',\n category,\n message: `Property \"${prop}\" is ${isNull ? 'null' : 'undefined'} at path \"${path}\"`,\n path,\n foundValue: value,\n expectedType: 'non-nullish value',\n source: label,\n suggestion: `Check if \"${prop}\" is loaded/initialized before accessing. Full path: ${path}`,\n };\n\n engine.report(issue);\n }\n\n function createProxy<T extends object>(\n target: T,\n label: string,\n parentPath: string,\n depth: number,\n ): T {\n if (depth > maxDepth) return target;\n\n const cached = proxyCache.get(target);\n if (cached) return cached as T;\n\n const proxy = new Proxy(target, {\n get(obj, prop, receiver): unknown {\n if (typeof prop === 'symbol') {\n return Reflect.get(obj, prop, receiver);\n }\n\n if (SKIP_PROPERTIES.has(prop)) {\n return Reflect.get(obj, prop, receiver);\n }\n\n const currentPath = parentPath ? `${parentPath}.${prop}` : prop;\n const value = Reflect.get(obj, prop, receiver);\n\n if (value === null || value === undefined) {\n const hasOwn =\n Object.prototype.hasOwnProperty.call(obj, prop) ||\n prop in obj;\n if (hasOwn) {\n reportAccess(currentPath, value as null | undefined, label);\n } else if (verbose) {\n reportAccess(currentPath, value as null | undefined, label);\n }\n return value;\n }\n\n if (typeof value === 'function') {\n return value;\n }\n\n if (isProxyable(value)) {\n return createProxy(\n value as object,\n label,\n currentPath,\n depth + 1,\n );\n }\n\n return value;\n },\n\n has(obj, prop): boolean {\n return Reflect.has(obj, prop);\n },\n\n ownKeys(obj): (string | symbol)[] {\n return Reflect.ownKeys(obj);\n },\n\n getOwnPropertyDescriptor(\n obj,\n prop,\n ): PropertyDescriptor | undefined {\n return Reflect.getOwnPropertyDescriptor(obj, prop);\n },\n\n set(obj, prop, value, receiver): boolean {\n return Reflect.set(obj, prop, value, receiver);\n },\n\n deleteProperty(obj, prop): boolean {\n return Reflect.deleteProperty(obj, prop);\n },\n });\n\n proxyCache.set(target, proxy);\n return proxy as T;\n }\n\n function guard<T extends object>(target: T, label?: string): T {\n if (target === null || target === undefined) {\n const nullLabel = label ?? 'unknown';\n const issue: DetectedIssue = {\n id: `null-access:${nullLabel}:root`,\n timestamp: Date.now(),\n severity: 'error',\n category: target === null ? 'null-access' : 'undefined-data',\n message: `Attempted to guard a ${target === null ? 'null' : 'undefined'} value (label: \"${nullLabel}\")`,\n path: nullLabel,\n foundValue: target,\n source: nullLabel,\n suggestion: `The value passed to guard() is ${target === null ? 'null' : 'undefined'}. Ensure data is loaded before guarding.`,\n };\n engine.report(issue);\n return target;\n }\n\n if (!isProxyable(target)) return target;\n return createProxy(target, label ?? 'guarded', '', 0);\n }\n\n function guardDeep<T extends object>(target: T, label?: string): T {\n if (target === null || target === undefined) return guard(target, label);\n if (!isProxyable(target)) return target;\n\n const seen = new WeakSet<object>();\n const resolvedLabel = label ?? 'guarded';\n\n function walkAndProxy(obj: object, path: string, depth: number): void {\n if (depth > maxDepth) return;\n if (seen.has(obj)) return;\n seen.add(obj);\n\n const keys = Object.keys(obj);\n for (const key of keys) {\n const value = (obj as Record<string, unknown>)[key];\n if (value !== null && value !== undefined && isProxyable(value)) {\n const childPath = path ? `${path}.${key}` : key;\n createProxy(value as object, resolvedLabel, childPath, depth + 1);\n walkAndProxy(value as object, childPath, depth + 1);\n }\n }\n }\n\n walkAndProxy(target, '', 0);\n return createProxy(target, resolvedLabel, '', 0);\n }\n\n function unguardAll(): void {\n }\n\n return { guard, guardDeep, unguardAll };\n}\n","import type { DevLensEngine, GlobalCatcherConfig, DetectedIssue } from '../types';\n\nexport function createGlobalCatcher(\n engine: DevLensEngine,\n config?: GlobalCatcherConfig | boolean,\n) {\n const resolvedConfig: GlobalCatcherConfig =\n typeof config === 'boolean' || config === undefined ? {} : config;\n\n const catchWindowErrors = resolvedConfig.windowErrors !== false;\n const catchRejections = resolvedConfig.unhandledRejections !== false;\n const catchConsoleErrors = resolvedConfig.consoleErrors === true;\n\n let originalConsoleError: typeof console.error | null = null;\n\n function handleWindowError(event: ErrorEvent): void {\n if (!engine.isEnabled()) return;\n\n const issue: DetectedIssue = {\n id: `unhandled-error:${event.message}:${event.filename ?? ''}:${event.lineno ?? 0}`,\n timestamp: Date.now(),\n severity: 'error',\n category: 'unhandled-error',\n message: event.message || 'Unknown error',\n details: {\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n },\n stack: event.error?.stack,\n source: event.filename\n ? `${event.filename}:${event.lineno}:${event.colno}`\n : 'unknown',\n suggestion: event.filename\n ? `Unhandled error at ${event.filename}:${event.lineno} — wrap in try/catch or add error boundary`\n : 'Unhandled error — add error handling to locate the source',\n };\n\n engine.report(issue);\n }\n\n function handleUnhandledRejection(event: PromiseRejectionEvent): void {\n if (!engine.isEnabled()) return;\n\n const reason = event.reason;\n const message =\n reason instanceof Error\n ? reason.message\n : typeof reason === 'string'\n ? reason\n : 'Unknown rejection reason';\n\n const issue: DetectedIssue = {\n id: `unhandled-rejection:${message}`,\n timestamp: Date.now(),\n severity: 'error',\n category: 'unhandled-rejection',\n message: `Unhandled Promise rejection: ${message}`,\n details: {\n reason:\n reason instanceof Error\n ? { name: reason.name, message: reason.message }\n : reason,\n },\n stack: reason instanceof Error ? reason.stack : undefined,\n source: 'Promise',\n suggestion:\n 'Add .catch() to the Promise or use try/catch with await',\n };\n\n engine.report(issue);\n }\n\n function installConsoleInterceptor(): void {\n if (typeof console === 'undefined') return;\n originalConsoleError = console.error;\n\n const saved = originalConsoleError;\n console.error = function devlensConsoleError(\n ...args: unknown[]\n ): void {\n saved.apply(console, args);\n\n if (!engine.isEnabled()) return;\n\n const message = args\n .map((arg) =>\n typeof arg === 'string' ? arg : JSON.stringify(arg),\n )\n .join(' ');\n\n const issue: DetectedIssue = {\n id: `unhandled-error:console:${message.slice(0, 100)}`,\n timestamp: Date.now(),\n severity: 'error',\n category: 'unhandled-error',\n message: `console.error: ${message}`,\n details: { args },\n source: 'console.error',\n suggestion:\n 'A console.error was detected — investigate the error above',\n };\n\n engine.report(issue);\n };\n }\n\n function install(): void {\n if (typeof window === 'undefined') return;\n\n if (catchWindowErrors) {\n window.addEventListener('error', handleWindowError);\n }\n if (catchRejections) {\n window.addEventListener(\n 'unhandledrejection',\n handleUnhandledRejection,\n );\n }\n if (catchConsoleErrors) {\n installConsoleInterceptor();\n }\n }\n\n function uninstall(): void {\n if (typeof window !== 'undefined') {\n window.removeEventListener('error', handleWindowError);\n window.removeEventListener(\n 'unhandledrejection',\n handleUnhandledRejection,\n );\n }\n if (originalConsoleError) {\n console.error = originalConsoleError;\n originalConsoleError = null;\n }\n }\n\n return { install, uninstall };\n}\n","import type { Reporter, DetectedIssue, Severity, IssueCategory } from '../types';\n\nconst CATEGORY_LABELS: Record<IssueCategory, string> = {\n 'network': '[NET]',\n 'null-access': '[NULL]',\n 'undefined-data': '[UNDEF]',\n 'render-data': '[RENDER]',\n 'unhandled-error': '[ERR]',\n 'unhandled-rejection': '[REJ]',\n 'type-mismatch': '[TYPE]',\n};\n\nconst SEVERITY_COLORS: Record<Severity, string> = {\n error: '#ff4444',\n warn: '#ffaa00',\n info: '#4488ff',\n};\n\nconst SEVERITY_LABELS: Record<Severity, string> = {\n error: 'ERROR',\n warn: 'WARN',\n info: 'INFO',\n};\n\nfunction formatDetails(issue: DetectedIssue): string[] {\n const lines: string[] = [];\n\n if (issue.path) {\n lines.push(` |- Path: ${issue.path}`);\n }\n\n if (issue.foundValue !== undefined) {\n lines.push(\n ` |- Value: ${issue.foundValue === null ? 'null' : String(issue.foundValue)}`,\n );\n }\n\n if (issue.details) {\n const entries = Object.entries(issue.details);\n for (const [key, value] of entries) {\n lines.push(` |- ${key}: ${typeof value === 'string' ? value : JSON.stringify(value)}`);\n }\n }\n\n if (issue.source) {\n lines.push(` |- Source: ${issue.source}`);\n }\n\n if (issue.suggestion) {\n lines.push(` |- Suggestion: ${issue.suggestion}`);\n }\n\n if (issue.stack) {\n const stackPreview = issue.stack.split('\\n').slice(0, 3).join('\\n');\n lines.push(` \\\\- Stack:\\n${stackPreview}`);\n } else if (lines.length > 0) {\n const lastIdx = lines.length - 1;\n lines[lastIdx] = lines[lastIdx].replace('|-', '\\\\-');\n }\n\n return lines;\n}\n\nexport function createConsoleReporter(): Reporter {\n function report(issue: DetectedIssue): void {\n const categoryLabel = CATEGORY_LABELS[issue.category] ?? '[DL]';\n const color = SEVERITY_COLORS[issue.severity];\n const label = SEVERITY_LABELS[issue.severity];\n\n const header = `${categoryLabel} DevLens [${label}] ${issue.category}: ${issue.message}`;\n const details = formatDetails(issue);\n\n const consoleFn =\n issue.severity === 'error'\n ? console.error\n : issue.severity === 'warn'\n ? console.warn\n : console.log;\n\n console.groupCollapsed(\n `%c${header}`,\n `color: ${color}; font-weight: bold;`,\n );\n\n for (const line of details) {\n consoleFn(line);\n }\n\n consoleFn(\n `%cTimestamp: ${new Date(issue.timestamp).toISOString()}`,\n 'color: #888;',\n );\n\n console.groupEnd();\n }\n\n function reportBatch(issues: DetectedIssue[]): void {\n if (issues.length === 0) return;\n\n console.groupCollapsed(\n `%c[DL] DevLens -- ${issues.length} issue(s) detected`,\n 'color: #ff4444; font-weight: bold; font-size: 12px;',\n );\n\n for (const issue of issues) {\n report(issue);\n }\n\n console.groupEnd();\n }\n\n function clear(): void {\n console.clear();\n }\n\n return { report, reportBatch, clear };\n}\n","import type {\n DevLensConfig,\n DevLensEngine,\n DetectedIssue,\n Reporter,\n Severity,\n} from '../types';\nimport { createConsoleReporter } from '../reporter/console-reporter';\n\nconst SEVERITY_RANK: Record<Severity, number> = {\n info: 0,\n warn: 1,\n error: 2,\n};\n\nfunction matchesAnyPattern(\n value: string | undefined,\n patterns: (string | RegExp)[],\n): boolean {\n if (!value || patterns.length === 0) return false;\n return patterns.some((p) =>\n typeof p === 'string' ? value.includes(p) : p.test(value),\n );\n}\n\nexport function createDetectionEngine(\n config: DevLensConfig = {},\n): DevLensEngine {\n const resolvedConfig: Required<\n Pick<DevLensConfig, 'enabled' | 'minSeverity' | 'throttleMs' | 'maxIssues'>\n > &\n DevLensConfig = {\n enabled: config.enabled ?? true,\n minSeverity: config.minSeverity ?? 'info',\n throttleMs: config.throttleMs ?? 1000,\n maxIssues: config.maxIssues ?? 100,\n ...config,\n };\n\n const reporter: Reporter =\n resolvedConfig.reporter ?? createConsoleReporter();\n const issues: DetectedIssue[] = [];\n const subscribers = new Set<(issue: DetectedIssue) => void>();\n const lastReportedAt = new Map<string, number>();\n\n function isEnabled(): boolean {\n if (!resolvedConfig.enabled) return false;\n if (typeof window === 'undefined') return false;\n try {\n if (\n typeof process !== 'undefined' &&\n process.env?.NODE_ENV === 'production'\n ) {\n return false;\n }\n } catch {\n // process may not be defined in browser\n }\n return true;\n }\n\n function meetsMinSeverity(severity: Severity): boolean {\n return (\n SEVERITY_RANK[severity] >= SEVERITY_RANK[resolvedConfig.minSeverity]\n );\n }\n\n function isThrottled(id: string, now: number): boolean {\n const lastTime = lastReportedAt.get(id);\n if (lastTime === undefined) return false;\n return now - lastTime < resolvedConfig.throttleMs;\n }\n\n function isIgnored(issue: DetectedIssue): boolean {\n const ignore = resolvedConfig.ignore;\n if (!ignore) return false;\n\n if (\n ignore.urls &&\n matchesAnyPattern(\n issue.details?.url as string | undefined,\n ignore.urls,\n )\n ) {\n return true;\n }\n\n if (ignore.paths && matchesAnyPattern(issue.path, ignore.paths)) {\n return true;\n }\n\n if (ignore.messages && matchesAnyPattern(issue.message, ignore.messages)) {\n return true;\n }\n\n return false;\n }\n\n function addToBuffer(issue: DetectedIssue): void {\n issues.push(issue);\n if (issues.length > resolvedConfig.maxIssues) {\n issues.shift();\n }\n }\n\n function report(issue: DetectedIssue): void {\n if (!isEnabled()) return;\n if (!meetsMinSeverity(issue.severity)) return;\n\n const now = Date.now();\n if (isThrottled(issue.id, now)) return;\n if (isIgnored(issue)) return;\n\n lastReportedAt.set(issue.id, now);\n addToBuffer(issue);\n\n reporter.report(issue);\n\n for (const callback of subscribers) {\n try {\n callback(issue);\n } catch {\n // subscriber errors should not break the engine\n }\n }\n }\n\n function getConfig(): Readonly<DevLensConfig> {\n return Object.freeze({ ...resolvedConfig });\n }\n\n function getIssues(): readonly DetectedIssue[] {\n return [...issues];\n }\n\n function subscribe(\n callback: (issue: DetectedIssue) => void,\n ): () => void {\n subscribers.add(callback);\n return () => {\n subscribers.delete(callback);\n };\n }\n\n return {\n report,\n getConfig,\n getIssues,\n subscribe,\n isEnabled,\n };\n}\n"]}
package/dist/index.mjs CHANGED
@@ -448,14 +448,14 @@ function createGlobalCatcher(engine, config) {
448
448
  }
449
449
 
450
450
  // src/reporter/console-reporter.ts
451
- var CATEGORY_ICONS = {
452
- "network": "\u{1F310}",
453
- "null-access": "\u{1F480}",
454
- "undefined-data": "\u{1F47B}",
455
- "render-data": "\u{1F3A8}",
456
- "unhandled-error": "\u{1F4A5}",
457
- "unhandled-rejection": "\u26A1",
458
- "type-mismatch": "\u{1F500}"
451
+ var CATEGORY_LABELS = {
452
+ "network": "[NET]",
453
+ "null-access": "[NULL]",
454
+ "undefined-data": "[UNDEF]",
455
+ "render-data": "[RENDER]",
456
+ "unhandled-error": "[ERR]",
457
+ "unhandled-rejection": "[REJ]",
458
+ "type-mismatch": "[TYPE]"
459
459
  };
460
460
  var SEVERITY_COLORS = {
461
461
  error: "#ff4444",
@@ -470,41 +470,41 @@ var SEVERITY_LABELS = {
470
470
  function formatDetails(issue) {
471
471
  const lines = [];
472
472
  if (issue.path) {
473
- lines.push(` \u251C\u2500 Path: ${issue.path}`);
473
+ lines.push(` |- Path: ${issue.path}`);
474
474
  }
475
475
  if (issue.foundValue !== void 0) {
476
476
  lines.push(
477
- ` \u251C\u2500 Value: ${issue.foundValue === null ? "null" : String(issue.foundValue)}`
477
+ ` |- Value: ${issue.foundValue === null ? "null" : String(issue.foundValue)}`
478
478
  );
479
479
  }
480
480
  if (issue.details) {
481
481
  const entries = Object.entries(issue.details);
482
482
  for (const [key, value] of entries) {
483
- lines.push(` \u251C\u2500 ${key}: ${typeof value === "string" ? value : JSON.stringify(value)}`);
483
+ lines.push(` |- ${key}: ${typeof value === "string" ? value : JSON.stringify(value)}`);
484
484
  }
485
485
  }
486
486
  if (issue.source) {
487
- lines.push(` \u251C\u2500 Source: ${issue.source}`);
487
+ lines.push(` |- Source: ${issue.source}`);
488
488
  }
489
489
  if (issue.suggestion) {
490
- lines.push(` \u251C\u2500 Suggestion: ${issue.suggestion}`);
490
+ lines.push(` |- Suggestion: ${issue.suggestion}`);
491
491
  }
492
492
  if (issue.stack) {
493
493
  const stackPreview = issue.stack.split("\n").slice(0, 3).join("\n");
494
- lines.push(` \u2514\u2500 Stack:
494
+ lines.push(` \\- Stack:
495
495
  ${stackPreview}`);
496
496
  } else if (lines.length > 0) {
497
497
  const lastIdx = lines.length - 1;
498
- lines[lastIdx] = lines[lastIdx].replace("\u251C\u2500", "\u2514\u2500");
498
+ lines[lastIdx] = lines[lastIdx].replace("|-", "\\-");
499
499
  }
500
500
  return lines;
501
501
  }
502
502
  function createConsoleReporter() {
503
503
  function report(issue) {
504
- const icon = CATEGORY_ICONS[issue.category] ?? "\u{1F50D}";
504
+ const categoryLabel = CATEGORY_LABELS[issue.category] ?? "[DL]";
505
505
  const color = SEVERITY_COLORS[issue.severity];
506
506
  const label = SEVERITY_LABELS[issue.severity];
507
- const header = `${icon} DevLens [${label}] ${issue.category}: ${issue.message}`;
507
+ const header = `${categoryLabel} DevLens [${label}] ${issue.category}: ${issue.message}`;
508
508
  const details = formatDetails(issue);
509
509
  const consoleFn = issue.severity === "error" ? console.error : issue.severity === "warn" ? console.warn : console.log;
510
510
  console.groupCollapsed(
@@ -523,7 +523,7 @@ function createConsoleReporter() {
523
523
  function reportBatch(issues) {
524
524
  if (issues.length === 0) return;
525
525
  console.groupCollapsed(
526
- `%c\u{1F50D} DevLens \u2014 ${issues.length} issue(s) detected`,
526
+ `%c[DL] DevLens -- ${issues.length} issue(s) detected`,
527
527
  "color: #ff4444; font-weight: bold; font-size: 12px;"
528
528
  );
529
529
  for (const issue of issues) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/network/interceptor.ts","../src/guardian/data-guardian.ts","../src/catcher/global-catcher.ts","../src/reporter/console-reporter.ts","../src/engine/detection-engine.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type {\n DevLensEngine,\n NetworkInterceptorConfig,\n DetectedIssue,\n Severity,\n} from '../types';\n\nfunction matchesPattern(url: string, patterns: (string | RegExp)[]): boolean {\n return patterns.some((p) =>\n typeof p === 'string' ? url.includes(p) : p.test(url),\n );\n}\n\nfunction generateIssueId(method: string, url: string, status: number): string {\n return `network:${method}:${url}:${status}`;\n}\n\nfunction severityFromStatus(status: number): Severity {\n if (status >= 500) return 'error';\n if (status >= 400) return 'warn';\n return 'info';\n}\n\nfunction buildSuggestion(\n method: string,\n url: string,\n status: number,\n): string {\n if (status >= 500)\n return `Server returned ${status} for ${method} ${url} — check server logs`;\n if (status === 404)\n return `Endpoint ${url} not found — verify the URL is correct`;\n if (status === 401 || status === 403)\n return `Authentication/authorization failed for ${url} — check credentials or permissions`;\n if (status >= 400)\n return `Client error ${status} for ${method} ${url} — check request parameters`;\n return `Request to ${url} completed with status ${status}`;\n}\n\nexport function createNetworkInterceptor(\n engine: DevLensEngine,\n config?: NetworkInterceptorConfig | boolean,\n) {\n const resolvedConfig: NetworkInterceptorConfig =\n typeof config === 'boolean' || config === undefined\n ? {}\n : config;\n\n const interceptFetch = resolvedConfig.fetch !== false;\n const interceptXhr = resolvedConfig.xhr !== false;\n const ignoreUrls = resolvedConfig.ignoreUrls ?? [];\n const logSuccess = resolvedConfig.logSuccess ?? false;\n\n let originalFetch: typeof globalThis.fetch | null = null;\n let originalXhrOpen: typeof XMLHttpRequest.prototype.open | null = null;\n let originalXhrSend: typeof XMLHttpRequest.prototype.send | null = null;\n\n function shouldIgnore(url: string): boolean {\n return ignoreUrls.length > 0 && matchesPattern(url, ignoreUrls);\n }\n\n function reportNetworkIssue(\n method: string,\n url: string,\n status: number,\n statusText: string,\n duration: number,\n error?: Error,\n ): void {\n if (!engine.isEnabled()) return;\n\n const severity = error ? 'error' : severityFromStatus(status);\n if (severity === 'info' && !logSuccess) return;\n\n const issue: DetectedIssue = {\n id: generateIssueId(method, url, status),\n timestamp: Date.now(),\n severity,\n category: 'network',\n message: error\n ? `${method} ${url} failed: ${error.message}`\n : `${method} ${url} returned ${status} ${statusText}`,\n details: {\n url,\n method,\n status,\n statusText,\n duration: `${duration}ms`,\n },\n suggestion: error\n ? `Network request to ${url} failed — check if the server is running and the URL is correct`\n : buildSuggestion(method, url, status),\n stack: error?.stack,\n source: 'NetworkInterceptor',\n };\n\n engine.report(issue);\n }\n\n function installFetchInterceptor(): void {\n if (typeof globalThis.fetch === 'undefined') return;\n originalFetch = globalThis.fetch;\n\n const savedFetch = originalFetch;\n globalThis.fetch = async function devlensFetch(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n const url =\n typeof input === 'string'\n ? input\n : input instanceof URL\n ? input.toString()\n : input.url;\n\n const method = init?.method ?? 'GET';\n\n if (shouldIgnore(url)) {\n return savedFetch.call(globalThis, input, init);\n }\n\n const start = performance.now();\n\n try {\n const response = await savedFetch.call(globalThis, input, init);\n const duration = Math.round(performance.now() - start);\n\n if (!response.ok || logSuccess) {\n reportNetworkIssue(\n method.toUpperCase(),\n url,\n response.status,\n response.statusText,\n duration,\n );\n }\n\n return response;\n } catch (err) {\n const duration = Math.round(performance.now() - start);\n reportNetworkIssue(\n method.toUpperCase(),\n url,\n 0,\n 'Network Error',\n duration,\n err instanceof Error ? err : new Error(String(err)),\n );\n throw err;\n }\n };\n }\n\n function installXhrInterceptor(): void {\n if (typeof XMLHttpRequest === 'undefined') return;\n\n originalXhrOpen = XMLHttpRequest.prototype.open;\n originalXhrSend = XMLHttpRequest.prototype.send;\n\n const savedOpen = originalXhrOpen;\n const savedSend = originalXhrSend;\n\n XMLHttpRequest.prototype.open = function devlensXhrOpen(\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ): void {\n (this as XMLHttpRequest & { _devlens_method: string })._devlens_method =\n method;\n (this as XMLHttpRequest & { _devlens_url: string })._devlens_url =\n typeof url === 'string' ? url : url.toString();\n return savedOpen.apply(\n this,\n [method, url, ...rest] as Parameters<typeof savedOpen>,\n );\n };\n\n XMLHttpRequest.prototype.send = function devlensXhrSend(\n body?: Document | XMLHttpRequestBodyInit | null,\n ): void {\n const xhr = this as XMLHttpRequest & {\n _devlens_method: string;\n _devlens_url: string;\n };\n const method = xhr._devlens_method ?? 'GET';\n const url = xhr._devlens_url ?? '';\n\n if (shouldIgnore(url)) {\n return savedSend.call(this, body);\n }\n\n const start = performance.now();\n\n const onLoadEnd = (): void => {\n const duration = Math.round(performance.now() - start);\n if (xhr.status >= 400 || logSuccess) {\n reportNetworkIssue(\n method.toUpperCase(),\n url,\n xhr.status,\n xhr.statusText,\n duration,\n );\n }\n xhr.removeEventListener('loadend', onLoadEnd);\n xhr.removeEventListener('error', onError);\n };\n\n const onError = (): void => {\n const duration = Math.round(performance.now() - start);\n reportNetworkIssue(\n method.toUpperCase(),\n url,\n 0,\n 'Network Error',\n duration,\n new Error('XMLHttpRequest network error'),\n );\n xhr.removeEventListener('loadend', onLoadEnd);\n xhr.removeEventListener('error', onError);\n };\n\n xhr.addEventListener('loadend', onLoadEnd);\n xhr.addEventListener('error', onError);\n\n return savedSend.call(this, body);\n };\n }\n\n function install(): void {\n if (typeof window === 'undefined') return;\n if (interceptFetch) installFetchInterceptor();\n if (interceptXhr) installXhrInterceptor();\n }\n\n function uninstall(): void {\n if (originalFetch) {\n globalThis.fetch = originalFetch;\n originalFetch = null;\n }\n if (originalXhrOpen) {\n XMLHttpRequest.prototype.open = originalXhrOpen;\n originalXhrOpen = null;\n }\n if (originalXhrSend) {\n XMLHttpRequest.prototype.send = originalXhrSend;\n originalXhrSend = null;\n }\n }\n\n return { install, uninstall };\n}\n","import type {\n DevLensEngine,\n DataGuardianConfig,\n DetectedIssue,\n IssueCategory,\n} from '../types';\n\nconst SKIP_PROPERTIES = new Set([\n 'constructor',\n 'prototype',\n '__proto__',\n 'toJSON',\n 'toString',\n 'valueOf',\n 'length',\n 'then',\n 'catch',\n 'finally',\n '$$typeof',\n '_owner',\n '_store',\n 'ref',\n 'key',\n '_self',\n '_source',\n 'displayName',\n 'nodeType',\n]);\n\nconst NON_PROXYABLE_TYPES = new Set([\n '[object Date]',\n '[object RegExp]',\n '[object Map]',\n '[object Set]',\n '[object WeakMap]',\n '[object WeakSet]',\n '[object Error]',\n '[object Promise]',\n '[object ArrayBuffer]',\n '[object DataView]',\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Float32Array]',\n '[object Float64Array]',\n]);\n\nfunction isProxyable(value: unknown): value is object {\n if (value === null || value === undefined) return false;\n if (typeof value !== 'object' && typeof value !== 'function') return false;\n const tag = Object.prototype.toString.call(value);\n return !NON_PROXYABLE_TYPES.has(tag);\n}\n\nexport function createDataGuardian(\n engine: DevLensEngine,\n config?: DataGuardianConfig | boolean,\n) {\n const resolvedConfig: DataGuardianConfig =\n typeof config === 'boolean' || config === undefined ? {} : config;\n\n const maxDepth = resolvedConfig.maxDepth ?? 5;\n const ignorePaths = new Set(resolvedConfig.ignorePaths ?? []);\n const verbose = resolvedConfig.verbose ?? false;\n\n const proxyCache = new WeakMap<object, object>();\n\n function shouldIgnorePath(path: string): boolean {\n if (ignorePaths.size === 0) return false;\n return ignorePaths.has(path);\n }\n\n function reportAccess(\n path: string,\n value: null | undefined,\n label: string,\n ): void {\n if (!engine.isEnabled()) return;\n if (shouldIgnorePath(path)) return;\n\n const isNull = value === null;\n const category: IssueCategory = isNull ? 'null-access' : 'undefined-data';\n const prop = path.split('.').pop() ?? path;\n\n const issue: DetectedIssue = {\n id: `${category}:${path}`,\n timestamp: Date.now(),\n severity: 'warn',\n category,\n message: `Property \"${prop}\" is ${isNull ? 'null' : 'undefined'} at path \"${path}\"`,\n path,\n foundValue: value,\n expectedType: 'non-nullish value',\n source: label,\n suggestion: `Check if \"${prop}\" is loaded/initialized before accessing. Full path: ${path}`,\n };\n\n engine.report(issue);\n }\n\n function createProxy<T extends object>(\n target: T,\n label: string,\n parentPath: string,\n depth: number,\n ): T {\n if (depth > maxDepth) return target;\n\n const cached = proxyCache.get(target);\n if (cached) return cached as T;\n\n const proxy = new Proxy(target, {\n get(obj, prop, receiver): unknown {\n if (typeof prop === 'symbol') {\n return Reflect.get(obj, prop, receiver);\n }\n\n if (SKIP_PROPERTIES.has(prop)) {\n return Reflect.get(obj, prop, receiver);\n }\n\n const currentPath = parentPath ? `${parentPath}.${prop}` : prop;\n const value = Reflect.get(obj, prop, receiver);\n\n if (value === null || value === undefined) {\n const hasOwn =\n Object.prototype.hasOwnProperty.call(obj, prop) ||\n prop in obj;\n if (hasOwn) {\n reportAccess(currentPath, value as null | undefined, label);\n } else if (verbose) {\n reportAccess(currentPath, value as null | undefined, label);\n }\n return value;\n }\n\n if (typeof value === 'function') {\n return value;\n }\n\n if (isProxyable(value)) {\n return createProxy(\n value as object,\n label,\n currentPath,\n depth + 1,\n );\n }\n\n return value;\n },\n\n has(obj, prop): boolean {\n return Reflect.has(obj, prop);\n },\n\n ownKeys(obj): (string | symbol)[] {\n return Reflect.ownKeys(obj);\n },\n\n getOwnPropertyDescriptor(\n obj,\n prop,\n ): PropertyDescriptor | undefined {\n return Reflect.getOwnPropertyDescriptor(obj, prop);\n },\n\n set(obj, prop, value, receiver): boolean {\n return Reflect.set(obj, prop, value, receiver);\n },\n\n deleteProperty(obj, prop): boolean {\n return Reflect.deleteProperty(obj, prop);\n },\n });\n\n proxyCache.set(target, proxy);\n return proxy as T;\n }\n\n function guard<T extends object>(target: T, label?: string): T {\n if (target === null || target === undefined) {\n const nullLabel = label ?? 'unknown';\n const issue: DetectedIssue = {\n id: `null-access:${nullLabel}:root`,\n timestamp: Date.now(),\n severity: 'error',\n category: target === null ? 'null-access' : 'undefined-data',\n message: `Attempted to guard a ${target === null ? 'null' : 'undefined'} value (label: \"${nullLabel}\")`,\n path: nullLabel,\n foundValue: target,\n source: nullLabel,\n suggestion: `The value passed to guard() is ${target === null ? 'null' : 'undefined'}. Ensure data is loaded before guarding.`,\n };\n engine.report(issue);\n return target;\n }\n\n if (!isProxyable(target)) return target;\n return createProxy(target, label ?? 'guarded', '', 0);\n }\n\n function guardDeep<T extends object>(target: T, label?: string): T {\n if (target === null || target === undefined) return guard(target, label);\n if (!isProxyable(target)) return target;\n\n const seen = new WeakSet<object>();\n const resolvedLabel = label ?? 'guarded';\n\n function walkAndProxy(obj: object, path: string, depth: number): void {\n if (depth > maxDepth) return;\n if (seen.has(obj)) return;\n seen.add(obj);\n\n const keys = Object.keys(obj);\n for (const key of keys) {\n const value = (obj as Record<string, unknown>)[key];\n if (value !== null && value !== undefined && isProxyable(value)) {\n const childPath = path ? `${path}.${key}` : key;\n createProxy(value as object, resolvedLabel, childPath, depth + 1);\n walkAndProxy(value as object, childPath, depth + 1);\n }\n }\n }\n\n walkAndProxy(target, '', 0);\n return createProxy(target, resolvedLabel, '', 0);\n }\n\n function unguardAll(): void {\n }\n\n return { guard, guardDeep, unguardAll };\n}\n","import type { DevLensEngine, GlobalCatcherConfig, DetectedIssue } from '../types';\n\nexport function createGlobalCatcher(\n engine: DevLensEngine,\n config?: GlobalCatcherConfig | boolean,\n) {\n const resolvedConfig: GlobalCatcherConfig =\n typeof config === 'boolean' || config === undefined ? {} : config;\n\n const catchWindowErrors = resolvedConfig.windowErrors !== false;\n const catchRejections = resolvedConfig.unhandledRejections !== false;\n const catchConsoleErrors = resolvedConfig.consoleErrors === true;\n\n let originalConsoleError: typeof console.error | null = null;\n\n function handleWindowError(event: ErrorEvent): void {\n if (!engine.isEnabled()) return;\n\n const issue: DetectedIssue = {\n id: `unhandled-error:${event.message}:${event.filename ?? ''}:${event.lineno ?? 0}`,\n timestamp: Date.now(),\n severity: 'error',\n category: 'unhandled-error',\n message: event.message || 'Unknown error',\n details: {\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n },\n stack: event.error?.stack,\n source: event.filename\n ? `${event.filename}:${event.lineno}:${event.colno}`\n : 'unknown',\n suggestion: event.filename\n ? `Unhandled error at ${event.filename}:${event.lineno} — wrap in try/catch or add error boundary`\n : 'Unhandled error — add error handling to locate the source',\n };\n\n engine.report(issue);\n }\n\n function handleUnhandledRejection(event: PromiseRejectionEvent): void {\n if (!engine.isEnabled()) return;\n\n const reason = event.reason;\n const message =\n reason instanceof Error\n ? reason.message\n : typeof reason === 'string'\n ? reason\n : 'Unknown rejection reason';\n\n const issue: DetectedIssue = {\n id: `unhandled-rejection:${message}`,\n timestamp: Date.now(),\n severity: 'error',\n category: 'unhandled-rejection',\n message: `Unhandled Promise rejection: ${message}`,\n details: {\n reason:\n reason instanceof Error\n ? { name: reason.name, message: reason.message }\n : reason,\n },\n stack: reason instanceof Error ? reason.stack : undefined,\n source: 'Promise',\n suggestion:\n 'Add .catch() to the Promise or use try/catch with await',\n };\n\n engine.report(issue);\n }\n\n function installConsoleInterceptor(): void {\n if (typeof console === 'undefined') return;\n originalConsoleError = console.error;\n\n const saved = originalConsoleError;\n console.error = function devlensConsoleError(\n ...args: unknown[]\n ): void {\n saved.apply(console, args);\n\n if (!engine.isEnabled()) return;\n\n const message = args\n .map((arg) =>\n typeof arg === 'string' ? arg : JSON.stringify(arg),\n )\n .join(' ');\n\n const issue: DetectedIssue = {\n id: `unhandled-error:console:${message.slice(0, 100)}`,\n timestamp: Date.now(),\n severity: 'error',\n category: 'unhandled-error',\n message: `console.error: ${message}`,\n details: { args },\n source: 'console.error',\n suggestion:\n 'A console.error was detected — investigate the error above',\n };\n\n engine.report(issue);\n };\n }\n\n function install(): void {\n if (typeof window === 'undefined') return;\n\n if (catchWindowErrors) {\n window.addEventListener('error', handleWindowError);\n }\n if (catchRejections) {\n window.addEventListener(\n 'unhandledrejection',\n handleUnhandledRejection,\n );\n }\n if (catchConsoleErrors) {\n installConsoleInterceptor();\n }\n }\n\n function uninstall(): void {\n if (typeof window !== 'undefined') {\n window.removeEventListener('error', handleWindowError);\n window.removeEventListener(\n 'unhandledrejection',\n handleUnhandledRejection,\n );\n }\n if (originalConsoleError) {\n console.error = originalConsoleError;\n originalConsoleError = null;\n }\n }\n\n return { install, uninstall };\n}\n","import type { Reporter, DetectedIssue, Severity, IssueCategory } from '../types';\n\nconst CATEGORY_ICONS: Record<IssueCategory, string> = {\n 'network': '\\u{1F310}',\n 'null-access': '\\u{1F480}',\n 'undefined-data': '\\u{1F47B}',\n 'render-data': '\\u{1F3A8}',\n 'unhandled-error': '\\u{1F4A5}',\n 'unhandled-rejection': '\\u26A1',\n 'type-mismatch': '\\u{1F500}',\n};\n\nconst SEVERITY_COLORS: Record<Severity, string> = {\n error: '#ff4444',\n warn: '#ffaa00',\n info: '#4488ff',\n};\n\nconst SEVERITY_LABELS: Record<Severity, string> = {\n error: 'ERROR',\n warn: 'WARN',\n info: 'INFO',\n};\n\nfunction formatDetails(issue: DetectedIssue): string[] {\n const lines: string[] = [];\n\n if (issue.path) {\n lines.push(` \\u251C\\u2500 Path: ${issue.path}`);\n }\n\n if (issue.foundValue !== undefined) {\n lines.push(\n ` \\u251C\\u2500 Value: ${issue.foundValue === null ? 'null' : String(issue.foundValue)}`,\n );\n }\n\n if (issue.details) {\n const entries = Object.entries(issue.details);\n for (const [key, value] of entries) {\n lines.push(` \\u251C\\u2500 ${key}: ${typeof value === 'string' ? value : JSON.stringify(value)}`);\n }\n }\n\n if (issue.source) {\n lines.push(` \\u251C\\u2500 Source: ${issue.source}`);\n }\n\n if (issue.suggestion) {\n lines.push(` \\u251C\\u2500 Suggestion: ${issue.suggestion}`);\n }\n\n if (issue.stack) {\n const stackPreview = issue.stack.split('\\n').slice(0, 3).join('\\n');\n lines.push(` \\u2514\\u2500 Stack:\\n${stackPreview}`);\n } else if (lines.length > 0) {\n const lastIdx = lines.length - 1;\n lines[lastIdx] = lines[lastIdx].replace('\\u251C\\u2500', '\\u2514\\u2500');\n }\n\n return lines;\n}\n\nexport function createConsoleReporter(): Reporter {\n function report(issue: DetectedIssue): void {\n const icon = CATEGORY_ICONS[issue.category] ?? '\\u{1F50D}';\n const color = SEVERITY_COLORS[issue.severity];\n const label = SEVERITY_LABELS[issue.severity];\n\n const header = `${icon} DevLens [${label}] ${issue.category}: ${issue.message}`;\n const details = formatDetails(issue);\n\n const consoleFn =\n issue.severity === 'error'\n ? console.error\n : issue.severity === 'warn'\n ? console.warn\n : console.log;\n\n console.groupCollapsed(\n `%c${header}`,\n `color: ${color}; font-weight: bold;`,\n );\n\n for (const line of details) {\n consoleFn(line);\n }\n\n consoleFn(\n `%cTimestamp: ${new Date(issue.timestamp).toISOString()}`,\n 'color: #888;',\n );\n\n console.groupEnd();\n }\n\n function reportBatch(issues: DetectedIssue[]): void {\n if (issues.length === 0) return;\n\n console.groupCollapsed(\n `%c\\u{1F50D} DevLens — ${issues.length} issue(s) detected`,\n 'color: #ff4444; font-weight: bold; font-size: 12px;',\n );\n\n for (const issue of issues) {\n report(issue);\n }\n\n console.groupEnd();\n }\n\n function clear(): void {\n console.clear();\n }\n\n return { report, reportBatch, clear };\n}\n","import type {\n DevLensConfig,\n DevLensEngine,\n DetectedIssue,\n Reporter,\n Severity,\n} from '../types';\nimport { createConsoleReporter } from '../reporter/console-reporter';\n\nconst SEVERITY_RANK: Record<Severity, number> = {\n info: 0,\n warn: 1,\n error: 2,\n};\n\nfunction matchesAnyPattern(\n value: string | undefined,\n patterns: (string | RegExp)[],\n): boolean {\n if (!value || patterns.length === 0) return false;\n return patterns.some((p) =>\n typeof p === 'string' ? value.includes(p) : p.test(value),\n );\n}\n\nexport function createDetectionEngine(\n config: DevLensConfig = {},\n): DevLensEngine {\n const resolvedConfig: Required<\n Pick<DevLensConfig, 'enabled' | 'minSeverity' | 'throttleMs' | 'maxIssues'>\n > &\n DevLensConfig = {\n enabled: config.enabled ?? true,\n minSeverity: config.minSeverity ?? 'info',\n throttleMs: config.throttleMs ?? 1000,\n maxIssues: config.maxIssues ?? 100,\n ...config,\n };\n\n const reporter: Reporter =\n resolvedConfig.reporter ?? createConsoleReporter();\n const issues: DetectedIssue[] = [];\n const subscribers = new Set<(issue: DetectedIssue) => void>();\n const lastReportedAt = new Map<string, number>();\n\n function isEnabled(): boolean {\n if (!resolvedConfig.enabled) return false;\n if (typeof window === 'undefined') return false;\n try {\n if (\n typeof process !== 'undefined' &&\n process.env?.NODE_ENV === 'production'\n ) {\n return false;\n }\n } catch {\n // process may not be defined in browser\n }\n return true;\n }\n\n function meetsMinSeverity(severity: Severity): boolean {\n return (\n SEVERITY_RANK[severity] >= SEVERITY_RANK[resolvedConfig.minSeverity]\n );\n }\n\n function isThrottled(id: string, now: number): boolean {\n const lastTime = lastReportedAt.get(id);\n if (lastTime === undefined) return false;\n return now - lastTime < resolvedConfig.throttleMs;\n }\n\n function isIgnored(issue: DetectedIssue): boolean {\n const ignore = resolvedConfig.ignore;\n if (!ignore) return false;\n\n if (\n ignore.urls &&\n matchesAnyPattern(\n issue.details?.url as string | undefined,\n ignore.urls,\n )\n ) {\n return true;\n }\n\n if (ignore.paths && matchesAnyPattern(issue.path, ignore.paths)) {\n return true;\n }\n\n if (ignore.messages && matchesAnyPattern(issue.message, ignore.messages)) {\n return true;\n }\n\n return false;\n }\n\n function addToBuffer(issue: DetectedIssue): void {\n issues.push(issue);\n if (issues.length > resolvedConfig.maxIssues) {\n issues.shift();\n }\n }\n\n function report(issue: DetectedIssue): void {\n if (!isEnabled()) return;\n if (!meetsMinSeverity(issue.severity)) return;\n\n const now = Date.now();\n if (isThrottled(issue.id, now)) return;\n if (isIgnored(issue)) return;\n\n lastReportedAt.set(issue.id, now);\n addToBuffer(issue);\n\n reporter.report(issue);\n\n for (const callback of subscribers) {\n try {\n callback(issue);\n } catch {\n // subscriber errors should not break the engine\n }\n }\n }\n\n function getConfig(): Readonly<DevLensConfig> {\n return Object.freeze({ ...resolvedConfig });\n }\n\n function getIssues(): readonly DetectedIssue[] {\n return [...issues];\n }\n\n function subscribe(\n callback: (issue: DetectedIssue) => void,\n ): () => void {\n subscribers.add(callback);\n return () => {\n subscribers.delete(callback);\n };\n }\n\n return {\n report,\n getConfig,\n getIssues,\n subscribe,\n isEnabled,\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/network/interceptor.ts","../src/guardian/data-guardian.ts","../src/catcher/global-catcher.ts","../src/reporter/console-reporter.ts","../src/engine/detection-engine.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type {\n DevLensEngine,\n NetworkInterceptorConfig,\n DetectedIssue,\n Severity,\n} from '../types';\n\nfunction matchesPattern(url: string, patterns: (string | RegExp)[]): boolean {\n return patterns.some((p) =>\n typeof p === 'string' ? url.includes(p) : p.test(url),\n );\n}\n\nfunction generateIssueId(method: string, url: string, status: number): string {\n return `network:${method}:${url}:${status}`;\n}\n\nfunction severityFromStatus(status: number): Severity {\n if (status >= 500) return 'error';\n if (status >= 400) return 'warn';\n return 'info';\n}\n\nfunction buildSuggestion(\n method: string,\n url: string,\n status: number,\n): string {\n if (status >= 500)\n return `Server returned ${status} for ${method} ${url} — check server logs`;\n if (status === 404)\n return `Endpoint ${url} not found — verify the URL is correct`;\n if (status === 401 || status === 403)\n return `Authentication/authorization failed for ${url} — check credentials or permissions`;\n if (status >= 400)\n return `Client error ${status} for ${method} ${url} — check request parameters`;\n return `Request to ${url} completed with status ${status}`;\n}\n\nexport function createNetworkInterceptor(\n engine: DevLensEngine,\n config?: NetworkInterceptorConfig | boolean,\n) {\n const resolvedConfig: NetworkInterceptorConfig =\n typeof config === 'boolean' || config === undefined\n ? {}\n : config;\n\n const interceptFetch = resolvedConfig.fetch !== false;\n const interceptXhr = resolvedConfig.xhr !== false;\n const ignoreUrls = resolvedConfig.ignoreUrls ?? [];\n const logSuccess = resolvedConfig.logSuccess ?? false;\n\n let originalFetch: typeof globalThis.fetch | null = null;\n let originalXhrOpen: typeof XMLHttpRequest.prototype.open | null = null;\n let originalXhrSend: typeof XMLHttpRequest.prototype.send | null = null;\n\n function shouldIgnore(url: string): boolean {\n return ignoreUrls.length > 0 && matchesPattern(url, ignoreUrls);\n }\n\n function reportNetworkIssue(\n method: string,\n url: string,\n status: number,\n statusText: string,\n duration: number,\n error?: Error,\n ): void {\n if (!engine.isEnabled()) return;\n\n const severity = error ? 'error' : severityFromStatus(status);\n if (severity === 'info' && !logSuccess) return;\n\n const issue: DetectedIssue = {\n id: generateIssueId(method, url, status),\n timestamp: Date.now(),\n severity,\n category: 'network',\n message: error\n ? `${method} ${url} failed: ${error.message}`\n : `${method} ${url} returned ${status} ${statusText}`,\n details: {\n url,\n method,\n status,\n statusText,\n duration: `${duration}ms`,\n },\n suggestion: error\n ? `Network request to ${url} failed — check if the server is running and the URL is correct`\n : buildSuggestion(method, url, status),\n stack: error?.stack,\n source: 'NetworkInterceptor',\n };\n\n engine.report(issue);\n }\n\n function installFetchInterceptor(): void {\n if (typeof globalThis.fetch === 'undefined') return;\n originalFetch = globalThis.fetch;\n\n const savedFetch = originalFetch;\n globalThis.fetch = async function devlensFetch(\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> {\n const url =\n typeof input === 'string'\n ? input\n : input instanceof URL\n ? input.toString()\n : input.url;\n\n const method = init?.method ?? 'GET';\n\n if (shouldIgnore(url)) {\n return savedFetch.call(globalThis, input, init);\n }\n\n const start = performance.now();\n\n try {\n const response = await savedFetch.call(globalThis, input, init);\n const duration = Math.round(performance.now() - start);\n\n if (!response.ok || logSuccess) {\n reportNetworkIssue(\n method.toUpperCase(),\n url,\n response.status,\n response.statusText,\n duration,\n );\n }\n\n return response;\n } catch (err) {\n const duration = Math.round(performance.now() - start);\n reportNetworkIssue(\n method.toUpperCase(),\n url,\n 0,\n 'Network Error',\n duration,\n err instanceof Error ? err : new Error(String(err)),\n );\n throw err;\n }\n };\n }\n\n function installXhrInterceptor(): void {\n if (typeof XMLHttpRequest === 'undefined') return;\n\n originalXhrOpen = XMLHttpRequest.prototype.open;\n originalXhrSend = XMLHttpRequest.prototype.send;\n\n const savedOpen = originalXhrOpen;\n const savedSend = originalXhrSend;\n\n XMLHttpRequest.prototype.open = function devlensXhrOpen(\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ): void {\n (this as XMLHttpRequest & { _devlens_method: string })._devlens_method =\n method;\n (this as XMLHttpRequest & { _devlens_url: string })._devlens_url =\n typeof url === 'string' ? url : url.toString();\n return savedOpen.apply(\n this,\n [method, url, ...rest] as Parameters<typeof savedOpen>,\n );\n };\n\n XMLHttpRequest.prototype.send = function devlensXhrSend(\n body?: Document | XMLHttpRequestBodyInit | null,\n ): void {\n const xhr = this as XMLHttpRequest & {\n _devlens_method: string;\n _devlens_url: string;\n };\n const method = xhr._devlens_method ?? 'GET';\n const url = xhr._devlens_url ?? '';\n\n if (shouldIgnore(url)) {\n return savedSend.call(this, body);\n }\n\n const start = performance.now();\n\n const onLoadEnd = (): void => {\n const duration = Math.round(performance.now() - start);\n if (xhr.status >= 400 || logSuccess) {\n reportNetworkIssue(\n method.toUpperCase(),\n url,\n xhr.status,\n xhr.statusText,\n duration,\n );\n }\n xhr.removeEventListener('loadend', onLoadEnd);\n xhr.removeEventListener('error', onError);\n };\n\n const onError = (): void => {\n const duration = Math.round(performance.now() - start);\n reportNetworkIssue(\n method.toUpperCase(),\n url,\n 0,\n 'Network Error',\n duration,\n new Error('XMLHttpRequest network error'),\n );\n xhr.removeEventListener('loadend', onLoadEnd);\n xhr.removeEventListener('error', onError);\n };\n\n xhr.addEventListener('loadend', onLoadEnd);\n xhr.addEventListener('error', onError);\n\n return savedSend.call(this, body);\n };\n }\n\n function install(): void {\n if (typeof window === 'undefined') return;\n if (interceptFetch) installFetchInterceptor();\n if (interceptXhr) installXhrInterceptor();\n }\n\n function uninstall(): void {\n if (originalFetch) {\n globalThis.fetch = originalFetch;\n originalFetch = null;\n }\n if (originalXhrOpen) {\n XMLHttpRequest.prototype.open = originalXhrOpen;\n originalXhrOpen = null;\n }\n if (originalXhrSend) {\n XMLHttpRequest.prototype.send = originalXhrSend;\n originalXhrSend = null;\n }\n }\n\n return { install, uninstall };\n}\n","import type {\n DevLensEngine,\n DataGuardianConfig,\n DetectedIssue,\n IssueCategory,\n} from '../types';\n\nconst SKIP_PROPERTIES = new Set([\n 'constructor',\n 'prototype',\n '__proto__',\n 'toJSON',\n 'toString',\n 'valueOf',\n 'length',\n 'then',\n 'catch',\n 'finally',\n '$$typeof',\n '_owner',\n '_store',\n 'ref',\n 'key',\n '_self',\n '_source',\n 'displayName',\n 'nodeType',\n]);\n\nconst NON_PROXYABLE_TYPES = new Set([\n '[object Date]',\n '[object RegExp]',\n '[object Map]',\n '[object Set]',\n '[object WeakMap]',\n '[object WeakSet]',\n '[object Error]',\n '[object Promise]',\n '[object ArrayBuffer]',\n '[object DataView]',\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Float32Array]',\n '[object Float64Array]',\n]);\n\nfunction isProxyable(value: unknown): value is object {\n if (value === null || value === undefined) return false;\n if (typeof value !== 'object' && typeof value !== 'function') return false;\n const tag = Object.prototype.toString.call(value);\n return !NON_PROXYABLE_TYPES.has(tag);\n}\n\nexport function createDataGuardian(\n engine: DevLensEngine,\n config?: DataGuardianConfig | boolean,\n) {\n const resolvedConfig: DataGuardianConfig =\n typeof config === 'boolean' || config === undefined ? {} : config;\n\n const maxDepth = resolvedConfig.maxDepth ?? 5;\n const ignorePaths = new Set(resolvedConfig.ignorePaths ?? []);\n const verbose = resolvedConfig.verbose ?? false;\n\n const proxyCache = new WeakMap<object, object>();\n\n function shouldIgnorePath(path: string): boolean {\n if (ignorePaths.size === 0) return false;\n return ignorePaths.has(path);\n }\n\n function reportAccess(\n path: string,\n value: null | undefined,\n label: string,\n ): void {\n if (!engine.isEnabled()) return;\n if (shouldIgnorePath(path)) return;\n\n const isNull = value === null;\n const category: IssueCategory = isNull ? 'null-access' : 'undefined-data';\n const prop = path.split('.').pop() ?? path;\n\n const issue: DetectedIssue = {\n id: `${category}:${path}`,\n timestamp: Date.now(),\n severity: 'warn',\n category,\n message: `Property \"${prop}\" is ${isNull ? 'null' : 'undefined'} at path \"${path}\"`,\n path,\n foundValue: value,\n expectedType: 'non-nullish value',\n source: label,\n suggestion: `Check if \"${prop}\" is loaded/initialized before accessing. Full path: ${path}`,\n };\n\n engine.report(issue);\n }\n\n function createProxy<T extends object>(\n target: T,\n label: string,\n parentPath: string,\n depth: number,\n ): T {\n if (depth > maxDepth) return target;\n\n const cached = proxyCache.get(target);\n if (cached) return cached as T;\n\n const proxy = new Proxy(target, {\n get(obj, prop, receiver): unknown {\n if (typeof prop === 'symbol') {\n return Reflect.get(obj, prop, receiver);\n }\n\n if (SKIP_PROPERTIES.has(prop)) {\n return Reflect.get(obj, prop, receiver);\n }\n\n const currentPath = parentPath ? `${parentPath}.${prop}` : prop;\n const value = Reflect.get(obj, prop, receiver);\n\n if (value === null || value === undefined) {\n const hasOwn =\n Object.prototype.hasOwnProperty.call(obj, prop) ||\n prop in obj;\n if (hasOwn) {\n reportAccess(currentPath, value as null | undefined, label);\n } else if (verbose) {\n reportAccess(currentPath, value as null | undefined, label);\n }\n return value;\n }\n\n if (typeof value === 'function') {\n return value;\n }\n\n if (isProxyable(value)) {\n return createProxy(\n value as object,\n label,\n currentPath,\n depth + 1,\n );\n }\n\n return value;\n },\n\n has(obj, prop): boolean {\n return Reflect.has(obj, prop);\n },\n\n ownKeys(obj): (string | symbol)[] {\n return Reflect.ownKeys(obj);\n },\n\n getOwnPropertyDescriptor(\n obj,\n prop,\n ): PropertyDescriptor | undefined {\n return Reflect.getOwnPropertyDescriptor(obj, prop);\n },\n\n set(obj, prop, value, receiver): boolean {\n return Reflect.set(obj, prop, value, receiver);\n },\n\n deleteProperty(obj, prop): boolean {\n return Reflect.deleteProperty(obj, prop);\n },\n });\n\n proxyCache.set(target, proxy);\n return proxy as T;\n }\n\n function guard<T extends object>(target: T, label?: string): T {\n if (target === null || target === undefined) {\n const nullLabel = label ?? 'unknown';\n const issue: DetectedIssue = {\n id: `null-access:${nullLabel}:root`,\n timestamp: Date.now(),\n severity: 'error',\n category: target === null ? 'null-access' : 'undefined-data',\n message: `Attempted to guard a ${target === null ? 'null' : 'undefined'} value (label: \"${nullLabel}\")`,\n path: nullLabel,\n foundValue: target,\n source: nullLabel,\n suggestion: `The value passed to guard() is ${target === null ? 'null' : 'undefined'}. Ensure data is loaded before guarding.`,\n };\n engine.report(issue);\n return target;\n }\n\n if (!isProxyable(target)) return target;\n return createProxy(target, label ?? 'guarded', '', 0);\n }\n\n function guardDeep<T extends object>(target: T, label?: string): T {\n if (target === null || target === undefined) return guard(target, label);\n if (!isProxyable(target)) return target;\n\n const seen = new WeakSet<object>();\n const resolvedLabel = label ?? 'guarded';\n\n function walkAndProxy(obj: object, path: string, depth: number): void {\n if (depth > maxDepth) return;\n if (seen.has(obj)) return;\n seen.add(obj);\n\n const keys = Object.keys(obj);\n for (const key of keys) {\n const value = (obj as Record<string, unknown>)[key];\n if (value !== null && value !== undefined && isProxyable(value)) {\n const childPath = path ? `${path}.${key}` : key;\n createProxy(value as object, resolvedLabel, childPath, depth + 1);\n walkAndProxy(value as object, childPath, depth + 1);\n }\n }\n }\n\n walkAndProxy(target, '', 0);\n return createProxy(target, resolvedLabel, '', 0);\n }\n\n function unguardAll(): void {\n }\n\n return { guard, guardDeep, unguardAll };\n}\n","import type { DevLensEngine, GlobalCatcherConfig, DetectedIssue } from '../types';\n\nexport function createGlobalCatcher(\n engine: DevLensEngine,\n config?: GlobalCatcherConfig | boolean,\n) {\n const resolvedConfig: GlobalCatcherConfig =\n typeof config === 'boolean' || config === undefined ? {} : config;\n\n const catchWindowErrors = resolvedConfig.windowErrors !== false;\n const catchRejections = resolvedConfig.unhandledRejections !== false;\n const catchConsoleErrors = resolvedConfig.consoleErrors === true;\n\n let originalConsoleError: typeof console.error | null = null;\n\n function handleWindowError(event: ErrorEvent): void {\n if (!engine.isEnabled()) return;\n\n const issue: DetectedIssue = {\n id: `unhandled-error:${event.message}:${event.filename ?? ''}:${event.lineno ?? 0}`,\n timestamp: Date.now(),\n severity: 'error',\n category: 'unhandled-error',\n message: event.message || 'Unknown error',\n details: {\n filename: event.filename,\n lineno: event.lineno,\n colno: event.colno,\n },\n stack: event.error?.stack,\n source: event.filename\n ? `${event.filename}:${event.lineno}:${event.colno}`\n : 'unknown',\n suggestion: event.filename\n ? `Unhandled error at ${event.filename}:${event.lineno} — wrap in try/catch or add error boundary`\n : 'Unhandled error — add error handling to locate the source',\n };\n\n engine.report(issue);\n }\n\n function handleUnhandledRejection(event: PromiseRejectionEvent): void {\n if (!engine.isEnabled()) return;\n\n const reason = event.reason;\n const message =\n reason instanceof Error\n ? reason.message\n : typeof reason === 'string'\n ? reason\n : 'Unknown rejection reason';\n\n const issue: DetectedIssue = {\n id: `unhandled-rejection:${message}`,\n timestamp: Date.now(),\n severity: 'error',\n category: 'unhandled-rejection',\n message: `Unhandled Promise rejection: ${message}`,\n details: {\n reason:\n reason instanceof Error\n ? { name: reason.name, message: reason.message }\n : reason,\n },\n stack: reason instanceof Error ? reason.stack : undefined,\n source: 'Promise',\n suggestion:\n 'Add .catch() to the Promise or use try/catch with await',\n };\n\n engine.report(issue);\n }\n\n function installConsoleInterceptor(): void {\n if (typeof console === 'undefined') return;\n originalConsoleError = console.error;\n\n const saved = originalConsoleError;\n console.error = function devlensConsoleError(\n ...args: unknown[]\n ): void {\n saved.apply(console, args);\n\n if (!engine.isEnabled()) return;\n\n const message = args\n .map((arg) =>\n typeof arg === 'string' ? arg : JSON.stringify(arg),\n )\n .join(' ');\n\n const issue: DetectedIssue = {\n id: `unhandled-error:console:${message.slice(0, 100)}`,\n timestamp: Date.now(),\n severity: 'error',\n category: 'unhandled-error',\n message: `console.error: ${message}`,\n details: { args },\n source: 'console.error',\n suggestion:\n 'A console.error was detected — investigate the error above',\n };\n\n engine.report(issue);\n };\n }\n\n function install(): void {\n if (typeof window === 'undefined') return;\n\n if (catchWindowErrors) {\n window.addEventListener('error', handleWindowError);\n }\n if (catchRejections) {\n window.addEventListener(\n 'unhandledrejection',\n handleUnhandledRejection,\n );\n }\n if (catchConsoleErrors) {\n installConsoleInterceptor();\n }\n }\n\n function uninstall(): void {\n if (typeof window !== 'undefined') {\n window.removeEventListener('error', handleWindowError);\n window.removeEventListener(\n 'unhandledrejection',\n handleUnhandledRejection,\n );\n }\n if (originalConsoleError) {\n console.error = originalConsoleError;\n originalConsoleError = null;\n }\n }\n\n return { install, uninstall };\n}\n","import type { Reporter, DetectedIssue, Severity, IssueCategory } from '../types';\n\nconst CATEGORY_LABELS: Record<IssueCategory, string> = {\n 'network': '[NET]',\n 'null-access': '[NULL]',\n 'undefined-data': '[UNDEF]',\n 'render-data': '[RENDER]',\n 'unhandled-error': '[ERR]',\n 'unhandled-rejection': '[REJ]',\n 'type-mismatch': '[TYPE]',\n};\n\nconst SEVERITY_COLORS: Record<Severity, string> = {\n error: '#ff4444',\n warn: '#ffaa00',\n info: '#4488ff',\n};\n\nconst SEVERITY_LABELS: Record<Severity, string> = {\n error: 'ERROR',\n warn: 'WARN',\n info: 'INFO',\n};\n\nfunction formatDetails(issue: DetectedIssue): string[] {\n const lines: string[] = [];\n\n if (issue.path) {\n lines.push(` |- Path: ${issue.path}`);\n }\n\n if (issue.foundValue !== undefined) {\n lines.push(\n ` |- Value: ${issue.foundValue === null ? 'null' : String(issue.foundValue)}`,\n );\n }\n\n if (issue.details) {\n const entries = Object.entries(issue.details);\n for (const [key, value] of entries) {\n lines.push(` |- ${key}: ${typeof value === 'string' ? value : JSON.stringify(value)}`);\n }\n }\n\n if (issue.source) {\n lines.push(` |- Source: ${issue.source}`);\n }\n\n if (issue.suggestion) {\n lines.push(` |- Suggestion: ${issue.suggestion}`);\n }\n\n if (issue.stack) {\n const stackPreview = issue.stack.split('\\n').slice(0, 3).join('\\n');\n lines.push(` \\\\- Stack:\\n${stackPreview}`);\n } else if (lines.length > 0) {\n const lastIdx = lines.length - 1;\n lines[lastIdx] = lines[lastIdx].replace('|-', '\\\\-');\n }\n\n return lines;\n}\n\nexport function createConsoleReporter(): Reporter {\n function report(issue: DetectedIssue): void {\n const categoryLabel = CATEGORY_LABELS[issue.category] ?? '[DL]';\n const color = SEVERITY_COLORS[issue.severity];\n const label = SEVERITY_LABELS[issue.severity];\n\n const header = `${categoryLabel} DevLens [${label}] ${issue.category}: ${issue.message}`;\n const details = formatDetails(issue);\n\n const consoleFn =\n issue.severity === 'error'\n ? console.error\n : issue.severity === 'warn'\n ? console.warn\n : console.log;\n\n console.groupCollapsed(\n `%c${header}`,\n `color: ${color}; font-weight: bold;`,\n );\n\n for (const line of details) {\n consoleFn(line);\n }\n\n consoleFn(\n `%cTimestamp: ${new Date(issue.timestamp).toISOString()}`,\n 'color: #888;',\n );\n\n console.groupEnd();\n }\n\n function reportBatch(issues: DetectedIssue[]): void {\n if (issues.length === 0) return;\n\n console.groupCollapsed(\n `%c[DL] DevLens -- ${issues.length} issue(s) detected`,\n 'color: #ff4444; font-weight: bold; font-size: 12px;',\n );\n\n for (const issue of issues) {\n report(issue);\n }\n\n console.groupEnd();\n }\n\n function clear(): void {\n console.clear();\n }\n\n return { report, reportBatch, clear };\n}\n","import type {\n DevLensConfig,\n DevLensEngine,\n DetectedIssue,\n Reporter,\n Severity,\n} from '../types';\nimport { createConsoleReporter } from '../reporter/console-reporter';\n\nconst SEVERITY_RANK: Record<Severity, number> = {\n info: 0,\n warn: 1,\n error: 2,\n};\n\nfunction matchesAnyPattern(\n value: string | undefined,\n patterns: (string | RegExp)[],\n): boolean {\n if (!value || patterns.length === 0) return false;\n return patterns.some((p) =>\n typeof p === 'string' ? value.includes(p) : p.test(value),\n );\n}\n\nexport function createDetectionEngine(\n config: DevLensConfig = {},\n): DevLensEngine {\n const resolvedConfig: Required<\n Pick<DevLensConfig, 'enabled' | 'minSeverity' | 'throttleMs' | 'maxIssues'>\n > &\n DevLensConfig = {\n enabled: config.enabled ?? true,\n minSeverity: config.minSeverity ?? 'info',\n throttleMs: config.throttleMs ?? 1000,\n maxIssues: config.maxIssues ?? 100,\n ...config,\n };\n\n const reporter: Reporter =\n resolvedConfig.reporter ?? createConsoleReporter();\n const issues: DetectedIssue[] = [];\n const subscribers = new Set<(issue: DetectedIssue) => void>();\n const lastReportedAt = new Map<string, number>();\n\n function isEnabled(): boolean {\n if (!resolvedConfig.enabled) return false;\n if (typeof window === 'undefined') return false;\n try {\n if (\n typeof process !== 'undefined' &&\n process.env?.NODE_ENV === 'production'\n ) {\n return false;\n }\n } catch {\n // process may not be defined in browser\n }\n return true;\n }\n\n function meetsMinSeverity(severity: Severity): boolean {\n return (\n SEVERITY_RANK[severity] >= SEVERITY_RANK[resolvedConfig.minSeverity]\n );\n }\n\n function isThrottled(id: string, now: number): boolean {\n const lastTime = lastReportedAt.get(id);\n if (lastTime === undefined) return false;\n return now - lastTime < resolvedConfig.throttleMs;\n }\n\n function isIgnored(issue: DetectedIssue): boolean {\n const ignore = resolvedConfig.ignore;\n if (!ignore) return false;\n\n if (\n ignore.urls &&\n matchesAnyPattern(\n issue.details?.url as string | undefined,\n ignore.urls,\n )\n ) {\n return true;\n }\n\n if (ignore.paths && matchesAnyPattern(issue.path, ignore.paths)) {\n return true;\n }\n\n if (ignore.messages && matchesAnyPattern(issue.message, ignore.messages)) {\n return true;\n }\n\n return false;\n }\n\n function addToBuffer(issue: DetectedIssue): void {\n issues.push(issue);\n if (issues.length > resolvedConfig.maxIssues) {\n issues.shift();\n }\n }\n\n function report(issue: DetectedIssue): void {\n if (!isEnabled()) return;\n if (!meetsMinSeverity(issue.severity)) return;\n\n const now = Date.now();\n if (isThrottled(issue.id, now)) return;\n if (isIgnored(issue)) return;\n\n lastReportedAt.set(issue.id, now);\n addToBuffer(issue);\n\n reporter.report(issue);\n\n for (const callback of subscribers) {\n try {\n callback(issue);\n } catch {\n // subscriber errors should not break the engine\n }\n }\n }\n\n function getConfig(): Readonly<DevLensConfig> {\n return Object.freeze({ ...resolvedConfig });\n }\n\n function getIssues(): readonly DetectedIssue[] {\n return [...issues];\n }\n\n function subscribe(\n callback: (issue: DetectedIssue) => void,\n ): () => void {\n subscribers.add(callback);\n return () => {\n subscribers.delete(callback);\n };\n }\n\n return {\n report,\n getConfig,\n getIssues,\n subscribe,\n isEnabled,\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devlens/core",
3
- "version": "1.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "Automatic runtime error detection and logging for JavaScript applications",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.js",