@agent-scope/core 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -180,7 +180,7 @@ function serializeInner(value, depth, seen, opts) {
|
|
|
180
180
|
}
|
|
181
181
|
if (typeof value === "string") {
|
|
182
182
|
if (value.length > opts.maxStringLength) {
|
|
183
|
-
const truncated = value.slice(0, opts.maxStringLength)
|
|
183
|
+
const truncated = `${value.slice(0, opts.maxStringLength)}...`;
|
|
184
184
|
return { type: "string", value: truncated, preview: `"${truncated}"` };
|
|
185
185
|
}
|
|
186
186
|
return { type: "string", value, preview: `"${value}"` };
|
|
@@ -194,7 +194,7 @@ function serializeInner(value, depth, seen, opts) {
|
|
|
194
194
|
}
|
|
195
195
|
if (typeof value === "function") {
|
|
196
196
|
const raw = Function.prototype.toString.call(value);
|
|
197
|
-
const preview = raw.length > 50 ? raw.slice(0, 50)
|
|
197
|
+
const preview = raw.length > 50 ? `${raw.slice(0, 50)} ...` : raw;
|
|
198
198
|
return { type: "function", preview };
|
|
199
199
|
}
|
|
200
200
|
if (typeof value !== "object") {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/guards.ts","../src/serialization.ts"],"names":["props"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ComponentType } from \"./types/component-node.js\";\nimport type { ConsoleLevel } from \"./types/console.js\";\nimport type { HookType } from \"./types/hook-state.js\";\nimport type { SerializedValueType } from \"./types/serialized-value.js\";\n\n/**\n * Semantic version of the `PageReport` schema.\n *\n * Consumers should compare this value when reading stored reports to detect\n * schema drift. Follows semver: breaking changes bump the major version.\n */\nexport const SCHEMA_VERSION = \"0.1.0\" as const;\n\n/**\n * All valid React hook types tracked by the Scope runtime.\n *\n * @see {@link HookType}\n */\nexport const HOOK_TYPES: readonly HookType[] = [\n \"useState\",\n \"useReducer\",\n \"useEffect\",\n \"useLayoutEffect\",\n \"useMemo\",\n \"useCallback\",\n \"useRef\",\n \"useContext\",\n \"useId\",\n \"useSyncExternalStore\",\n \"useTransition\",\n \"useDeferredValue\",\n \"custom\",\n] as const;\n\n/**\n * All valid component implementation strategies.\n *\n * @see {@link ComponentType}\n */\nexport const COMPONENT_TYPES: readonly ComponentType[] = [\n \"function\",\n \"class\",\n \"forward_ref\",\n \"memo\",\n \"host\",\n] as const;\n\n/**\n * All valid serialized value types.\n *\n * @see {@link SerializedValueType}\n */\nexport const SERIALIZED_VALUE_TYPES: readonly SerializedValueType[] = [\n \"string\",\n \"number\",\n \"boolean\",\n \"null\",\n \"undefined\",\n \"object\",\n \"array\",\n \"function\",\n \"symbol\",\n \"bigint\",\n \"date\",\n \"map\",\n \"set\",\n \"circular\",\n \"truncated\",\n] as const;\n\n/**\n * All valid console entry levels.\n *\n * @see {@link ConsoleLevel}\n */\nexport const CONSOLE_LEVELS: readonly ConsoleLevel[] = [\n \"log\",\n \"warn\",\n \"error\",\n \"info\",\n \"debug\",\n \"group\",\n \"groupCollapsed\",\n \"table\",\n \"trace\",\n] as const;\n","import {\n COMPONENT_TYPES,\n CONSOLE_LEVELS,\n HOOK_TYPES,\n SERIALIZED_VALUE_TYPES,\n} from \"./constants.js\";\nimport type { ComponentNode } from \"./types/component-node.js\";\nimport type { ConsoleEntry } from \"./types/console.js\";\nimport type { ContextConsumption } from \"./types/context.js\";\nimport type { CapturedError } from \"./types/errors.js\";\nimport type { HookState } from \"./types/hook-state.js\";\nimport type { PageReport } from \"./types/page-report.js\";\nimport type { RouteInfo } from \"./types/route.js\";\nimport type { SerializedValue } from \"./types/serialized-value.js\";\nimport type { SourceLocation } from \"./types/source-location.js\";\nimport type { SuspenseBoundaryInfo } from \"./types/suspense.js\";\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isStringOrNull(value: unknown): value is string | null {\n return typeof value === \"string\" || value === null;\n}\n\nfunction isNullableNumber(value: unknown): value is number | null {\n return typeof value === \"number\" || value === null;\n}\n\n// ---------------------------------------------------------------------------\n// SourceLocation\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link SourceLocation}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `SourceLocation` interface.\n */\nexport function isSourceLocation(value: unknown): value is SourceLocation {\n if (!isObject(value)) return false;\n return (\n typeof value.fileName === \"string\" &&\n typeof value.lineNumber === \"number\" &&\n typeof value.columnNumber === \"number\"\n );\n}\n\n// ---------------------------------------------------------------------------\n// SerializedValue\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link SerializedValue}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `SerializedValue` interface.\n */\nexport function isSerializedValue(value: unknown): value is SerializedValue {\n if (!isObject(value)) return false;\n if (!SERIALIZED_VALUE_TYPES.includes(value.type as SerializedValue[\"type\"])) return false;\n if (\"preview\" in value && typeof value.preview !== \"string\") return false;\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// RouteInfo\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link RouteInfo}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `RouteInfo` interface.\n */\nexport function isRouteInfo(value: unknown): value is RouteInfo {\n if (!isObject(value)) return false;\n if (!isStringOrNull(value.pattern)) return false;\n if (!isStringOrNull(value.name)) return false;\n if (value.params !== null && !isObject(value.params)) return false;\n if (!isObject(value.query)) return false;\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// ContextConsumption\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link ContextConsumption}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `ContextConsumption` interface.\n */\nexport function isContextConsumption(value: unknown): value is ContextConsumption {\n if (!isObject(value)) return false;\n return (\n isStringOrNull(value.contextName) &&\n isSerializedValue(value.value) &&\n typeof value.didTriggerRender === \"boolean\"\n );\n}\n\n// ---------------------------------------------------------------------------\n// HookState\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link HookState}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `HookState` interface.\n */\nexport function isHookState(value: unknown): value is HookState {\n if (!isObject(value)) return false;\n if (!HOOK_TYPES.includes(value.type as HookState[\"type\"])) return false;\n if (!isStringOrNull(value.name)) return false;\n if (!isSerializedValue(value.value)) return false;\n if (value.deps !== null) {\n if (!Array.isArray(value.deps)) return false;\n if (!(value.deps as unknown[]).every(isSerializedValue)) return false;\n }\n if (value.hasCleanup !== null && typeof value.hasCleanup !== \"boolean\") return false;\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// ComponentNode\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link ComponentNode}.\n *\n * Performs a shallow check of the node itself; `children` are verified to be\n * arrays of objects but are **not** recursively validated to keep the guard\n * O(1) per node. Use {@link isComponentNodeDeep} for full tree validation.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `ComponentNode` interface.\n */\nexport function isComponentNode(value: unknown): value is ComponentNode {\n if (!isObject(value)) return false;\n if (typeof value.id !== \"number\") return false;\n if (typeof value.name !== \"string\") return false;\n if (!COMPONENT_TYPES.includes(value.type as ComponentNode[\"type\"])) return false;\n if (value.source !== null && !isSourceLocation(value.source)) return false;\n if (!isSerializedValue(value.props)) return false;\n if (!Array.isArray(value.state)) return false;\n if (!(value.state as unknown[]).every(isHookState)) return false;\n if (!Array.isArray(value.context)) return false;\n if (!(value.context as unknown[]).every(isContextConsumption)) return false;\n if (typeof value.renderCount !== \"number\") return false;\n if (typeof value.renderDuration !== \"number\") return false;\n if (!Array.isArray(value.children)) return false;\n return true;\n}\n\n/**\n * Recursively validates a `ComponentNode` and its entire subtree.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` and all descendant nodes conform to `ComponentNode`.\n */\nexport function isComponentNodeDeep(value: unknown): value is ComponentNode {\n if (!isComponentNode(value)) return false;\n return (value.children as unknown[]).every(isComponentNodeDeep);\n}\n\n// ---------------------------------------------------------------------------\n// CapturedError\n// ---------------------------------------------------------------------------\n\nconst CAPTURED_BY_VALUES = [\"boundary\", \"unhandled\", \"rejection\", \"console\"] as const;\n\n/**\n * Type guard for {@link CapturedError}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `CapturedError` interface.\n */\nexport function isCapturedError(value: unknown): value is CapturedError {\n if (!isObject(value)) return false;\n return (\n typeof value.message === \"string\" &&\n typeof value.name === \"string\" &&\n (typeof value.stack === \"string\" || value.stack === null) &&\n (value.source === null || isSourceLocation(value.source)) &&\n isStringOrNull(value.componentName) &&\n typeof value.timestamp === \"number\" &&\n CAPTURED_BY_VALUES.includes(value.capturedBy as CapturedError[\"capturedBy\"])\n );\n}\n\n// ---------------------------------------------------------------------------\n// SuspenseBoundaryInfo\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link SuspenseBoundaryInfo}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `SuspenseBoundaryInfo` interface.\n */\nexport function isSuspenseBoundaryInfo(value: unknown): value is SuspenseBoundaryInfo {\n if (!isObject(value)) return false;\n return (\n typeof value.id === \"number\" &&\n typeof value.componentName === \"string\" &&\n typeof value.isSuspended === \"boolean\" &&\n isNullableNumber(value.suspendedDuration) &&\n isStringOrNull(value.fallbackName) &&\n (value.source === null || isSourceLocation(value.source))\n );\n}\n\n// ---------------------------------------------------------------------------\n// ConsoleEntry\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link ConsoleEntry}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `ConsoleEntry` interface.\n */\nexport function isConsoleEntry(value: unknown): value is ConsoleEntry {\n if (!isObject(value)) return false;\n if (!CONSOLE_LEVELS.includes(value.level as ConsoleEntry[\"level\"])) return false;\n if (!Array.isArray(value.args)) return false;\n if (!(value.args as unknown[]).every(isSerializedValue)) return false;\n return (\n typeof value.timestamp === \"number\" &&\n isStringOrNull(value.componentName) &&\n typeof value.preview === \"string\"\n );\n}\n\n// ---------------------------------------------------------------------------\n// PageReport\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link PageReport}.\n *\n * Validates the top-level shape of a `PageReport`. The component tree\n * (`tree`) is shallowly validated via {@link isComponentNode}. Use\n * {@link isPageReportDeep} if you need full recursive tree validation.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `PageReport` interface.\n */\nexport function isPageReport(value: unknown): value is PageReport {\n if (!isObject(value)) return false;\n if (typeof value.url !== \"string\") return false;\n if (value.route !== null && !isRouteInfo(value.route)) return false;\n if (typeof value.timestamp !== \"number\") return false;\n if (typeof value.capturedIn !== \"number\") return false;\n if (!isComponentNode(value.tree)) return false;\n if (!Array.isArray(value.errors)) return false;\n if (!(value.errors as unknown[]).every(isCapturedError)) return false;\n if (!Array.isArray(value.suspenseBoundaries)) return false;\n if (!(value.suspenseBoundaries as unknown[]).every(isSuspenseBoundaryInfo)) return false;\n if (!Array.isArray(value.consoleEntries)) return false;\n if (!(value.consoleEntries as unknown[]).every(isConsoleEntry)) return false;\n return true;\n}\n\n/**\n * Like {@link isPageReport} but also recursively validates the entire\n * component tree via {@link isComponentNodeDeep}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` and its full component tree are valid.\n */\nexport function isPageReportDeep(value: unknown): value is PageReport {\n if (!isPageReport(value)) return false;\n return isComponentNodeDeep(value.tree);\n}\n","/**\n * serialize() — Convert any JavaScript value to a SerializedValue snapshot.\n *\n * Features:\n * - Handles all primitives: string, number, boolean, null, undefined\n * - Handles complex types: object, array, function, symbol, bigint\n * - Handles built-ins: Date, Map, Set\n * - Circular reference detection via WeakSet → { type: 'circular' }\n * - Depth limiting → { type: 'truncated' }\n * - Configurable truncation for strings, arrays, and object properties\n */\n\nimport type { SerializedValue } from \"./types/serialized-value.js\";\n\nexport interface SerializeOptions {\n /** Maximum recursion depth for nested objects/arrays. Default: 5. */\n maxDepth?: number;\n /** Maximum length of serialized strings before truncation. Default: 200. */\n maxStringLength?: number;\n /** Maximum number of array items to serialize. Default: 100. */\n maxArrayLength?: number;\n /** Maximum number of object properties to serialize. Default: 50. */\n maxProperties?: number;\n}\n\nconst DEFAULTS = {\n maxDepth: 5,\n maxStringLength: 200,\n maxArrayLength: 100,\n maxProperties: 50,\n} as const;\n\n/**\n * Convert any JavaScript value to a safely-serialized {@link SerializedValue}.\n *\n * @param value - The value to serialize.\n * @param options - Optional tuning parameters.\n */\nexport function serialize(value: unknown, options?: SerializeOptions): SerializedValue {\n const opts = { ...DEFAULTS, ...options };\n const seen = new WeakSet<object>();\n return serializeInner(value, 0, seen, opts);\n}\n\n// ---------------------------------------------------------------------------\n// Internal recursive implementation\n// ---------------------------------------------------------------------------\n\nfunction serializeInner(\n value: unknown,\n depth: number,\n seen: WeakSet<object>,\n opts: Required<SerializeOptions>,\n): SerializedValue {\n // ── Primitives ────────────────────────────────────────────────────────────\n\n if (value === null) {\n return { type: \"null\", value: null, preview: \"null\" };\n }\n\n if (value === undefined) {\n return { type: \"undefined\", preview: \"undefined\" };\n }\n\n if (typeof value === \"boolean\") {\n return { type: \"boolean\", value, preview: String(value) };\n }\n\n if (typeof value === \"number\") {\n return { type: \"number\", value, preview: String(value) };\n }\n\n if (typeof value === \"string\") {\n if (value.length > opts.maxStringLength) {\n const truncated = value.slice(0, opts.maxStringLength) + \"...\";\n return { type: \"string\", value: truncated, preview: `\"${truncated}\"` };\n }\n return { type: \"string\", value, preview: `\"${value}\"` };\n }\n\n if (typeof value === \"bigint\") {\n return { type: \"bigint\", value: `${value.toString()}n`, preview: `${value.toString()}n` };\n }\n\n if (typeof value === \"symbol\") {\n const preview = value.toString(); // \"Symbol(description)\"\n return { type: \"symbol\", preview };\n }\n\n if (typeof value === \"function\") {\n const raw = Function.prototype.toString.call(value);\n const preview = raw.length > 50 ? raw.slice(0, 50) + \" ...\" : raw;\n return { type: \"function\", preview };\n }\n\n // ── Objects (all reference types below) ──────────────────────────────────\n\n if (typeof value !== \"object\") {\n // Shouldn't happen with normal JS types, but guard for safety\n return { type: \"string\", value: String(value), preview: String(value) };\n }\n\n // Circular reference check\n if (seen.has(value as object)) {\n return { type: \"circular\" };\n }\n\n // Depth exceeded — but we haven't seen it yet, so no circular, just truncated\n if (depth >= opts.maxDepth) {\n return { type: \"truncated\", preview: truncationPreview(value) };\n }\n\n seen.add(value as object);\n\n try {\n // ── Date ──────────────────────────────────────────────────────────────\n if (value instanceof Date) {\n return { type: \"date\", value: value.toISOString(), preview: value.toISOString() };\n }\n\n // ── Map ───────────────────────────────────────────────────────────────\n if (value instanceof Map) {\n const entries: SerializedValue[] = [];\n let count = 0;\n for (const [k, v] of value) {\n if (count >= opts.maxProperties) break;\n // Serialize each entry as an object { key, value }\n const serializedKey = serializeInner(k, depth + 1, seen, opts);\n const serializedVal = serializeInner(v, depth + 1, seen, opts);\n entries.push({\n type: \"object\",\n value: { key: serializedKey, value: serializedVal },\n preview: `[${serializedKey.preview ?? \"?\"} => ${serializedVal.preview ?? \"?\"}]`,\n });\n count++;\n }\n const truncated = value.size > opts.maxProperties;\n return {\n type: \"map\",\n value: entries,\n preview: `Map(${value.size})${truncated ? \" [truncated]\" : \"\"}`,\n };\n }\n\n // ── Set ───────────────────────────────────────────────────────────────\n if (value instanceof Set) {\n const items: SerializedValue[] = [];\n let count = 0;\n for (const v of value) {\n if (count >= opts.maxArrayLength) break;\n items.push(serializeInner(v, depth + 1, seen, opts));\n count++;\n }\n const truncated = value.size > opts.maxArrayLength;\n return {\n type: \"set\",\n value: items,\n preview: `Set(${value.size})${truncated ? \" [truncated]\" : \"\"}`,\n };\n }\n\n // ── Array ─────────────────────────────────────────────────────────────\n if (Array.isArray(value)) {\n const items: SerializedValue[] = [];\n const limit = Math.min(value.length, opts.maxArrayLength);\n for (let i = 0; i < limit; i++) {\n items.push(serializeInner(value[i], depth + 1, seen, opts));\n }\n const truncated = value.length > opts.maxArrayLength;\n return {\n type: \"array\",\n value: items,\n preview: `Array(${value.length})${truncated ? \" [truncated]\" : \"\"}`,\n };\n }\n\n // ── Plain objects / class instances ───────────────────────────────────\n return serializeObject(value as Record<string, unknown>, depth, seen, opts);\n } finally {\n // Remove from seen after processing so the same object can appear in\n // sibling branches without being falsely flagged as circular.\n seen.delete(value as object);\n }\n}\n\nfunction serializeObject(\n value: Record<string, unknown>,\n depth: number,\n seen: WeakSet<object>,\n opts: Required<SerializeOptions>,\n): SerializedValue {\n // Special preview for well-known non-serializable built-ins\n const ctor = getConstructorName(value);\n\n // WeakMap / WeakRef / WeakSet — can't iterate, return opaque object preview\n if (\n value instanceof WeakMap ||\n value instanceof WeakSet ||\n (typeof WeakRef !== \"undefined\" && value instanceof WeakRef)\n ) {\n return { type: \"object\", preview: ctor };\n }\n\n // Error objects — special handling\n if (value instanceof Error) {\n const props: Record<string, SerializedValue> = {\n name: serializeInner(value.name, depth + 1, seen, opts),\n message: serializeInner(value.message, depth + 1, seen, opts),\n };\n if (value.stack !== undefined) {\n props.stack = serializeInner(value.stack, depth + 1, seen, opts);\n }\n return { type: \"object\", value: props, preview: `${value.name}: ${value.message}` };\n }\n\n // Generic object / class instance\n let keys: string[];\n try {\n keys = Object.keys(value);\n } catch {\n // null-prototype objects or Proxies that throw on ownKeys\n return { type: \"object\", preview: ctor ?? \"Object\" };\n }\n\n const props: Record<string, SerializedValue> = {};\n const limit = Math.min(keys.length, opts.maxProperties);\n for (let i = 0; i < limit; i++) {\n const key = keys[i] as string;\n let propValue: unknown;\n try {\n propValue = (value as Record<string, unknown>)[key];\n } catch {\n propValue = \"[Getter threw]\";\n }\n props[key] = serializeInner(propValue, depth + 1, seen, opts);\n }\n\n const truncated = keys.length > opts.maxProperties;\n const ctorPart = ctor && ctor !== \"Object\" ? `${ctor} ` : \"\";\n const preview = `${ctorPart}{${keys.slice(0, 3).join(\", \")}${keys.length > 3 ? \", …\" : \"\"}}${truncated ? \" [truncated]\" : \"\"}`;\n\n return { type: \"object\", value: props, preview };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getConstructorName(value: object): string {\n try {\n const ctor = Object.getPrototypeOf(value)?.constructor;\n return ctor?.name ?? \"Object\";\n } catch {\n return \"Object\";\n }\n}\n\nfunction truncationPreview(value: unknown): string {\n if (Array.isArray(value)) return `Array(${value.length})`;\n if (value instanceof Map) return `Map(${value.size})`;\n if (value instanceof Set) return `Set(${value.size})`;\n const ctor =\n typeof value === \"object\" && value !== null ? getConstructorName(value as object) : \"\";\n return ctor || \"Object\";\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/guards.ts","../src/serialization.ts"],"names":["props"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ComponentType } from \"./types/component-node.js\";\nimport type { ConsoleLevel } from \"./types/console.js\";\nimport type { HookType } from \"./types/hook-state.js\";\nimport type { SerializedValueType } from \"./types/serialized-value.js\";\n\n/**\n * Semantic version of the `PageReport` schema.\n *\n * Consumers should compare this value when reading stored reports to detect\n * schema drift. Follows semver: breaking changes bump the major version.\n */\nexport const SCHEMA_VERSION = \"0.1.0\" as const;\n\n/**\n * All valid React hook types tracked by the Scope runtime.\n *\n * @see {@link HookType}\n */\nexport const HOOK_TYPES: readonly HookType[] = [\n \"useState\",\n \"useReducer\",\n \"useEffect\",\n \"useLayoutEffect\",\n \"useMemo\",\n \"useCallback\",\n \"useRef\",\n \"useContext\",\n \"useId\",\n \"useSyncExternalStore\",\n \"useTransition\",\n \"useDeferredValue\",\n \"custom\",\n] as const;\n\n/**\n * All valid component implementation strategies.\n *\n * @see {@link ComponentType}\n */\nexport const COMPONENT_TYPES: readonly ComponentType[] = [\n \"function\",\n \"class\",\n \"forward_ref\",\n \"memo\",\n \"host\",\n] as const;\n\n/**\n * All valid serialized value types.\n *\n * @see {@link SerializedValueType}\n */\nexport const SERIALIZED_VALUE_TYPES: readonly SerializedValueType[] = [\n \"string\",\n \"number\",\n \"boolean\",\n \"null\",\n \"undefined\",\n \"object\",\n \"array\",\n \"function\",\n \"symbol\",\n \"bigint\",\n \"date\",\n \"map\",\n \"set\",\n \"circular\",\n \"truncated\",\n] as const;\n\n/**\n * All valid console entry levels.\n *\n * @see {@link ConsoleLevel}\n */\nexport const CONSOLE_LEVELS: readonly ConsoleLevel[] = [\n \"log\",\n \"warn\",\n \"error\",\n \"info\",\n \"debug\",\n \"group\",\n \"groupCollapsed\",\n \"table\",\n \"trace\",\n] as const;\n","import {\n COMPONENT_TYPES,\n CONSOLE_LEVELS,\n HOOK_TYPES,\n SERIALIZED_VALUE_TYPES,\n} from \"./constants.js\";\nimport type { ComponentNode } from \"./types/component-node.js\";\nimport type { ConsoleEntry } from \"./types/console.js\";\nimport type { ContextConsumption } from \"./types/context.js\";\nimport type { CapturedError } from \"./types/errors.js\";\nimport type { HookState } from \"./types/hook-state.js\";\nimport type { PageReport } from \"./types/page-report.js\";\nimport type { RouteInfo } from \"./types/route.js\";\nimport type { SerializedValue } from \"./types/serialized-value.js\";\nimport type { SourceLocation } from \"./types/source-location.js\";\nimport type { SuspenseBoundaryInfo } from \"./types/suspense.js\";\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isStringOrNull(value: unknown): value is string | null {\n return typeof value === \"string\" || value === null;\n}\n\nfunction isNullableNumber(value: unknown): value is number | null {\n return typeof value === \"number\" || value === null;\n}\n\n// ---------------------------------------------------------------------------\n// SourceLocation\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link SourceLocation}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `SourceLocation` interface.\n */\nexport function isSourceLocation(value: unknown): value is SourceLocation {\n if (!isObject(value)) return false;\n return (\n typeof value.fileName === \"string\" &&\n typeof value.lineNumber === \"number\" &&\n typeof value.columnNumber === \"number\"\n );\n}\n\n// ---------------------------------------------------------------------------\n// SerializedValue\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link SerializedValue}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `SerializedValue` interface.\n */\nexport function isSerializedValue(value: unknown): value is SerializedValue {\n if (!isObject(value)) return false;\n if (!SERIALIZED_VALUE_TYPES.includes(value.type as SerializedValue[\"type\"])) return false;\n if (\"preview\" in value && typeof value.preview !== \"string\") return false;\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// RouteInfo\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link RouteInfo}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `RouteInfo` interface.\n */\nexport function isRouteInfo(value: unknown): value is RouteInfo {\n if (!isObject(value)) return false;\n if (!isStringOrNull(value.pattern)) return false;\n if (!isStringOrNull(value.name)) return false;\n if (value.params !== null && !isObject(value.params)) return false;\n if (!isObject(value.query)) return false;\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// ContextConsumption\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link ContextConsumption}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `ContextConsumption` interface.\n */\nexport function isContextConsumption(value: unknown): value is ContextConsumption {\n if (!isObject(value)) return false;\n return (\n isStringOrNull(value.contextName) &&\n isSerializedValue(value.value) &&\n typeof value.didTriggerRender === \"boolean\"\n );\n}\n\n// ---------------------------------------------------------------------------\n// HookState\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link HookState}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `HookState` interface.\n */\nexport function isHookState(value: unknown): value is HookState {\n if (!isObject(value)) return false;\n if (!HOOK_TYPES.includes(value.type as HookState[\"type\"])) return false;\n if (!isStringOrNull(value.name)) return false;\n if (!isSerializedValue(value.value)) return false;\n if (value.deps !== null) {\n if (!Array.isArray(value.deps)) return false;\n if (!(value.deps as unknown[]).every(isSerializedValue)) return false;\n }\n if (value.hasCleanup !== null && typeof value.hasCleanup !== \"boolean\") return false;\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// ComponentNode\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link ComponentNode}.\n *\n * Performs a shallow check of the node itself; `children` are verified to be\n * arrays of objects but are **not** recursively validated to keep the guard\n * O(1) per node. Use {@link isComponentNodeDeep} for full tree validation.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `ComponentNode` interface.\n */\nexport function isComponentNode(value: unknown): value is ComponentNode {\n if (!isObject(value)) return false;\n if (typeof value.id !== \"number\") return false;\n if (typeof value.name !== \"string\") return false;\n if (!COMPONENT_TYPES.includes(value.type as ComponentNode[\"type\"])) return false;\n if (value.source !== null && !isSourceLocation(value.source)) return false;\n if (!isSerializedValue(value.props)) return false;\n if (!Array.isArray(value.state)) return false;\n if (!(value.state as unknown[]).every(isHookState)) return false;\n if (!Array.isArray(value.context)) return false;\n if (!(value.context as unknown[]).every(isContextConsumption)) return false;\n if (typeof value.renderCount !== \"number\") return false;\n if (typeof value.renderDuration !== \"number\") return false;\n if (!Array.isArray(value.children)) return false;\n return true;\n}\n\n/**\n * Recursively validates a `ComponentNode` and its entire subtree.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` and all descendant nodes conform to `ComponentNode`.\n */\nexport function isComponentNodeDeep(value: unknown): value is ComponentNode {\n if (!isComponentNode(value)) return false;\n return (value.children as unknown[]).every(isComponentNodeDeep);\n}\n\n// ---------------------------------------------------------------------------\n// CapturedError\n// ---------------------------------------------------------------------------\n\nconst CAPTURED_BY_VALUES = [\"boundary\", \"unhandled\", \"rejection\", \"console\"] as const;\n\n/**\n * Type guard for {@link CapturedError}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `CapturedError` interface.\n */\nexport function isCapturedError(value: unknown): value is CapturedError {\n if (!isObject(value)) return false;\n return (\n typeof value.message === \"string\" &&\n typeof value.name === \"string\" &&\n (typeof value.stack === \"string\" || value.stack === null) &&\n (value.source === null || isSourceLocation(value.source)) &&\n isStringOrNull(value.componentName) &&\n typeof value.timestamp === \"number\" &&\n CAPTURED_BY_VALUES.includes(value.capturedBy as CapturedError[\"capturedBy\"])\n );\n}\n\n// ---------------------------------------------------------------------------\n// SuspenseBoundaryInfo\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link SuspenseBoundaryInfo}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `SuspenseBoundaryInfo` interface.\n */\nexport function isSuspenseBoundaryInfo(value: unknown): value is SuspenseBoundaryInfo {\n if (!isObject(value)) return false;\n return (\n typeof value.id === \"number\" &&\n typeof value.componentName === \"string\" &&\n typeof value.isSuspended === \"boolean\" &&\n isNullableNumber(value.suspendedDuration) &&\n isStringOrNull(value.fallbackName) &&\n (value.source === null || isSourceLocation(value.source))\n );\n}\n\n// ---------------------------------------------------------------------------\n// ConsoleEntry\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link ConsoleEntry}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `ConsoleEntry` interface.\n */\nexport function isConsoleEntry(value: unknown): value is ConsoleEntry {\n if (!isObject(value)) return false;\n if (!CONSOLE_LEVELS.includes(value.level as ConsoleEntry[\"level\"])) return false;\n if (!Array.isArray(value.args)) return false;\n if (!(value.args as unknown[]).every(isSerializedValue)) return false;\n return (\n typeof value.timestamp === \"number\" &&\n isStringOrNull(value.componentName) &&\n typeof value.preview === \"string\"\n );\n}\n\n// ---------------------------------------------------------------------------\n// PageReport\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link PageReport}.\n *\n * Validates the top-level shape of a `PageReport`. The component tree\n * (`tree`) is shallowly validated via {@link isComponentNode}. Use\n * {@link isPageReportDeep} if you need full recursive tree validation.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `PageReport` interface.\n */\nexport function isPageReport(value: unknown): value is PageReport {\n if (!isObject(value)) return false;\n if (typeof value.url !== \"string\") return false;\n if (value.route !== null && !isRouteInfo(value.route)) return false;\n if (typeof value.timestamp !== \"number\") return false;\n if (typeof value.capturedIn !== \"number\") return false;\n if (!isComponentNode(value.tree)) return false;\n if (!Array.isArray(value.errors)) return false;\n if (!(value.errors as unknown[]).every(isCapturedError)) return false;\n if (!Array.isArray(value.suspenseBoundaries)) return false;\n if (!(value.suspenseBoundaries as unknown[]).every(isSuspenseBoundaryInfo)) return false;\n if (!Array.isArray(value.consoleEntries)) return false;\n if (!(value.consoleEntries as unknown[]).every(isConsoleEntry)) return false;\n return true;\n}\n\n/**\n * Like {@link isPageReport} but also recursively validates the entire\n * component tree via {@link isComponentNodeDeep}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` and its full component tree are valid.\n */\nexport function isPageReportDeep(value: unknown): value is PageReport {\n if (!isPageReport(value)) return false;\n return isComponentNodeDeep(value.tree);\n}\n","/**\n * serialize() — Convert any JavaScript value to a SerializedValue snapshot.\n *\n * Features:\n * - Handles all primitives: string, number, boolean, null, undefined\n * - Handles complex types: object, array, function, symbol, bigint\n * - Handles built-ins: Date, Map, Set\n * - Circular reference detection via WeakSet → { type: 'circular' }\n * - Depth limiting → { type: 'truncated' }\n * - Configurable truncation for strings, arrays, and object properties\n */\n\nimport type { SerializedValue } from \"./types/serialized-value.js\";\n\nexport interface SerializeOptions {\n /** Maximum recursion depth for nested objects/arrays. Default: 5. */\n maxDepth?: number;\n /** Maximum length of serialized strings before truncation. Default: 200. */\n maxStringLength?: number;\n /** Maximum number of array items to serialize. Default: 100. */\n maxArrayLength?: number;\n /** Maximum number of object properties to serialize. Default: 50. */\n maxProperties?: number;\n}\n\nconst DEFAULTS = {\n maxDepth: 5,\n maxStringLength: 200,\n maxArrayLength: 100,\n maxProperties: 50,\n} as const;\n\n/**\n * Convert any JavaScript value to a safely-serialized {@link SerializedValue}.\n *\n * @param value - The value to serialize.\n * @param options - Optional tuning parameters.\n */\nexport function serialize(value: unknown, options?: SerializeOptions): SerializedValue {\n const opts = { ...DEFAULTS, ...options };\n const seen = new WeakSet<object>();\n return serializeInner(value, 0, seen, opts);\n}\n\n// ---------------------------------------------------------------------------\n// Internal recursive implementation\n// ---------------------------------------------------------------------------\n\nfunction serializeInner(\n value: unknown,\n depth: number,\n seen: WeakSet<object>,\n opts: Required<SerializeOptions>,\n): SerializedValue {\n // ── Primitives ────────────────────────────────────────────────────────────\n\n if (value === null) {\n return { type: \"null\", value: null, preview: \"null\" };\n }\n\n if (value === undefined) {\n return { type: \"undefined\", preview: \"undefined\" };\n }\n\n if (typeof value === \"boolean\") {\n return { type: \"boolean\", value, preview: String(value) };\n }\n\n if (typeof value === \"number\") {\n return { type: \"number\", value, preview: String(value) };\n }\n\n if (typeof value === \"string\") {\n if (value.length > opts.maxStringLength) {\n const truncated = `${value.slice(0, opts.maxStringLength)}...`;\n return { type: \"string\", value: truncated, preview: `\"${truncated}\"` };\n }\n return { type: \"string\", value, preview: `\"${value}\"` };\n }\n\n if (typeof value === \"bigint\") {\n return { type: \"bigint\", value: `${value.toString()}n`, preview: `${value.toString()}n` };\n }\n\n if (typeof value === \"symbol\") {\n const preview = value.toString(); // \"Symbol(description)\"\n return { type: \"symbol\", preview };\n }\n\n if (typeof value === \"function\") {\n const raw = Function.prototype.toString.call(value);\n const preview = raw.length > 50 ? `${raw.slice(0, 50)} ...` : raw;\n return { type: \"function\", preview };\n }\n\n // ── Objects (all reference types below) ──────────────────────────────────\n\n if (typeof value !== \"object\") {\n // Shouldn't happen with normal JS types, but guard for safety\n return { type: \"string\", value: String(value), preview: String(value) };\n }\n\n // Circular reference check\n if (seen.has(value as object)) {\n return { type: \"circular\" };\n }\n\n // Depth exceeded — but we haven't seen it yet, so no circular, just truncated\n if (depth >= opts.maxDepth) {\n return { type: \"truncated\", preview: truncationPreview(value) };\n }\n\n seen.add(value as object);\n\n try {\n // ── Date ──────────────────────────────────────────────────────────────\n if (value instanceof Date) {\n return { type: \"date\", value: value.toISOString(), preview: value.toISOString() };\n }\n\n // ── Map ───────────────────────────────────────────────────────────────\n if (value instanceof Map) {\n const entries: SerializedValue[] = [];\n let count = 0;\n for (const [k, v] of value) {\n if (count >= opts.maxProperties) break;\n // Serialize each entry as an object { key, value }\n const serializedKey = serializeInner(k, depth + 1, seen, opts);\n const serializedVal = serializeInner(v, depth + 1, seen, opts);\n entries.push({\n type: \"object\",\n value: { key: serializedKey, value: serializedVal },\n preview: `[${serializedKey.preview ?? \"?\"} => ${serializedVal.preview ?? \"?\"}]`,\n });\n count++;\n }\n const truncated = value.size > opts.maxProperties;\n return {\n type: \"map\",\n value: entries,\n preview: `Map(${value.size})${truncated ? \" [truncated]\" : \"\"}`,\n };\n }\n\n // ── Set ───────────────────────────────────────────────────────────────\n if (value instanceof Set) {\n const items: SerializedValue[] = [];\n let count = 0;\n for (const v of value) {\n if (count >= opts.maxArrayLength) break;\n items.push(serializeInner(v, depth + 1, seen, opts));\n count++;\n }\n const truncated = value.size > opts.maxArrayLength;\n return {\n type: \"set\",\n value: items,\n preview: `Set(${value.size})${truncated ? \" [truncated]\" : \"\"}`,\n };\n }\n\n // ── Array ─────────────────────────────────────────────────────────────\n if (Array.isArray(value)) {\n const items: SerializedValue[] = [];\n const limit = Math.min(value.length, opts.maxArrayLength);\n for (let i = 0; i < limit; i++) {\n items.push(serializeInner(value[i], depth + 1, seen, opts));\n }\n const truncated = value.length > opts.maxArrayLength;\n return {\n type: \"array\",\n value: items,\n preview: `Array(${value.length})${truncated ? \" [truncated]\" : \"\"}`,\n };\n }\n\n // ── Plain objects / class instances ───────────────────────────────────\n return serializeObject(value as Record<string, unknown>, depth, seen, opts);\n } finally {\n // Remove from seen after processing so the same object can appear in\n // sibling branches without being falsely flagged as circular.\n seen.delete(value as object);\n }\n}\n\nfunction serializeObject(\n value: Record<string, unknown>,\n depth: number,\n seen: WeakSet<object>,\n opts: Required<SerializeOptions>,\n): SerializedValue {\n // Special preview for well-known non-serializable built-ins\n const ctor = getConstructorName(value);\n\n // WeakMap / WeakRef / WeakSet — can't iterate, return opaque object preview\n if (\n value instanceof WeakMap ||\n value instanceof WeakSet ||\n (typeof WeakRef !== \"undefined\" && value instanceof WeakRef)\n ) {\n return { type: \"object\", preview: ctor };\n }\n\n // Error objects — special handling\n if (value instanceof Error) {\n const props: Record<string, SerializedValue> = {\n name: serializeInner(value.name, depth + 1, seen, opts),\n message: serializeInner(value.message, depth + 1, seen, opts),\n };\n if (value.stack !== undefined) {\n props.stack = serializeInner(value.stack, depth + 1, seen, opts);\n }\n return { type: \"object\", value: props, preview: `${value.name}: ${value.message}` };\n }\n\n // Generic object / class instance\n let keys: string[];\n try {\n keys = Object.keys(value);\n } catch {\n // null-prototype objects or Proxies that throw on ownKeys\n return { type: \"object\", preview: ctor ?? \"Object\" };\n }\n\n const props: Record<string, SerializedValue> = {};\n const limit = Math.min(keys.length, opts.maxProperties);\n for (let i = 0; i < limit; i++) {\n const key = keys[i] as string;\n let propValue: unknown;\n try {\n propValue = (value as Record<string, unknown>)[key];\n } catch {\n propValue = \"[Getter threw]\";\n }\n props[key] = serializeInner(propValue, depth + 1, seen, opts);\n }\n\n const truncated = keys.length > opts.maxProperties;\n const ctorPart = ctor && ctor !== \"Object\" ? `${ctor} ` : \"\";\n const preview = `${ctorPart}{${keys.slice(0, 3).join(\", \")}${keys.length > 3 ? \", …\" : \"\"}}${truncated ? \" [truncated]\" : \"\"}`;\n\n return { type: \"object\", value: props, preview };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getConstructorName(value: object): string {\n try {\n const ctor = Object.getPrototypeOf(value)?.constructor;\n return ctor?.name ?? \"Object\";\n } catch {\n return \"Object\";\n }\n}\n\nfunction truncationPreview(value: unknown): string {\n if (Array.isArray(value)) return `Array(${value.length})`;\n if (value instanceof Map) return `Map(${value.size})`;\n if (value instanceof Set) return `Set(${value.size})`;\n const ctor =\n typeof value === \"object\" && value !== null ? getConstructorName(value as object) : \"\";\n return ctor || \"Object\";\n}\n"]}
|
package/dist/index.js
CHANGED
|
@@ -178,7 +178,7 @@ function serializeInner(value, depth, seen, opts) {
|
|
|
178
178
|
}
|
|
179
179
|
if (typeof value === "string") {
|
|
180
180
|
if (value.length > opts.maxStringLength) {
|
|
181
|
-
const truncated = value.slice(0, opts.maxStringLength)
|
|
181
|
+
const truncated = `${value.slice(0, opts.maxStringLength)}...`;
|
|
182
182
|
return { type: "string", value: truncated, preview: `"${truncated}"` };
|
|
183
183
|
}
|
|
184
184
|
return { type: "string", value, preview: `"${value}"` };
|
|
@@ -192,7 +192,7 @@ function serializeInner(value, depth, seen, opts) {
|
|
|
192
192
|
}
|
|
193
193
|
if (typeof value === "function") {
|
|
194
194
|
const raw = Function.prototype.toString.call(value);
|
|
195
|
-
const preview = raw.length > 50 ? raw.slice(0, 50)
|
|
195
|
+
const preview = raw.length > 50 ? `${raw.slice(0, 50)} ...` : raw;
|
|
196
196
|
return { type: "function", preview };
|
|
197
197
|
}
|
|
198
198
|
if (typeof value !== "object") {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/guards.ts","../src/serialization.ts"],"names":["props"],"mappings":";AAWO,IAAM,cAAA,GAAiB;AAOvB,IAAM,UAAA,GAAkC;AAAA,EAC7C,UAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,iBAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,OAAA;AAAA,EACA,sBAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA;AACF;AAOO,IAAM,eAAA,GAA4C;AAAA,EACvD,UAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF;AAOO,IAAM,sBAAA,GAAyD;AAAA,EACpE,QAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF;AAOO,IAAM,cAAA,GAA0C;AAAA,EACrD,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,gBAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF;;;AChEA,SAAS,SAAS,KAAA,EAAkD;AAClE,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAEA,SAAS,eAAe,KAAA,EAAwC;AAC9D,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA;AAChD;AAEA,SAAS,iBAAiB,KAAA,EAAwC;AAChE,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA;AAChD;AAYO,SAAS,iBAAiB,KAAA,EAAyC;AACxE,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AAC7B,EAAA,OACE,OAAO,KAAA,CAAM,QAAA,KAAa,QAAA,IAC1B,OAAO,MAAM,UAAA,KAAe,QAAA,IAC5B,OAAO,KAAA,CAAM,YAAA,KAAiB,QAAA;AAElC;AAYO,SAAS,kBAAkB,KAAA,EAA0C;AAC1E,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AAC7B,EAAA,IAAI,CAAC,sBAAA,CAAuB,QAAA,CAAS,KAAA,CAAM,IAA+B,GAAG,OAAO,KAAA;AACpF,EAAA,IAAI,aAAa,KAAA,IAAS,OAAO,KAAA,CAAM,OAAA,KAAY,UAAU,OAAO,KAAA;AACpE,EAAA,OAAO,IAAA;AACT;AAYO,SAAS,YAAY,KAAA,EAAoC;AAC9D,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AAC7B,EAAA,IAAI,CAAC,cAAA,CAAe,KAAA,CAAM,OAAO,GAAG,OAAO,KAAA;AAC3C,EAAA,IAAI,CAAC,cAAA,CAAe,KAAA,CAAM,IAAI,GAAG,OAAO,KAAA;AACxC,EAAA,IAAI,KAAA,CAAM,WAAW,IAAA,IAAQ,CAAC,SAAS,KAAA,CAAM,MAAM,GAAG,OAAO,KAAA;AAC7D,EAAA,IAAI,CAAC,QAAA,CAAS,KAAA,CAAM,KAAK,GAAG,OAAO,KAAA;AACnC,EAAA,OAAO,IAAA;AACT;AAYO,SAAS,qBAAqB,KAAA,EAA6C;AAChF,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AAC7B,EAAA,OACE,cAAA,CAAe,KAAA,CAAM,WAAW,CAAA,IAChC,iBAAA,CAAkB,MAAM,KAAK,CAAA,IAC7B,OAAO,KAAA,CAAM,gBAAA,KAAqB,SAAA;AAEtC;AAYO,SAAS,YAAY,KAAA,EAAoC;AAC9D,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AAC7B,EAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,KAAA,CAAM,IAAyB,GAAG,OAAO,KAAA;AAClE,EAAA,IAAI,CAAC,cAAA,CAAe,KAAA,CAAM,IAAI,GAAG,OAAO,KAAA;AACxC,EAAA,IAAI,CAAC,iBAAA,CAAkB,KAAA,CAAM,KAAK,GAAG,OAAO,KAAA;AAC5C,EAAA,IAAI,KAAA,CAAM,SAAS,IAAA,EAAM;AACvB,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,IAAI,GAAG,OAAO,KAAA;AACvC,IAAA,IAAI,CAAE,KAAA,CAAM,IAAA,CAAmB,KAAA,CAAM,iBAAiB,GAAG,OAAO,KAAA;AAAA,EAClE;AACA,EAAA,IAAI,MAAM,UAAA,KAAe,IAAA,IAAQ,OAAO,KAAA,CAAM,UAAA,KAAe,WAAW,OAAO,KAAA;AAC/E,EAAA,OAAO,IAAA;AACT;AAgBO,SAAS,gBAAgB,KAAA,EAAwC;AACtE,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AAC7B,EAAA,IAAI,OAAO,KAAA,CAAM,EAAA,KAAO,QAAA,EAAU,OAAO,KAAA;AACzC,EAAA,IAAI,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,EAAU,OAAO,KAAA;AAC3C,EAAA,IAAI,CAAC,eAAA,CAAgB,QAAA,CAAS,KAAA,CAAM,IAA6B,GAAG,OAAO,KAAA;AAC3E,EAAA,IAAI,KAAA,CAAM,WAAW,IAAA,IAAQ,CAAC,iBAAiB,KAAA,CAAM,MAAM,GAAG,OAAO,KAAA;AACrE,EAAA,IAAI,CAAC,iBAAA,CAAkB,KAAA,CAAM,KAAK,GAAG,OAAO,KAAA;AAC5C,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,KAAK,GAAG,OAAO,KAAA;AACxC,EAAA,IAAI,CAAE,KAAA,CAAM,KAAA,CAAoB,KAAA,CAAM,WAAW,GAAG,OAAO,KAAA;AAC3D,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,OAAO,GAAG,OAAO,KAAA;AAC1C,EAAA,IAAI,CAAE,KAAA,CAAM,OAAA,CAAsB,KAAA,CAAM,oBAAoB,GAAG,OAAO,KAAA;AACtE,EAAA,IAAI,OAAO,KAAA,CAAM,WAAA,KAAgB,QAAA,EAAU,OAAO,KAAA;AAClD,EAAA,IAAI,OAAO,KAAA,CAAM,cAAA,KAAmB,QAAA,EAAU,OAAO,KAAA;AACrD,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,QAAQ,GAAG,OAAO,KAAA;AAC3C,EAAA,OAAO,IAAA;AACT;AAQO,SAAS,oBAAoB,KAAA,EAAwC;AAC1E,EAAA,IAAI,CAAC,eAAA,CAAgB,KAAK,CAAA,EAAG,OAAO,KAAA;AACpC,EAAA,OAAQ,KAAA,CAAM,QAAA,CAAuB,KAAA,CAAM,mBAAmB,CAAA;AAChE;AAMA,IAAM,kBAAA,GAAqB,CAAC,UAAA,EAAY,WAAA,EAAa,aAAa,SAAS,CAAA;AAQpE,SAAS,gBAAgB,KAAA,EAAwC;AACtE,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AAC7B,EAAA,OACE,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,IACzB,OAAO,KAAA,CAAM,IAAA,KAAS,QAAA,KACrB,OAAO,KAAA,CAAM,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,UAAU,IAAA,CAAA,KACnD,KAAA,CAAM,MAAA,KAAW,IAAA,IAAQ,gBAAA,CAAiB,KAAA,CAAM,MAAM,CAAA,CAAA,IACvD,eAAe,KAAA,CAAM,aAAa,CAAA,IAClC,OAAO,MAAM,SAAA,KAAc,QAAA,IAC3B,kBAAA,CAAmB,QAAA,CAAS,MAAM,UAAyC,CAAA;AAE/E;AAYO,SAAS,uBAAuB,KAAA,EAA+C;AACpF,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AAC7B,EAAA,OACE,OAAO,KAAA,CAAM,EAAA,KAAO,QAAA,IACpB,OAAO,MAAM,aAAA,KAAkB,QAAA,IAC/B,OAAO,KAAA,CAAM,WAAA,KAAgB,SAAA,IAC7B,iBAAiB,KAAA,CAAM,iBAAiB,CAAA,IACxC,cAAA,CAAe,KAAA,CAAM,YAAY,CAAA,KAChC,KAAA,CAAM,MAAA,KAAW,IAAA,IAAQ,gBAAA,CAAiB,KAAA,CAAM,MAAM,CAAA,CAAA;AAE3D;AAYO,SAAS,eAAe,KAAA,EAAuC;AACpE,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AAC7B,EAAA,IAAI,CAAC,cAAA,CAAe,QAAA,CAAS,KAAA,CAAM,KAA8B,GAAG,OAAO,KAAA;AAC3E,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,IAAI,GAAG,OAAO,KAAA;AACvC,EAAA,IAAI,CAAE,KAAA,CAAM,IAAA,CAAmB,KAAA,CAAM,iBAAiB,GAAG,OAAO,KAAA;AAChE,EAAA,OACE,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,IAC3B,cAAA,CAAe,MAAM,aAAa,CAAA,IAClC,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA;AAE7B;AAgBO,SAAS,aAAa,KAAA,EAAqC;AAChE,EAAA,IAAI,CAAC,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AAC7B,EAAA,IAAI,OAAO,KAAA,CAAM,GAAA,KAAQ,QAAA,EAAU,OAAO,KAAA;AAC1C,EAAA,IAAI,KAAA,CAAM,UAAU,IAAA,IAAQ,CAAC,YAAY,KAAA,CAAM,KAAK,GAAG,OAAO,KAAA;AAC9D,EAAA,IAAI,OAAO,KAAA,CAAM,SAAA,KAAc,QAAA,EAAU,OAAO,KAAA;AAChD,EAAA,IAAI,OAAO,KAAA,CAAM,UAAA,KAAe,QAAA,EAAU,OAAO,KAAA;AACjD,EAAA,IAAI,CAAC,eAAA,CAAgB,KAAA,CAAM,IAAI,GAAG,OAAO,KAAA;AACzC,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,MAAM,GAAG,OAAO,KAAA;AACzC,EAAA,IAAI,CAAE,KAAA,CAAM,MAAA,CAAqB,KAAA,CAAM,eAAe,GAAG,OAAO,KAAA;AAChE,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,kBAAkB,GAAG,OAAO,KAAA;AACrD,EAAA,IAAI,CAAE,KAAA,CAAM,kBAAA,CAAiC,KAAA,CAAM,sBAAsB,GAAG,OAAO,KAAA;AACnF,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,cAAc,GAAG,OAAO,KAAA;AACjD,EAAA,IAAI,CAAE,KAAA,CAAM,cAAA,CAA6B,KAAA,CAAM,cAAc,GAAG,OAAO,KAAA;AACvE,EAAA,OAAO,IAAA;AACT;AASO,SAAS,iBAAiB,KAAA,EAAqC;AACpE,EAAA,IAAI,CAAC,YAAA,CAAa,KAAK,CAAA,EAAG,OAAO,KAAA;AACjC,EAAA,OAAO,mBAAA,CAAoB,MAAM,IAAI,CAAA;AACvC;;;AChQA,IAAM,QAAA,GAAW;AAAA,EACf,QAAA,EAAU,CAAA;AAAA,EACV,eAAA,EAAiB,GAAA;AAAA,EACjB,cAAA,EAAgB,GAAA;AAAA,EAChB,aAAA,EAAe;AACjB,CAAA;AAQO,SAAS,SAAA,CAAU,OAAgB,OAAA,EAA6C;AACrF,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,QAAA,EAAU,GAAG,OAAA,EAAQ;AACvC,EAAA,MAAM,IAAA,uBAAW,OAAA,EAAgB;AACjC,EAAA,OAAO,cAAA,CAAe,KAAA,EAAO,CAAA,EAAG,IAAA,EAAM,IAAI,CAAA;AAC5C;AAMA,SAAS,cAAA,CACP,KAAA,EACA,KAAA,EACA,IAAA,EACA,IAAA,EACiB;AAGjB,EAAA,IAAI,UAAU,IAAA,EAAM;AAClB,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,SAAS,MAAA,EAAO;AAAA,EACtD;AAEA,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,EAAE,IAAA,EAAM,WAAA,EAAa,OAAA,EAAS,WAAA,EAAY;AAAA,EACnD;AAEA,EAAA,IAAI,OAAO,UAAU,SAAA,EAAW;AAC9B,IAAA,OAAO,EAAE,IAAA,EAAM,SAAA,EAAW,OAAO,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,EAC1D;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,EACzD;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,IAAI,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,eAAA,EAAiB;AACvC,MAAA,MAAM,YAAY,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,eAAe,CAAA,GAAI,KAAA;AACzD,MAAA,OAAO,EAAE,MAAM,QAAA,EAAU,KAAA,EAAO,WAAW,OAAA,EAAS,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,CAAA,EAAI;AAAA,IACvE;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAO,OAAA,EAAS,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,CAAA,EAAI;AAAA,EACxD;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,GAAG,KAAA,CAAM,QAAA,EAAU,CAAA,CAAA,CAAA,EAAK,OAAA,EAAS,CAAA,EAAG,KAAA,CAAM,QAAA,EAAU,CAAA,CAAA,CAAA,EAAI;AAAA,EAC1F;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,EAAS;AAC/B,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAQ;AAAA,EACnC;AAEA,EAAA,IAAI,OAAO,UAAU,UAAA,EAAY;AAC/B,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,SAAA,CAAU,QAAA,CAAS,KAAK,KAAK,CAAA;AAClD,IAAA,MAAM,OAAA,GAAU,IAAI,MAAA,GAAS,EAAA,GAAK,IAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA,GAAS,GAAA;AAC9D,IAAA,OAAO,EAAE,IAAA,EAAM,UAAA,EAAY,OAAA,EAAQ;AAAA,EACrC;AAIA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAE7B,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAG,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,EACxE;AAGA,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,KAAe,CAAA,EAAG;AAC7B,IAAA,OAAO,EAAE,MAAM,UAAA,EAAW;AAAA,EAC5B;AAGA,EAAA,IAAI,KAAA,IAAS,KAAK,QAAA,EAAU;AAC1B,IAAA,OAAO,EAAE,IAAA,EAAM,WAAA,EAAa,OAAA,EAAS,iBAAA,CAAkB,KAAK,CAAA,EAAE;AAAA,EAChE;AAEA,EAAA,IAAA,CAAK,IAAI,KAAe,CAAA;AAExB,EAAA,IAAI;AAEF,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,KAAA,CAAM,aAAY,EAAG,OAAA,EAAS,KAAA,CAAM,WAAA,EAAY,EAAE;AAAA,IAClF;AAGA,IAAA,IAAI,iBAAiB,GAAA,EAAK;AACxB,MAAA,MAAM,UAA6B,EAAC;AACpC,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,CAAA,IAAK,KAAA,EAAO;AAC1B,QAAA,IAAI,KAAA,IAAS,KAAK,aAAA,EAAe;AAEjC,QAAA,MAAM,gBAAgB,cAAA,CAAe,CAAA,EAAG,KAAA,GAAQ,CAAA,EAAG,MAAM,IAAI,CAAA;AAC7D,QAAA,MAAM,gBAAgB,cAAA,CAAe,CAAA,EAAG,KAAA,GAAQ,CAAA,EAAG,MAAM,IAAI,CAAA;AAC7D,QAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,UACX,IAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO,EAAE,GAAA,EAAK,aAAA,EAAe,OAAO,aAAA,EAAc;AAAA,UAClD,OAAA,EAAS,IAAI,aAAA,CAAc,OAAA,IAAW,GAAG,CAAA,IAAA,EAAO,aAAA,CAAc,WAAW,GAAG,CAAA,CAAA;AAAA,SAC7E,CAAA;AACD,QAAA,KAAA,EAAA;AAAA,MACF;AACA,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,GAAO,IAAA,CAAK,aAAA;AACpC,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,KAAA;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,SAAS,CAAA,IAAA,EAAO,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,SAAA,GAAY,iBAAiB,EAAE,CAAA;AAAA,OAC/D;AAAA,IACF;AAGA,IAAA,IAAI,iBAAiB,GAAA,EAAK;AACxB,MAAA,MAAM,QAA2B,EAAC;AAClC,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,QAAA,IAAI,KAAA,IAAS,KAAK,cAAA,EAAgB;AAClC,QAAA,KAAA,CAAM,KAAK,cAAA,CAAe,CAAA,EAAG,QAAQ,CAAA,EAAG,IAAA,EAAM,IAAI,CAAC,CAAA;AACnD,QAAA,KAAA,EAAA;AAAA,MACF;AACA,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,GAAO,IAAA,CAAK,cAAA;AACpC,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,KAAA;AAAA,QACN,KAAA,EAAO,KAAA;AAAA,QACP,SAAS,CAAA,IAAA,EAAO,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,SAAA,GAAY,iBAAiB,EAAE,CAAA;AAAA,OAC/D;AAAA,IACF;AAGA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,MAAM,QAA2B,EAAC;AAClC,MAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,cAAc,CAAA;AACxD,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,QAAA,KAAA,CAAM,IAAA,CAAK,eAAe,KAAA,CAAM,CAAC,GAAG,KAAA,GAAQ,CAAA,EAAG,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,MAC5D;AACA,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,cAAA;AACtC,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,KAAA;AAAA,QACP,SAAS,CAAA,MAAA,EAAS,KAAA,CAAM,MAAM,CAAA,CAAA,EAAI,SAAA,GAAY,iBAAiB,EAAE,CAAA;AAAA,OACnE;AAAA,IACF;AAGA,IAAA,OAAO,eAAA,CAAgB,KAAA,EAAkC,KAAA,EAAO,IAAA,EAAM,IAAI,CAAA;AAAA,EAC5E,CAAA,SAAE;AAGA,IAAA,IAAA,CAAK,OAAO,KAAe,CAAA;AAAA,EAC7B;AACF;AAEA,SAAS,eAAA,CACP,KAAA,EACA,KAAA,EACA,IAAA,EACA,IAAA,EACiB;AAEjB,EAAA,MAAM,IAAA,GAAO,mBAAmB,KAAK,CAAA;AAGrC,EAAA,IACE,KAAA,YAAiB,WACjB,KAAA,YAAiB,OAAA,IAChB,OAAO,OAAA,KAAY,WAAA,IAAe,iBAAiB,OAAA,EACpD;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,IAAA,EAAK;AAAA,EACzC;AAGA,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,MAAMA,MAAAA,GAAyC;AAAA,MAC7C,MAAM,cAAA,CAAe,KAAA,CAAM,MAAM,KAAA,GAAQ,CAAA,EAAG,MAAM,IAAI,CAAA;AAAA,MACtD,SAAS,cAAA,CAAe,KAAA,CAAM,SAAS,KAAA,GAAQ,CAAA,EAAG,MAAM,IAAI;AAAA,KAC9D;AACA,IAAA,IAAI,KAAA,CAAM,UAAU,MAAA,EAAW;AAC7B,MAAAA,MAAAA,CAAM,QAAQ,cAAA,CAAe,KAAA,CAAM,OAAO,KAAA,GAAQ,CAAA,EAAG,MAAM,IAAI,CAAA;AAAA,IACjE;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAOA,MAAAA,EAAO,OAAA,EAAS,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAA,EAAG;AAAA,EACpF;AAGA,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,EAC1B,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,EAAS,QAAQ,QAAA,EAAS;AAAA,EACrD;AAEA,EAAA,MAAM,QAAyC,EAAC;AAChD,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,KAAK,aAAa,CAAA;AACtD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,IAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAClB,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI;AACF,MAAA,SAAA,GAAa,MAAkC,GAAG,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AACN,MAAA,SAAA,GAAY,gBAAA;AAAA,IACd;AACA,IAAA,KAAA,CAAM,GAAG,CAAA,GAAI,cAAA,CAAe,WAAW,KAAA,GAAQ,CAAA,EAAG,MAAM,IAAI,CAAA;AAAA,EAC9D;AAEA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,aAAA;AACrC,EAAA,MAAM,WAAW,IAAA,IAAQ,IAAA,KAAS,QAAA,GAAW,CAAA,EAAG,IAAI,CAAA,CAAA,CAAA,GAAM,EAAA;AAC1D,EAAA,MAAM,OAAA,GAAU,GAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,EAAG,KAAK,MAAA,GAAS,CAAA,GAAI,aAAQ,EAAE,CAAA,CAAA,EAAI,SAAA,GAAY,cAAA,GAAiB,EAAE,CAAA,CAAA;AAE5H,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,OAAO,OAAA,EAAQ;AACjD;AAMA,SAAS,mBAAmB,KAAA,EAAuB;AACjD,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,cAAA,CAAe,KAAK,CAAA,EAAG,WAAA;AAC3C,IAAA,OAAO,MAAM,IAAA,IAAQ,QAAA;AAAA,EACvB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,QAAA;AAAA,EACT;AACF;AAEA,SAAS,kBAAkB,KAAA,EAAwB;AACjD,EAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,GAAG,OAAO,CAAA,MAAA,EAAS,MAAM,MAAM,CAAA,CAAA,CAAA;AACtD,EAAA,IAAI,KAAA,YAAiB,GAAA,EAAK,OAAO,CAAA,IAAA,EAAO,MAAM,IAAI,CAAA,CAAA,CAAA;AAClD,EAAA,IAAI,KAAA,YAAiB,GAAA,EAAK,OAAO,CAAA,IAAA,EAAO,MAAM,IAAI,CAAA,CAAA,CAAA;AAClD,EAAA,MAAM,IAAA,GACJ,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,GAAO,kBAAA,CAAmB,KAAe,CAAA,GAAI,EAAA;AACtF,EAAA,OAAO,IAAA,IAAQ,QAAA;AACjB","file":"index.js","sourcesContent":["import type { ComponentType } from \"./types/component-node.js\";\nimport type { ConsoleLevel } from \"./types/console.js\";\nimport type { HookType } from \"./types/hook-state.js\";\nimport type { SerializedValueType } from \"./types/serialized-value.js\";\n\n/**\n * Semantic version of the `PageReport` schema.\n *\n * Consumers should compare this value when reading stored reports to detect\n * schema drift. Follows semver: breaking changes bump the major version.\n */\nexport const SCHEMA_VERSION = \"0.1.0\" as const;\n\n/**\n * All valid React hook types tracked by the Scope runtime.\n *\n * @see {@link HookType}\n */\nexport const HOOK_TYPES: readonly HookType[] = [\n \"useState\",\n \"useReducer\",\n \"useEffect\",\n \"useLayoutEffect\",\n \"useMemo\",\n \"useCallback\",\n \"useRef\",\n \"useContext\",\n \"useId\",\n \"useSyncExternalStore\",\n \"useTransition\",\n \"useDeferredValue\",\n \"custom\",\n] as const;\n\n/**\n * All valid component implementation strategies.\n *\n * @see {@link ComponentType}\n */\nexport const COMPONENT_TYPES: readonly ComponentType[] = [\n \"function\",\n \"class\",\n \"forward_ref\",\n \"memo\",\n \"host\",\n] as const;\n\n/**\n * All valid serialized value types.\n *\n * @see {@link SerializedValueType}\n */\nexport const SERIALIZED_VALUE_TYPES: readonly SerializedValueType[] = [\n \"string\",\n \"number\",\n \"boolean\",\n \"null\",\n \"undefined\",\n \"object\",\n \"array\",\n \"function\",\n \"symbol\",\n \"bigint\",\n \"date\",\n \"map\",\n \"set\",\n \"circular\",\n \"truncated\",\n] as const;\n\n/**\n * All valid console entry levels.\n *\n * @see {@link ConsoleLevel}\n */\nexport const CONSOLE_LEVELS: readonly ConsoleLevel[] = [\n \"log\",\n \"warn\",\n \"error\",\n \"info\",\n \"debug\",\n \"group\",\n \"groupCollapsed\",\n \"table\",\n \"trace\",\n] as const;\n","import {\n COMPONENT_TYPES,\n CONSOLE_LEVELS,\n HOOK_TYPES,\n SERIALIZED_VALUE_TYPES,\n} from \"./constants.js\";\nimport type { ComponentNode } from \"./types/component-node.js\";\nimport type { ConsoleEntry } from \"./types/console.js\";\nimport type { ContextConsumption } from \"./types/context.js\";\nimport type { CapturedError } from \"./types/errors.js\";\nimport type { HookState } from \"./types/hook-state.js\";\nimport type { PageReport } from \"./types/page-report.js\";\nimport type { RouteInfo } from \"./types/route.js\";\nimport type { SerializedValue } from \"./types/serialized-value.js\";\nimport type { SourceLocation } from \"./types/source-location.js\";\nimport type { SuspenseBoundaryInfo } from \"./types/suspense.js\";\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isStringOrNull(value: unknown): value is string | null {\n return typeof value === \"string\" || value === null;\n}\n\nfunction isNullableNumber(value: unknown): value is number | null {\n return typeof value === \"number\" || value === null;\n}\n\n// ---------------------------------------------------------------------------\n// SourceLocation\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link SourceLocation}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `SourceLocation` interface.\n */\nexport function isSourceLocation(value: unknown): value is SourceLocation {\n if (!isObject(value)) return false;\n return (\n typeof value.fileName === \"string\" &&\n typeof value.lineNumber === \"number\" &&\n typeof value.columnNumber === \"number\"\n );\n}\n\n// ---------------------------------------------------------------------------\n// SerializedValue\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link SerializedValue}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `SerializedValue` interface.\n */\nexport function isSerializedValue(value: unknown): value is SerializedValue {\n if (!isObject(value)) return false;\n if (!SERIALIZED_VALUE_TYPES.includes(value.type as SerializedValue[\"type\"])) return false;\n if (\"preview\" in value && typeof value.preview !== \"string\") return false;\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// RouteInfo\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link RouteInfo}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `RouteInfo` interface.\n */\nexport function isRouteInfo(value: unknown): value is RouteInfo {\n if (!isObject(value)) return false;\n if (!isStringOrNull(value.pattern)) return false;\n if (!isStringOrNull(value.name)) return false;\n if (value.params !== null && !isObject(value.params)) return false;\n if (!isObject(value.query)) return false;\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// ContextConsumption\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link ContextConsumption}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `ContextConsumption` interface.\n */\nexport function isContextConsumption(value: unknown): value is ContextConsumption {\n if (!isObject(value)) return false;\n return (\n isStringOrNull(value.contextName) &&\n isSerializedValue(value.value) &&\n typeof value.didTriggerRender === \"boolean\"\n );\n}\n\n// ---------------------------------------------------------------------------\n// HookState\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link HookState}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `HookState` interface.\n */\nexport function isHookState(value: unknown): value is HookState {\n if (!isObject(value)) return false;\n if (!HOOK_TYPES.includes(value.type as HookState[\"type\"])) return false;\n if (!isStringOrNull(value.name)) return false;\n if (!isSerializedValue(value.value)) return false;\n if (value.deps !== null) {\n if (!Array.isArray(value.deps)) return false;\n if (!(value.deps as unknown[]).every(isSerializedValue)) return false;\n }\n if (value.hasCleanup !== null && typeof value.hasCleanup !== \"boolean\") return false;\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// ComponentNode\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link ComponentNode}.\n *\n * Performs a shallow check of the node itself; `children` are verified to be\n * arrays of objects but are **not** recursively validated to keep the guard\n * O(1) per node. Use {@link isComponentNodeDeep} for full tree validation.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `ComponentNode` interface.\n */\nexport function isComponentNode(value: unknown): value is ComponentNode {\n if (!isObject(value)) return false;\n if (typeof value.id !== \"number\") return false;\n if (typeof value.name !== \"string\") return false;\n if (!COMPONENT_TYPES.includes(value.type as ComponentNode[\"type\"])) return false;\n if (value.source !== null && !isSourceLocation(value.source)) return false;\n if (!isSerializedValue(value.props)) return false;\n if (!Array.isArray(value.state)) return false;\n if (!(value.state as unknown[]).every(isHookState)) return false;\n if (!Array.isArray(value.context)) return false;\n if (!(value.context as unknown[]).every(isContextConsumption)) return false;\n if (typeof value.renderCount !== \"number\") return false;\n if (typeof value.renderDuration !== \"number\") return false;\n if (!Array.isArray(value.children)) return false;\n return true;\n}\n\n/**\n * Recursively validates a `ComponentNode` and its entire subtree.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` and all descendant nodes conform to `ComponentNode`.\n */\nexport function isComponentNodeDeep(value: unknown): value is ComponentNode {\n if (!isComponentNode(value)) return false;\n return (value.children as unknown[]).every(isComponentNodeDeep);\n}\n\n// ---------------------------------------------------------------------------\n// CapturedError\n// ---------------------------------------------------------------------------\n\nconst CAPTURED_BY_VALUES = [\"boundary\", \"unhandled\", \"rejection\", \"console\"] as const;\n\n/**\n * Type guard for {@link CapturedError}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `CapturedError` interface.\n */\nexport function isCapturedError(value: unknown): value is CapturedError {\n if (!isObject(value)) return false;\n return (\n typeof value.message === \"string\" &&\n typeof value.name === \"string\" &&\n (typeof value.stack === \"string\" || value.stack === null) &&\n (value.source === null || isSourceLocation(value.source)) &&\n isStringOrNull(value.componentName) &&\n typeof value.timestamp === \"number\" &&\n CAPTURED_BY_VALUES.includes(value.capturedBy as CapturedError[\"capturedBy\"])\n );\n}\n\n// ---------------------------------------------------------------------------\n// SuspenseBoundaryInfo\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link SuspenseBoundaryInfo}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `SuspenseBoundaryInfo` interface.\n */\nexport function isSuspenseBoundaryInfo(value: unknown): value is SuspenseBoundaryInfo {\n if (!isObject(value)) return false;\n return (\n typeof value.id === \"number\" &&\n typeof value.componentName === \"string\" &&\n typeof value.isSuspended === \"boolean\" &&\n isNullableNumber(value.suspendedDuration) &&\n isStringOrNull(value.fallbackName) &&\n (value.source === null || isSourceLocation(value.source))\n );\n}\n\n// ---------------------------------------------------------------------------\n// ConsoleEntry\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link ConsoleEntry}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `ConsoleEntry` interface.\n */\nexport function isConsoleEntry(value: unknown): value is ConsoleEntry {\n if (!isObject(value)) return false;\n if (!CONSOLE_LEVELS.includes(value.level as ConsoleEntry[\"level\"])) return false;\n if (!Array.isArray(value.args)) return false;\n if (!(value.args as unknown[]).every(isSerializedValue)) return false;\n return (\n typeof value.timestamp === \"number\" &&\n isStringOrNull(value.componentName) &&\n typeof value.preview === \"string\"\n );\n}\n\n// ---------------------------------------------------------------------------\n// PageReport\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link PageReport}.\n *\n * Validates the top-level shape of a `PageReport`. The component tree\n * (`tree`) is shallowly validated via {@link isComponentNode}. Use\n * {@link isPageReportDeep} if you need full recursive tree validation.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `PageReport` interface.\n */\nexport function isPageReport(value: unknown): value is PageReport {\n if (!isObject(value)) return false;\n if (typeof value.url !== \"string\") return false;\n if (value.route !== null && !isRouteInfo(value.route)) return false;\n if (typeof value.timestamp !== \"number\") return false;\n if (typeof value.capturedIn !== \"number\") return false;\n if (!isComponentNode(value.tree)) return false;\n if (!Array.isArray(value.errors)) return false;\n if (!(value.errors as unknown[]).every(isCapturedError)) return false;\n if (!Array.isArray(value.suspenseBoundaries)) return false;\n if (!(value.suspenseBoundaries as unknown[]).every(isSuspenseBoundaryInfo)) return false;\n if (!Array.isArray(value.consoleEntries)) return false;\n if (!(value.consoleEntries as unknown[]).every(isConsoleEntry)) return false;\n return true;\n}\n\n/**\n * Like {@link isPageReport} but also recursively validates the entire\n * component tree via {@link isComponentNodeDeep}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` and its full component tree are valid.\n */\nexport function isPageReportDeep(value: unknown): value is PageReport {\n if (!isPageReport(value)) return false;\n return isComponentNodeDeep(value.tree);\n}\n","/**\n * serialize() — Convert any JavaScript value to a SerializedValue snapshot.\n *\n * Features:\n * - Handles all primitives: string, number, boolean, null, undefined\n * - Handles complex types: object, array, function, symbol, bigint\n * - Handles built-ins: Date, Map, Set\n * - Circular reference detection via WeakSet → { type: 'circular' }\n * - Depth limiting → { type: 'truncated' }\n * - Configurable truncation for strings, arrays, and object properties\n */\n\nimport type { SerializedValue } from \"./types/serialized-value.js\";\n\nexport interface SerializeOptions {\n /** Maximum recursion depth for nested objects/arrays. Default: 5. */\n maxDepth?: number;\n /** Maximum length of serialized strings before truncation. Default: 200. */\n maxStringLength?: number;\n /** Maximum number of array items to serialize. Default: 100. */\n maxArrayLength?: number;\n /** Maximum number of object properties to serialize. Default: 50. */\n maxProperties?: number;\n}\n\nconst DEFAULTS = {\n maxDepth: 5,\n maxStringLength: 200,\n maxArrayLength: 100,\n maxProperties: 50,\n} as const;\n\n/**\n * Convert any JavaScript value to a safely-serialized {@link SerializedValue}.\n *\n * @param value - The value to serialize.\n * @param options - Optional tuning parameters.\n */\nexport function serialize(value: unknown, options?: SerializeOptions): SerializedValue {\n const opts = { ...DEFAULTS, ...options };\n const seen = new WeakSet<object>();\n return serializeInner(value, 0, seen, opts);\n}\n\n// ---------------------------------------------------------------------------\n// Internal recursive implementation\n// ---------------------------------------------------------------------------\n\nfunction serializeInner(\n value: unknown,\n depth: number,\n seen: WeakSet<object>,\n opts: Required<SerializeOptions>,\n): SerializedValue {\n // ── Primitives ────────────────────────────────────────────────────────────\n\n if (value === null) {\n return { type: \"null\", value: null, preview: \"null\" };\n }\n\n if (value === undefined) {\n return { type: \"undefined\", preview: \"undefined\" };\n }\n\n if (typeof value === \"boolean\") {\n return { type: \"boolean\", value, preview: String(value) };\n }\n\n if (typeof value === \"number\") {\n return { type: \"number\", value, preview: String(value) };\n }\n\n if (typeof value === \"string\") {\n if (value.length > opts.maxStringLength) {\n const truncated = value.slice(0, opts.maxStringLength) + \"...\";\n return { type: \"string\", value: truncated, preview: `\"${truncated}\"` };\n }\n return { type: \"string\", value, preview: `\"${value}\"` };\n }\n\n if (typeof value === \"bigint\") {\n return { type: \"bigint\", value: `${value.toString()}n`, preview: `${value.toString()}n` };\n }\n\n if (typeof value === \"symbol\") {\n const preview = value.toString(); // \"Symbol(description)\"\n return { type: \"symbol\", preview };\n }\n\n if (typeof value === \"function\") {\n const raw = Function.prototype.toString.call(value);\n const preview = raw.length > 50 ? raw.slice(0, 50) + \" ...\" : raw;\n return { type: \"function\", preview };\n }\n\n // ── Objects (all reference types below) ──────────────────────────────────\n\n if (typeof value !== \"object\") {\n // Shouldn't happen with normal JS types, but guard for safety\n return { type: \"string\", value: String(value), preview: String(value) };\n }\n\n // Circular reference check\n if (seen.has(value as object)) {\n return { type: \"circular\" };\n }\n\n // Depth exceeded — but we haven't seen it yet, so no circular, just truncated\n if (depth >= opts.maxDepth) {\n return { type: \"truncated\", preview: truncationPreview(value) };\n }\n\n seen.add(value as object);\n\n try {\n // ── Date ──────────────────────────────────────────────────────────────\n if (value instanceof Date) {\n return { type: \"date\", value: value.toISOString(), preview: value.toISOString() };\n }\n\n // ── Map ───────────────────────────────────────────────────────────────\n if (value instanceof Map) {\n const entries: SerializedValue[] = [];\n let count = 0;\n for (const [k, v] of value) {\n if (count >= opts.maxProperties) break;\n // Serialize each entry as an object { key, value }\n const serializedKey = serializeInner(k, depth + 1, seen, opts);\n const serializedVal = serializeInner(v, depth + 1, seen, opts);\n entries.push({\n type: \"object\",\n value: { key: serializedKey, value: serializedVal },\n preview: `[${serializedKey.preview ?? \"?\"} => ${serializedVal.preview ?? \"?\"}]`,\n });\n count++;\n }\n const truncated = value.size > opts.maxProperties;\n return {\n type: \"map\",\n value: entries,\n preview: `Map(${value.size})${truncated ? \" [truncated]\" : \"\"}`,\n };\n }\n\n // ── Set ───────────────────────────────────────────────────────────────\n if (value instanceof Set) {\n const items: SerializedValue[] = [];\n let count = 0;\n for (const v of value) {\n if (count >= opts.maxArrayLength) break;\n items.push(serializeInner(v, depth + 1, seen, opts));\n count++;\n }\n const truncated = value.size > opts.maxArrayLength;\n return {\n type: \"set\",\n value: items,\n preview: `Set(${value.size})${truncated ? \" [truncated]\" : \"\"}`,\n };\n }\n\n // ── Array ─────────────────────────────────────────────────────────────\n if (Array.isArray(value)) {\n const items: SerializedValue[] = [];\n const limit = Math.min(value.length, opts.maxArrayLength);\n for (let i = 0; i < limit; i++) {\n items.push(serializeInner(value[i], depth + 1, seen, opts));\n }\n const truncated = value.length > opts.maxArrayLength;\n return {\n type: \"array\",\n value: items,\n preview: `Array(${value.length})${truncated ? \" [truncated]\" : \"\"}`,\n };\n }\n\n // ── Plain objects / class instances ───────────────────────────────────\n return serializeObject(value as Record<string, unknown>, depth, seen, opts);\n } finally {\n // Remove from seen after processing so the same object can appear in\n // sibling branches without being falsely flagged as circular.\n seen.delete(value as object);\n }\n}\n\nfunction serializeObject(\n value: Record<string, unknown>,\n depth: number,\n seen: WeakSet<object>,\n opts: Required<SerializeOptions>,\n): SerializedValue {\n // Special preview for well-known non-serializable built-ins\n const ctor = getConstructorName(value);\n\n // WeakMap / WeakRef / WeakSet — can't iterate, return opaque object preview\n if (\n value instanceof WeakMap ||\n value instanceof WeakSet ||\n (typeof WeakRef !== \"undefined\" && value instanceof WeakRef)\n ) {\n return { type: \"object\", preview: ctor };\n }\n\n // Error objects — special handling\n if (value instanceof Error) {\n const props: Record<string, SerializedValue> = {\n name: serializeInner(value.name, depth + 1, seen, opts),\n message: serializeInner(value.message, depth + 1, seen, opts),\n };\n if (value.stack !== undefined) {\n props.stack = serializeInner(value.stack, depth + 1, seen, opts);\n }\n return { type: \"object\", value: props, preview: `${value.name}: ${value.message}` };\n }\n\n // Generic object / class instance\n let keys: string[];\n try {\n keys = Object.keys(value);\n } catch {\n // null-prototype objects or Proxies that throw on ownKeys\n return { type: \"object\", preview: ctor ?? \"Object\" };\n }\n\n const props: Record<string, SerializedValue> = {};\n const limit = Math.min(keys.length, opts.maxProperties);\n for (let i = 0; i < limit; i++) {\n const key = keys[i] as string;\n let propValue: unknown;\n try {\n propValue = (value as Record<string, unknown>)[key];\n } catch {\n propValue = \"[Getter threw]\";\n }\n props[key] = serializeInner(propValue, depth + 1, seen, opts);\n }\n\n const truncated = keys.length > opts.maxProperties;\n const ctorPart = ctor && ctor !== \"Object\" ? `${ctor} ` : \"\";\n const preview = `${ctorPart}{${keys.slice(0, 3).join(\", \")}${keys.length > 3 ? \", …\" : \"\"}}${truncated ? \" [truncated]\" : \"\"}`;\n\n return { type: \"object\", value: props, preview };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getConstructorName(value: object): string {\n try {\n const ctor = Object.getPrototypeOf(value)?.constructor;\n return ctor?.name ?? \"Object\";\n } catch {\n return \"Object\";\n }\n}\n\nfunction truncationPreview(value: unknown): string {\n if (Array.isArray(value)) return `Array(${value.length})`;\n if (value instanceof Map) return `Map(${value.size})`;\n if (value instanceof Set) return `Set(${value.size})`;\n const ctor =\n typeof value === \"object\" && value !== null ? getConstructorName(value as object) : \"\";\n return ctor || \"Object\";\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/guards.ts","../src/serialization.ts"],"names":["props"],"mappings":"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","file":"index.js","sourcesContent":["import type { ComponentType } from \"./types/component-node.js\";\nimport type { ConsoleLevel } from \"./types/console.js\";\nimport type { HookType } from \"./types/hook-state.js\";\nimport type { SerializedValueType } from \"./types/serialized-value.js\";\n\n/**\n * Semantic version of the `PageReport` schema.\n *\n * Consumers should compare this value when reading stored reports to detect\n * schema drift. Follows semver: breaking changes bump the major version.\n */\nexport const SCHEMA_VERSION = \"0.1.0\" as const;\n\n/**\n * All valid React hook types tracked by the Scope runtime.\n *\n * @see {@link HookType}\n */\nexport const HOOK_TYPES: readonly HookType[] = [\n \"useState\",\n \"useReducer\",\n \"useEffect\",\n \"useLayoutEffect\",\n \"useMemo\",\n \"useCallback\",\n \"useRef\",\n \"useContext\",\n \"useId\",\n \"useSyncExternalStore\",\n \"useTransition\",\n \"useDeferredValue\",\n \"custom\",\n] as const;\n\n/**\n * All valid component implementation strategies.\n *\n * @see {@link ComponentType}\n */\nexport const COMPONENT_TYPES: readonly ComponentType[] = [\n \"function\",\n \"class\",\n \"forward_ref\",\n \"memo\",\n \"host\",\n] as const;\n\n/**\n * All valid serialized value types.\n *\n * @see {@link SerializedValueType}\n */\nexport const SERIALIZED_VALUE_TYPES: readonly SerializedValueType[] = [\n \"string\",\n \"number\",\n \"boolean\",\n \"null\",\n \"undefined\",\n \"object\",\n \"array\",\n \"function\",\n \"symbol\",\n \"bigint\",\n \"date\",\n \"map\",\n \"set\",\n \"circular\",\n \"truncated\",\n] as const;\n\n/**\n * All valid console entry levels.\n *\n * @see {@link ConsoleLevel}\n */\nexport const CONSOLE_LEVELS: readonly ConsoleLevel[] = [\n \"log\",\n \"warn\",\n \"error\",\n \"info\",\n \"debug\",\n \"group\",\n \"groupCollapsed\",\n \"table\",\n \"trace\",\n] as const;\n","import {\n COMPONENT_TYPES,\n CONSOLE_LEVELS,\n HOOK_TYPES,\n SERIALIZED_VALUE_TYPES,\n} from \"./constants.js\";\nimport type { ComponentNode } from \"./types/component-node.js\";\nimport type { ConsoleEntry } from \"./types/console.js\";\nimport type { ContextConsumption } from \"./types/context.js\";\nimport type { CapturedError } from \"./types/errors.js\";\nimport type { HookState } from \"./types/hook-state.js\";\nimport type { PageReport } from \"./types/page-report.js\";\nimport type { RouteInfo } from \"./types/route.js\";\nimport type { SerializedValue } from \"./types/serialized-value.js\";\nimport type { SourceLocation } from \"./types/source-location.js\";\nimport type { SuspenseBoundaryInfo } from \"./types/suspense.js\";\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isStringOrNull(value: unknown): value is string | null {\n return typeof value === \"string\" || value === null;\n}\n\nfunction isNullableNumber(value: unknown): value is number | null {\n return typeof value === \"number\" || value === null;\n}\n\n// ---------------------------------------------------------------------------\n// SourceLocation\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link SourceLocation}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `SourceLocation` interface.\n */\nexport function isSourceLocation(value: unknown): value is SourceLocation {\n if (!isObject(value)) return false;\n return (\n typeof value.fileName === \"string\" &&\n typeof value.lineNumber === \"number\" &&\n typeof value.columnNumber === \"number\"\n );\n}\n\n// ---------------------------------------------------------------------------\n// SerializedValue\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link SerializedValue}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `SerializedValue` interface.\n */\nexport function isSerializedValue(value: unknown): value is SerializedValue {\n if (!isObject(value)) return false;\n if (!SERIALIZED_VALUE_TYPES.includes(value.type as SerializedValue[\"type\"])) return false;\n if (\"preview\" in value && typeof value.preview !== \"string\") return false;\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// RouteInfo\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link RouteInfo}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `RouteInfo` interface.\n */\nexport function isRouteInfo(value: unknown): value is RouteInfo {\n if (!isObject(value)) return false;\n if (!isStringOrNull(value.pattern)) return false;\n if (!isStringOrNull(value.name)) return false;\n if (value.params !== null && !isObject(value.params)) return false;\n if (!isObject(value.query)) return false;\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// ContextConsumption\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link ContextConsumption}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `ContextConsumption` interface.\n */\nexport function isContextConsumption(value: unknown): value is ContextConsumption {\n if (!isObject(value)) return false;\n return (\n isStringOrNull(value.contextName) &&\n isSerializedValue(value.value) &&\n typeof value.didTriggerRender === \"boolean\"\n );\n}\n\n// ---------------------------------------------------------------------------\n// HookState\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link HookState}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `HookState` interface.\n */\nexport function isHookState(value: unknown): value is HookState {\n if (!isObject(value)) return false;\n if (!HOOK_TYPES.includes(value.type as HookState[\"type\"])) return false;\n if (!isStringOrNull(value.name)) return false;\n if (!isSerializedValue(value.value)) return false;\n if (value.deps !== null) {\n if (!Array.isArray(value.deps)) return false;\n if (!(value.deps as unknown[]).every(isSerializedValue)) return false;\n }\n if (value.hasCleanup !== null && typeof value.hasCleanup !== \"boolean\") return false;\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// ComponentNode\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link ComponentNode}.\n *\n * Performs a shallow check of the node itself; `children` are verified to be\n * arrays of objects but are **not** recursively validated to keep the guard\n * O(1) per node. Use {@link isComponentNodeDeep} for full tree validation.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `ComponentNode` interface.\n */\nexport function isComponentNode(value: unknown): value is ComponentNode {\n if (!isObject(value)) return false;\n if (typeof value.id !== \"number\") return false;\n if (typeof value.name !== \"string\") return false;\n if (!COMPONENT_TYPES.includes(value.type as ComponentNode[\"type\"])) return false;\n if (value.source !== null && !isSourceLocation(value.source)) return false;\n if (!isSerializedValue(value.props)) return false;\n if (!Array.isArray(value.state)) return false;\n if (!(value.state as unknown[]).every(isHookState)) return false;\n if (!Array.isArray(value.context)) return false;\n if (!(value.context as unknown[]).every(isContextConsumption)) return false;\n if (typeof value.renderCount !== \"number\") return false;\n if (typeof value.renderDuration !== \"number\") return false;\n if (!Array.isArray(value.children)) return false;\n return true;\n}\n\n/**\n * Recursively validates a `ComponentNode` and its entire subtree.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` and all descendant nodes conform to `ComponentNode`.\n */\nexport function isComponentNodeDeep(value: unknown): value is ComponentNode {\n if (!isComponentNode(value)) return false;\n return (value.children as unknown[]).every(isComponentNodeDeep);\n}\n\n// ---------------------------------------------------------------------------\n// CapturedError\n// ---------------------------------------------------------------------------\n\nconst CAPTURED_BY_VALUES = [\"boundary\", \"unhandled\", \"rejection\", \"console\"] as const;\n\n/**\n * Type guard for {@link CapturedError}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `CapturedError` interface.\n */\nexport function isCapturedError(value: unknown): value is CapturedError {\n if (!isObject(value)) return false;\n return (\n typeof value.message === \"string\" &&\n typeof value.name === \"string\" &&\n (typeof value.stack === \"string\" || value.stack === null) &&\n (value.source === null || isSourceLocation(value.source)) &&\n isStringOrNull(value.componentName) &&\n typeof value.timestamp === \"number\" &&\n CAPTURED_BY_VALUES.includes(value.capturedBy as CapturedError[\"capturedBy\"])\n );\n}\n\n// ---------------------------------------------------------------------------\n// SuspenseBoundaryInfo\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link SuspenseBoundaryInfo}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `SuspenseBoundaryInfo` interface.\n */\nexport function isSuspenseBoundaryInfo(value: unknown): value is SuspenseBoundaryInfo {\n if (!isObject(value)) return false;\n return (\n typeof value.id === \"number\" &&\n typeof value.componentName === \"string\" &&\n typeof value.isSuspended === \"boolean\" &&\n isNullableNumber(value.suspendedDuration) &&\n isStringOrNull(value.fallbackName) &&\n (value.source === null || isSourceLocation(value.source))\n );\n}\n\n// ---------------------------------------------------------------------------\n// ConsoleEntry\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link ConsoleEntry}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `ConsoleEntry` interface.\n */\nexport function isConsoleEntry(value: unknown): value is ConsoleEntry {\n if (!isObject(value)) return false;\n if (!CONSOLE_LEVELS.includes(value.level as ConsoleEntry[\"level\"])) return false;\n if (!Array.isArray(value.args)) return false;\n if (!(value.args as unknown[]).every(isSerializedValue)) return false;\n return (\n typeof value.timestamp === \"number\" &&\n isStringOrNull(value.componentName) &&\n typeof value.preview === \"string\"\n );\n}\n\n// ---------------------------------------------------------------------------\n// PageReport\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard for {@link PageReport}.\n *\n * Validates the top-level shape of a `PageReport`. The component tree\n * (`tree`) is shallowly validated via {@link isComponentNode}. Use\n * {@link isPageReportDeep} if you need full recursive tree validation.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` conforms to the `PageReport` interface.\n */\nexport function isPageReport(value: unknown): value is PageReport {\n if (!isObject(value)) return false;\n if (typeof value.url !== \"string\") return false;\n if (value.route !== null && !isRouteInfo(value.route)) return false;\n if (typeof value.timestamp !== \"number\") return false;\n if (typeof value.capturedIn !== \"number\") return false;\n if (!isComponentNode(value.tree)) return false;\n if (!Array.isArray(value.errors)) return false;\n if (!(value.errors as unknown[]).every(isCapturedError)) return false;\n if (!Array.isArray(value.suspenseBoundaries)) return false;\n if (!(value.suspenseBoundaries as unknown[]).every(isSuspenseBoundaryInfo)) return false;\n if (!Array.isArray(value.consoleEntries)) return false;\n if (!(value.consoleEntries as unknown[]).every(isConsoleEntry)) return false;\n return true;\n}\n\n/**\n * Like {@link isPageReport} but also recursively validates the entire\n * component tree via {@link isComponentNodeDeep}.\n *\n * @param value - Any value to test.\n * @returns `true` when `value` and its full component tree are valid.\n */\nexport function isPageReportDeep(value: unknown): value is PageReport {\n if (!isPageReport(value)) return false;\n return isComponentNodeDeep(value.tree);\n}\n","/**\n * serialize() — Convert any JavaScript value to a SerializedValue snapshot.\n *\n * Features:\n * - Handles all primitives: string, number, boolean, null, undefined\n * - Handles complex types: object, array, function, symbol, bigint\n * - Handles built-ins: Date, Map, Set\n * - Circular reference detection via WeakSet → { type: 'circular' }\n * - Depth limiting → { type: 'truncated' }\n * - Configurable truncation for strings, arrays, and object properties\n */\n\nimport type { SerializedValue } from \"./types/serialized-value.js\";\n\nexport interface SerializeOptions {\n /** Maximum recursion depth for nested objects/arrays. Default: 5. */\n maxDepth?: number;\n /** Maximum length of serialized strings before truncation. Default: 200. */\n maxStringLength?: number;\n /** Maximum number of array items to serialize. Default: 100. */\n maxArrayLength?: number;\n /** Maximum number of object properties to serialize. Default: 50. */\n maxProperties?: number;\n}\n\nconst DEFAULTS = {\n maxDepth: 5,\n maxStringLength: 200,\n maxArrayLength: 100,\n maxProperties: 50,\n} as const;\n\n/**\n * Convert any JavaScript value to a safely-serialized {@link SerializedValue}.\n *\n * @param value - The value to serialize.\n * @param options - Optional tuning parameters.\n */\nexport function serialize(value: unknown, options?: SerializeOptions): SerializedValue {\n const opts = { ...DEFAULTS, ...options };\n const seen = new WeakSet<object>();\n return serializeInner(value, 0, seen, opts);\n}\n\n// ---------------------------------------------------------------------------\n// Internal recursive implementation\n// ---------------------------------------------------------------------------\n\nfunction serializeInner(\n value: unknown,\n depth: number,\n seen: WeakSet<object>,\n opts: Required<SerializeOptions>,\n): SerializedValue {\n // ── Primitives ────────────────────────────────────────────────────────────\n\n if (value === null) {\n return { type: \"null\", value: null, preview: \"null\" };\n }\n\n if (value === undefined) {\n return { type: \"undefined\", preview: \"undefined\" };\n }\n\n if (typeof value === \"boolean\") {\n return { type: \"boolean\", value, preview: String(value) };\n }\n\n if (typeof value === \"number\") {\n return { type: \"number\", value, preview: String(value) };\n }\n\n if (typeof value === \"string\") {\n if (value.length > opts.maxStringLength) {\n const truncated = `${value.slice(0, opts.maxStringLength)}...`;\n return { type: \"string\", value: truncated, preview: `\"${truncated}\"` };\n }\n return { type: \"string\", value, preview: `\"${value}\"` };\n }\n\n if (typeof value === \"bigint\") {\n return { type: \"bigint\", value: `${value.toString()}n`, preview: `${value.toString()}n` };\n }\n\n if (typeof value === \"symbol\") {\n const preview = value.toString(); // \"Symbol(description)\"\n return { type: \"symbol\", preview };\n }\n\n if (typeof value === \"function\") {\n const raw = Function.prototype.toString.call(value);\n const preview = raw.length > 50 ? `${raw.slice(0, 50)} ...` : raw;\n return { type: \"function\", preview };\n }\n\n // ── Objects (all reference types below) ──────────────────────────────────\n\n if (typeof value !== \"object\") {\n // Shouldn't happen with normal JS types, but guard for safety\n return { type: \"string\", value: String(value), preview: String(value) };\n }\n\n // Circular reference check\n if (seen.has(value as object)) {\n return { type: \"circular\" };\n }\n\n // Depth exceeded — but we haven't seen it yet, so no circular, just truncated\n if (depth >= opts.maxDepth) {\n return { type: \"truncated\", preview: truncationPreview(value) };\n }\n\n seen.add(value as object);\n\n try {\n // ── Date ──────────────────────────────────────────────────────────────\n if (value instanceof Date) {\n return { type: \"date\", value: value.toISOString(), preview: value.toISOString() };\n }\n\n // ── Map ───────────────────────────────────────────────────────────────\n if (value instanceof Map) {\n const entries: SerializedValue[] = [];\n let count = 0;\n for (const [k, v] of value) {\n if (count >= opts.maxProperties) break;\n // Serialize each entry as an object { key, value }\n const serializedKey = serializeInner(k, depth + 1, seen, opts);\n const serializedVal = serializeInner(v, depth + 1, seen, opts);\n entries.push({\n type: \"object\",\n value: { key: serializedKey, value: serializedVal },\n preview: `[${serializedKey.preview ?? \"?\"} => ${serializedVal.preview ?? \"?\"}]`,\n });\n count++;\n }\n const truncated = value.size > opts.maxProperties;\n return {\n type: \"map\",\n value: entries,\n preview: `Map(${value.size})${truncated ? \" [truncated]\" : \"\"}`,\n };\n }\n\n // ── Set ───────────────────────────────────────────────────────────────\n if (value instanceof Set) {\n const items: SerializedValue[] = [];\n let count = 0;\n for (const v of value) {\n if (count >= opts.maxArrayLength) break;\n items.push(serializeInner(v, depth + 1, seen, opts));\n count++;\n }\n const truncated = value.size > opts.maxArrayLength;\n return {\n type: \"set\",\n value: items,\n preview: `Set(${value.size})${truncated ? \" [truncated]\" : \"\"}`,\n };\n }\n\n // ── Array ─────────────────────────────────────────────────────────────\n if (Array.isArray(value)) {\n const items: SerializedValue[] = [];\n const limit = Math.min(value.length, opts.maxArrayLength);\n for (let i = 0; i < limit; i++) {\n items.push(serializeInner(value[i], depth + 1, seen, opts));\n }\n const truncated = value.length > opts.maxArrayLength;\n return {\n type: \"array\",\n value: items,\n preview: `Array(${value.length})${truncated ? \" [truncated]\" : \"\"}`,\n };\n }\n\n // ── Plain objects / class instances ───────────────────────────────────\n return serializeObject(value as Record<string, unknown>, depth, seen, opts);\n } finally {\n // Remove from seen after processing so the same object can appear in\n // sibling branches without being falsely flagged as circular.\n seen.delete(value as object);\n }\n}\n\nfunction serializeObject(\n value: Record<string, unknown>,\n depth: number,\n seen: WeakSet<object>,\n opts: Required<SerializeOptions>,\n): SerializedValue {\n // Special preview for well-known non-serializable built-ins\n const ctor = getConstructorName(value);\n\n // WeakMap / WeakRef / WeakSet — can't iterate, return opaque object preview\n if (\n value instanceof WeakMap ||\n value instanceof WeakSet ||\n (typeof WeakRef !== \"undefined\" && value instanceof WeakRef)\n ) {\n return { type: \"object\", preview: ctor };\n }\n\n // Error objects — special handling\n if (value instanceof Error) {\n const props: Record<string, SerializedValue> = {\n name: serializeInner(value.name, depth + 1, seen, opts),\n message: serializeInner(value.message, depth + 1, seen, opts),\n };\n if (value.stack !== undefined) {\n props.stack = serializeInner(value.stack, depth + 1, seen, opts);\n }\n return { type: \"object\", value: props, preview: `${value.name}: ${value.message}` };\n }\n\n // Generic object / class instance\n let keys: string[];\n try {\n keys = Object.keys(value);\n } catch {\n // null-prototype objects or Proxies that throw on ownKeys\n return { type: \"object\", preview: ctor ?? \"Object\" };\n }\n\n const props: Record<string, SerializedValue> = {};\n const limit = Math.min(keys.length, opts.maxProperties);\n for (let i = 0; i < limit; i++) {\n const key = keys[i] as string;\n let propValue: unknown;\n try {\n propValue = (value as Record<string, unknown>)[key];\n } catch {\n propValue = \"[Getter threw]\";\n }\n props[key] = serializeInner(propValue, depth + 1, seen, opts);\n }\n\n const truncated = keys.length > opts.maxProperties;\n const ctorPart = ctor && ctor !== \"Object\" ? `${ctor} ` : \"\";\n const preview = `${ctorPart}{${keys.slice(0, 3).join(\", \")}${keys.length > 3 ? \", …\" : \"\"}}${truncated ? \" [truncated]\" : \"\"}`;\n\n return { type: \"object\", value: props, preview };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getConstructorName(value: object): string {\n try {\n const ctor = Object.getPrototypeOf(value)?.constructor;\n return ctor?.name ?? \"Object\";\n } catch {\n return \"Object\";\n }\n}\n\nfunction truncationPreview(value: unknown): string {\n if (Array.isArray(value)) return `Array(${value.length})`;\n if (value instanceof Map) return `Map(${value.size})`;\n if (value instanceof Set) return `Set(${value.size})`;\n const ctor =\n typeof value === \"object\" && value !== null ? getConstructorName(value as object) : \"\";\n return ctor || \"Object\";\n}\n"]}
|