diff --git a/lib/README.md b/lib/README.md new file mode 100644 index 00000000..b15dbaed --- /dev/null +++ b/lib/README.md @@ -0,0 +1,8 @@ +Subdirectories +-------------- + +* [`src`](./src) - C source code for the Tree-sitter library +* [`include`](./include) - C headers for the Tree-sitter library +* [`utf8proc`](./utf8proc) - A submodule for [`utf8proc`](https://juliastrings.github.io/utf8proc/), Tree-sitter's one library dependency. +* [`binding_rust`](./binding_rust) - Rust bindings to the Tree-sitter library +* [`binding_web`](./binding_web) - JavaScript bindings to the Tree-sitter library, using WebAssembly diff --git a/lib/binding_web/.gitignore b/lib/binding_web/.gitignore new file mode 100644 index 00000000..820ce7df --- /dev/null +++ b/lib/binding_web/.gitignore @@ -0,0 +1,4 @@ +/tree-sitter.js +/tree-sitter.wasm +node_modules +*.tgz diff --git a/lib/binding_web/.npmignore b/lib/binding_web/.npmignore new file mode 100644 index 00000000..43bcef02 --- /dev/null +++ b/lib/binding_web/.npmignore @@ -0,0 +1,4 @@ +* +!README.md +!tree-sitter.js +!tree-sitter.wasm diff --git a/lib/binding_web/README.md b/lib/binding_web/README.md index 5779e129..451471d9 100644 --- a/lib/binding_web/README.md +++ b/lib/binding_web/README.md @@ -1,16 +1,16 @@ -tree-sitter.wasm -================ +Web Tree-sitter +=============== [![Build Status](https://travis-ci.org/tree-sitter/tree-sitter.svg?branch=master)](https://travis-ci.org/tree-sitter/tree-sitter) -Wasm bindings to the [Tree-sitter](https://github.com/tree-sitter/tree-sitter) parsing library. +WebAssembly bindings to the [Tree-sitter](https://github.com/tree-sitter/tree-sitter) parsing library. -### Basic Usage +### Setup -You can either load the library as a standalone script: +You can download the the `tree-sitter.js` and `tree-sitter.wasm` files from [the latest GitHub release](https://github.com/tree-sitter/tree-sitter/releases/tag/0.14.7) and load them using a standalone script: ```html - ``` -or using a packaging system like Webpack: +You can also install [the `web-tree-sitter` module](https://www.npmjs.com/package/web-tree-sitter) from NPM and load it using a system like Webpack: ```js -const Parser = require('tree-sitter'); +const Parser = require('web-tree-sitter'); Parser.init().then(() => { /* the library is ready */ }); ``` -Create a parser: +### Basic Usage + +First, create a parser: ```js const parser = new Parser; diff --git a/lib/binding_web/check-artifacts-fresh.js b/lib/binding_web/check-artifacts-fresh.js new file mode 100755 index 00000000..23ebe9af --- /dev/null +++ b/lib/binding_web/check-artifacts-fresh.js @@ -0,0 +1,38 @@ +#!/usr/bin/env node + +const fs = require('fs'); +const path = require('path'); + +const inputFiles = [ + 'binding.c', + 'binding.js', + 'exports.json', + 'imports.js', + 'prefix.js', + ...list('../include/tree_sitter'), + ...list('../src') +] + +const outputFiles = [ + 'tree-sitter.js', + 'tree-sitter.wasm', +] + +const outputMtime = Math.min(...outputFiles.map(mtime)); + +for (const inputFile of inputFiles) { + if (mtime(inputFile) > outputMtime) { + console.log(`File '${inputFile}' has changed. Re-run 'script/build-wasm'.`); + process.exit(1); + } +} + +function list(dir) { + return fs.readdirSync(path.join(__dirname, dir), 'utf8') + .filter(p => !p.startsWith('.')) + .map(p => path.join(dir, p)); +} + +function mtime(p) { + return fs.statSync(path.join(__dirname, p)).mtime; +} diff --git a/lib/binding_web/package.json b/lib/binding_web/package.json index 9f0b60bc..878c4983 100644 --- a/lib/binding_web/package.json +++ b/lib/binding_web/package.json @@ -1,13 +1,14 @@ { - "name": "tree-sitter.wasm", - "version": "0.0.1", + "name": "web-tree-sitter", + "version": "0.15.1", "description": "Tree-sitter bindings for the web", - "main": "index.js", + "main": "tree-sitter.js", "directories": { "test": "test" }, "scripts": { - "test": "mocha" + "test": "mocha", + "prepublish": "node check-artifacts-fresh.js" }, "repository": { "type": "git", @@ -22,7 +23,7 @@ "bugs": { "url": "https://github.com/tree-sitter/tree-sitter/issues" }, - "homepage": "https://github.com/tree-sitter/tree-sitter#readme", + "homepage": "https://github.com/tree-sitter/tree-sitter/tree/master/lib/binding_web", "devDependencies": { "chai": "^4.2.0", "mocha": "^6.1.4", diff --git a/lib/binding_web/test/helper.js b/lib/binding_web/test/helper.js index a3be9530..2cb3a418 100644 --- a/lib/binding_web/test/helper.js +++ b/lib/binding_web/test/helper.js @@ -1,6 +1,8 @@ -const release = '../../../target/release' -const Parser = require(`${release}/tree-sitter.js`); -const languageURL = name => require.resolve(`${release}/tree-sitter-${name}.wasm`); +const Parser = require(`..`); + +function languageURL(name) { + return require.resolve(`../../../target/release/tree-sitter-${name}.wasm`); +} module.exports = Parser.init().then(async () => ({ Parser, diff --git a/script/build-wasm b/script/build-wasm index 8c4756f3..300a1141 100755 --- a/script/build-wasm +++ b/script/build-wasm @@ -2,16 +2,40 @@ set -e +if [[ "$1" == "--help" || "$1" == "-h" ]]; then + cat < target/release/tree-sitter.js + > $web_dir/tree-sitter.js else - cp target/scratch/tree-sitter.js target/release/tree-sitter.js + cp target/scratch/tree-sitter.js $web_dir/tree-sitter.js fi -mv target/scratch/tree-sitter.wasm target/release/tree-sitter.wasm +mv target/scratch/tree-sitter.wasm $web_dir/tree-sitter.wasm