diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..8139589 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @cursorless-dev/code-owners diff --git a/.github/workflows/build-and-publish.yml b/.github/workflows/build-and-publish.yml deleted file mode 100644 index 31f42b3..0000000 --- a/.github/workflows/build-and-publish.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: build-and-publish -on: workflow_dispatch -jobs: - build-and-publish: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - - uses: pnpm/action-setup@v4 - with: - version: 10.0.0 - - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: "pnpm" - - run: pnpm install - - - uses: mymindstorm/setup-emsdk@v14 - with: - version: 3.1.74 - - - run: pnpm build - - - uses: JS-DevTools/npm-publish@v1 - with: - token: ${{ secrets.NPM_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml new file mode 100644 index 0000000..a5c800f --- /dev/null +++ b/.github/workflows/deploy.yaml @@ -0,0 +1,34 @@ +name: Deploy + +on: + push: + branches: [main] + +jobs: + publish-npm: + name: Publish to NPM + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version-file: .nvmrc + cache: pnpm + + - name: Install dependencies + run: pnpm --color install + + - name: Build + run: pnpm build + + - name: Publish to NPM + uses: JS-DevTools/npm-publish@v1 + with: + token: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml new file mode 100644 index 0000000..2bf5802 --- /dev/null +++ b/.github/workflows/test.yaml @@ -0,0 +1,30 @@ +name: Run Tests +permissions: read-all + +on: + pull_request: + types: [opened, synchronize, reopened] + +jobs: + test: + name: Test + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version-file: .nvmrc + cache: pnpm + + - name: Install dependencies + run: pnpm --color install + + - name: Build + run: pnpm build diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..67e145b --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v20.18.0 diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..75fa134 --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,3 @@ +{ + "tabWidth": 2 +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..65a1965 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "editor.defaultFormatter": "esbenp.prettier-vscode" +} diff --git a/README.md b/README.md index 7927427..521a786 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,3 @@ -# tree-sitter-wasms -Prebuilt WASM binaries for tree-sitter's language parsers. Forked from https://github.com/Menci/tree-sitter-wasm-prebuilt because I wanted to use GitHub Actions to automate publishing. +# Cursorless Tree sitter wasms -## Installation - -```bash -pnpm add tree-sitter-wasms -# or -yarn add tree-sitter-wasms -# or -npm install tree-sitter-wasms -``` - -## Usage - -```ts -import treeSitterRust from "tree-sitter-wasms/out/tree-sitter-rust.wasm" -parser.setLanguage(treeSitterCpp); -``` - -## Supported Languages - -Check https://unpkg.com/browse/tree-sitter-wasms@latest/out/ to see all supported languages, and manually download the wasm artifacts directly. +Repository building wasms for use by Cursorless. diff --git a/build.ts b/build.ts index 7a9231a..b7b7a7d 100644 --- a/build.ts +++ b/build.ts @@ -16,7 +16,12 @@ const outDir = path.join(__dirname, "out"); let hasErrors = false; -async function gitCloneOverload(name: string, repoUrl: string, useLatest: boolean, {commitHash}: {commitHash?: string}) { +async function gitCloneOverload( + name: string, + repoUrl: string, + useLatest: boolean, + { commitHash }: { commitHash?: string } +) { let packagePath; try { packagePath = findRoot(require.resolve(name)); @@ -24,43 +29,44 @@ async function gitCloneOverload(name: string, repoUrl: string, useLatest: boolea packagePath = path.join(__dirname, "node_modules", name); } - let commitInfo = (commitHash === undefined) ? "latest" : commitHash; - + let commitInfo = commitHash === undefined ? "latest" : commitHash; + try { - console.log(`🗑️ Deleting cached node dep for ${ name }`); - await exec(`rm -rf ${ packagePath }`) - console.log(`⬇️ Cloning ${ name } from git (${commitInfo})`); - await exec(`git clone ${ repoUrl } ${ packagePath }`) + console.log(`🗑️ Deleting cached node dep for ${name}`); + await exec(`rm -rf ${packagePath}`); + console.log(`⬇️ Cloning ${name} from git (${commitInfo})`); + await exec(`git clone ${repoUrl} ${packagePath}`); if (!useLatest) { if (commitHash !== undefined) { process.chdir(packagePath); - await exec(`git reset --hard ${ commitHash }`); - } else throw new Error("Latest commit is not being used, yet no commit hash was specified"); + await exec(`git reset --hard ${commitHash}`); + } else + throw new Error( + "Latest commit is not being used, yet no commit hash was specified" + ); } } catch (err) { - console.error(`❗Failed to clone git repo for ${ name }:\n`, err); + console.error(`❗Failed to clone git repo for ${name}:\n`, err); } } async function buildParserWASM( name: string, - { subPath, generate }: - { subPath?: string; generate?: boolean } = {} + { subPath, generate }: { subPath?: string; generate?: boolean } = {} ) { - const label = subPath ? path.join(name, subPath) : name; - + let cliPackagePath; try { cliPackagePath = findRoot(require.resolve("tree-sitter-cli")); - } catch(_) { + } catch (_) { cliPackagePath = path.join(__dirname, "node_modules", "tree-sitter-cli"); } let cliPath = path.join(cliPackagePath, "tree-sitter"); let generateCommand = cliPath.concat(" generate"); let buildCommand = cliPath.concat(" build --wasm"); - + try { console.log(`⏳ Building ${label}`); let packagePath; @@ -73,7 +79,7 @@ async function buildParserWASM( if (generate) { await exec(generateCommand, { cwd }); } - await exec(buildCommand, { cwd }); + await exec(buildCommand, { cwd }); await exec(`mv *.wasm ${outDir}`, { cwd }); console.log(`✅ Finished building ${label}`); } catch (e) { @@ -91,48 +97,77 @@ fs.mkdirSync(outDir); process.chdir(outDir); const grammars = Object.keys(packageInfo.devDependencies) - .filter((n) => n.startsWith("tree-sitter-") && n !== "tree-sitter-cli" && n !== "tree-sitter") + .filter( + (n) => + n.startsWith("tree-sitter-") && + n !== "tree-sitter-cli" && + n !== "tree-sitter" + ) .filter((s) => !langArg || s.includes(langArg)); PromisePool.withConcurrency(os.cpus().length) .for(grammars) - .process(async (name : string) => { + .process(async (name: string) => { if (name == "tree-sitter-agda") { - await gitCloneOverload(name, "https://github.com/tree-sitter/tree-sitter-agda.git", false, {commitHash: "47802091de0cb8ac2533d67ac37e65692c5902c4"}); - await buildParserWASM(name) + await gitCloneOverload( + name, + "https://github.com/tree-sitter/tree-sitter-agda.git", + false, + { commitHash: "47802091de0cb8ac2533d67ac37e65692c5902c4" } + ); + await buildParserWASM(name); } else if (name == "tree-sitter-perl") { - await gitCloneOverload(name, "https://github.com/tree-sitter-perl/tree-sitter-perl.git", false, {commitHash: "b467c41aed6e52c7f581c18a3b50821995a82c95"}); - await buildParserWASM(name, {generate: true}); + await gitCloneOverload( + name, + "https://github.com/tree-sitter-perl/tree-sitter-perl.git", + false, + { commitHash: "b467c41aed6e52c7f581c18a3b50821995a82c95" } + ); + await buildParserWASM(name, { generate: true }); } else if (name == "tree-sitter-php") { await buildParserWASM(name, { subPath: "php" }); } else if (name == "tree-sitter-typescript") { await buildParserWASM(name, { subPath: "typescript" }); await buildParserWASM(name, { subPath: "tsx" }); } else if (name == "tree-sitter-latex") { - await buildParserWASM(name, {generate: true}); + await buildParserWASM(name, { generate: true }); } else if (name == "tree-sitter-xml") { - await buildParserWASM(name, {subPath: "xml"}); - await buildParserWASM(name, {subPath: "dtd"}); + await buildParserWASM(name, { subPath: "xml" }); + await buildParserWASM(name, { subPath: "dtd" }); } else if (name == "tree-sitter-query") { - await gitCloneOverload(name, "https://github.com/tree-sitter-grammars/tree-sitter-query.git", false, {commitHash: "a6674e279b14958625d7a530cabe06119c7a1532"}); + await gitCloneOverload( + name, + "https://github.com/tree-sitter-grammars/tree-sitter-query.git", + false, + { commitHash: "a6674e279b14958625d7a530cabe06119c7a1532" } + ); await buildParserWASM(name); } else if (name == "tree-sitter-elixir") { - await gitCloneOverload(name, "https://github.com/elixir-lang/tree-sitter-elixir.git", false, {commitHash: "02a6f7fd4be28dd94ee4dd2ca19cb777053ea74e"}); + await gitCloneOverload( + name, + "https://github.com/elixir-lang/tree-sitter-elixir.git", + false, + { commitHash: "02a6f7fd4be28dd94ee4dd2ca19cb777053ea74e" } + ); await buildParserWASM(name); } else if (name == "tree-sitter-markdown") { - await gitCloneOverload(name, "https://github.com/tree-sitter-grammars/tree-sitter-markdown", false, {commitHash: "192407ab5a24bfc24f13332979b5e7967518754a"}); - await buildParserWASM(name, {subPath: "tree-sitter-markdown"}); - await buildParserWASM(name, {subPath: "tree-sitter-markdown-inline"}); - } - else { + await gitCloneOverload( + name, + "https://github.com/tree-sitter-grammars/tree-sitter-markdown", + false, + { commitHash: "192407ab5a24bfc24f13332979b5e7967518754a" } + ); + await buildParserWASM(name, { subPath: "tree-sitter-markdown" }); + await buildParserWASM(name, { subPath: "tree-sitter-markdown-inline" }); + } else { await buildParserWASM(name); } }) .then(async () => { if (hasErrors) { - //not sure if this failsafe is actually required, but it doesn't hurt to ensure that no wasms can be published from a failed build + //not sure if this failsafe is actually required, but it doesn't hurt to ensure that no wasms can be published from a failed build fs.rmSync(outDir, { recursive: true, force: true }); fs.mkdirSync(outDir); process.exit(1); } - }); \ No newline at end of file + }); diff --git a/package.json b/package.json index 3fd52ad..eb23c6e 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,23 @@ { "name": "@cursorless/tree-sitter-wasms", - "version": "0.2.0", + "version": "0.1.0", "description": "Prebuilt WASM binaries for tree-sitter's language parsers.", - "repository": "https://github.com/cursorless-dev/tree-sitter-wasms", - "author": "Gregor , Menci , rinOfTheStars", + "packageManager": "pnpm@10.0.0", + "main": "bindings/node", + "author": "Cursorless Dev", "license": "Unlicense", + "files": [ + "/out" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/cursorless-dev/tree-sitter-wasms.git" + }, + "pnpm": { + "onlyBuiltDependencies": [ + "tree-sitter-cli" + ] + }, "scripts": { "build": "ts-node build.ts" }, @@ -48,7 +61,7 @@ "tree-sitter-rust": "^0.23.2", "tree-sitter-scala": "^0.23.4", "tree-sitter-scss": "github:tree-sitter-grammars/tree-sitter-scss#00a4cd98d5fc71aa5a55174e7ed5e34c9cc85a87", - "tree-sitter-sparql": "github:IoannisNezis/tree-sitter-sparql#3c468620e7c2ffa69441de60161c4e4a919969f7", + "tree-sitter-sparql": "github:IoannisNezis/tree-sitter-sparql#3c468620e7c2ffa69441de60161c4e4a919969f7", "tree-sitter-swift": "^0.6.0", "tree-sitter-talon": "github:wenkokke/tree-sitter-talon#7119d7f3fefd0b0c7e900120b51f85a23e6c3160", "tree-sitter-typescript": "^0.23.2", @@ -56,18 +69,8 @@ "ts-node": "^10.9.2", "typescript": "^5.7.3" }, - "pnpm": { - "onlyBuiltDependencies": [ - "tree-sitter-cli" - ] - }, - "files": [ - "/out" - ], - "packageManager": "pnpm@10.0.0", - "main": "bindings/node", "dependencies": { "tree-sitter": "^0.22.4", "tree-sitter-cli": "^0.24.7" } -} \ No newline at end of file +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 886f090..b53c001 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -52,8 +52,8 @@ importers: specifier: github:UserNobody14/tree-sitter-dart#e81af6ab94a728ed99c30083be72d88e6d56cf9e version: https://codeload.github.com/UserNobody14/tree-sitter-dart/tar.gz/e81af6ab94a728ed99c30083be72d88e6d56cf9e(tree-sitter@0.22.4) tree-sitter-elixir: - specifier: github:elixir-lang/tree-sitter-elixir#b20eaa75565243c50be5e35e253d8beb58f45d56 - version: https://codeload.github.com/elixir-lang/tree-sitter-elixir/tar.gz/b20eaa75565243c50be5e35e253d8beb58f45d56 + specifier: github:elixir-lang/tree-sitter-elixir#02a6f7fd4be28dd94ee4dd2ca19cb777053ea74e + version: https://codeload.github.com/elixir-lang/tree-sitter-elixir/tar.gz/02a6f7fd4be28dd94ee4dd2ca19cb777053ea74e(tree-sitter@0.22.4) tree-sitter-elm: specifier: github:elm-tooling/tree-sitter-elm#e34bdc5c512918628b05b48e633f711123204e45 version: '@elm-tooling/tree-sitter-elm@https://codeload.github.com/elm-tooling/tree-sitter-elm/tar.gz/e34bdc5c512918628b05b48e633f711123204e45' @@ -342,9 +342,11 @@ packages: tree_sitter: optional: true - tree-sitter-elixir@https://codeload.github.com/elixir-lang/tree-sitter-elixir/tar.gz/b20eaa75565243c50be5e35e253d8beb58f45d56: - resolution: {tarball: https://codeload.github.com/elixir-lang/tree-sitter-elixir/tar.gz/b20eaa75565243c50be5e35e253d8beb58f45d56} - version: 0.19.0 + tree-sitter-elixir@https://codeload.github.com/elixir-lang/tree-sitter-elixir/tar.gz/02a6f7fd4be28dd94ee4dd2ca19cb777053ea74e: + resolution: {tarball: https://codeload.github.com/elixir-lang/tree-sitter-elixir/tar.gz/02a6f7fd4be28dd94ee4dd2ca19cb777053ea74e} + version: 0.3.3 + peerDependencies: + tree-sitter: ^0.21.0 tree-sitter-gdscript@https://codeload.github.com/PrestonKnopp/tree-sitter-gdscript/tar.gz/48b49330888a4669b48619b211cc8da573827725: resolution: {tarball: https://codeload.github.com/PrestonKnopp/tree-sitter-gdscript/tar.gz/48b49330888a4669b48619b211cc8da573827725} @@ -713,9 +715,11 @@ snapshots: node-gyp-build: 4.8.4 tree-sitter: 0.22.4 - tree-sitter-elixir@https://codeload.github.com/elixir-lang/tree-sitter-elixir/tar.gz/b20eaa75565243c50be5e35e253d8beb58f45d56: + tree-sitter-elixir@https://codeload.github.com/elixir-lang/tree-sitter-elixir/tar.gz/02a6f7fd4be28dd94ee4dd2ca19cb777053ea74e(tree-sitter@0.22.4): dependencies: - nan: 2.22.0 + node-addon-api: 7.1.1 + node-gyp-build: 4.8.4 + tree-sitter: 0.22.4 tree-sitter-gdscript@https://codeload.github.com/PrestonKnopp/tree-sitter-gdscript/tar.gz/48b49330888a4669b48619b211cc8da573827725(tree-sitter@0.22.4): dependencies: