Skip to content

Commit be18223

Browse files
Merge pull request #120 from cucumber/rvramesh-javascript-support
Rvramesh javascript support
2 parents 8a86bf3 + 9c4dc56 commit be18223

11 files changed

Lines changed: 87 additions & 5 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/)
66
and this project adheres to [Semantic Versioning](http://semver.org/).
77

88
## [Unreleased]
9+
### Added
10+
- Added support for JavaScript - [#42](https://github.com/cucumber/language-service/issues/42), [#115](https://github.com/cucumber/language-service/pull/115), [#120](https://github.com/cucumber/language-service/pull/120)
911

1012
## [1.3.0] - 2022-11-28
1113
### Added

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ and [Cucumber Monaco](https://github.com/cucumber/monaco#readme).
1515
- [x] PHP
1616
- [x] Ruby
1717
- [x] Rust
18-
- [ ] [JavaScript](https://github.com/cucumber/language-service/issues/42)
18+
- [x] JavaScript
1919
- [ ] [Python](https://github.com/cucumber/language-service/issues/49)
2020
- [x] Go to step definition
2121
- [x] Generate step definition

src/language/javascriptLanguage.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { tsxLanguage } from './tsxLanguage.js'
2+
import { Language } from './types.js'
3+
4+
export const javascriptLanguage: Language = {
5+
...tsxLanguage,
6+
defaultSnippetTemplate: `
7+
{{ keyword }}('{{ expression }}', ({{ #parameters }}{{ #seenParameter }}, {{ /seenParameter }}{{ name }}{{ /parameters }}) => {
8+
// {{ blurb }}
9+
})
10+
`,
11+
}

src/language/languages.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { csharpLanguage } from './csharpLanguage.js'
22
import { javaLanguage } from './javaLanguage.js'
3+
import { javascriptLanguage } from './javascriptLanguage.js'
34
import { phpLanguage } from './phpLanguage.js'
45
import { pythonLanguage } from './pythonLanguage.js'
56
import { rubyLanguage } from './rubyLanguage.js'
@@ -15,6 +16,7 @@ const languageByName: Record<LanguageName, Language> = {
1516
ruby: rubyLanguage,
1617
rust: rustLanguage,
1718
python: pythonLanguage,
19+
javascript: javascriptLanguage,
1820
}
1921

2022
export function getLanguage(languageName: LanguageName): Language {

src/language/tsxLanguage.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { StringOrRegExp } from '@cucumber/cucumber-expressions'
2-
import { RegExps } from '@cucumber/cucumber-expressions/dist/cjs/src/ParameterType'
2+
import { RegExps } from '@cucumber/cucumber-expressions'
33

44
import { childrenToString, filter, NO_QUOTES } from './helpers.js'
55
import { NO_EXPRESSION } from './SourceAnalyzer.js'

src/language/types.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,16 @@ export type SnippetParameters = Readonly<Record<ParameterTypeName, SnippetParame
3535

3636
export type ParameterTypeMeta = Readonly<{ name: string; regexp: string }>
3737

38-
export const LanguageNames = ['java', 'tsx', 'c_sharp', 'php', 'python', 'ruby', 'rust'] as const
38+
export const LanguageNames = [
39+
'java',
40+
'tsx',
41+
'c_sharp',
42+
'php',
43+
'python',
44+
'ruby',
45+
'rust',
46+
'javascript',
47+
] as const
3948
export type LanguageName = typeof LanguageNames[number]
4049

4150
export type Source<L> = Readonly<{

src/tree-sitter-node/NodeParserAdapter.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export class NodeParserAdapter implements ParserAdapter {
3030
this.parser.setLanguage(Java)
3131
break
3232
case 'tsx':
33+
case 'javascript':
3334
this.parser.setLanguage(TypeScript.typescript)
3435
break
3536
case 'c_sharp':

src/tree-sitter-wasm/WasmParserAdapter.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,16 @@ export class WasmParserAdapter implements ParserAdapter {
1414

1515
const languages = await Promise.all(
1616
LanguageNames.map((languageName) => {
17-
const wasmUrl = `${this.wasmBaseUrl}/${languageName}.wasm`
17+
let wasmName: LanguageName
18+
switch (languageName) {
19+
case 'javascript':
20+
wasmName = 'tsx'
21+
break
22+
default:
23+
wasmName = languageName
24+
}
25+
26+
const wasmUrl = `${this.wasmBaseUrl}/${wasmName}.wasm`
1827
try {
1928
return WasmParser.Language.load(wasmUrl)
2029
} catch (err) {

test/language/ExpressionBuilder.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { WasmParserAdapter } from '../../src/tree-sitter-wasm/WasmParserAdapter.
1313
const cucumberExpressionsSupport: Set<LanguageName> = new Set([
1414
'c_sharp',
1515
'java',
16+
'javascript',
1617
'python',
1718
'ruby',
1819
'rust',
@@ -73,7 +74,6 @@ function defineContract(makeParserAdapter: () => ParserAdapter) {
7374
link.targetSelectionRange.end.character <= link.targetRange.end.character
7475
)
7576
}
76-
7777
const expressions = result.expressionLinks.map(({ expression }) =>
7878
expression instanceof CucumberExpression
7979
? expression.source
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { defineParameterType } from '@cucumber/cucumber'
2+
3+
defineParameterType({
4+
name: 'planet',
5+
regexp: [/jupiter/, /mars/, /tellus/],
6+
transformer: (name) => name,
7+
})
8+
9+
defineParameterType({
10+
name: 'uuid',
11+
regexp: /[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}/,
12+
transformer: (uuid) => uuid,
13+
})
14+
15+
defineParameterType({
16+
name: 'date',
17+
regexp: /\d{4}-\d{2}-\d{2}/,
18+
transformer: (name) => new Date(name),
19+
})

0 commit comments

Comments
 (0)