From 94727b49b32752490083e6f29b483eae3f7329c5 Mon Sep 17 00:00:00 2001 From: Carlos Scheidegger Date: Mon, 19 May 2025 15:30:35 -0400 Subject: [PATCH] feature - dev-call show-ast-trace --- src/command/dev-call/cmd.ts | 4 +- src/command/dev-call/show-ast-trace/cmd.ts | 74 +++++++++++++++++++ .../tools/ast-tracing}/convert-pandoc-json.js | 0 .../resources/tools/ast-tracing}/draw-tree.js | 0 .../tools/ast-tracing}/edit-distance.ts | 0 .../resources/tools/ast-tracing}/jsonpatch.js | 0 .../tools/ast-tracing}/load_trace.lua | 0 .../resources/tools/ast-tracing}/main.js | 0 .../resources/tools/ast-tracing}/styles.css | 0 .../tools/ast-tracing}/trace-viewer.qmd | 0 tools/trace-viewer/index.html | 8 -- 11 files changed, 77 insertions(+), 9 deletions(-) create mode 100644 src/command/dev-call/show-ast-trace/cmd.ts rename {tools/trace-viewer => src/resources/tools/ast-tracing}/convert-pandoc-json.js (100%) rename {tools/trace-viewer => src/resources/tools/ast-tracing}/draw-tree.js (100%) rename {tools/trace-viewer => src/resources/tools/ast-tracing}/edit-distance.ts (100%) rename {tools/trace-viewer => src/resources/tools/ast-tracing}/jsonpatch.js (100%) rename {tools/trace-viewer => src/resources/tools/ast-tracing}/load_trace.lua (100%) rename {tools/trace-viewer => src/resources/tools/ast-tracing}/main.js (100%) rename {tools/trace-viewer => src/resources/tools/ast-tracing}/styles.css (100%) rename {tools/trace-viewer => src/resources/tools/ast-tracing}/trace-viewer.qmd (100%) delete mode 100644 tools/trace-viewer/index.html diff --git a/src/command/dev-call/cmd.ts b/src/command/dev-call/cmd.ts index a6e2f63316c..7fc67453ce7 100644 --- a/src/command/dev-call/cmd.ts +++ b/src/command/dev-call/cmd.ts @@ -3,6 +3,7 @@ import { quartoConfig } from "../../core/quarto.ts"; import { commands } from "../command.ts"; import { buildJsCommand } from "./build-artifacts/cmd.ts"; import { validateYamlCommand } from "./validate-yaml/cmd.ts"; +import { showAstTraceCommand } from "./show-ast-trace/cmd.ts"; type CommandOptionInfo = { name: string; @@ -71,4 +72,5 @@ export const devCallCommand = new Command() }) .command("cli-info", generateCliInfoCommand) .command("validate-yaml", validateYamlCommand) - .command("build-artifacts", buildJsCommand); + .command("build-artifacts", buildJsCommand) + .command("show-ast-trace", showAstTraceCommand); diff --git a/src/command/dev-call/show-ast-trace/cmd.ts b/src/command/dev-call/show-ast-trace/cmd.ts new file mode 100644 index 00000000000..7f69d3376e1 --- /dev/null +++ b/src/command/dev-call/show-ast-trace/cmd.ts @@ -0,0 +1,74 @@ +/* + * cmd.ts + * + * Copyright (C) 2025 Posit Software, PBC + */ + +import { Command } from "cliffy/command/mod.ts"; +import { quartoCacheDir } from "../../../core/appdirs.ts"; +import { quartoConfig } from "../../../core/quarto.ts"; +import { + ensureDir, + moveSync, + safeRemoveDirSync, +} from "../../../deno_ral/fs.ts"; +import { basename, dirname, join } from "../../../deno_ral/path.ts"; +import { copy } from "fs/copy"; +import { resourcePath } from "../../../core/resources.ts"; +import { execProcess } from "../../../core/process.ts"; + +const ensureTracingToolsCopied = async () => { + const cacheDir = quartoCacheDir(); + const tracingDir = `${cacheDir}/ast-tracing`; + await ensureDir(tracingDir); + safeRemoveDirSync(join(tracingDir, "qmd"), cacheDir); + await copy( + resourcePath(join("tools", "ast-tracing")), + join(tracingDir, "qmd"), + ); + return join(tracingDir, "qmd"); +}; + +export const showAstTraceCommand = new Command() + .name("show-ast-trace") + .hidden() + .arguments("") + .description( + "Renders the document with AST tracing enabled and then shows the debugging output.\n\n", + ) + .action(async (_options: unknown, input: string, ...args: string[]) => { + const toolsPath = await ensureTracingToolsCopied(); + + const dir = dirname(input); + const base = basename(input, ".qmd"); + const traceName = join(dir, `${base}-quarto-ast-trace.json`); + + const renderOpts = { + cmd: "quarto", + env: { + "QUARTO_TRACE_FILTERS": traceName, + }, + args: [ + "render", + input, + ...args, + "--quiet", + ], + }; + const _renderResult = await execProcess(renderOpts); + // we don't check for errors here because we want to show the trace even if + // the render fails + + moveSync(traceName, join(toolsPath, basename(traceName))); + + const _previewResult = await execProcess({ + cmd: "quarto", + cwd: toolsPath, + args: [ + "preview", + "trace-viewer.qmd", + "-M", + `trace_1:${basename(traceName)}`, + ], + }); + }); diff --git a/tools/trace-viewer/convert-pandoc-json.js b/src/resources/tools/ast-tracing/convert-pandoc-json.js similarity index 100% rename from tools/trace-viewer/convert-pandoc-json.js rename to src/resources/tools/ast-tracing/convert-pandoc-json.js diff --git a/tools/trace-viewer/draw-tree.js b/src/resources/tools/ast-tracing/draw-tree.js similarity index 100% rename from tools/trace-viewer/draw-tree.js rename to src/resources/tools/ast-tracing/draw-tree.js diff --git a/tools/trace-viewer/edit-distance.ts b/src/resources/tools/ast-tracing/edit-distance.ts similarity index 100% rename from tools/trace-viewer/edit-distance.ts rename to src/resources/tools/ast-tracing/edit-distance.ts diff --git a/tools/trace-viewer/jsonpatch.js b/src/resources/tools/ast-tracing/jsonpatch.js similarity index 100% rename from tools/trace-viewer/jsonpatch.js rename to src/resources/tools/ast-tracing/jsonpatch.js diff --git a/tools/trace-viewer/load_trace.lua b/src/resources/tools/ast-tracing/load_trace.lua similarity index 100% rename from tools/trace-viewer/load_trace.lua rename to src/resources/tools/ast-tracing/load_trace.lua diff --git a/tools/trace-viewer/main.js b/src/resources/tools/ast-tracing/main.js similarity index 100% rename from tools/trace-viewer/main.js rename to src/resources/tools/ast-tracing/main.js diff --git a/tools/trace-viewer/styles.css b/src/resources/tools/ast-tracing/styles.css similarity index 100% rename from tools/trace-viewer/styles.css rename to src/resources/tools/ast-tracing/styles.css diff --git a/tools/trace-viewer/trace-viewer.qmd b/src/resources/tools/ast-tracing/trace-viewer.qmd similarity index 100% rename from tools/trace-viewer/trace-viewer.qmd rename to src/resources/tools/ast-tracing/trace-viewer.qmd diff --git a/tools/trace-viewer/index.html b/tools/trace-viewer/index.html deleted file mode 100644 index 2660d25d83c..00000000000 --- a/tools/trace-viewer/index.html +++ /dev/null @@ -1,8 +0,0 @@ - - - - - -
- - \ No newline at end of file