aboutsummaryrefslogtreecommitdiff
path: root/packages/bun-debug-adapter-protocol/debugger/preview.ts
diff options
context:
space:
mode:
authorGravatar Ashcon Partovi <ashcon@partovi.net> 2023-08-24 22:53:34 -0700
committerGravatar GitHub <noreply@github.com> 2023-08-24 22:53:34 -0700
commit1480889205d49cf7221a36608a8896b452967cea (patch)
treee1427e4041cf19ef1e8e8e0f58cfbbceb4cbbf74 /packages/bun-debug-adapter-protocol/debugger/preview.ts
parentf269432d90826ad3e5b66c7685a6e826e0fb05e2 (diff)
downloadbun-1480889205d49cf7221a36608a8896b452967cea.tar.gz
bun-1480889205d49cf7221a36608a8896b452967cea.tar.zst
bun-1480889205d49cf7221a36608a8896b452967cea.zip
Improved support for `debug-adapter-protocol` (#4186)
* Improve support for \`debug-adapter-protocol\` * More improvements, fix formatting in debug console * Fix attaching * Prepare for source maps * Start of source map support, breakpoints work * Source map support * add some package.jsons * wip * Update package.json * More fixes * Make source maps safer if exception occurs * Check bun version if it fails * Fix console.log formatting * Fix source maps partly * More source map fixes * Prepare for extension * watch mode with dap * Improve preview code * Prepare for extension 2 --------- Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Diffstat (limited to 'packages/bun-debug-adapter-protocol/debugger/preview.ts')
-rw-r--r--packages/bun-debug-adapter-protocol/debugger/preview.ts110
1 files changed, 110 insertions, 0 deletions
diff --git a/packages/bun-debug-adapter-protocol/debugger/preview.ts b/packages/bun-debug-adapter-protocol/debugger/preview.ts
new file mode 100644
index 000000000..6012623d2
--- /dev/null
+++ b/packages/bun-debug-adapter-protocol/debugger/preview.ts
@@ -0,0 +1,110 @@
+import type { JSC } from "../../bun-inspector-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";
+}