diff --git a/bindings/web/index.d.ts b/bindings/web/index.d.ts new file mode 100644 index 000000000..d73b33ff9 --- /dev/null +++ b/bindings/web/index.d.ts @@ -0,0 +1,6 @@ +type Parser = import("web-tree-sitter"); +declare module "web-tree-sitter-sfapex" { + function getApexParser(): Promise; + function getSoqlParser(): Promise; + function getSoslParser(): Promise; +} diff --git a/bindings/web/index.js b/bindings/web/index.js new file mode 100644 index 000000000..a32f045f6 --- /dev/null +++ b/bindings/web/index.js @@ -0,0 +1,42 @@ +const Parser = require("web-tree-sitter"); +const fs = require("fs"); + +function getApexParser() { + return getParser(__dirname + "/tree-sitter-apex.wasm"); +} +function getSoqlParser() { + return getParser(__dirname + "/tree-sitter-soql.wasm"); +} +function getSoslParser() { + return getParser(__dirname + "/tree-sitter-sosl.wasm"); +} + +/** + * @param {string} wasmLangFile + * @returns {Promise} + */ +async function getParser(wasmLangFile) { + return new Promise(async (resolve, reject) => { + await Parser.init(); + // make loadable on NodeJS to enable testing, should be smarter later + const parser = new Parser(); + fs.readFile(wasmLangFile, async (err, data) => { + if (err) { + reject(err); + } + try { + const lang = await Parser.Language.load(data); + parser.setLanguage(lang); + resolve(parser); + } catch (err2) { + reject(err2); + } + }); + }); +} + +module.exports = { + getApexParser, + getSoqlParser, + getSoslParser, +}; diff --git a/bindings/web/package-lock.json b/bindings/web/package-lock.json new file mode 100644 index 000000000..d7b4b949e --- /dev/null +++ b/bindings/web/package-lock.json @@ -0,0 +1,21 @@ +{ + "name": "web-tree-sitter-sfapex", + "version": "0.0.9-beta2", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "web-tree-sitter-sfapex", + "version": "0.0.9-beta2", + "license": "ISC", + "dependencies": { + "web-tree-sitter": "^0.20.8" + } + }, + "node_modules/web-tree-sitter": { + "version": "0.20.8", + "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.20.8.tgz", + "integrity": "sha512-weOVgZ3aAARgdnb220GqYuh7+rZU0Ka9k9yfKtGAzEYMa6GgiCzW9JjQRJyCJakvibQW+dfjJdihjInKuuCAUQ==" + } + } +} diff --git a/bindings/web/package.json b/bindings/web/package.json new file mode 100644 index 000000000..6df42832b --- /dev/null +++ b/bindings/web/package.json @@ -0,0 +1,15 @@ +{ + "name": "web-tree-sitter-sfapex", + "version": "0.0.9", + "description": "tree-sitter-sfapex WASM", + "main": "index.js", + "types": "index.d.ts", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Anthony Heber", + "license": "ISC", + "dependencies": { + "web-tree-sitter": "^0.20.8" + } +}