From 6a206647831f9ccd9598b83e6b74fbe59707be14 Mon Sep 17 00:00:00 2001 From: Nathan Gendron Date: Tue, 1 Apr 2025 13:42:37 -0400 Subject: [PATCH 1/4] =?UTF-8?q?=E2=9C=A8=20tsx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/tsx/README.md | 24 +++++++++++++++++++ packages/tsx/index.d.ts | 10 ++++++++ packages/tsx/index.js | 9 ++++++++ packages/tsx/nursery.js | 12 ++++++++++ packages/tsx/package.json | 46 +++++++++++++++++++++++++++++++++++++ packages/tsx/postinstall.js | 4 ++++ 6 files changed, 105 insertions(+) create mode 100644 packages/tsx/README.md create mode 100644 packages/tsx/index.d.ts create mode 100644 packages/tsx/index.js create mode 100644 packages/tsx/nursery.js create mode 100644 packages/tsx/package.json create mode 100644 packages/tsx/postinstall.js diff --git a/packages/tsx/README.md b/packages/tsx/README.md new file mode 100644 index 0000000..439739d --- /dev/null +++ b/packages/tsx/README.md @@ -0,0 +1,24 @@ +# ast-grep napi language for tsx + +## Installation + +In a pnpm project, run: + +```bash +pnpm install @ast-grep/lang-tsx +pnpm install @ast-grep/napi +# install the tree-sitter-cli if no prebuild is available +pnpm install @tree-sitter/cli --save-dev +``` + +## Usage + +```js +import tsx from '@ast-grep/lang-tsx' +import { registerDynamicLanguage, parse } from '@ast-grep/napi' + +registerDynamicLanguage({ tsx }) + +const sg = parse('tsx', `your code`) +sg.root().kind() +``` diff --git a/packages/tsx/index.d.ts b/packages/tsx/index.d.ts new file mode 100644 index 0000000..11140a6 --- /dev/null +++ b/packages/tsx/index.d.ts @@ -0,0 +1,10 @@ +type LanguageRegistration = { + libraryPath: string + extensions: string[] + languageSymbol?: string + metaVarChar?: string + expandoChar?: string +} + +declare const registration: LanguageRegistration +export default registration diff --git a/packages/tsx/index.js b/packages/tsx/index.js new file mode 100644 index 0000000..3756a12 --- /dev/null +++ b/packages/tsx/index.js @@ -0,0 +1,9 @@ +const path = require('node:path') +const libPath = path.join(__dirname, 'parser.so') + +module.exports = { + libraryPath: libPath, + extensions: ['tsx'], + languageSymbol: 'tree_sitter_tsx', + expandoChar: '$', +} diff --git a/packages/tsx/nursery.js b/packages/tsx/nursery.js new file mode 100644 index 0000000..b10e7a0 --- /dev/null +++ b/packages/tsx/nursery.js @@ -0,0 +1,12 @@ +const { setup } = require('@ast-grep/nursery') +const languageRegistration = require('./index') + +setup({ + dirname: __dirname, + name: 'tsx', + treeSitterPackage: 'tree-sitter-tsx', + languageRegistration, + testRunner: parse => { + // add test here + }, +}) diff --git a/packages/tsx/package.json b/packages/tsx/package.json new file mode 100644 index 0000000..7a5f5c2 --- /dev/null +++ b/packages/tsx/package.json @@ -0,0 +1,46 @@ +{ + "name": "@ast-grep/lang-tsx", + "version": "0.0.1", + "description": "", + "main": "index.js", + "scripts": { + "build": "tree-sitter build -o parser.so", + "source": "node nursery.js source", + "prepublishOnly": "node nursery.js source", + "postinstall": "node postinstall.js", + "test": "node nursery.js test" + }, + "files": [ + "index.js", + "index.d.ts", + "type.d.ts", + "postinstall.js", + "src", + "prebuilds" + ], + "keywords": ["ast-grep"], + "author": "", + "license": "ISC", + "dependencies": { + "@ast-grep/setup-lang": "0.0.3" + }, + "peerDependencies": { + "tree-sitter-cli": "0.24.6" + }, + "peerDependenciesMeta": { + "tree-sitter-cli": { + "optional": true + } + }, + "devDependencies": { + "@ast-grep/nursery": "0.0.2", + "tree-sitter-cli": "0.24.6" + }, + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org/" + }, + "pnpm": { + "onlyBuiltDependencies": ["@ast-grep/lang-tsx", "tree-sitter-cli"] + } +} diff --git a/packages/tsx/postinstall.js b/packages/tsx/postinstall.js new file mode 100644 index 0000000..b9141ff --- /dev/null +++ b/packages/tsx/postinstall.js @@ -0,0 +1,4 @@ +const { postinstall } = require('@ast-grep/setup-lang') +postinstall({ + dirname: __dirname, +}) From 4f9b9f2946a87a44cbbbaf918acb4ec2087018a7 Mon Sep 17 00:00:00 2001 From: Nathan Gendron Date: Thu, 3 Apr 2025 14:38:10 -0400 Subject: [PATCH 2/4] =?UTF-8?q?=F0=9F=93=8C=20pnpm=20i?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pnpm-lock.yaml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 788f16e..e0c09b6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -402,6 +402,19 @@ importers: specifier: 0.24.6 version: 0.24.6 + packages/tsx: + dependencies: + '@ast-grep/setup-lang': + specifier: 0.0.3 + version: 0.0.3 + devDependencies: + '@ast-grep/nursery': + specifier: 0.0.2 + version: 0.0.2 + tree-sitter-cli: + specifier: 0.24.6 + version: 0.24.6 + scripts/create-lang: dependencies: prompts: From 97dbf2307cae84b8b1149b958a9211c369f9b1e8 Mon Sep 17 00:00:00 2001 From: Nathan Gendron Date: Thu, 10 Apr 2025 14:57:49 -0400 Subject: [PATCH 3/4] =?UTF-8?q?=E2=9C=85=20Add=20test=20to=20tsx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .changeset/cyan-crabs-relax.md | 5 +++++ packages/tsx/nursery.js | 9 +++++++-- packages/tsx/package.json | 7 ++++--- pnpm-lock.yaml | 23 +++++++++++++++++++++-- 4 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 .changeset/cyan-crabs-relax.md diff --git a/.changeset/cyan-crabs-relax.md b/.changeset/cyan-crabs-relax.md new file mode 100644 index 0000000..2c4ff41 --- /dev/null +++ b/.changeset/cyan-crabs-relax.md @@ -0,0 +1,5 @@ +--- +"@ast-grep/lang-tsx": patch +--- + +Add @ast-grep/lang-tsx diff --git a/packages/tsx/nursery.js b/packages/tsx/nursery.js index b10e7a0..c23035c 100644 --- a/packages/tsx/nursery.js +++ b/packages/tsx/nursery.js @@ -1,12 +1,17 @@ const { setup } = require('@ast-grep/nursery') const languageRegistration = require('./index') +const assert = require('node:assert') setup({ dirname: __dirname, name: 'tsx', - treeSitterPackage: 'tree-sitter-tsx', + treeSitterPackage: 'tree-sitter-typescript', + src: 'tsx/src', languageRegistration, testRunner: parse => { - // add test here + const sg = parse('') + const root = sg.root() + const node = root.find('<$ELEMENT onClick={$HANDLER}>$$$') + assert.equal(node.kind(), 'jsx_element') }, }) diff --git a/packages/tsx/package.json b/packages/tsx/package.json index 7a5f5c2..b7d735c 100644 --- a/packages/tsx/package.json +++ b/packages/tsx/package.json @@ -4,7 +4,7 @@ "description": "", "main": "index.js", "scripts": { - "build": "tree-sitter build -o parser.so", + "build": "tree-sitter build -o parser.so ./node_modules/tree-sitter-typescript/tsx", "source": "node nursery.js source", "prepublishOnly": "node nursery.js source", "postinstall": "node postinstall.js", @@ -33,8 +33,9 @@ } }, "devDependencies": { - "@ast-grep/nursery": "0.0.2", - "tree-sitter-cli": "0.24.6" + "@ast-grep/nursery": "0.0.3", + "tree-sitter-cli": "0.24.6", + "tree-sitter-typescript": "^0.23.2" }, "publishConfig": { "access": "public", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e0c09b6..139761b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -409,11 +409,14 @@ importers: version: 0.0.3 devDependencies: '@ast-grep/nursery': - specifier: 0.0.2 - version: 0.0.2 + specifier: 0.0.3 + version: 0.0.3 tree-sitter-cli: specifier: 0.24.6 version: 0.24.6 + tree-sitter-typescript: + specifier: ^0.23.2 + version: 0.23.2(tree-sitter@0.21.1) scripts/create-lang: dependencies: @@ -1185,6 +1188,14 @@ packages: tree_sitter: optional: true + tree-sitter-typescript@0.23.2: + resolution: {integrity: sha512-e04JUUKxTT53/x3Uq1zIL45DoYKVfHH4CZqwgZhPg5qYROl5nQjV+85ruFzFGZxu+QeFVbRTPDRnqL9UbU4VeA==} + peerDependencies: + tree-sitter: ^0.21.0 + peerDependenciesMeta: + tree-sitter: + optional: true + tree-sitter@0.21.1: resolution: {integrity: sha512-7dxoA6kYvtgWw80265MyqJlkRl4yawIjO7S5MigytjELkX43fV2WsAXzsNfO7sBpPPCF5Gp0+XzHk0DwLCq3xQ==} @@ -1895,6 +1906,14 @@ snapshots: tree-sitter-cli: 0.23.2 which: 2.0.2 + tree-sitter-typescript@0.23.2(tree-sitter@0.21.1): + dependencies: + node-addon-api: 8.3.1 + node-gyp-build: 4.8.4 + tree-sitter-javascript: 0.23.1(tree-sitter@0.21.1) + optionalDependencies: + tree-sitter: 0.21.1 + tree-sitter@0.21.1: dependencies: node-addon-api: 8.3.1 From 97d09187af9351d072cac6d23ec58752169653f4 Mon Sep 17 00:00:00 2001 From: Nathan Gendron Date: Thu, 10 Apr 2025 15:01:41 -0400 Subject: [PATCH 4/4] =?UTF-8?q?=F0=9F=90=9B=20path.join?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/tsx/nursery.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/tsx/nursery.js b/packages/tsx/nursery.js index c23035c..6d16ce3 100644 --- a/packages/tsx/nursery.js +++ b/packages/tsx/nursery.js @@ -1,12 +1,13 @@ const { setup } = require('@ast-grep/nursery') -const languageRegistration = require('./index') const assert = require('node:assert') +const languageRegistration = require('./index') +const path = require('node:path') setup({ dirname: __dirname, name: 'tsx', treeSitterPackage: 'tree-sitter-typescript', - src: 'tsx/src', + src: path.join('tsx', 'src'), languageRegistration, testRunner: parse => { const sg = parse('')