tuil
ReferencePackages@mwillbanks/tuil-inkAPI

InkRendererBackend

class exported by @mwillbanks/tuil-ink.

View rawEdit

class

Public class exported by @mwillbanks/tuil-ink.

export class InkRendererBackend implements RendererBackend<InkRendererTree> {
  readonly id = "ink";
  readonly capabilities = new Set([
    "ink",
    "renderer-application",
    "react-ink-components",
    "pointer",
    "scroll",
    "clipboard",
    "alternate-screen",
    "inline",
    "static",
    "json",
    "silent",
    "embedded",
  ] as const);
  #sequence: number;

  constructor() {
    this.#sequence = 0;
  }

  render(tree: InkRendererTree, context: RendererContext): RendererFrame {
    if (context.signal.aborted) throw context.signal.reason;
    const scene = normalizeRendererScene(
      tree,
      context.capabilities.width,
      context.capabilities.height,
      context.capabilities.hyperlinks,
    );
    const frame = frameText(scene);
    return Object.freeze({
      width: context.capabilities.width,
      height: context.capabilities.height,
      sequence: ++this.#sequence,
      timestamp: performance.now(),
      mode: context.mode,
      payload: Object.freeze({
        frame,
        rendered:
          context.mode === "interactive"
            ? `${styledFrameText(scene)}\u001b[0m${cursorOutput(scene.cursor)}`
            : frame,
        semantics: scene.semantics,
      }),
      cursor: scene.cursor,
    });
  }

  diff(
    previous: RendererFrame | undefined,
    current: RendererFrame,
  ): RendererOutput {
    const before = previous?.payload as InkFramePayload | undefined;
    const after = current.payload as InkFramePayload & {
      readonly rendered: string;
    };
    const mode = current.mode ?? "interactive";
    const unchanged =
      mode === "json"
        ? JSON.stringify(before) === JSON.stringify(after)
        : before?.rendered === after.rendered;
    const rows = rendererChangeRows(before, after, unchanged);
    const changed = unchanged ? 0 : changedCellCount(before, after, rows, mode);
    const dirty = dirtyOutput(before?.frame, current, after.frame, rows);
    return Object.freeze({
      bytes: outputBytes(mode, current.payload, after.rendered, changed),
      fullFrame: mode !== "silent",
      changedCells: mode === "silent" ? 0 : changed,
      ...dirty,
    });
  }
}

Members

MemberTypeRequiredDescriptionRelated types
id"ink"YesThe id member uses the "ink" contract.
capabilitiesSet<"static" | "ink" | "renderer-application" | "react-ink-components" | "pointer" | "scroll" | "clipboard" | "alternate-screen" | "inline" | "json" | "silent" | "embedded">YesThe capabilities member uses the Set<"static" | "ink" | "renderer-application" | "react-ink-components" | "pointer" | "scroll" | "clipboard" | "alternate-screen" | "inline" | "json" | "silent" | "embedded"> contract.
#sequencenumberYesThe #sequence member uses the number contract.
__constructoranyYesThe __constructor member uses the any contract.
render(tree: InkRendererTree, context: RendererContext) => RendererFrameYesThe render member uses the (tree: InkRendererTree, context: RendererContext) => RendererFrame contract.InkRendererTree
diff(previous: RendererFrame | undefined, current: RendererFrame) => RendererOutputYesThe diff member uses the (previous: RendererFrame | undefined, current: RendererFrame) => RendererOutput contract.

Parameters

This declaration has no public members.

Returns

This declaration does not return a value.

Throws

No thrown errors are documented for this declaration.

Source

View the secondary source reference

Package

@mwillbanks/tuil-ink

On this page