API

import { Analyzer, BindingFlags, analyze, generate, parse } from "@tsrx/yuku";
Export Signature
parse parse(source: string, options?: ParseOptions): ParseResult
analyze analyze(source: string, options?: AnalyzeOptions): Module
Analyzer new Analyzer(options?: AnalyzerOptions), with setFile, deleteFile, module, modules, diagnostics, and link
generate generate(node: Node, options?: GenerateOptions): GenerateResult
BindingFlags The flags of a Binding, for binding.has(BindingFlags.Const)

The options are Yuku's, without lang and wasm, and parse defaults preserveParens to false. The guides cover each: Parse, Analyze, and Generate. generate takes every option of Yuku's but print, which @tsrx/yuku sets to its TSRX printers.

Types#

@tsrx/yuku exports Yuku's types, yuku/types for the tree and yuku/analyzer for the semantic model, and its own for TSRX. It adds TSRX's nodes to Yuku's DialectNodes, so Node, node.type checks, and visitors know them.

/** What a template renders. */
type TemplateOutput =
  | JSXElement
  | JSXFragment
  | JSXStyleElement
  | JSXCodeBlock
  | JSXIfExpression
  | JSXForExpression
  | JSXSwitchExpression
  | JSXTryExpression;

/** `@{ statements output }`, a template with the code that sets it up. */
interface JSXCodeBlock extends BaseNode {
  type: "JSXCodeBlock";
  body: Statement[];
  render: TemplateOutput | null;
}

/** `@if (test) { } @else { }`, an `@else if` being an `IfStatement`. */
interface JSXIfExpression extends BaseNode {
  type: "JSXIfExpression";
  statementType: "IfStatement";
  test: Expression;
  consequent: BlockStatement;
  alternate: BlockStatement | IfStatement | null;
}

/** `@for (left of right; index i; key k) { } @empty { }`. */
interface JSXForExpression extends BaseNode {
  type: "JSXForExpression";
  statementType: "ForOfStatement";
  await: boolean;
  left: VariableDeclaration | Expression;
  right: Expression;
  index: Identifier | null;
  key: Expression | null;
  body: BlockStatement;
  empty: BlockStatement | null;
}

/** `@switch (discriminant) { @case test: { } @default: { } }`. */
interface JSXSwitchExpression extends BaseNode {
  type: "JSXSwitchExpression";
  statementType: "SwitchStatement";
  discriminant: Expression;
  cases: SwitchCase[];
}

/** `@try { } @pending { } @catch (error, reset) { }`. */
interface JSXTryExpression extends BaseNode {
  type: "JSXTryExpression";
  statementType: "TryStatement";
  block: BlockStatement;
  pending: BlockStatement | null;
  handler: (CatchClause & { resetParam: BindingPattern | null }) | null;
  finalizer: null;
}

/** `<style>`, its CSS kept as written. */
interface JSXStyleElement extends BaseNode {
  type: "JSXStyleElement";
  openingElement: JSXOpeningElement;
  /** The CSS, or nothing for `<style />`. */
  children: JSXText[];
  closingElement: JSXClosingElement | null;
}

These are read from src/ast.ts (opens in new tab). The statementType of each directive names the standard statement it reads like.