typescriptabstract-syntax-treetypescript-compiler-apits-morph

How to access FlowNode in typescript ast api?


I try to resolve foo and bar from nodes variable.

After I checked at ts-ast-viewer you can see in the picture that typescript can know about foo and bar from nodes node, under FlowNode section. (node -> initializer -> elements -> escapedText (foo, bar)).

But how I can access FlowNode?

I using ts-morph to work on my typescript ast code. and I already have the nodes Identifier. unfortunately I can't access to the properties I can see in the FlowNode section:

console.log({ n: nodes.node }); //<-- node not exist in nodes but I can see this in picture.

The full code:

codesandbox

import { Project, SyntaxKind } from "ts-morph";

console.clear();

const project = new Project({
  skipAddingFilesFromTsConfig: true
});

const sourceFile = project.createSourceFile(
  "foo.ts",
  `
const items = [foo, bar];
const nodes = [...items];
  `
);

const nodes = sourceFile
  .getDescendantsOfKind(SyntaxKind.Identifier)
  .find((n) => n.getText() === "nodes");

console.log({ n: nodes.node.initializer }); // <-- error: node is undefined

enter image description here


Solution

  • Flow nodes aren't exposed in ts-morph at the moment and aren't actually really exposed in the compiler API's type declarations, but you can still access them.

    import { Project, ts } from "ts-morph";
    
    console.clear();
    
    const project = new Project({
      skipAddingFilesFromTsConfig: true
    });
    
    const sourceFile = project.createSourceFile(
      "foo.ts",
      `
    const items = [foo, bar];
    const nodes = [...items];
      `
    );
    
    // get the identifier
    const nodesIdent = sourceFile
      .getVariableDeclarationOrThrow("nodes")
      .getNameNode();
    
    // hack to force the type checker to create the flow node
    nodesIdent.getType();
    
    // get the flow node
    const flowNode = (nodesIdent.compilerNode as any).flowNode as ts.FlowNode;
    
    console.log({ n: flowNode });
    

    I've opened https://github.com/dsherret/ts-morph/issues/1276 to make this easier for the future.