Previous version with Demo Video
How to use, add the script to your existing Debug component:
---
import { Debug } from 'astro:components';
---
| import { liftHtml } from '@lift-html/core'; | |
| import html from "solid-js/html"; | |
| import { createSignal } from "solid-js"; | |
| import { render } from "solid-js/web"; | |
| const css = /*css*/ ` | |
| * { font-size: 200%; } | |
| span { | |
| width: 4rem; |
| // put this in src/pages/.well-known/appspecific/com.chrome.devtools.json.ts | |
| import type { APIRoute } from "astro" | |
| import { join } from "node:path" | |
| // https://chromium.googlesource.com/devtools/devtools-frontend/+/main/docs/ecosystem/automatic_workspace_folders.md | |
| export const GET: APIRoute = () => { | |
| return new Response( | |
| JSON.stringify({ | |
| "workspace": { | |
| "root": join(import.meta.dirname, "../../../../../.."), |
| # tmp function | |
| function tmp() { | |
| local tmp_dir=$(mktemp -d) | |
| echo "Created temporary directory: $tmp_dir" | |
| cd $tmp_dir | |
| } |
Previous version with Demo Video
How to use, add the script to your existing Debug component:
---
import { Debug } from 'astro:components';
---
| --- | |
| declare global { | |
| interface Window { | |
| had_hydration_error?: string; | |
| } | |
| } | |
| --- | |
| <script> | |
| const prefix = 'Uncaught Error: '; |
| <!DOCTYPE html> | |
| <html> | |
| <head is="my-head"> | |
| <script> | |
| customElements.define( | |
| "my-head", | |
| class extends HTMLHeadElement { | |
| connectedCallback() { | |
| this.setAttribute("live", "true"); | |
| this.appendChild(document.createElement("title")).textContent = |
| --- | |
| type Props = { | |
| json: unknown; | |
| }; | |
| --- | |
| <view-as-json><pre data-target="view-as-json:pre" set:text={JSON.stringify(Astro.props.json, null, 2)} /></view-as-json> | |
| <script is:inline type="module"> | |
| // @ts-ignore | |
| import { liftHtml } from 'https://esm.sh/@lift-html/[email protected]'; |
| // https://github.com/BuilderIO/builder/blob/21c96eff31434f51adc9ec3e6071256572cd261b/packages/sdks/src/blocks/embed/embed.lite.tsx | |
| import { useEffect, useRef, useState } from 'react'; | |
| export interface EmbedProps { | |
| content: string; | |
| } | |
| const SCRIPT_MIME_TYPES = ['text/javascript', 'application/javascript', 'application/ecmascript']; | |
| function isJsScript(script: HTMLScriptElement) { |
| ((raw)=>{let i = { 0: t => m(t), 1: t => a(t), 2: t => new RegExp(t), 3: t => new Date(t), 4: t => new Map(a(t)), 5: t => new Set(a(t)), 6: t => BigInt(t), 7: t => new URL(t), 8: t => new Uint8Array(t), 9: t => new Uint16Array(t), 10: t => new Uint32Array(t) } , o = t => { let[l,e] = t; return l in i ? i[l](e) : void 0 } , a = t => t.map(o) , m = t => typeof t != "object" || t === null ? t : Object.fromEntries(Object.entries(t).map( ([l,e]) => [l, o(e)])); return m(raw)})(JSON.parse($0.getAttribute('props'))) |
| // https://x.com/JLarky/status/1826404005876301882 | |
| export function FancyStuff(props: { getFromServer?: undefined | (() => string) }) { | |
| const [mousePos, setMousePos] = useState('0, 0'); | |
| useEffect(() => { | |
| document.addEventListener('mousemove', (e) => { | |
| setMousePos(`${e.clientX}, ${e.clientY}`); | |
| }); | |
| }, []); | |
| return ( |