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
+===============
[](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