diff options
Diffstat (limited to 'bindings/node')
| -rw-r--r-- | bindings/node/binding.cc | 36 | ||||
| -rw-r--r-- | bindings/node/index.d.ts | 28 | ||||
| -rw-r--r-- | bindings/node/index.js | 18 | 
3 files changed, 45 insertions, 37 deletions
diff --git a/bindings/node/binding.cc b/bindings/node/binding.cc index 81881bf..a813e24 100644 --- a/bindings/node/binding.cc +++ b/bindings/node/binding.cc @@ -1,28 +1,20 @@ -#include "tree_sitter/parser.h" -#include <node.h> -#include "nan.h" +#include <napi.h> -using namespace v8; +typedef struct TSLanguage TSLanguage; -extern "C" TSLanguage * tree_sitter_gsp(); +extern "C" TSLanguage *tree_sitter_gsp(); -namespace { +// "tree-sitter", "language" hashed with BLAKE2 +const napi_type_tag LANGUAGE_TYPE_TAG = { +  0x8AF2E5212AD58ABF, 0xD5006CAD83ABBA16 +}; -NAN_METHOD(New) {} - -void Init(Local<Object> exports, Local<Object> module) { -  Local<FunctionTemplate> tpl = Nan::New<FunctionTemplate>(New); -  tpl->SetClassName(Nan::New("Language").ToLocalChecked()); -  tpl->InstanceTemplate()->SetInternalFieldCount(1); - -  Local<Function> constructor = Nan::GetFunction(tpl).ToLocalChecked(); -  Local<Object> instance = constructor->NewInstance(Nan::GetCurrentContext()).ToLocalChecked(); -  Nan::SetInternalFieldPointer(instance, 0, tree_sitter_gsp()); - -  Nan::Set(instance, Nan::New("name").ToLocalChecked(), Nan::New("gsp").ToLocalChecked()); -  Nan::Set(module, Nan::New("exports").ToLocalChecked(), instance); +Napi::Object Init(Napi::Env env, Napi::Object exports) { +    exports["name"] = Napi::String::New(env, "gsp"); +    auto language = Napi::External<TSLanguage>::New(env, tree_sitter_gsp()); +    language.TypeTag(&LANGUAGE_TYPE_TAG); +    exports["language"] = language; +    return exports;  } -NODE_MODULE(tree_sitter_gsp_binding, Init) - -}  // namespace +NODE_API_MODULE(tree_sitter_gsp_binding, Init) diff --git a/bindings/node/index.d.ts b/bindings/node/index.d.ts new file mode 100644 index 0000000..efe259e --- /dev/null +++ b/bindings/node/index.d.ts @@ -0,0 +1,28 @@ +type BaseNode = { +  type: string; +  named: boolean; +}; + +type ChildNode = { +  multiple: boolean; +  required: boolean; +  types: BaseNode[]; +}; + +type NodeInfo = +  | (BaseNode & { +      subtypes: BaseNode[]; +    }) +  | (BaseNode & { +      fields: { [name: string]: ChildNode }; +      children: ChildNode[]; +    }); + +type Language = { +  name: string; +  language: unknown; +  nodeTypeInfo: NodeInfo[]; +}; + +declare const language: Language; +export = language; diff --git a/bindings/node/index.js b/bindings/node/index.js index d0bc87e..6657bcf 100644 --- a/bindings/node/index.js +++ b/bindings/node/index.js @@ -1,18 +1,6 @@ -try { -  module.exports = require("../../build/Release/tree_sitter_gsp_binding"); -} catch (error1) { -  if (error1.code !== 'MODULE_NOT_FOUND') { -    throw error1; -  } -  try { -    module.exports = require("../../build/Debug/tree_sitter_gsp_binding"); -  } catch (error2) { -    if (error2.code !== 'MODULE_NOT_FOUND') { -      throw error2; -    } -    throw error1 -  } -} +const root = require("path").join(__dirname, "..", ".."); + +module.exports = require("node-gyp-build")(root);  try {    module.exports.nodeTypeInfo = require("../../src/node-types.json");  |