Published-release documentation · 281 actions; release compatibility · contract 5520b0fa9525

Remove resources in dependency order

Use the ownership error to identify a live consumer, then delete the consumer and its temporary dataset in order.

Remove resources in dependency order shown as an executable chart workflow
Remove resources in dependency order. Each panel is generated from the complete program below.

Prerequisites

Use the Getting Started browser module setup, install the full ggaction entry, and provide <canvas id="chart"></canvas>. This complete example includes its data and imports. These APIs require ggaction 0.0.15 or later; check the documentation version for release compatibility.

Decision sequence: Complete chart → independent mark removal → explicit data lifecycle.

Complete program

import { chart, hconcat } from "ggaction";
import { render } from "ggaction";

export function createResourceRemovalWorkflow() {
  const before = chart()
    .createCanvas({ width: 360, height: 280, margin: 60 })
    .createData({ id: "rows", values: [{ x: 1, y: 2 }, { x: 3, y: 4 }] })
    .createScatterPlot({ id: "main", data: "rows", x: "x", y: "y" })
    .createData({ id: "temporary", values: [{ x: 2, y: 3 }] })
    .createPointMark({ id: "preview", data: "temporary", fill: "#dc2626" })
    .encodeX({ target: "preview", field: "x", scale: { id: "previewX" } })
    .encodeY({ target: "preview", field: "y", scale: { id: "previewY" } });
  try {
    before.removeData({ id: "temporary" });
  } catch (error) {
    if (!/preview/.test(error.message)) throw error;
  }
  const after = before.removeMark({ target: "preview" }).removeData({ id: "temporary" });
  return hconcat({ programs: [
    before.createTitle({ text: "Temporary red preview" }),
    after.createTitle({ text: "Preview and data removed" })
  ], gap: 20 });
}

const program = createResourceRemovalWorkflow();
render(program, document.querySelector("#chart").getContext("2d"));

Expected result

The first panel has a red preview point backed by temporary. Its attempted data removal reports the live preview reference. The second panel removes that mark and then its dataset, leaving the main chart intact.

Boundaries and failure behavior

removeData requires an explicit ID and does not cascade. A current-dataset pointer and historical trace alone do not keep a resource alive. Derived data and retained facet recipes do keep their sources alive. Use the named ownership paths in the error to remove or rebind consumers first; there is no force-delete option.

Authoring conventions · Data policies · Complete action reference