diff options
author | 2023-08-25 11:31:47 -0700 | |
---|---|---|
committer | 2023-08-25 11:31:47 -0700 | |
commit | 0731dfa0a42e719f3e3d736580c5709a43871670 (patch) | |
tree | f17b2b171ba15c2875c7e74cbd739ab1a51ebd47 /packages/bun-inspector-protocol/src/util/preview.ts | |
parent | 9e2ddb936ec48c6341cc76948e16868e6db06a13 (diff) | |
download | bun-0731dfa0a42e719f3e3d736580c5709a43871670.tar.gz bun-0731dfa0a42e719f3e3d736580c5709a43871670.tar.zst bun-0731dfa0a42e719f3e3d736580c5709a43871670.zip |
Fix build
Diffstat (limited to 'packages/bun-inspector-protocol/src/util/preview.ts')
-rw-r--r-- | packages/bun-inspector-protocol/src/util/preview.ts | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/packages/bun-inspector-protocol/src/util/preview.ts b/packages/bun-inspector-protocol/src/util/preview.ts new file mode 100644 index 000000000..ad751a2b8 --- /dev/null +++ b/packages/bun-inspector-protocol/src/util/preview.ts @@ -0,0 +1,110 @@ +import type { JSC } from "../protocol"; + +export function remoteObjectToString(remoteObject: JSC.Runtime.RemoteObject): string { + const { type, subtype, value, description, className, preview } = remoteObject; + switch (type) { + case "undefined": + return "undefined"; + case "boolean": + case "number": + return description ?? JSON.stringify(value); + case "string": + return JSON.stringify(value ?? description); + case "symbol": + case "bigint": + return description!; + case "function": + return description!.replace("function", "ƒ") || "ƒ"; + } + switch (subtype) { + case "null": + return "null"; + case "regexp": + case "date": + case "error": + return description!; + } + if (preview) { + return objectPreviewToString(preview); + } + if (className) { + return className; + } + return description || "Object"; +} + +export function objectPreviewToString(objectPreview: JSC.Runtime.ObjectPreview): string { + const { type, subtype, entries, properties, overflow, description, size } = objectPreview; + if (type !== "object") { + return remoteObjectToString(objectPreview); + } + let items: string[]; + if (entries) { + items = entries.map(entryPreviewToString).sort(); + } else if (properties) { + if (isIndexed(subtype)) { + items = properties.map(indexedPropertyPreviewToString).sort(); + } else { + items = properties.map(namedPropertyPreviewToString).sort(); + } + } else { + items = ["…"]; + } + if (overflow) { + items.push("…"); + } + let label: string; + if (description === "Object") { + label = ""; + } else if (size === undefined) { + label = description!; + } else { + label = `${description}(${size})`; + } + if (!items.length) { + return label || "{}"; + } + if (label) { + label += " "; + } + if (isIndexed(subtype)) { + return `${label}[${items.join(", ")}]`; + } + return `${label}{${items.join(", ")}}`; +} + +function propertyPreviewToString(propertyPreview: JSC.Runtime.PropertyPreview): string { + const { type, value, ...preview } = propertyPreview; + if (type === "accessor") { + return "ƒ"; + } + return remoteObjectToString({ ...preview, type, description: value }); +} + +function entryPreviewToString(entryPreview: JSC.Runtime.EntryPreview): string { + const { key, value } = entryPreview; + if (key) { + return `${objectPreviewToString(key)} => ${objectPreviewToString(value)}`; + } + return objectPreviewToString(value); +} + +function namedPropertyPreviewToString(propertyPreview: JSC.Runtime.PropertyPreview): string { + const { name, valuePreview } = propertyPreview; + if (valuePreview) { + return `${name}: ${objectPreviewToString(valuePreview)}`; + } + return `${name}: ${propertyPreviewToString(propertyPreview)}`; +} + +function indexedPropertyPreviewToString(propertyPreview: JSC.Runtime.PropertyPreview): string { + const { valuePreview } = propertyPreview; + if (valuePreview) { + return objectPreviewToString(valuePreview); + } + return propertyPreviewToString(propertyPreview); +} + +function isIndexed(type?: JSC.Runtime.RemoteObject["subtype"]): boolean { + return type === "array" || type === "set" || type === "weakset"; +} |