Skip to content

Commit 804b0d5

Browse files
feat: add ember glimmer language parser (.gjs,.gts) extensions (#154)
* chore(release): add changeset summary * feat: add ember glimmer language parser (.gjs,.gts) extensions * feat: add README.md to packages. Rename language registration to camelCase * chore: run dprint
1 parent 700c9ad commit 804b0d5

14 files changed

Lines changed: 418 additions & 0 deletions

File tree

.changeset/fair-lions-know.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@ast-grep/lang-glimmer-javascript": patch
3+
"@ast-grep/lang-glimmer-typescript": patch
4+
---
5+
6+
Add Glimmer, Ember component authoring support (.gjs, .gts)
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# ast-grep napi language for glimmer-javascript
2+
3+
## Installation
4+
5+
In a pnpm project, run:
6+
7+
```bash
8+
pnpm install @ast-grep/lang-glimmer-javascript
9+
pnpm install @ast-grep/napi
10+
# install the tree-sitter-cli if no prebuild is available
11+
pnpm install @tree-sitter/cli --save-dev
12+
```
13+
14+
## Usage
15+
16+
```js
17+
import glimmerJavascript from '@ast-grep/lang-glimmer-javascript'
18+
import { registerDynamicLanguage, parse } from '@ast-grep/napi'
19+
20+
registerDynamicLanguage({ glimmerJavascript })
21+
22+
const sg = parse('glimmerJavascript', `your code`)
23+
sg.root().kind()
24+
```
25+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
type LanguageRegistration = {
2+
libraryPath: string
3+
extensions: string[]
4+
languageSymbol?: string
5+
metaVarChar?: string
6+
expandoChar?: string
7+
}
8+
9+
declare const registration: LanguageRegistration
10+
export default registration
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
const path = require('node:path')
2+
const fs = require('node:fs')
3+
const { resolvePrebuild } = require('@ast-grep/setup-lang')
4+
5+
function getLibPath() {
6+
const prebuild = resolvePrebuild(__dirname)
7+
if (prebuild) {
8+
return prebuild
9+
}
10+
11+
const native = path.join(__dirname, 'parser.so')
12+
if (fs.existsSync(native)) {
13+
return native
14+
}
15+
16+
throw new Error('No parser found. Please ensure the parser is built or a prebuild is available.')
17+
}
18+
19+
let libPath
20+
21+
module.exports = {
22+
get libraryPath() {
23+
if (!libPath) {
24+
libPath = getLibPath()
25+
}
26+
return libPath
27+
},
28+
extensions: ['gjs'],
29+
languageSymbol: 'tree_sitter_glimmer_javascript',
30+
expandoChar: '$',
31+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
const { setup } = require('@ast-grep/nursery')
2+
const assert = require('node:assert')
3+
const languageRegistration = require('./index')
4+
5+
setup({
6+
dirname: __dirname,
7+
name: 'glimmerJavascript',
8+
treeSitterPackage: 'tree-sitter-glimmer-javascript',
9+
languageRegistration,
10+
testRunner: (parse) => {
11+
const sg = parse(`
12+
import Component from '@glimmer/component';
13+
14+
function isLatestVersion() {
15+
const stableRegex = /^d+.d+.d+$/;
16+
return !stableRegex.test(VERSION);
17+
}
18+
19+
export default class WelcomePageComponent extends Component {
20+
<template>
21+
<main id="ember-welcome-page-id-selector">
22+
<Hello> </Hello>
23+
</main>
24+
</template>
25+
26+
@service session;
27+
28+
get extension() {
29+
return this.args.extension ?? 'hbs';
30+
}
31+
}
32+
`)
33+
const root = sg.root()
34+
35+
const getter = root.find({
36+
rule: {
37+
kind: 'method_definition',
38+
},
39+
})
40+
const property = getter.find({ rule: { kind: 'property_identifier' } })
41+
assert.equal(property.text(), 'extension')
42+
43+
const service = root.find({ rule: { kind: 'field_definition > property_identifier' } })
44+
assert.equal(service.text(), 'session')
45+
46+
const main_tag = root.find({ rule: { kind: 'glimmer_template > glimmer_opening_tag' } })
47+
assert.equal(main_tag.text(), '<template>')
48+
},
49+
})
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
{
2+
"name": "@ast-grep/lang-glimmer-javascript",
3+
"version": "0.0.1",
4+
"description": "",
5+
"main": "index.js",
6+
"scripts": {
7+
"build": "tree-sitter build -o parser.so",
8+
"source": "node nursery.js source",
9+
"prepublishOnly": "node nursery.js source",
10+
"postinstall": "node postinstall.js",
11+
"test": "node nursery.js test"
12+
},
13+
"files": [
14+
"index.js",
15+
"index.d.ts",
16+
"type.d.ts",
17+
"postinstall.js",
18+
"src",
19+
"prebuilds"
20+
],
21+
"keywords": [
22+
"ast-grep",
23+
"ast-grep-lang"
24+
],
25+
"author": "",
26+
"license": "ISC",
27+
"dependencies": {
28+
"@ast-grep/setup-lang": "0.0.6"
29+
},
30+
"peerDependencies": {
31+
"tree-sitter-cli": "0.25.8"
32+
},
33+
"peerDependenciesMeta": {
34+
"tree-sitter-cli": {
35+
"optional": true
36+
}
37+
},
38+
"devDependencies": {
39+
"@ast-grep/nursery": "0.0.9",
40+
"tree-sitter-cli": "0.25.8",
41+
"tree-sitter-glimmer-javascript": "0.2.0"
42+
},
43+
"publishConfig": {
44+
"access": "public",
45+
"registry": "https://registry.npmjs.org/"
46+
},
47+
"pnpm": {
48+
"onlyBuiltDependencies": [
49+
"@ast-grep/lang-glimmer-javascript",
50+
"tree-sitter-cli"
51+
]
52+
}
53+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
const { postinstall } = require('@ast-grep/setup-lang')
2+
postinstall({
3+
dirname: __dirname,
4+
})
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# ast-grep napi language for glimmer-typescript
2+
3+
## Installation
4+
5+
In a pnpm project, run:
6+
7+
```bash
8+
pnpm install @ast-grep/lang-glimmer-typescript
9+
pnpm install @ast-grep/napi
10+
# install the tree-sitter-cli if no prebuild is available
11+
pnpm install @tree-sitter/cli --save-dev
12+
```
13+
14+
## Usage
15+
16+
```js
17+
import glimmerTypescript from '@ast-grep/lang-glimmer-typescript'
18+
import { registerDynamicLanguage, parse } from '@ast-grep/napi'
19+
20+
registerDynamicLanguage({ glimmerTypescript })
21+
22+
const sg = parse('glimmerTypescript', `your code`)
23+
sg.root().kind()
24+
```
25+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
type LanguageRegistration = {
2+
libraryPath: string
3+
extensions: string[]
4+
languageSymbol?: string
5+
metaVarChar?: string
6+
expandoChar?: string
7+
}
8+
9+
declare const registration: LanguageRegistration
10+
export default registration
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
const path = require('node:path')
2+
const fs = require('node:fs')
3+
const { resolvePrebuild } = require('@ast-grep/setup-lang')
4+
5+
function getLibPath() {
6+
const prebuild = resolvePrebuild(__dirname)
7+
if (prebuild) {
8+
return prebuild
9+
}
10+
11+
const native = path.join(__dirname, 'parser.so')
12+
if (fs.existsSync(native)) {
13+
return native
14+
}
15+
16+
throw new Error('No parser found. Please ensure the parser is built or a prebuild is available.')
17+
}
18+
19+
let libPath
20+
21+
module.exports = {
22+
get libraryPath() {
23+
if (!libPath) {
24+
libPath = getLibPath()
25+
}
26+
return libPath
27+
},
28+
extensions: ['gts'],
29+
languageSymbol: 'tree_sitter_glimmer_typescript',
30+
expandoChar: '$',
31+
}

0 commit comments

Comments
 (0)