npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

tree-sitter-sfapex

v2.1.0

Published

A tree-sitter grammer for Salesforce's Apex, SOQL, and SOSL

Downloads

1,125

Readme

tree-sitter-sfapex

Salesforce grammars for tree-sitter; includes Apex, SOQL, and SOSL languages. Also includes parser for the Salesforce Log files (sflog).

Try it out using our playground

If you are a Neo-vim user, the parsers and syntax highlights are part of nvim-treesitter plugin already, guidance.

Usage

Install

npm install tree-sitter

npm install tree-sitter-sfapex

Example

// import libraries
import Parser from "tree-sitter";
import TsSfApex from "tree-sitter-sfapex";

// create a parser instance
const parser = new Parser();
// could be .apex, .soql, or .sosl
parser.setLanguage(TsSfApex.apex);

// we set the language to Apex so lets feed it some apex
const apexTree = parser.parse(`
/**
 * block comment
 */
global class TestClass implements TestInterface {
    public static String Prop1 = 'TestVal';

    global Account setName(Account acct, String nameVal){
        acct.Name = nameVal;
        return acct;
    }
}`);

// just a super simple example of printing the discovered nodes
// to see the anonymous nodes (syntax without formal names) set this to `true`
const includeAnonymousNodes = false;

console.log("APEX TREE");
printTree(apexTree.rootNode);

// do it with some SOQL this time
parser.setLanguage(TsSfApex.soql);

const soqlTree = parser.parse(`
SELECT Id, Name, Parent.Name,
    TYPEOF Owner
        WHEN User THEN Id, Username, FederationId
        WHEN Group THEN Name
    END,
    (SELECT Id, Name FROM Contacts)
FROM Account
WHERE Name = 'Robots' AND Are_Coming__c = FALSE
`);

console.log("SOQL TREE");
printTree(soqlTree.rootNode);

function printTree(node, indent = 0) {
  console.log(
    " ".repeat(indent),
    (node.isNamed ? "(" : "") + node.type + (node.isNamed ? ")" : "")
  );
  for (let c of includeAnonymousNodes ? node.children : node.namedChildren) {
    printTree(c, indent + 2);
  }
}

Status

Most of the parsers are built and tested on large corpus of Apex, I still intend to write automated tests that parse large Apex libraries as part of evaluating the grammar.

Apex

  • [x] grammar
  • [x] grammar tests
  • [x] highlighting queries
  • [x] highlighting tests
  • [x] tags queries
  • [x] tags tests (could use more)
  • [x] locals queries
  • [x] locals tests (using highlighting)

Anonymous Apex

  • [x] grammar
  • [x] grammar tests
  • [x] highlighting queries
  • [x] highlighting tests
  • [x] tags queries
  • [x] tags tests (could use more)
  • [x] locals queries
  • [x] locals tests (using highlighting)

SOQL

  • [x] grammar
  • [x] grammar tests
  • [x] highlighting queries
  • [x] highlighting tests

SOSL

  • [x] grammar
  • [x] grammar tests
  • [x] highlighting queries
  • [x] highlighting tests

SFLOG

Contributed by @finxxi, the sflog parser is very new and still being figured out. Feel free to contribute logs that fail to parse via the issues or by adding a failing test. I expect it to have a lot of development in terms of comprehention of individual log patterns and pulling out the types present there. For now it generally handles the main structure of log entries but doesn't parse the logged details very finely.

  • [x] grammar
  • [ ] grammar tests (wip)
  • [ ] highlighting queries (wip)
  • [ ] highlighting tests

Questions/Issues

Please open an issue on this repo and we'll work through it.

Contributing

Still figuring this out. By far the most useful contributions would be tests, if you have a scenario that doesn't work you can just provide the example or open a PR with a new failing test and I can figure out what to do about it.