From 980e661b0620ab8d32d6cb1ef6c164ca960b6948 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aslak=20Helles=C3=B8y?= Date: Tue, 12 Oct 2021 08:55:27 +0100 Subject: [PATCH 1/2] Move changelogs to prepare extraction to separate repos --- language-server/{ => javascript}/CHANGELOG.md | 0 language-service/{ => javascript}/CHANGELOG.md | 0 monaco/{ => javascript}/CHANGELOG.md | 0 suggest/{ => javascript}/CHANGELOG.md | 0 vscode/{ => javascript}/CHANGELOG.md | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename language-server/{ => javascript}/CHANGELOG.md (100%) rename language-service/{ => javascript}/CHANGELOG.md (100%) rename monaco/{ => javascript}/CHANGELOG.md (100%) rename suggest/{ => javascript}/CHANGELOG.md (100%) rename vscode/{ => javascript}/CHANGELOG.md (100%) diff --git a/language-server/CHANGELOG.md b/language-server/javascript/CHANGELOG.md similarity index 100% rename from language-server/CHANGELOG.md rename to language-server/javascript/CHANGELOG.md diff --git a/language-service/CHANGELOG.md b/language-service/javascript/CHANGELOG.md similarity index 100% rename from language-service/CHANGELOG.md rename to language-service/javascript/CHANGELOG.md diff --git a/monaco/CHANGELOG.md b/monaco/javascript/CHANGELOG.md similarity index 100% rename from monaco/CHANGELOG.md rename to monaco/javascript/CHANGELOG.md diff --git a/suggest/CHANGELOG.md b/suggest/javascript/CHANGELOG.md similarity index 100% rename from suggest/CHANGELOG.md rename to suggest/javascript/CHANGELOG.md diff --git a/vscode/CHANGELOG.md b/vscode/javascript/CHANGELOG.md similarity index 100% rename from vscode/CHANGELOG.md rename to vscode/javascript/CHANGELOG.md From d1d55fc70c0e93a24062a964e4800391028fece5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aslak=20Helles=C3=B8y?= Date: Wed, 13 Oct 2021 12:22:36 +0100 Subject: [PATCH 2/2] Remove language-server,language-service,suggest,monaco,vscode --- .circleci/config.yml | 60 - Makefile | 5 - language-server/.rsync | 1 - language-server/Makefile | 1 - language-server/README.md | 1 - language-server/default.mk | 89 - language-server/javascript/.gitignore | 19 - language-server/javascript/.mocharc.json | 6 - language-server/javascript/.rsync | 2 - language-server/javascript/CHANGELOG.md | 42 - language-server/javascript/LICENSE | 21 - language-server/javascript/Makefile | 1 - language-server/javascript/README.md | 12 - .../bin/cucumber-language-server.js | 3 - language-server/javascript/default.mk | 87 - language-server/javascript/package.json | 46 - .../javascript/src/CucumberInfoStream.ts | 21 - .../javascript/src/makeCucumberInfo.ts | 56 - language-server/javascript/src/server.ts | 177 -- .../test/CucumberInfoStream.test.ts | 80 - .../javascript/test/fixtures/messages.ndjson | 39 - .../javascript/test/fixtures/suggest.ndjson | 63 - .../javascript/test/makeCucumberInfo.test.ts | 12 - .../javascript/tsconfig.build.json | 12 - language-server/javascript/tsconfig.json | 3 - language-service/.rsync | 1 - language-service/Makefile | 1 - language-service/README.md | 1 - language-service/default.mk | 89 - language-service/javascript/.gitignore | 19 - language-service/javascript/.mocharc.json | 6 - language-service/javascript/.rsync | 2 - language-service/javascript/CHANGELOG.md | 59 - language-service/javascript/LICENSE | 21 - language-service/javascript/Makefile | 1 - language-service/javascript/README.md | 25 - language-service/javascript/default.mk | 87 - language-service/javascript/package.json | 42 - .../javascript/src/CucumberInfo.ts | 60 - .../src/getGherkinCompletionItems.ts | 48 - .../javascript/src/getGherkinDiagnostics.ts | 85 - .../src/getGherkinFormattingEdits.ts | 26 - .../src/getGherkinSemanticTokens.ts | 163 -- language-service/javascript/src/index.ts | 5 - .../javascript/src/parseGherkinDocument.ts | 40 - .../test/getGherkinCompletionItems.test.ts | 49 - .../test/getGherkinDiagnostics.test.ts | 110 -- .../test/getGherkinFormattingEdits.test.ts | 30 - .../test/getGherkinSemanticTokens.test.ts | 175 -- .../test/parseGherkinDocument.test.ts | 16 - .../javascript/tsconfig.build.json | 12 - language-service/javascript/tsconfig.json | 3 - monaco/.rsync | 1 - monaco/Makefile | 1 - monaco/default.mk | 89 - monaco/javascript/.gitignore | 19 - monaco/javascript/.mocharc.json | 6 - monaco/javascript/.rsync | 2 - monaco/javascript/CHANGELOG.md | 66 - monaco/javascript/LICENSE | 21 - monaco/javascript/Makefile | 1 - monaco/javascript/README.md | 33 - monaco/javascript/default.mk | 87 - monaco/javascript/example/.gitignore | 3 - monaco/javascript/example/index.html | 30 - monaco/javascript/example/index.js | 51 - monaco/javascript/package.json | 46 - monaco/javascript/screenshot1.png | Bin 78163 -> 0 bytes monaco/javascript/screenshot2.png | Bin 65613 -> 0 bytes monaco/javascript/src/index.ts | 121 -- monaco/javascript/test/dummy.ts | 5 - monaco/javascript/tsconfig.build.json | 12 - monaco/javascript/tsconfig.json | 3 - monaco/javascript/webpack.config.js | 32 - package-lock.json | 1679 +---------------- suggest/.rsync | 1 - suggest/Makefile | 1 - suggest/default.mk | 89 - suggest/javascript/.gitignore | 19 - suggest/javascript/.mocharc.json | 6 - suggest/javascript/.rsync | 2 - suggest/javascript/.vscodeignore | 4 - suggest/javascript/CHANGELOG.md | 64 - suggest/javascript/LICENSE | 21 - suggest/javascript/Makefile | 1 - suggest/javascript/Monaco.gif | Bin 167993 -> 0 bytes suggest/javascript/README.md | 269 --- suggest/javascript/cucumber.js | 4 - suggest/javascript/default.mk | 87 - .../features/step_definitions/steps.ts | 50 - suggest/javascript/features/support/World.ts | 35 - suggest/javascript/features/support/env.js | 4 - suggest/javascript/package.json | 47 - suggest/javascript/src/buildStepDocuments.ts | 90 - suggest/javascript/src/expressions/java.ts | 101 - suggest/javascript/src/index.ts | 4 - .../javascript/src/index/bruteForceIndex.ts | 23 - suggest/javascript/src/index/fuseIndex.ts | 29 - suggest/javascript/src/index/index.ts | 4 - suggest/javascript/src/index/jsSearchIndex.ts | 29 - suggest/javascript/src/index/types.ts | 9 - .../javascript/src/lspCompletionSnippet.ts | 17 - suggest/javascript/src/types.ts | 32 - .../test/buildStepDocuments.test.ts | 110 -- .../javascript/test/expressions/java.test.ts | 59 - suggest/javascript/test/index/Index.test.ts | 91 - suggest/javascript/test/lspSnippet.test.ts | 17 - suggest/javascript/tree-sitter-java.wasm | Bin 232273 -> 0 bytes suggest/javascript/tsconfig.build.json | 12 - suggest/javascript/tsconfig.json | 3 - tsconfig.build.json | 15 - tsconfig.json | 7 +- vscode/.rsync | 1 - vscode/Makefile | 1 - vscode/default.mk | 89 - vscode/javascript/.gitignore | 19 - vscode/javascript/.mocharc.json | 6 - vscode/javascript/.rsync | 2 - vscode/javascript/.vscode/.gitignore | 1 - vscode/javascript/.vscode/extensions.json | 7 - vscode/javascript/.vscode/launch.json | 34 - vscode/javascript/.vscode/settings.json | 11 - vscode/javascript/.vscode/tasks.json | 21 - vscode/javascript/.vscodeignore | 10 - vscode/javascript/CHANGELOG.md | 25 - vscode/javascript/LICENSE | 21 - vscode/javascript/Makefile | 1 - vscode/javascript/README.md | 102 - vscode/javascript/default.mk | 87 - vscode/javascript/images/icon.png | Bin 29212 -> 0 bytes vscode/javascript/language-configuration.json | 13 - vscode/javascript/package.json | 69 - vscode/javascript/src/extension.ts | 53 - vscode/javascript/src/test/runTest.ts | 29 - .../src/test/suite/extension.test.ts | 15 - vscode/javascript/src/test/suite/index.ts | 38 - .../syntaxes/gherkin-classic.tmLanguage | 294 --- vscode/javascript/tsconfig.build.json | 12 - vscode/javascript/tsconfig.json | 3 - vscode/javascript/vsc-extension-quickstart.md | 42 - 140 files changed, 64 insertions(+), 6641 deletions(-) delete mode 100644 language-server/.rsync delete mode 100644 language-server/Makefile delete mode 100644 language-server/README.md delete mode 100644 language-server/default.mk delete mode 100644 language-server/javascript/.gitignore delete mode 100644 language-server/javascript/.mocharc.json delete mode 100644 language-server/javascript/.rsync delete mode 100644 language-server/javascript/CHANGELOG.md delete mode 100644 language-server/javascript/LICENSE delete mode 100644 language-server/javascript/Makefile delete mode 100644 language-server/javascript/README.md delete mode 100755 language-server/javascript/bin/cucumber-language-server.js delete mode 100644 language-server/javascript/default.mk delete mode 100644 language-server/javascript/package.json delete mode 100644 language-server/javascript/src/CucumberInfoStream.ts delete mode 100644 language-server/javascript/src/makeCucumberInfo.ts delete mode 100644 language-server/javascript/src/server.ts delete mode 100644 language-server/javascript/test/CucumberInfoStream.test.ts delete mode 100644 language-server/javascript/test/fixtures/messages.ndjson delete mode 100644 language-server/javascript/test/fixtures/suggest.ndjson delete mode 100644 language-server/javascript/test/makeCucumberInfo.test.ts delete mode 100644 language-server/javascript/tsconfig.build.json delete mode 100644 language-server/javascript/tsconfig.json delete mode 100644 language-service/.rsync delete mode 100644 language-service/Makefile delete mode 100644 language-service/README.md delete mode 100644 language-service/default.mk delete mode 100644 language-service/javascript/.gitignore delete mode 100644 language-service/javascript/.mocharc.json delete mode 100644 language-service/javascript/.rsync delete mode 100644 language-service/javascript/CHANGELOG.md delete mode 100644 language-service/javascript/LICENSE delete mode 100644 language-service/javascript/Makefile delete mode 100644 language-service/javascript/README.md delete mode 100644 language-service/javascript/default.mk delete mode 100644 language-service/javascript/package.json delete mode 100644 language-service/javascript/src/CucumberInfo.ts delete mode 100644 language-service/javascript/src/getGherkinCompletionItems.ts delete mode 100644 language-service/javascript/src/getGherkinDiagnostics.ts delete mode 100644 language-service/javascript/src/getGherkinFormattingEdits.ts delete mode 100644 language-service/javascript/src/getGherkinSemanticTokens.ts delete mode 100644 language-service/javascript/src/index.ts delete mode 100644 language-service/javascript/src/parseGherkinDocument.ts delete mode 100644 language-service/javascript/test/getGherkinCompletionItems.test.ts delete mode 100644 language-service/javascript/test/getGherkinDiagnostics.test.ts delete mode 100644 language-service/javascript/test/getGherkinFormattingEdits.test.ts delete mode 100644 language-service/javascript/test/getGherkinSemanticTokens.test.ts delete mode 100644 language-service/javascript/test/parseGherkinDocument.test.ts delete mode 100644 language-service/javascript/tsconfig.build.json delete mode 100644 language-service/javascript/tsconfig.json delete mode 100644 monaco/.rsync delete mode 100644 monaco/Makefile delete mode 100644 monaco/default.mk delete mode 100644 monaco/javascript/.gitignore delete mode 100644 monaco/javascript/.mocharc.json delete mode 100644 monaco/javascript/.rsync delete mode 100644 monaco/javascript/CHANGELOG.md delete mode 100644 monaco/javascript/LICENSE delete mode 100644 monaco/javascript/Makefile delete mode 100644 monaco/javascript/README.md delete mode 100644 monaco/javascript/default.mk delete mode 100644 monaco/javascript/example/.gitignore delete mode 100644 monaco/javascript/example/index.html delete mode 100644 monaco/javascript/example/index.js delete mode 100644 monaco/javascript/package.json delete mode 100644 monaco/javascript/screenshot1.png delete mode 100644 monaco/javascript/screenshot2.png delete mode 100644 monaco/javascript/src/index.ts delete mode 100644 monaco/javascript/test/dummy.ts delete mode 100644 monaco/javascript/tsconfig.build.json delete mode 100644 monaco/javascript/tsconfig.json delete mode 100644 monaco/javascript/webpack.config.js delete mode 100644 suggest/.rsync delete mode 100644 suggest/Makefile delete mode 100644 suggest/default.mk delete mode 100644 suggest/javascript/.gitignore delete mode 100644 suggest/javascript/.mocharc.json delete mode 100644 suggest/javascript/.rsync delete mode 100644 suggest/javascript/.vscodeignore delete mode 100644 suggest/javascript/CHANGELOG.md delete mode 100644 suggest/javascript/LICENSE delete mode 100644 suggest/javascript/Makefile delete mode 100644 suggest/javascript/Monaco.gif delete mode 100644 suggest/javascript/README.md delete mode 100644 suggest/javascript/cucumber.js delete mode 100644 suggest/javascript/default.mk delete mode 100644 suggest/javascript/features/step_definitions/steps.ts delete mode 100644 suggest/javascript/features/support/World.ts delete mode 100644 suggest/javascript/features/support/env.js delete mode 100644 suggest/javascript/package.json delete mode 100644 suggest/javascript/src/buildStepDocuments.ts delete mode 100644 suggest/javascript/src/expressions/java.ts delete mode 100644 suggest/javascript/src/index.ts delete mode 100644 suggest/javascript/src/index/bruteForceIndex.ts delete mode 100644 suggest/javascript/src/index/fuseIndex.ts delete mode 100644 suggest/javascript/src/index/index.ts delete mode 100644 suggest/javascript/src/index/jsSearchIndex.ts delete mode 100644 suggest/javascript/src/index/types.ts delete mode 100644 suggest/javascript/src/lspCompletionSnippet.ts delete mode 100644 suggest/javascript/src/types.ts delete mode 100644 suggest/javascript/test/buildStepDocuments.test.ts delete mode 100644 suggest/javascript/test/expressions/java.test.ts delete mode 100644 suggest/javascript/test/index/Index.test.ts delete mode 100644 suggest/javascript/test/lspSnippet.test.ts delete mode 100755 suggest/javascript/tree-sitter-java.wasm delete mode 100644 suggest/javascript/tsconfig.build.json delete mode 100644 suggest/javascript/tsconfig.json delete mode 100644 vscode/.rsync delete mode 100644 vscode/Makefile delete mode 100644 vscode/default.mk delete mode 100644 vscode/javascript/.gitignore delete mode 100644 vscode/javascript/.mocharc.json delete mode 100644 vscode/javascript/.rsync delete mode 100644 vscode/javascript/.vscode/.gitignore delete mode 100644 vscode/javascript/.vscode/extensions.json delete mode 100644 vscode/javascript/.vscode/launch.json delete mode 100644 vscode/javascript/.vscode/settings.json delete mode 100644 vscode/javascript/.vscode/tasks.json delete mode 100644 vscode/javascript/.vscodeignore delete mode 100644 vscode/javascript/CHANGELOG.md delete mode 100644 vscode/javascript/LICENSE delete mode 100644 vscode/javascript/Makefile delete mode 100644 vscode/javascript/README.md delete mode 100644 vscode/javascript/default.mk delete mode 100644 vscode/javascript/images/icon.png delete mode 100644 vscode/javascript/language-configuration.json delete mode 100644 vscode/javascript/package.json delete mode 100644 vscode/javascript/src/extension.ts delete mode 100644 vscode/javascript/src/test/runTest.ts delete mode 100644 vscode/javascript/src/test/suite/extension.test.ts delete mode 100644 vscode/javascript/src/test/suite/index.ts delete mode 100644 vscode/javascript/syntaxes/gherkin-classic.tmLanguage delete mode 100644 vscode/javascript/tsconfig.build.json delete mode 100644 vscode/javascript/tsconfig.json delete mode 100644 vscode/javascript/vsc-extension-quickstart.md diff --git a/.circleci/config.yml b/.circleci/config.yml index 5836e40681..19431b9eb7 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -145,66 +145,6 @@ jobs: ### JavaScript - suggest-javascript: - executor: docker-circleci-node-14 - steps: - - attach_workspace: - at: '~/cucumber' - - run: - name: suggest/javascript - command: | - sudo npm install --global npm@7 - cd suggest/javascript - make - - language-service-javascript: - executor: docker-circleci-node-14 - steps: - - attach_workspace: - at: '~/cucumber' - - run: - name: language-service/javascript - command: | - sudo npm install --global npm@7 - cd language-service/javascript - make - - language-server-javascript: - executor: docker-circleci-node-14 - steps: - - attach_workspace: - at: '~/cucumber' - - run: - name: language-server/javascript - command: | - sudo npm install --global npm@7 - cd language-server/javascript - make - - monaco-javascript: - executor: docker-circleci-node-14 - steps: - - attach_workspace: - at: '~/cucumber' - - run: - name: monaco/javascript - command: | - sudo npm install --global npm@7 - cd monaco/javascript - make - - vscode-javascript: - executor: docker-circleci-node-14 - steps: - - attach_workspace: - at: '~/cucumber' - - run: - name: vscode/javascript - command: | - sudo npm install --global npm@7 - cd vscode/javascript - make - message-streams-javascript: executor: docker-circleci-node-14 steps: diff --git a/Makefile b/Makefile index 43db585325..c31a8e1b9a 100644 --- a/Makefile +++ b/Makefile @@ -5,11 +5,6 @@ PACKAGES ?= messages \ gherkin \ gherkin-streams \ gherkin-utils \ - suggest \ - language-service \ - language-server \ - monaco \ - vscode \ create-meta \ fake-cucumber \ query \ diff --git a/language-server/.rsync b/language-server/.rsync deleted file mode 100644 index ea5a5de249..0000000000 --- a/language-server/.rsync +++ /dev/null @@ -1 +0,0 @@ -../.templates/default.mk default.mk diff --git a/language-server/Makefile b/language-server/Makefile deleted file mode 100644 index 551e68e27a..0000000000 --- a/language-server/Makefile +++ /dev/null @@ -1 +0,0 @@ -include default.mk diff --git a/language-server/README.md b/language-server/README.md deleted file mode 100644 index 8f80d31daa..0000000000 --- a/language-server/README.md +++ /dev/null @@ -1 +0,0 @@ -See [javascript/README.md](javascript/README.md) diff --git a/language-server/default.mk b/language-server/default.mk deleted file mode 100644 index a0d8dd28fb..0000000000 --- a/language-server/default.mk +++ /dev/null @@ -1,89 +0,0 @@ -# Please update /.templates/default.mk and sync: -# -# source scripts/functions.sh && rsync_files -# -SHELL := /usr/bin/env bash -ALPINE = $(shell which apk 2> /dev/null) -LIBNAME = $(shell basename $$(pwd)) -LANGUAGES ?= $(wildcard */) - -# https://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make -rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d)) - -default: $(patsubst %,default-%,$(LANGUAGES)) -.PHONY: default - -default-%: % - if [[ -d $< ]]; then cd $< && make default; fi -.PHONY: default-% - -# Need to declare these phonies to avoid errors for packages without a particular language -.PHONY: c dotnet go java javascript objective-c perl python ruby - -update-dependencies: $(patsubst %,update-dependencies-%,$(LANGUAGES)) -.PHONY: update-dependencies - -update-dependencies-%: % - if [[ -d $< ]]; then cd $< && make update-dependencies; fi -.PHONY: update-dependencies-% - -update-changelog: -ifdef NEW_VERSION - cat CHANGELOG.md | ../scripts/update_changelog.sh $(NEW_VERSION) > CHANGELOG.md.tmp - mv CHANGELOG.md.tmp CHANGELOG.md -else - @echo -e "\033[0;31mNEW_VERSION is not defined. Can't update version :-(\033[0m" - exit 1 -endif -.PHONY: update-changelog - -pre-release: update-changelog $(patsubst %,pre-release-%,$(LANGUAGES)) -.PHONY: pre-release - -pre-release-%: % - if [[ -d $< ]]; then cd $< && make pre-release; fi -.PHONY: pre-release-% - -release: publish -.PHONY: release - -publish: create-and-push-release-tag $(patsubst %,publish-%,$(LANGUAGES)) -.PHONY: publish - -publish-%: % - if [[ -d $< ]]; then cd $< && make publish; fi -.PHONY: publish-% - -create-and-push-release-tag: - [ -f '/home/cukebot/configure' ] && /home/cukebot/configure - git commit --gpg-sign --all --message "Release $(LIBNAME) v$(NEW_VERSION)" - git tag --sign "$(LIBNAME)/v$(NEW_VERSION)" -m "Release $(LIBNAME) v$(NEW_VERSION)" - git push --tags -.PHONY: create-and-push-release-tag - -post-release: $(patsubst %,post-release-%,$(LANGUAGES)) -.PHONY: post-release - -post-release: commit-and-push-post-release - -post-release-%: % - if [[ -d $< ]]; then cd $< && make post-release; fi -.PHONY: post-release-% - -commit-and-push-post-release: -ifdef NEW_VERSION - git push --tags - git commit --gpg-sign --all --message "Post release $(LIBNAME) v$(NEW_VERSION)" 2> /dev/null || true - git push -else - @echo -e "\033[0;31mNEW_VERSION is not defined.\033[0m" - exit 1 -endif -.PHONY: commit-and-push-post-release - -clean: $(patsubst %,clean-%,$(LANGUAGES)) -.PHONY: clean - -clean-%: % - if [[ -d $< ]]; then cd $< && make clean; fi -.PHONY: clean-% diff --git a/language-server/javascript/.gitignore b/language-server/javascript/.gitignore deleted file mode 100644 index 385b67bb27..0000000000 --- a/language-server/javascript/.gitignore +++ /dev/null @@ -1,19 +0,0 @@ -dist/ -.idea/ -.nyc_output/ -coverage/ -node_modules/ -yarn.lock -package-lock.json -*.log -.deps -.tested* -.linted -.built* -.compared -.codegen -acceptance/ -storybook-static -*-go -*.iml -.vscode-test diff --git a/language-server/javascript/.mocharc.json b/language-server/javascript/.mocharc.json deleted file mode 100644 index d5055eb10d..0000000000 --- a/language-server/javascript/.mocharc.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "require": ["tsconfig-paths/register", "ts-node/register", "source-map-support/register"], - "extension": ["ts", "tsx"], - "recursive": true, - "timeout": 10000 -} diff --git a/language-server/javascript/.rsync b/language-server/javascript/.rsync deleted file mode 100644 index 5592adbd0c..0000000000 --- a/language-server/javascript/.rsync +++ /dev/null @@ -1,2 +0,0 @@ -../../LICENSE LICENSE -../../.templates/javascript/ . diff --git a/language-server/javascript/CHANGELOG.md b/language-server/javascript/CHANGELOG.md deleted file mode 100644 index 2bbb94e868..0000000000 --- a/language-server/javascript/CHANGELOG.md +++ /dev/null @@ -1,42 +0,0 @@ -# CHANGE LOG -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](http://keepachangelog.com/) -and this project adheres to [Semantic Versioning](http://semver.org/). - ----- -## [Unreleased] - -### Added - -### Changed - -* Upgrade to `@cucumber/cucumber-expressions 13.0.1` - -### Deprecated - -### Removed - -### Fixed - -## [0.1.0] - 2021-09-07 - -### Added - -* Document Formatting - ([#1732](https://github.com/cucumber/common/pull/1732) - [aslakhellesoy]) - -## [0.0.1] - 2021-09-02 - -### Added - -* First release - - -[Unreleased]: https://github.com/cucumber/common/compare/language-server/v0.1.0...main -[0.1.0]: https://github.com/cucumber/common/compare/language-server/v0.0.1...v0.1.0 -[0.0.1]: https://github.com/cucumber/common/tree/language-server/v0.0.1 - - -[aslakhellesoy]: https://github.com/aslakhellesoy diff --git a/language-server/javascript/LICENSE b/language-server/javascript/LICENSE deleted file mode 100644 index 725ba9f4ac..0000000000 --- a/language-server/javascript/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Cucumber Ltd - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/language-server/javascript/Makefile b/language-server/javascript/Makefile deleted file mode 100644 index 551e68e27a..0000000000 --- a/language-server/javascript/Makefile +++ /dev/null @@ -1 +0,0 @@ -include default.mk diff --git a/language-server/javascript/README.md b/language-server/javascript/README.md deleted file mode 100644 index acd57807ed..0000000000 --- a/language-server/javascript/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# Cucumber Language Server - -A [Language Server](https://langserver.org/) for Cucumber. - -This language server provides most of the functionality offered by the -[Cucumber Visual Studio Code Extension](../../vscode/javascript). - -It may also be used to power other editors. - -## Supported features - -See [Cucumber Language Service](../../language-service/javascript) diff --git a/language-server/javascript/bin/cucumber-language-server.js b/language-server/javascript/bin/cucumber-language-server.js deleted file mode 100755 index 64bbaa1214..0000000000 --- a/language-server/javascript/bin/cucumber-language-server.js +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env node -require('source-map-support').install() -require('../dist/src/server') diff --git a/language-server/javascript/default.mk b/language-server/javascript/default.mk deleted file mode 100644 index b04d59c4a2..0000000000 --- a/language-server/javascript/default.mk +++ /dev/null @@ -1,87 +0,0 @@ -SHELL := /usr/bin/env bash -# https://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make -rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d)) -TYPESCRIPT_SOURCE_FILES = $(sort $(call rwildcard,src test,*.ts *.tsx)) -PRIVATE = $(shell node -e "console.log(require('./package.json').private)") -IS_TESTDATA = $(findstring -testdata,${CURDIR}) -NPM_MODULE = $(shell cat package.json | jq .name --raw-output) - -default: .tested -.PHONY: default - -../../node_modules ../../package-lock.json: package.json - cd ../.. && npm install - -.codegen: - touch $@ - -.tested: .tested-npm .built - -.built: $(TYPESCRIPT_SOURCE_FILES) ../../node_modules ../../package-lock.json .codegen - pushd ../.. && \ - npm run build && \ - popd && \ - touch $@ - -.tested-npm: $(TYPESCRIPT_SOURCE_FILES) ../../node_modules ../../package-lock.json .codegen - npm run test - touch $@ - -pre-release: clean update-version update-dependencies default -.PHONY: pre-release - -update-dependencies: ../../node_modules ../../package-lock.json - ../../node_modules/.bin/npm-check-updates --upgrade --reject hast-util-sanitize,@types/node,react-markdown,rehype-raw,rehype-sanitize,remark-gfm -.PHONY: update-dependencies - -update-version: -ifeq ($(IS_TESTDATA),-testdata) - # no-op -else -ifdef NEW_VERSION - npm --no-git-tag-version --allow-same-version version "$(NEW_VERSION)" - # Update all npm packages that depend on us - pushd ../.. && \ - ./scripts/npm-each update_npm_dependency_if_exists package.json "$(NPM_MODULE)" "$(NEW_VERSION)" -else - @echo -e "\033[0;31mNEW_VERSION is not defined. Can't update version :-(\033[0m" - exit 1 -endif -endif -.PHONY: update-version - -publish: .codegen -ifeq ($(IS_TESTDATA),-testdata) - # no-op -else -ifneq (true,$(PRIVATE)) - npm publish --access public -else - @echo "Not publishing private npm module" -endif -endif -.PHONY: publish - -post-release: -.PHONY: post-release - -clean: clean-javascript -.PHONY: clean - -clean-javascript: - rm -rf .deps .codegen .tested* coverage dist acceptance -.PHONY: clean-javascript - -clobber: clean - rm -rf node_modules ../../node_modules -.PHONY: clobber - -### COMMON stuff for all platforms - -BERP_VERSION = 1.3.0 -BERP_GRAMMAR = gherkin.berp - -define berp-generate-parser = --! dotnet tool list --tool-path /usr/bin | grep "berp\s*$(BERP_VERSION)" && dotnet tool update Berp --version $(BERP_VERSION) --tool-path /usr/bin -berp -g $(BERP_GRAMMAR) -t $< -o $@ --noBOM -endef diff --git a/language-server/javascript/package.json b/language-server/javascript/package.json deleted file mode 100644 index 70482660a0..0000000000 --- a/language-server/javascript/package.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "@cucumber/language-server", - "version": "0.2.0", - "description": "Cucumber Language Server", - "main": "dist/src/index.js", - "types": "dist/src/index.d.ts", - "bin": { - "cucumber-language-server": "bin/cucumber-language-server.js" - }, - "scripts": { - "test": "mocha", - "prepublishOnly": "tsc --build tsconfig.build.json" - }, - "repository": { - "type": "git", - "url": "git://github.com/cucumber/common.git" - }, - "keywords": [ - "cucumber", - "lsp" - ], - "author": "Cucumber Limited ", - "license": "MIT", - "bugs": { - "url": "https://github.com/cucumber/common/issues" - }, - "homepage": "https://github.com/cucumber/common#readme", - "devDependencies": { - "@types/mocha": "9.0.0", - "@types/node": "14.17.21", - "mocha": "9.1.2", - "txtgen": "2.2.8", - "ts-node": "10.2.1", - "typescript": "4.4.3" - }, - "dependencies": { - "@cucumber/cucumber-expressions": "^13.0.1", - "@cucumber/gherkin-utils": "^7.0.0", - "@cucumber/language-service": "^0.2.0", - "@cucumber/messages": "^17.1.1", - "@cucumber/suggest": "^0.0.4", - "source-map-support": "0.5.20", - "vscode-languageserver": "7.0.0", - "vscode-languageserver-textdocument": "1.0.2" - } -} diff --git a/language-server/javascript/src/CucumberInfoStream.ts b/language-server/javascript/src/CucumberInfoStream.ts deleted file mode 100644 index 0d2275fd04..0000000000 --- a/language-server/javascript/src/CucumberInfoStream.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Transform, TransformCallback } from 'stream' -import { Envelope } from '@cucumber/messages' -import { CucumberInfoBuilder } from '@cucumber/language-service' - -export class CucumberInfoStream extends Transform { - private readonly builder = new CucumberInfoBuilder() - - constructor() { - super({ objectMode: true }) - } - - _transform(envelope: Envelope, _: BufferEncoding, callback: TransformCallback) { - this.builder.processEnvelope(envelope) - callback() - } - - _flush(callback: TransformCallback) { - const cucumberInfo = this.builder.build() - callback(null, cucumberInfo) - } -} diff --git a/language-server/javascript/src/makeCucumberInfo.ts b/language-server/javascript/src/makeCucumberInfo.ts deleted file mode 100644 index 0efab7d50f..0000000000 --- a/language-server/javascript/src/makeCucumberInfo.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { spawn } from 'child_process' -import { pipeline, Writable } from 'stream' -import { NdjsonToMessageStream } from '@cucumber/message-streams' -import { CucumberInfo } from '@cucumber/language-service' -import { CucumberInfoStream } from './CucumberInfoStream' - -export function makeCucumberInfo(command: string, args: string[]): Promise { - const cucumber = spawn(command, args) - - const stderr: Buffer[] = [] - - return new Promise((resolve, reject) => { - cucumber.on('error', reject) - cucumber.on('close', (code, signal) => { - if (signal) { - reject(new Error(`Received signal ${signal}`)) - } - // https://github.com/cucumber/cucumber-js/issues/1768 - if (code === 1 || code === 0) { - return resolve(null) - } - reject( - new Error(`Exited with status ${code}. STDERR:\n${Buffer.concat(stderr).toString('utf8')}`) - ) - }) - - pipeline( - cucumber.stderr, - new Writable({ - write(chunk: Buffer, _, callback) { - stderr.push(chunk) - callback() - }, - }), - (err) => err && reject(err) - ) - - let cucumberInfo: CucumberInfo = null - pipeline( - cucumber.stdout, - new NdjsonToMessageStream(), - new CucumberInfoStream(), - new Writable({ - objectMode: true, - write(_cucumberInfo: CucumberInfo, encoding, callback) { - cucumberInfo = _cucumberInfo - callback() - }, - }), - (err) => { - if (err) return reject(err) - resolve(cucumberInfo) - } - ) - }) -} diff --git a/language-server/javascript/src/server.ts b/language-server/javascript/src/server.ts deleted file mode 100644 index b31a18b789..0000000000 --- a/language-server/javascript/src/server.ts +++ /dev/null @@ -1,177 +0,0 @@ -import { - CompletionItem, - createConnection, - DidChangeConfigurationNotification, - InitializeParams, - InitializeResult, - ProposedFeatures, - SemanticTokensParams, - TextDocumentPositionParams, - TextDocuments, - TextDocumentSyncKind, - TextEdit, -} from 'vscode-languageserver/node' - -import { TextDocument } from 'vscode-languageserver-textdocument' -import { Index, jsSearchIndex } from '@cucumber/suggest' -import { - getGherkinCompletionItems, - getGherkinDiagnostics, - getGherkinSemanticTokens, - getGherkinFormattingEdits, - semanticTokenModifiers, - semanticTokenTypes, -} from '@cucumber/language-service' -import { Expression } from '@cucumber/cucumber-expressions' -import { makeCucumberInfo } from './makeCucumberInfo' - -// Create a connection for the server, using Node's IPC as a transport. -// Also include all preview / proposed LSP features. -const connection = createConnection(ProposedFeatures.all) - -// Create a simple text document manager. -const documents: TextDocuments = new TextDocuments(TextDocument) - -type IndexAndExpressions = { - expressions: readonly Expression[] - index: Index -} - -let indexAndExpressions: IndexAndExpressions - -let hasConfigurationCapability = false -let hasWorkspaceFolderCapability = false -let hasDiagnosticRelatedInformationCapability = false - -connection.onInitialize(async (params: InitializeParams) => { - const capabilities = params.capabilities - - // Does the client support the `workspace/configuration` request? - // If not, we fall back using global settings. - hasConfigurationCapability = !!(capabilities.workspace && !!capabilities.workspace.configuration) - hasWorkspaceFolderCapability = !!( - capabilities.workspace && !!capabilities.workspace.workspaceFolders - ) - hasDiagnosticRelatedInformationCapability = !!( - capabilities.textDocument && - capabilities.textDocument.publishDiagnostics && - capabilities.textDocument.publishDiagnostics.relatedInformation - ) - - const semanticTokensSupport = - params.capabilities.textDocument && params.capabilities.textDocument.semanticTokens - - const result: InitializeResult = { - capabilities: { - textDocumentSync: TextDocumentSyncKind.Incremental, - // Tell the client that this server supports code completion. - completionProvider: { - resolveProvider: false, - }, - semanticTokensProvider: semanticTokensSupport - ? { - full: { - delta: false, - }, - legend: { - tokenTypes: semanticTokenTypes, - tokenModifiers: semanticTokenModifiers, - }, - } - : undefined, - documentFormattingProvider: true, - }, - } - if (hasWorkspaceFolderCapability) { - result.capabilities.workspace = { - workspaceFolders: { - supported: true, - }, - } - } - indexAndExpressions = await makeIndexAndExpressions() - return result -}) - -connection.onInitialized(() => { - if (hasConfigurationCapability) { - // Register for all configuration changes. - connection.client.register(DidChangeConfigurationNotification.type, undefined) - } - if (hasWorkspaceFolderCapability) { - connection.workspace.onDidChangeWorkspaceFolders((_event) => { - connection.console.log('Workspace folder change event received.') - }) - } - connection.console.log('Cucumber Language server initialized') - updateIndexAndExpressions() -}) - -connection.onDidChangeConfiguration(() => { - documents.all().forEach(validateGherkinDocument) -}) - -// The content of a text document has changed. This event is emitted -// when the text document first opened or when its content has changed. -documents.onDidChangeContent((change) => { - updateIndexAndExpressionsDebounce() - validateGherkinDocument(change.document) -}) - -let updateTimer: NodeJS.Timer - -function updateIndexAndExpressionsDebounce() { - if (updateTimer) clearTimeout(updateTimer) - updateTimer = setTimeout(updateIndexAndExpressions, 5000) -} - -function updateIndexAndExpressions() { - makeIndexAndExpressions() - .then((_indexAndExpressions) => { - indexAndExpressions = _indexAndExpressions - }) - .catch((err) => connection.console.error('Failed to make Cucumber Info: ' + err.message)) -} - -async function makeIndexAndExpressions(): Promise { - const cucumberInfo = await makeCucumberInfo(process.execPath, [ - './node_modules/.bin/cucumber-js', - '--dry-run', - '--format', - 'message', - ]) - return { - index: jsSearchIndex(cucumberInfo.stepDocuments), - expressions: cucumberInfo.expressions, - } -} - -function validateGherkinDocument(textDocument: TextDocument): void { - const diagnostics = getGherkinDiagnostics(textDocument.getText(), indexAndExpressions.expressions) - connection.sendDiagnostics({ uri: textDocument.uri, diagnostics }) -} - -connection.onCompletion((textDocumentPosition: TextDocumentPositionParams): CompletionItem[] => { - const gherkinSource = documents.get(textDocumentPosition.textDocument.uri).getText() - return getGherkinCompletionItems( - gherkinSource, - textDocumentPosition.position.line, - indexAndExpressions.index - ) -}) - -connection.onCompletionResolve((item) => item) - -connection.languages.semanticTokens.on((semanticTokenParams: SemanticTokensParams) => { - const gherkinSource = documents.get(semanticTokenParams.textDocument.uri).getText() - return getGherkinSemanticTokens(gherkinSource, indexAndExpressions.expressions) -}) - -connection.onDocumentFormatting(async (params): Promise => { - const gherkinSource = documents.get(params.textDocument.uri).getText() - return getGherkinFormattingEdits(gherkinSource) -}) - -documents.listen(connection) - -connection.listen() diff --git a/language-server/javascript/test/CucumberInfoStream.test.ts b/language-server/javascript/test/CucumberInfoStream.test.ts deleted file mode 100644 index 72d96f09bd..0000000000 --- a/language-server/javascript/test/CucumberInfoStream.test.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { pipeline as pipelineCb, Writable } from 'stream' -import { promisify } from 'util' -import fs from 'fs' -import { NdjsonToMessageStream } from '@cucumber/message-streams' -import assert from 'assert' -import { StepDocument } from '@cucumber/suggest' -import { CucumberInfoStream } from '../src/CucumberInfoStream' -import { CucumberInfo } from '@cucumber/language-service' - -const pipeline = promisify(pipelineCb) - -describe('CucumberInfoStream', () => { - it('builds CucumberInfo from a message stream with parameter types', async () => { - const readStream = fs.createReadStream(__dirname + '/fixtures/suggest.ndjson', 'utf-8') - let cucumberInfo: CucumberInfo - await pipeline( - readStream, - new NdjsonToMessageStream(), - new CucumberInfoStream(), - new Writable({ - objectMode: true, - write(_cucumberInfo: CucumberInfo, encoding, callback) { - cucumberInfo = _cucumberInfo - callback() - }, - }) - ) - const expectedStepDocuments: Partial[] = [ - { - segments: ['I select the ', ['2nd'], ' snippet'], - suggestion: 'I select the {ordinal} snippet', - }, - { - segments: [ - 'I type ', - ['"I have ${1|11,17,23|} cukes on my ${2|belly,table,tree|}"', '"cukes"'], - ], - suggestion: 'I type {string}', - }, - { - segments: [ - 'the LSP snippet should be ', - ['"I have ${1|11,17,23|} cukes on my ${2|belly,table,tree|}"', '"cukes"'], - ], - suggestion: 'the LSP snippet should be {string}', - }, - { - segments: ['the following Gherkin step texts exist:'], - suggestion: 'the following Gherkin step texts exist:', - }, - { - segments: ['the following Step Definitions exist:'], - suggestion: 'the following Step Definitions exist:', - }, - { - segments: ['the suggestions should be empty'], - suggestion: 'the suggestions should be empty', - }, - { - segments: ['the suggestions should be:'], - suggestion: 'the suggestions should be:', - }, - ] - assert.deepStrictEqual(cucumberInfo.stepDocuments.map(d => ({segments: d.segments, suggestion: d.suggestion})), expectedStepDocuments) - - const expectedExpressionSources = [ - 'the following Gherkin step texts exist:', - 'the following Step Definitions exist:', - 'I type {string}', - 'I select the {ordinal} snippet', - 'the suggestions should be:', - 'the suggestions should be empty', - 'the LSP snippet should be {string}', - ] - assert.deepStrictEqual( - cucumberInfo.expressions.map((e) => e.source), - expectedExpressionSources - ) - }) -}) diff --git a/language-server/javascript/test/fixtures/messages.ndjson b/language-server/javascript/test/fixtures/messages.ndjson deleted file mode 100644 index 2ca4bd07a0..0000000000 --- a/language-server/javascript/test/fixtures/messages.ndjson +++ /dev/null @@ -1,39 +0,0 @@ -{"meta":{"protocolVersion":"16.0.1","implementation":{"name":"cucumber-js","version":"7.3.0"},"cpu":{"name":"x64"},"os":{"name":"darwin","version":"20.5.0"},"runtime":{"name":"node.js","version":"16.3.0"}}} -{"source":{"data":"Feature: Hear Shout\n\n Shouts have a range of approximately 1000m\n\n Scenario: In range shout is heard\n Given Lucy is at 0, 0\n And Sean is at 0, 900\n When Sean shouts\n Then Lucy should hear Sean\n\n Scenario: Out of range shout is not heard\n Given Lucy is at 0, 0\n And Sean is at 800, 800\n When Sean shouts\n Then Lucy should hear nothing\n","uri":"features/hear_shout.feature","mediaType":"text/x.cucumber.gherkin+plain"}} -{"gherkinDocument":{"feature":{"tags":[],"location":{"line":1,"column":1},"language":"en","keyword":"Feature","name":"Hear Shout","description":" Shouts have a range of approximately 1000m","children":[{"scenario":{"id":"8c7d83bb-9ff2-4c26-8ac2-d3eb2f1ad01d","tags":[],"location":{"line":5,"column":3},"keyword":"Scenario","name":"In range shout is heard","description":"","steps":[{"id":"3a238c6e-e72c-4ee6-9bd5-c424e577fb76","location":{"line":6,"column":5},"keyword":"Given ","text":"Lucy is at 0, 0"},{"id":"59cc32b8-9074-4b5f-8879-dee864e875c0","location":{"line":7,"column":5},"keyword":"And ","text":"Sean is at 0, 900"},{"id":"3759e9f6-3a3e-4632-8efe-154172628cc0","location":{"line":8,"column":5},"keyword":"When ","text":"Sean shouts"},{"id":"63918b08-cded-4ab3-9b1e-866d185c1f53","location":{"line":9,"column":5},"keyword":"Then ","text":"Lucy should hear Sean"}],"examples":[]}},{"scenario":{"id":"cf35f821-a57a-43c3-9760-4c792d3ab0d4","tags":[],"location":{"line":11,"column":3},"keyword":"Scenario","name":"Out of range shout is not heard","description":"","steps":[{"id":"5da47841-def6-4d68-b1a3-56cf09354d3c","location":{"line":12,"column":5},"keyword":"Given ","text":"Lucy is at 0, 0"},{"id":"1972e5f9-56e0-45a0-808f-65c011bbb540","location":{"line":13,"column":5},"keyword":"And ","text":"Sean is at 800, 800"},{"id":"36304215-2917-4829-8e5c-9e3bd1d87c8c","location":{"line":14,"column":5},"keyword":"When ","text":"Sean shouts"},{"id":"077f4be9-9638-42f4-96d7-58cb6d4afef4","location":{"line":15,"column":5},"keyword":"Then ","text":"Lucy should hear nothing"}],"examples":[]}}]},"comments":[],"uri":"features/hear_shout.feature"}} -{"pickle":{"id":"1a7d8c7e-9ce0-4b92-8072-35aea6359a07","uri":"features/hear_shout.feature","astNodeIds":["8c7d83bb-9ff2-4c26-8ac2-d3eb2f1ad01d"],"tags":[],"name":"In range shout is heard","language":"en","steps":[{"id":"e7a5273a-f865-4c6f-8986-7ef0d8e139f1","text":"Lucy is at 0, 0","astNodeIds":["3a238c6e-e72c-4ee6-9bd5-c424e577fb76"]},{"id":"3a1a3656-a595-460a-aa74-c143886e2719","text":"Sean is at 0, 900","astNodeIds":["59cc32b8-9074-4b5f-8879-dee864e875c0"]},{"id":"189f5631-b5f2-436a-bd2b-3ac731e93843","text":"Sean shouts","astNodeIds":["3759e9f6-3a3e-4632-8efe-154172628cc0"]},{"id":"26b1caf8-4954-443e-a0cc-1ea0fddf789d","text":"Lucy should hear Sean","astNodeIds":["63918b08-cded-4ab3-9b1e-866d185c1f53"]}]}} -{"pickle":{"id":"ea5d4352-cc59-4746-ac5a-7f6fbb3fcd0d","uri":"features/hear_shout.feature","astNodeIds":["cf35f821-a57a-43c3-9760-4c792d3ab0d4"],"tags":[],"name":"Out of range shout is not heard","language":"en","steps":[{"id":"ace3fd8a-0fb8-4cca-a8f2-498e41e33b45","text":"Lucy is at 0, 0","astNodeIds":["5da47841-def6-4d68-b1a3-56cf09354d3c"]},{"id":"2ea88ccb-00f1-4198-9903-45cee3f7db0e","text":"Sean is at 800, 800","astNodeIds":["1972e5f9-56e0-45a0-808f-65c011bbb540"]},{"id":"9586ec8f-ad9e-4600-a670-5f0b176941e9","text":"Sean shouts","astNodeIds":["36304215-2917-4829-8e5c-9e3bd1d87c8c"]},{"id":"0c653613-abc2-4f5e-b2e3-5d66d9a9bf04","text":"Lucy should hear nothing","astNodeIds":["077f4be9-9638-42f4-96d7-58cb6d4afef4"]}]}} -{"stepDefinition":{"id":"f920bb09-d2e7-4870-b428-bbfc7b317c72","pattern":{"source":"Lucy is at {int}, {int}","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"features/step_definitions/shout_steps.js","location":{"line":13}}}} -{"stepDefinition":{"id":"1faf0352-aa32-4deb-bd1f-9ed7dcdf0eb1","pattern":{"source":"Sean is at {int}, {int}","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"features/step_definitions/shout_steps.js","location":{"line":17}}}} -{"stepDefinition":{"id":"7153c5e8-aef0-4cd3-a935-a8ed8114226b","pattern":{"source":"Sean shouts","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"features/step_definitions/shout_steps.js","location":{"line":21}}}} -{"stepDefinition":{"id":"f44e44dd-188b-4a37-bd60-aad9ecf41703","pattern":{"source":"Lucy should hear Sean","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"features/step_definitions/shout_steps.js","location":{"line":25}}}} -{"stepDefinition":{"id":"c0df2d95-a1d8-4332-8fce-488fb72fb9db","pattern":{"source":"Lucy should hear nothing","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"features/step_definitions/shout_steps.js","location":{"line":29}}}} -{"hook":{"id":"bd3324a0-6ab8-4f5f-9baf-c1c71149c2ed","sourceReference":{"uri":"features/step_definitions/shout_steps.js","location":{"line":9}}}} -{"testRunStarted":{"timestamp":{"seconds":1628282241,"nanos":665000000}}} -{"testCase":{"pickleId":"1a7d8c7e-9ce0-4b92-8072-35aea6359a07","id":"441e2e5f-d26b-44e2-9354-4c8a08cb3e97","testSteps":[{"id":"f8259afd-0cd1-4d32-933e-ecf623d44c69","hookId":"bd3324a0-6ab8-4f5f-9baf-c1c71149c2ed"},{"id":"e2432ba1-5e3d-44d4-a040-a8c85ccebc77","pickleStepId":"e7a5273a-f865-4c6f-8986-7ef0d8e139f1","stepDefinitionIds":["f920bb09-d2e7-4870-b428-bbfc7b317c72"],"stepMatchArgumentsLists":[{"stepMatchArguments":[{"group":{"start":11,"value":"0","children":[]},"parameterTypeName":"int"},{"group":{"start":14,"value":"0","children":[]},"parameterTypeName":"int"}]}]},{"id":"1ff8c9ff-34ba-464e-8e78-846f156befde","pickleStepId":"3a1a3656-a595-460a-aa74-c143886e2719","stepDefinitionIds":["1faf0352-aa32-4deb-bd1f-9ed7dcdf0eb1"],"stepMatchArgumentsLists":[{"stepMatchArguments":[{"group":{"start":11,"value":"0","children":[]},"parameterTypeName":"int"},{"group":{"start":14,"value":"900","children":[]},"parameterTypeName":"int"}]}]},{"id":"a245ef93-8160-4aa5-88d0-912d78ad4b3c","pickleStepId":"189f5631-b5f2-436a-bd2b-3ac731e93843","stepDefinitionIds":["7153c5e8-aef0-4cd3-a935-a8ed8114226b"],"stepMatchArgumentsLists":[{"stepMatchArguments":[]}]},{"id":"7fbe4859-744e-454b-8a31-511c8baf11d7","pickleStepId":"26b1caf8-4954-443e-a0cc-1ea0fddf789d","stepDefinitionIds":["f44e44dd-188b-4a37-bd60-aad9ecf41703"],"stepMatchArgumentsLists":[{"stepMatchArguments":[]}]}]}} -{"testCase":{"pickleId":"ea5d4352-cc59-4746-ac5a-7f6fbb3fcd0d","id":"0f50693a-4d37-475c-93c7-11f2050a714f","testSteps":[{"id":"53d7cec3-a7b0-41be-96d1-6ace96299882","hookId":"bd3324a0-6ab8-4f5f-9baf-c1c71149c2ed"},{"id":"f70010a4-29a9-47ab-bc4b-f0b753d473cb","pickleStepId":"ace3fd8a-0fb8-4cca-a8f2-498e41e33b45","stepDefinitionIds":["f920bb09-d2e7-4870-b428-bbfc7b317c72"],"stepMatchArgumentsLists":[{"stepMatchArguments":[{"group":{"start":11,"value":"0","children":[]},"parameterTypeName":"int"},{"group":{"start":14,"value":"0","children":[]},"parameterTypeName":"int"}]}]},{"id":"f1d0a858-bcfd-476f-aec4-b60da1f5ff60","pickleStepId":"2ea88ccb-00f1-4198-9903-45cee3f7db0e","stepDefinitionIds":["1faf0352-aa32-4deb-bd1f-9ed7dcdf0eb1"],"stepMatchArgumentsLists":[{"stepMatchArguments":[{"group":{"start":11,"value":"800","children":[]},"parameterTypeName":"int"},{"group":{"start":16,"value":"800","children":[]},"parameterTypeName":"int"}]}]},{"id":"1fe55842-61bd-4347-8c67-9d31c50c7871","pickleStepId":"9586ec8f-ad9e-4600-a670-5f0b176941e9","stepDefinitionIds":["7153c5e8-aef0-4cd3-a935-a8ed8114226b"],"stepMatchArgumentsLists":[{"stepMatchArguments":[]}]},{"id":"76d209a3-0c29-4e26-a326-22072714f4a0","pickleStepId":"0c653613-abc2-4f5e-b2e3-5d66d9a9bf04","stepDefinitionIds":["c0df2d95-a1d8-4332-8fce-488fb72fb9db"],"stepMatchArgumentsLists":[{"stepMatchArguments":[]}]}]}} -{"testCaseStarted":{"attempt":0,"testCaseId":"441e2e5f-d26b-44e2-9354-4c8a08cb3e97","id":"24d127c3-4d50-4daf-b370-dd61c6159907","timestamp":{"seconds":1628282241,"nanos":668000000}}} -{"testStepStarted":{"testCaseStartedId":"24d127c3-4d50-4daf-b370-dd61c6159907","testStepId":"f8259afd-0cd1-4d32-933e-ecf623d44c69","timestamp":{"seconds":1628282241,"nanos":668000000}}} -{"testStepFinished":{"testCaseStartedId":"24d127c3-4d50-4daf-b370-dd61c6159907","testStepId":"f8259afd-0cd1-4d32-933e-ecf623d44c69","testStepResult":{"status":"SKIPPED","duration":{"seconds":0,"nanos":0},"willBeRetried":false},"timestamp":{"seconds":1628282241,"nanos":668000000}}} -{"testStepStarted":{"testCaseStartedId":"24d127c3-4d50-4daf-b370-dd61c6159907","testStepId":"e2432ba1-5e3d-44d4-a040-a8c85ccebc77","timestamp":{"seconds":1628282241,"nanos":668000000}}} -{"testStepFinished":{"testCaseStartedId":"24d127c3-4d50-4daf-b370-dd61c6159907","testStepId":"e2432ba1-5e3d-44d4-a040-a8c85ccebc77","testStepResult":{"status":"SKIPPED","duration":{"seconds":0,"nanos":0},"willBeRetried":false},"timestamp":{"seconds":1628282241,"nanos":669000000}}} -{"testStepStarted":{"testCaseStartedId":"24d127c3-4d50-4daf-b370-dd61c6159907","testStepId":"1ff8c9ff-34ba-464e-8e78-846f156befde","timestamp":{"seconds":1628282241,"nanos":669000000}}} -{"testStepFinished":{"testCaseStartedId":"24d127c3-4d50-4daf-b370-dd61c6159907","testStepId":"1ff8c9ff-34ba-464e-8e78-846f156befde","testStepResult":{"status":"SKIPPED","duration":{"seconds":0,"nanos":0},"willBeRetried":false},"timestamp":{"seconds":1628282241,"nanos":669000000}}} -{"testStepStarted":{"testCaseStartedId":"24d127c3-4d50-4daf-b370-dd61c6159907","testStepId":"a245ef93-8160-4aa5-88d0-912d78ad4b3c","timestamp":{"seconds":1628282241,"nanos":669000000}}} -{"testStepFinished":{"testCaseStartedId":"24d127c3-4d50-4daf-b370-dd61c6159907","testStepId":"a245ef93-8160-4aa5-88d0-912d78ad4b3c","testStepResult":{"status":"SKIPPED","duration":{"seconds":0,"nanos":0},"willBeRetried":false},"timestamp":{"seconds":1628282241,"nanos":669000000}}} -{"testStepStarted":{"testCaseStartedId":"24d127c3-4d50-4daf-b370-dd61c6159907","testStepId":"7fbe4859-744e-454b-8a31-511c8baf11d7","timestamp":{"seconds":1628282241,"nanos":669000000}}} -{"testStepFinished":{"testCaseStartedId":"24d127c3-4d50-4daf-b370-dd61c6159907","testStepId":"7fbe4859-744e-454b-8a31-511c8baf11d7","testStepResult":{"status":"SKIPPED","duration":{"seconds":0,"nanos":0},"willBeRetried":false},"timestamp":{"seconds":1628282241,"nanos":669000000}}} -{"testCaseFinished":{"testCaseStartedId":"24d127c3-4d50-4daf-b370-dd61c6159907","timestamp":{"seconds":1628282241,"nanos":669000000}}} -{"testCaseStarted":{"attempt":0,"testCaseId":"0f50693a-4d37-475c-93c7-11f2050a714f","id":"1b421bd9-a776-4c26-a858-087bfa96b2b9","timestamp":{"seconds":1628282241,"nanos":669000000}}} -{"testStepStarted":{"testCaseStartedId":"1b421bd9-a776-4c26-a858-087bfa96b2b9","testStepId":"53d7cec3-a7b0-41be-96d1-6ace96299882","timestamp":{"seconds":1628282241,"nanos":669000000}}} -{"testStepFinished":{"testCaseStartedId":"1b421bd9-a776-4c26-a858-087bfa96b2b9","testStepId":"53d7cec3-a7b0-41be-96d1-6ace96299882","testStepResult":{"status":"SKIPPED","duration":{"seconds":0,"nanos":0},"willBeRetried":false},"timestamp":{"seconds":1628282241,"nanos":670000000}}} -{"testStepStarted":{"testCaseStartedId":"1b421bd9-a776-4c26-a858-087bfa96b2b9","testStepId":"f70010a4-29a9-47ab-bc4b-f0b753d473cb","timestamp":{"seconds":1628282241,"nanos":670000000}}} -{"testStepFinished":{"testCaseStartedId":"1b421bd9-a776-4c26-a858-087bfa96b2b9","testStepId":"f70010a4-29a9-47ab-bc4b-f0b753d473cb","testStepResult":{"status":"SKIPPED","duration":{"seconds":0,"nanos":0},"willBeRetried":false},"timestamp":{"seconds":1628282241,"nanos":670000000}}} -{"testStepStarted":{"testCaseStartedId":"1b421bd9-a776-4c26-a858-087bfa96b2b9","testStepId":"f1d0a858-bcfd-476f-aec4-b60da1f5ff60","timestamp":{"seconds":1628282241,"nanos":670000000}}} -{"testStepFinished":{"testCaseStartedId":"1b421bd9-a776-4c26-a858-087bfa96b2b9","testStepId":"f1d0a858-bcfd-476f-aec4-b60da1f5ff60","testStepResult":{"status":"SKIPPED","duration":{"seconds":0,"nanos":0},"willBeRetried":false},"timestamp":{"seconds":1628282241,"nanos":670000000}}} -{"testStepStarted":{"testCaseStartedId":"1b421bd9-a776-4c26-a858-087bfa96b2b9","testStepId":"1fe55842-61bd-4347-8c67-9d31c50c7871","timestamp":{"seconds":1628282241,"nanos":670000000}}} -{"testStepFinished":{"testCaseStartedId":"1b421bd9-a776-4c26-a858-087bfa96b2b9","testStepId":"1fe55842-61bd-4347-8c67-9d31c50c7871","testStepResult":{"status":"SKIPPED","duration":{"seconds":0,"nanos":0},"willBeRetried":false},"timestamp":{"seconds":1628282241,"nanos":670000000}}} -{"testStepStarted":{"testCaseStartedId":"1b421bd9-a776-4c26-a858-087bfa96b2b9","testStepId":"76d209a3-0c29-4e26-a326-22072714f4a0","timestamp":{"seconds":1628282241,"nanos":670000000}}} -{"testStepFinished":{"testCaseStartedId":"1b421bd9-a776-4c26-a858-087bfa96b2b9","testStepId":"76d209a3-0c29-4e26-a326-22072714f4a0","testStepResult":{"status":"SKIPPED","duration":{"seconds":0,"nanos":0},"willBeRetried":false},"timestamp":{"seconds":1628282241,"nanos":670000000}}} -{"testCaseFinished":{"testCaseStartedId":"1b421bd9-a776-4c26-a858-087bfa96b2b9","timestamp":{"seconds":1628282241,"nanos":670000000}}} -{"testRunFinished":{"timestamp":{"seconds":1628282241,"nanos":670000000},"success":true}} diff --git a/language-server/javascript/test/fixtures/suggest.ndjson b/language-server/javascript/test/fixtures/suggest.ndjson deleted file mode 100644 index ca64992d61..0000000000 --- a/language-server/javascript/test/fixtures/suggest.ndjson +++ /dev/null @@ -1,63 +0,0 @@ -{"meta":{"protocolVersion":"16.0.1","implementation":{"name":"cucumber-js","version":"7.3.1"},"cpu":{"name":"x64"},"os":{"name":"darwin","version":"20.5.0"},"runtime":{"name":"node.js","version":"16.3.0"}}} -{"source":{"data":"# Cucumber Suggest\n\nThis is a library that can be used to build Gherkin step auto-complete in editors.\nIt does not implement a UI component, but it can provide *suggestions* to an editor's auto-complete component.\n\nHere is an example of a [Monaco editor](https://microsoft.github.io/monaco-editor/) using this library:\n\n![Monaco](Monaco.gif)\n\n## Architecture\n\nThe suggest system consists of multiple components, each of which may run in a different process.\n\n```\n+--------------------+ +---------------+ +-------+\n| Cucumber/Regular | | | | |\n| Expressions | | Gherkin Steps | | |\n| (Step definitions) | | | | |\n+----------+---------+ +-------+-------+ | |\n | | | |\n | | | |\n +-------------+-----------+ | |\n | | |\n | | |\n +---------v----------+ | |\n | buildStepDocuments | | |\n | (Transform) | | ETL |\n +---------+----------+ | |\n | | |\n | | |\n | | |\n +-------v--------+ | |\n | Step Documents | | |\n +-------+--------+ | |\n | | |\n | | |\n | | |\n +-----v-----+ | |\n | Storage | | |\n +-----^-----+ +-------+\n |\n +--------+-------+\n | |\n +---+----+ +----+----+\n | LSP | | Editor |\n | Server | | Plugin |\n +---^----+ +----^----+\n | |\n | |\n +---+----+ +----+----+\n | LSP | | Editor |\n | Editor | |(Non-LSP)|\n +--------+ +---------+\n```\n\n### ETL process for Step Documents\n\nAt the top right of the diagram is an [ETL](https://en.wikipedia.org/wiki/Extract,_transform,_load) process. Implementing\na full ETL process is currently beyond the scope of this library - it only implements the **transform** step. A full ETL\nprocess would do the following:\n\nFirst, **extract** [Cucumber Expressions](../../cucumber-expressions) and Regular Expressions from step definitions,\nand the text from Gherkin Steps. This can be done by parsing [Cucumber Messages](../../messages) from Cucumber dry-runs.\n\nSecond, **transform** the expressions and steps to [Step Documents](#step-documents) using the `buildStepDocuments` function.\n\nThird, **load** the *Step Documents* into a persistent storage. This can be a [search index](https://en.wikipedia.org/wiki/Search_engine_indexing),\nor some other form of persistent storage (such as a file in a file system or a database).\nSee the [Search Index](#search-index) section below for more details.\n\n### Editor suggest\n\nThis library does not implement any editor functionality, but it *does define* the *Step Document* data structure\non which editor auto-complete can be implemented. There are two ways to build support for an editor.\n\nWhat is common for both approaches is that they will query a search index.\n\nThe `StepDocument`s coming back from an index search can be converted to an\n[LSP Completion Snippet](https://microsoft.github.io/language-server-protocol/specifications/specification-3-17/#snippet_syntax)\nusing the `lspCompletionSnippet` function.\n\nFor example, this `StepDocument`:\n\n`[\"I have \", [\"42\", \"54\"], \" cukes in my \", [\"basket\", \"belly\"]]`\n\nbecomes the following LSP Completion Snippet:\n\n`I have ${1|42,54|} cukes in my ${2|basket,belly|}`\n\n### LSP\n\nWith the [LSP](https://microsoft.github.io/language-server-protocol/) approach, the storage is typically a \n[search index](https://en.wikipedia.org/wiki/Search_engine_indexing).\nWhen the user invokes the auto-complete command in the editor, the editor will send a \n[completion request](https://microsoft.github.io/language-server-protocol/specifications/specification-3-17/#textDocument_completion) \nto the LSP server. The LSP server queries the search index, and uses the returned *Step Documents* to build the response to\nthe completion request.\n\n### Dedicated plugin\n\nWith the dedicated plugin approach, the storage is typically a file system or a database.\nWhen the editor plugin is loaded, it will fetch the *Step Documents* from the storage in raw form,\nand add them to an embedded (in-memory) search index.\n\nWhen the user invokes the auto-complete command in the editor, the editor plugin will query the in-memory search index\nand use the editor's native API to present the suggestions.\n\n## Examples\n\nThe examples below illustrate how the library works from the perspective of a user, with a full stack. The ETL process\nand the index all run in-memory.\n\n(Yep, this README.md file is executed by Cucumber.js)!\n\nThe suggestions in the examples use the\n[LSP Completion Snippet syntax](https://microsoft.github.io/language-server-protocol/specifications/specification-3-17/#snippet_syntax)\nto represent search results.\n\n### Rule: Suggestions are based on both steps and step definitions\n\n#### Example: Two suggestions from Cucumber Expression\n\n* Given the following Gherkin step texts exist:\n | Gherkin Step |\n | ------------------------------ |\n | I have 23 cukes in my belly |\n | I have 11 cukes on my table |\n | I have 11 cukes in my suitcase |\n | the weather forecast is rain |\n* And the following Step Definitions exist:\n | Cucumber Expression |\n | ---------------------------------- |\n | I have {int} cukes in/on my {word} |\n | the weather forecast is {word} |\n* When I type \"cukes\"\n* Then the suggestions should be:\n | Suggestion |\n | ------------------------------- |\n | I have {int} cukes in my {word} |\n | I have {int} cukes on my {word} |\n\n#### Example: One suggestion from Regular Expression\n\n* Given the following Gherkin step texts exist:\n | Gherkin Step |\n | -------------------------------- |\n | I have 23 cukes in my \"belly\" |\n | I have 11 cukes in my \"suitcase\" |\n* And the following Step Definitions exist:\n | Regular Expression |\n | ----------------------------------------------- |\n | /I have (\\d\\d) cukes in my \"(belly\\|suitcase)\"/ |\n* When I type \"cukes\"\n* Then the suggestions should be:\n | Suggestion |\n | -------------------------- |\n | I have {} cukes in my \"{}\" |\n\nThe parameters are not named, because the regular expression doesn't have named capture groups.\n\n### Rule: Parameter choices are based on all steps\n\nThe available choices for a parameter type are built from *all* the choices\nencoutered for that parameter type, across steps.\n\n#### Example: {int} and {word} choices are build from three steps\n\n* Given the following Gherkin step texts exist:\n | Gherkin Step |\n | -------------------------------- |\n | I have 23 cukes in my belly |\n | I have 11 cukes on my table |\n | there are 17 apples on the tree |\n* And the following Step Definitions exist:\n | Cucumber Expression |\n | ------------------------------------ |\n | I have {int} cukes in/on my {word} |\n | there are {int} apples on the {word} |\n* When I type \"cukes\"\n* And I select the 2nd snippet\n* Then the LSP snippet should be \"I have ${1|11,17,23|} cukes on my ${2|belly,table,tree|}\"\n\nLSP-compatible editors such as\n[Monaco Editor](https://microsoft.github.io/monaco-editor/) or\n[Visual Studio Code](https://code.visualstudio.com/) can display these suggestions\nas `I have {int} cukes in my {word}` and `I have {int} cukes on my {word}`.\n\nWhen the user chooses a suggestion, the editor will focus the editor at the first parameter and\nlet the user choose between `11`, `17` or `23` (or type a custom value). When the user has made a choice,\nthe focus moves to the next parameter and suggests `belly`, `table` or `tree`.\n\n### Rule: Suggestions must have a matching step definition\n\nIt isn't enough to type something that matches an existing step -\nthe existing step must also have a matching step definition.\n\n#### Example: Nothing matches\n\n* Given the following Gherkin step texts exist:\n | Gherkin Step |\n | --------------------------- |\n | I have 42 cukes in my belly |\n* And the following Step Definitions exist:\n | Step Definition Expression |\n | -------------------------- |\n | Something else |\n* When I type \"cukes\"\n* Then the suggestions should be empty\n\n### Step Documents\n\nA *Step Document* is a data structure with the following properties:\n\n* `suggestion` - what the user will see when the editor presents a suggestion\n* `segments` - what the editor will use to *insert* a suggestion, along with choices for parameters\n\nA *Step Document* can be represented as a JSON document. Here is an example:\n\n {\n \"suggestion\": \"I have {int} cukes in my belly\",\n \"segments\": [\"I have \", [\"42\", \"54\"], \" cukes in my \", [\"basket\", \"belly\"]]\n }\n\nThe `segments` field is an array of `Text` (a string) or `Choices` (an array of strings).\nThe purpose of the `Choices` is to present the user with *possible* values for step parameters.\nThe segments above could be used to write the following steps texts:\n\n* `I have 42 cukes in my basket`\n* `I have 54 cukes in my basket`\n* `I have 42 cukes in my belly`\n* `I have 54 cukes in my belly`\n\nWhen a *Step Document* is added to a search index, it should use the `segments` field for indexing.\n\nThe `segments` field can also be used to build an\n[LSP Completion Snippet](https://microsoft.github.io/language-server-protocol/specifications/specification-3-17/#snippet_syntax)\n\n### Search Index\n\nEach `StepDocument` can be added to a *search index*, either during the ETL process, or inside a dedicated editor plugin. \nThe search index will return matching `StepDocument`s for a search term.\n\nThe index is a function with the following signature:\n\n`type Index = (text: string) => readonly StepDocument[]`\n\nThere are three experimental search index implementations in this library:\n\n* `fuseIndex` (based on [Fuse.js](https://fusejs.io/))\n* `jsSearchIndex` (based on [JS Search](http://bvaughn.github.io/js-search/))\n* `bruteForceIndex` (based on [String.prototype.includes()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes))\n\nThey are currently only in the test code, but one of them might be promoted to be part of the library at a later stage\nwhen we have tried them out on real data.\n\nSee the `Index.test.ts` contract test for more details about how the indexes behave.\n\n### Not in this library\n\nIt's beyond the scope of this library to implement an LSP server.\nAn LSP server could be built on this library though.\n\nIt is also beyond the scope of this library to provide any kind of UI component.\nFor LSP-capable editors this isn't even needed - it is built into the editor.\n\nFor non-LSP capable editors written in JavaScript (such as CodeMirror) it would be possible to\nbuild an auto-complete plugin that uses one of the `Index` implementations in this library.\nBuilding the `StepDocument`s could happen on a server somewhere, and could be transferred to\nthe browser over HTTP/JSON.\n","uri":"README.md","mediaType":"text/x.cucumber.gherkin+markdown"}} -{"gherkinDocument":{"feature":{"tags":[],"location":{"line":1,"column":1},"language":"en","name":"# Cucumber Suggest","description":"```\n+--------------------+ +---------------+ +-------+\n| Cucumber/Regular | | | | |\n| Expressions | | Gherkin Steps | | |\n| (Step definitions) | | | | |\n+----------+---------+ +-------+-------+ | |\n | | | |\n | | | |\n +-------------+-----------+ | |\n | | |\n | | |\n +---------v----------+ | |\n | buildStepDocuments | | |\n | (Transform) | | ETL |\n +---------+----------+ | |\n | | |\n | | |\n | | |\n +-------v--------+ | |\n | Step Documents | | |\n +-------+--------+ | |\n | | |\n | | |\n | | |\n +-----v-----+ | |\n | Storage | | |\n +-----^-----+ +-------+\n |\n +--------+-------+\n | |\n +---+----+ +----+----+\n | LSP | | Editor |\n | Server | | Plugin |\n +---^----+ +----^----+\n | |\n | |\n +---+----+ +----+----+\n | LSP | | Editor |\n | Editor | |(Non-LSP)|\n +--------+ +---------+\n```\n\n### ETL process for Step Documents\n\nAt the top right of the diagram is an [ETL](https://en.wikipedia.org/wiki/Extract,_transform,_load) process. Implementing\na full ETL process is currently beyond the scope of this library - it only implements the **transform** step. A full ETL\nprocess would do the following:\n\nFirst, **extract** [Cucumber Expressions](../../cucumber-expressions) and Regular Expressions from step definitions,\nand the text from Gherkin Steps. This can be done by parsing [Cucumber Messages](../../messages) from Cucumber dry-runs.\n\nSecond, **transform** the expressions and steps to [Step Documents](#step-documents) using the `buildStepDocuments` function.\n\nThird, **load** the *Step Documents* into a persistent storage. This can be a [search index](https://en.wikipedia.org/wiki/Search_engine_indexing),\nor some other form of persistent storage (such as a file in a file system or a database).\nSee the [Search Index](#search-index) section below for more details.\n\n### Editor suggest\n\nThis library does not implement any editor functionality, but it *does define* the *Step Document* data structure\non which editor auto-complete can be implemented. There are two ways to build support for an editor.\n\nWhat is common for both approaches is that they will query a search index.\n\nThe `StepDocument`s coming back from an index search can be converted to an\n[LSP Completion Snippet](https://microsoft.github.io/language-server-protocol/specifications/specification-3-17/#snippet_syntax)\nusing the `lspCompletionSnippet` function.\n\nFor example, this `StepDocument`:\n\n`[\"I have \", [\"42\", \"54\"], \" cukes in my \", [\"basket\", \"belly\"]]`\n\nbecomes the following LSP Completion Snippet:\n\n`I have ${1|42,54|} cukes in my ${2|basket,belly|}`\n\n### LSP\n\nWith the [LSP](https://microsoft.github.io/language-server-protocol/) approach, the storage is typically a \n[search index](https://en.wikipedia.org/wiki/Search_engine_indexing).\nWhen the user invokes the auto-complete command in the editor, the editor will send a \n[completion request](https://microsoft.github.io/language-server-protocol/specifications/specification-3-17/#textDocument_completion) \nto the LSP server. The LSP server queries the search index, and uses the returned *Step Documents* to build the response to\nthe completion request.\n\n### Dedicated plugin\n\nWith the dedicated plugin approach, the storage is typically a file system or a database.\nWhen the editor plugin is loaded, it will fetch the *Step Documents* from the storage in raw form,\nand add them to an embedded (in-memory) search index.\n\nWhen the user invokes the auto-complete command in the editor, the editor plugin will query the in-memory search index\nand use the editor's native API to present the suggestions.\n\n## Examples\n\nThe examples below illustrate how the library works from the perspective of a user, with a full stack. The ETL process\nand the index all run in-memory.\n\n(Yep, this README.md file is executed by Cucumber.js)!\n\nThe suggestions in the examples use the\n[LSP Completion Snippet syntax](https://microsoft.github.io/language-server-protocol/specifications/specification-3-17/#snippet_syntax)\nto represent search results.","children":[{"rule":{"id":"b8759cfc-df6d-47b5-8d4e-c173b385ae65","location":{"line":119,"column":5},"keyword":"Rule","name":"Suggestions are based on both steps and step definitions","description":"","children":[{"scenario":{"id":"5a67f15b-a967-477f-8d02-8f7d0a06a656","tags":[],"location":{"line":121,"column":6},"keyword":"Example","name":"Two suggestions from Cucumber Expression","description":"","steps":[{"id":"61b072e6-0a30-484b-a8cc-957a2f9d3e23","location":{"line":123,"column":3},"keyword":"Given ","text":"the following Gherkin step texts exist:","dataTable":{"location":{"line":124,"column":3},"rows":[{"id":"2cb47494-61ad-4d42-ab1c-9ba842fc594e","location":{"line":124,"column":3},"cells":[{"location":{"line":124,"column":5},"value":"Gherkin Step"}]},{"id":"32ae561b-faeb-40f9-b3ed-1238e002d29d","location":{"line":126,"column":3},"cells":[{"location":{"line":126,"column":5},"value":"I have 23 cukes in my belly"}]},{"id":"0f21af80-cca9-4a46-be8c-6e57a8673882","location":{"line":127,"column":3},"cells":[{"location":{"line":127,"column":5},"value":"I have 11 cukes on my table"}]},{"id":"c6de230a-6427-42b0-a637-e05aa2d8b370","location":{"line":128,"column":3},"cells":[{"location":{"line":128,"column":5},"value":"I have 11 cukes in my suitcase"}]},{"id":"6b7c8dd5-6a93-4102-a56c-0ae91aa01611","location":{"line":129,"column":3},"cells":[{"location":{"line":129,"column":5},"value":"the weather forecast is rain"}]}]}},{"id":"2ca4f619-7c38-4d0f-8db2-7f5e44ff157a","location":{"line":130,"column":3},"keyword":"And ","text":"the following Step Definitions exist:","dataTable":{"location":{"line":131,"column":3},"rows":[{"id":"9bdec28e-adc8-4717-8e4b-1e844831d8fc","location":{"line":131,"column":3},"cells":[{"location":{"line":131,"column":5},"value":"Cucumber Expression"}]},{"id":"70241631-da5f-4fd0-950f-04ba43b11a3d","location":{"line":133,"column":3},"cells":[{"location":{"line":133,"column":5},"value":"I have {int} cukes in/on my {word}"}]},{"id":"cdfcac31-f2f4-43dd-8001-840afef89f77","location":{"line":134,"column":3},"cells":[{"location":{"line":134,"column":5},"value":"the weather forecast is {word}"}]}]}},{"id":"0e6423e3-6774-4c4d-a74d-b802655419ab","location":{"line":135,"column":3},"keyword":"When ","text":"I type \"cukes\""},{"id":"b314cb66-347d-44bd-a3ec-32a6e3bd6dfc","location":{"line":136,"column":3},"keyword":"Then ","text":"the suggestions should be:","dataTable":{"location":{"line":137,"column":3},"rows":[{"id":"db0a21d6-f842-4b79-8d01-3060c5400a3b","location":{"line":137,"column":3},"cells":[{"location":{"line":137,"column":5},"value":"Suggestion"}]},{"id":"8c5a9ee7-3169-4b14-9189-675b9913de15","location":{"line":139,"column":3},"cells":[{"location":{"line":139,"column":5},"value":"I have {int} cukes in my {word}"}]},{"id":"c2f33f2d-2578-4523-b7d4-cff577f12d6d","location":{"line":140,"column":3},"cells":[{"location":{"line":140,"column":5},"value":"I have {int} cukes on my {word}"}]}]}}],"examples":[]}},{"scenario":{"id":"f0c0e37a-a4af-4f7a-8f30-9a22dd18b196","tags":[],"location":{"line":142,"column":6},"keyword":"Example","name":"One suggestion from Regular Expression","description":"","steps":[{"id":"32ac7c49-4626-43a5-a62c-1e562a8a7288","location":{"line":144,"column":3},"keyword":"Given ","text":"the following Gherkin step texts exist:","dataTable":{"location":{"line":145,"column":3},"rows":[{"id":"cae1e479-e809-47ed-9847-ce4f91c7bcac","location":{"line":145,"column":3},"cells":[{"location":{"line":145,"column":5},"value":"Gherkin Step"}]},{"id":"884017ac-ddbe-4a74-a62d-ea296addecc6","location":{"line":147,"column":3},"cells":[{"location":{"line":147,"column":5},"value":"I have 23 cukes in my \"belly\""}]},{"id":"22f72fe6-12cf-4f31-a2ce-b21fff4bc4d9","location":{"line":148,"column":3},"cells":[{"location":{"line":148,"column":5},"value":"I have 11 cukes in my \"suitcase\""}]}]}},{"id":"f5ffc2d2-3c98-4ac3-8f7e-a24ff154d857","location":{"line":149,"column":3},"keyword":"And ","text":"the following Step Definitions exist:","dataTable":{"location":{"line":150,"column":3},"rows":[{"id":"e3ba4f32-576e-497d-abed-72494b36bef5","location":{"line":150,"column":3},"cells":[{"location":{"line":150,"column":5},"value":"Regular Expression"}]},{"id":"7f31ca87-5cfa-416e-8a7b-b0aa1a7a2a13","location":{"line":152,"column":3},"cells":[{"location":{"line":152,"column":5},"value":"/I have (\\d\\d) cukes in my \"(belly|suitcase)\"/"}]}]}},{"id":"72d1607d-552b-4b37-a255-fe4b734ac27d","location":{"line":153,"column":3},"keyword":"When ","text":"I type \"cukes\""},{"id":"b01bde54-332c-4f0d-be93-32478381435d","location":{"line":154,"column":3},"keyword":"Then ","text":"the suggestions should be:","dataTable":{"location":{"line":155,"column":3},"rows":[{"id":"9104bc19-92a6-4a3a-9420-b4d949c81b6a","location":{"line":155,"column":3},"cells":[{"location":{"line":155,"column":5},"value":"Suggestion"}]},{"id":"11beeb05-0e99-4918-a9b6-31d9cc3dfca3","location":{"line":157,"column":3},"cells":[{"location":{"line":157,"column":5},"value":"I have {} cukes in my \"{}\""}]}]}}],"examples":[]}}],"tags":[]}},{"rule":{"id":"857e23da-9deb-4662-93b6-b0a3fbd96e1d","location":{"line":161,"column":5},"keyword":"Rule","name":"Parameter choices are based on all steps","description":"","children":[{"scenario":{"id":"9ddbc641-f622-4f0d-b4b9-c0d9c742bafb","tags":[],"location":{"line":166,"column":6},"keyword":"Example","name":"{int} and {word} choices are build from three steps","description":"","steps":[{"id":"b0e42663-9a3c-47ac-b0d4-f832b44f430b","location":{"line":168,"column":3},"keyword":"Given ","text":"the following Gherkin step texts exist:","dataTable":{"location":{"line":169,"column":3},"rows":[{"id":"4916a097-95f1-45c7-aebc-858e1da56d50","location":{"line":169,"column":3},"cells":[{"location":{"line":169,"column":5},"value":"Gherkin Step"}]},{"id":"339b0a2c-9dbe-48a4-bdaa-dc9490eb033d","location":{"line":171,"column":3},"cells":[{"location":{"line":171,"column":5},"value":"I have 23 cukes in my belly"}]},{"id":"96fa4ab3-81db-45eb-b31b-8bb625c97efe","location":{"line":172,"column":3},"cells":[{"location":{"line":172,"column":5},"value":"I have 11 cukes on my table"}]},{"id":"8ee7ad05-e7c8-43ad-9fc3-9cd0d143a041","location":{"line":173,"column":3},"cells":[{"location":{"line":173,"column":5},"value":"there are 17 apples on the tree"}]}]}},{"id":"fd0ff74b-00d0-41a0-959f-6afd3dced0a2","location":{"line":174,"column":3},"keyword":"And ","text":"the following Step Definitions exist:","dataTable":{"location":{"line":175,"column":3},"rows":[{"id":"3c11a1ba-e8ed-4f64-b43c-8da5f5413546","location":{"line":175,"column":3},"cells":[{"location":{"line":175,"column":5},"value":"Cucumber Expression"}]},{"id":"a93d1f44-156e-4cc4-9296-176100b58c4f","location":{"line":177,"column":3},"cells":[{"location":{"line":177,"column":5},"value":"I have {int} cukes in/on my {word}"}]},{"id":"d16ba7f1-e584-4a51-ace3-590133067acc","location":{"line":178,"column":3},"cells":[{"location":{"line":178,"column":5},"value":"there are {int} apples on the {word}"}]}]}},{"id":"7127b950-0ae9-44c7-ae14-3f9edf6d6391","location":{"line":179,"column":3},"keyword":"When ","text":"I type \"cukes\""},{"id":"9db0cc93-416e-4baf-90f5-aa87638377c4","location":{"line":180,"column":3},"keyword":"And ","text":"I select the 2nd snippet"},{"id":"b99f85d1-2a1b-4986-b153-73fcb28e6fd4","location":{"line":181,"column":3},"keyword":"Then ","text":"the LSP snippet should be \"I have ${1|11,17,23|} cukes on my ${2|belly,table,tree|}\""}],"examples":[]}}],"tags":[]}},{"rule":{"id":"32d38d18-d0f7-40b8-bca8-c5b5035a4c48","location":{"line":192,"column":5},"keyword":"Rule","name":"Suggestions must have a matching step definition","description":"","children":[{"scenario":{"id":"0f4e6378-2957-4954-b864-fd0cd7acb66b","tags":[],"location":{"line":197,"column":6},"keyword":"Example","name":"Nothing matches","description":"","steps":[{"id":"68c74927-3a93-4d5f-9095-19c8d8e60b4b","location":{"line":199,"column":3},"keyword":"Given ","text":"the following Gherkin step texts exist:","dataTable":{"location":{"line":200,"column":3},"rows":[{"id":"c0eda36c-4b84-491e-92fd-9c6d8065aa00","location":{"line":200,"column":3},"cells":[{"location":{"line":200,"column":5},"value":"Gherkin Step"}]},{"id":"7f81eaec-4864-4f72-8613-4d2b7d6e851e","location":{"line":202,"column":3},"cells":[{"location":{"line":202,"column":5},"value":"I have 42 cukes in my belly"}]}]}},{"id":"da1663bd-9052-4b5f-b100-a0820121d928","location":{"line":203,"column":3},"keyword":"And ","text":"the following Step Definitions exist:","dataTable":{"location":{"line":204,"column":3},"rows":[{"id":"a6439f7c-d436-4a97-bf92-6bc7c3d83bc3","location":{"line":204,"column":3},"cells":[{"location":{"line":204,"column":5},"value":"Step Definition Expression"}]},{"id":"dc32b50b-5110-4e39-90d1-5bdca1961419","location":{"line":206,"column":3},"cells":[{"location":{"line":206,"column":5},"value":"Something else"}]}]}},{"id":"57adbdef-795b-4a9d-b31a-06275fc1cb8d","location":{"line":207,"column":3},"keyword":"When ","text":"I type \"cukes\""},{"id":"c5731fb0-3eb3-495e-9ac0-c522d5c56c56","location":{"line":208,"column":3},"keyword":"Then ","text":"the suggestions should be empty"}],"examples":[]}}],"tags":[]}}]},"comments":[],"uri":"README.md"}} -{"pickle":{"id":"e3dc573e-e469-4229-9411-b55de9912276","uri":"README.md","astNodeIds":["5a67f15b-a967-477f-8d02-8f7d0a06a656"],"tags":[],"name":"Two suggestions from Cucumber Expression","language":"en","steps":[{"id":"76fc30b5-0ba4-49e5-b13f-a6e0042ae6c2","text":"the following Gherkin step texts exist:","argument":{"dataTable":{"rows":[{"cells":[{"value":"Gherkin Step"}]},{"cells":[{"value":"I have 23 cukes in my belly"}]},{"cells":[{"value":"I have 11 cukes on my table"}]},{"cells":[{"value":"I have 11 cukes in my suitcase"}]},{"cells":[{"value":"the weather forecast is rain"}]}]}},"astNodeIds":["61b072e6-0a30-484b-a8cc-957a2f9d3e23"]},{"id":"584fe1d9-98dc-4fba-bedc-95ec3ad80fe9","text":"the following Step Definitions exist:","argument":{"dataTable":{"rows":[{"cells":[{"value":"Cucumber Expression"}]},{"cells":[{"value":"I have {int} cukes in/on my {word}"}]},{"cells":[{"value":"the weather forecast is {word}"}]}]}},"astNodeIds":["2ca4f619-7c38-4d0f-8db2-7f5e44ff157a"]},{"id":"8052c87b-eba2-4fc4-ab25-b4c40ee06bb2","text":"I type \"cukes\"","astNodeIds":["0e6423e3-6774-4c4d-a74d-b802655419ab"]},{"id":"f4e9a058-6c66-419a-8c48-f3c2c798866e","text":"the suggestions should be:","argument":{"dataTable":{"rows":[{"cells":[{"value":"Suggestion"}]},{"cells":[{"value":"I have {int} cukes in my {word}"}]},{"cells":[{"value":"I have {int} cukes on my {word}"}]}]}},"astNodeIds":["b314cb66-347d-44bd-a3ec-32a6e3bd6dfc"]}]}} -{"pickle":{"id":"54fae48d-4496-4ccf-a93a-f7aa55c031a5","uri":"README.md","astNodeIds":["f0c0e37a-a4af-4f7a-8f30-9a22dd18b196"],"tags":[],"name":"One suggestion from Regular Expression","language":"en","steps":[{"id":"4e1963ac-fe43-454b-9e36-41300a5e93b9","text":"the following Gherkin step texts exist:","argument":{"dataTable":{"rows":[{"cells":[{"value":"Gherkin Step"}]},{"cells":[{"value":"I have 23 cukes in my \"belly\""}]},{"cells":[{"value":"I have 11 cukes in my \"suitcase\""}]}]}},"astNodeIds":["32ac7c49-4626-43a5-a62c-1e562a8a7288"]},{"id":"15209eaf-0d7c-406f-9be1-b37d766680a5","text":"the following Step Definitions exist:","argument":{"dataTable":{"rows":[{"cells":[{"value":"Regular Expression"}]},{"cells":[{"value":"/I have (\\d\\d) cukes in my \"(belly|suitcase)\"/"}]}]}},"astNodeIds":["f5ffc2d2-3c98-4ac3-8f7e-a24ff154d857"]},{"id":"0a24607e-175b-41c0-9d74-03d5b69675e5","text":"I type \"cukes\"","astNodeIds":["72d1607d-552b-4b37-a255-fe4b734ac27d"]},{"id":"0e58cf04-32a5-4c40-8796-0f0dc64a931a","text":"the suggestions should be:","argument":{"dataTable":{"rows":[{"cells":[{"value":"Suggestion"}]},{"cells":[{"value":"I have {} cukes in my \"{}\""}]}]}},"astNodeIds":["b01bde54-332c-4f0d-be93-32478381435d"]}]}} -{"pickle":{"id":"096db359-f2e5-4873-9315-3e180e3244ff","uri":"README.md","astNodeIds":["9ddbc641-f622-4f0d-b4b9-c0d9c742bafb"],"tags":[],"name":"{int} and {word} choices are build from three steps","language":"en","steps":[{"id":"2349f69f-5133-481e-89cf-dc17fe2e9789","text":"the following Gherkin step texts exist:","argument":{"dataTable":{"rows":[{"cells":[{"value":"Gherkin Step"}]},{"cells":[{"value":"I have 23 cukes in my belly"}]},{"cells":[{"value":"I have 11 cukes on my table"}]},{"cells":[{"value":"there are 17 apples on the tree"}]}]}},"astNodeIds":["b0e42663-9a3c-47ac-b0d4-f832b44f430b"]},{"id":"8e5526da-fbc0-4246-bab4-d67c706d0883","text":"the following Step Definitions exist:","argument":{"dataTable":{"rows":[{"cells":[{"value":"Cucumber Expression"}]},{"cells":[{"value":"I have {int} cukes in/on my {word}"}]},{"cells":[{"value":"there are {int} apples on the {word}"}]}]}},"astNodeIds":["fd0ff74b-00d0-41a0-959f-6afd3dced0a2"]},{"id":"e6872fa8-fc8b-4cd3-a8c9-e92a5449e629","text":"I type \"cukes\"","astNodeIds":["7127b950-0ae9-44c7-ae14-3f9edf6d6391"]},{"id":"7ccda357-613c-47b7-ae4d-e2c58db393ac","text":"I select the 2nd snippet","astNodeIds":["9db0cc93-416e-4baf-90f5-aa87638377c4"]},{"id":"0cceb816-8508-4a79-8c51-8ba1b7b52356","text":"the LSP snippet should be \"I have ${1|11,17,23|} cukes on my ${2|belly,table,tree|}\"","astNodeIds":["b99f85d1-2a1b-4986-b153-73fcb28e6fd4"]}]}} -{"pickle":{"id":"a9bfec1e-c45e-4e90-ac03-a2d51b04c3d4","uri":"README.md","astNodeIds":["0f4e6378-2957-4954-b864-fd0cd7acb66b"],"tags":[],"name":"Nothing matches","language":"en","steps":[{"id":"6fac1622-2230-4f66-9f1a-76f8c438c94f","text":"the following Gherkin step texts exist:","argument":{"dataTable":{"rows":[{"cells":[{"value":"Gherkin Step"}]},{"cells":[{"value":"I have 42 cukes in my belly"}]}]}},"astNodeIds":["68c74927-3a93-4d5f-9095-19c8d8e60b4b"]},{"id":"18087378-7a25-4825-a318-278add2e4328","text":"the following Step Definitions exist:","argument":{"dataTable":{"rows":[{"cells":[{"value":"Step Definition Expression"}]},{"cells":[{"value":"Something else"}]}]}},"astNodeIds":["da1663bd-9052-4b5f-b100-a0820121d928"]},{"id":"07a8b42f-4e20-4a5a-8b36-c852741fe29e","text":"I type \"cukes\"","astNodeIds":["57adbdef-795b-4a9d-b31a-06275fc1cb8d"]},{"id":"d1ccde5b-f0b6-46dc-9e1e-69628a5f2157","text":"the suggestions should be empty","astNodeIds":["c5731fb0-3eb3-495e-9ac0-c522d5c56c56"]}]}} -{"parameterType":{"id":"bdb25c42-bfb1-4f5c-bbc7-1f3c940ba6c5","name":"ordinal","preferForRegularExpressionMatch":false,"regularExpressions":["(\\d+)(?:st|nd|rd|th)"],"useForSnippets":true}} -{"stepDefinition":{"id":"546ac0e7-2dca-496f-ba93-403d4d7303d4","pattern":{"source":"the following Gherkin step texts exist:","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"features/step_definitions/steps.ts","location":{"line":9}}}} -{"stepDefinition":{"id":"2ac1c870-0e02-4cec-a2a4-e7b941faf4c7","pattern":{"source":"the following Step Definitions exist:","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"features/step_definitions/steps.ts","location":{"line":13}}}} -{"stepDefinition":{"id":"af28bd8d-12de-4f36-aff0-e40f9407443e","pattern":{"source":"I type {string}","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"features/step_definitions/steps.ts","location":{"line":27}}}} -{"stepDefinition":{"id":"56a8779c-1bd5-4800-b8d7-c4a1417fb940","pattern":{"source":"I select the {ordinal} snippet","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"features/step_definitions/steps.ts","location":{"line":33}}}} -{"stepDefinition":{"id":"21adfb3e-7832-4a40-843d-22a8dee76cb0","pattern":{"source":"the suggestions should be:","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"features/step_definitions/steps.ts","location":{"line":37}}}} -{"stepDefinition":{"id":"9a952550-7218-413c-a3c8-9d4ff8dd2857","pattern":{"source":"the suggestions should be empty","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"features/step_definitions/steps.ts","location":{"line":45}}}} -{"stepDefinition":{"id":"9845cc58-140c-472b-9387-e6da77305039","pattern":{"source":"the LSP snippet should be {string}","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"features/step_definitions/steps.ts","location":{"line":49}}}} -{"testRunStarted":{"timestamp":{"seconds":1628589261,"nanos":125000000}}} -{"testCase":{"pickleId":"e3dc573e-e469-4229-9411-b55de9912276","id":"8f460faa-adb9-400f-96e1-b9f670a178ab","testSteps":[{"id":"251bbfde-a65a-40b4-8115-7e0bfed0b571","pickleStepId":"76fc30b5-0ba4-49e5-b13f-a6e0042ae6c2","stepDefinitionIds":["546ac0e7-2dca-496f-ba93-403d4d7303d4"],"stepMatchArgumentsLists":[{"stepMatchArguments":[]}]},{"id":"3911a022-9617-486b-a19a-38844f4b50b7","pickleStepId":"584fe1d9-98dc-4fba-bedc-95ec3ad80fe9","stepDefinitionIds":["2ac1c870-0e02-4cec-a2a4-e7b941faf4c7"],"stepMatchArgumentsLists":[{"stepMatchArguments":[]}]},{"id":"e9bb60e7-5840-4d98-97c0-11ac1c3157d1","pickleStepId":"8052c87b-eba2-4fc4-ab25-b4c40ee06bb2","stepDefinitionIds":["af28bd8d-12de-4f36-aff0-e40f9407443e"],"stepMatchArgumentsLists":[{"stepMatchArguments":[{"group":{"start":7,"value":"\"cukes\"","children":[{"start":8,"value":"cukes","children":[{"children":[]}]},{"children":[{"children":[]}]}]},"parameterTypeName":"string"}]}]},{"id":"60a80819-2f26-4903-8adf-b2fc971a7bc8","pickleStepId":"f4e9a058-6c66-419a-8c48-f3c2c798866e","stepDefinitionIds":["21adfb3e-7832-4a40-843d-22a8dee76cb0"],"stepMatchArgumentsLists":[{"stepMatchArguments":[]}]}]}} -{"testCase":{"pickleId":"54fae48d-4496-4ccf-a93a-f7aa55c031a5","id":"30c234ed-8d65-4055-9543-07140107c788","testSteps":[{"id":"c09fe512-d49a-4b25-9673-cefa36c829b4","pickleStepId":"4e1963ac-fe43-454b-9e36-41300a5e93b9","stepDefinitionIds":["546ac0e7-2dca-496f-ba93-403d4d7303d4"],"stepMatchArgumentsLists":[{"stepMatchArguments":[]}]},{"id":"6f3d59e5-c417-4b79-8dd2-e317a1fc3284","pickleStepId":"15209eaf-0d7c-406f-9be1-b37d766680a5","stepDefinitionIds":["2ac1c870-0e02-4cec-a2a4-e7b941faf4c7"],"stepMatchArgumentsLists":[{"stepMatchArguments":[]}]},{"id":"141825f8-5fa3-474a-9b4e-9d6f0a6aec68","pickleStepId":"0a24607e-175b-41c0-9d74-03d5b69675e5","stepDefinitionIds":["af28bd8d-12de-4f36-aff0-e40f9407443e"],"stepMatchArgumentsLists":[{"stepMatchArguments":[{"group":{"start":7,"value":"\"cukes\"","children":[{"start":8,"value":"cukes","children":[{"children":[]}]},{"children":[{"children":[]}]}]},"parameterTypeName":"string"}]}]},{"id":"80524e55-d013-4521-882f-38af2909e671","pickleStepId":"0e58cf04-32a5-4c40-8796-0f0dc64a931a","stepDefinitionIds":["21adfb3e-7832-4a40-843d-22a8dee76cb0"],"stepMatchArgumentsLists":[{"stepMatchArguments":[]}]}]}} -{"testCase":{"pickleId":"096db359-f2e5-4873-9315-3e180e3244ff","id":"4bc9cb3f-a0d6-403d-9f74-a21d3fd535d0","testSteps":[{"id":"5d30bd0e-79a2-4f41-ab25-4f1c1271cb7f","pickleStepId":"2349f69f-5133-481e-89cf-dc17fe2e9789","stepDefinitionIds":["546ac0e7-2dca-496f-ba93-403d4d7303d4"],"stepMatchArgumentsLists":[{"stepMatchArguments":[]}]},{"id":"dc993ad8-5ae1-4e2b-9f9d-62432d4f495f","pickleStepId":"8e5526da-fbc0-4246-bab4-d67c706d0883","stepDefinitionIds":["2ac1c870-0e02-4cec-a2a4-e7b941faf4c7"],"stepMatchArgumentsLists":[{"stepMatchArguments":[]}]},{"id":"998c54e6-d003-4ea8-ac43-1d2244567ece","pickleStepId":"e6872fa8-fc8b-4cd3-a8c9-e92a5449e629","stepDefinitionIds":["af28bd8d-12de-4f36-aff0-e40f9407443e"],"stepMatchArgumentsLists":[{"stepMatchArguments":[{"group":{"start":7,"value":"\"cukes\"","children":[{"start":8,"value":"cukes","children":[{"children":[]}]},{"children":[{"children":[]}]}]},"parameterTypeName":"string"}]}]},{"id":"d83130b9-4ee6-45a7-86b4-0a92ffc82757","pickleStepId":"7ccda357-613c-47b7-ae4d-e2c58db393ac","stepDefinitionIds":["56a8779c-1bd5-4800-b8d7-c4a1417fb940"],"stepMatchArgumentsLists":[{"stepMatchArguments":[{"group":{"start":13,"value":"2nd","children":[{"start":13,"value":"2","children":[]}]},"parameterTypeName":"ordinal"}]}]},{"id":"dc606206-d11e-4ff9-9d0e-eb05dbeaa683","pickleStepId":"0cceb816-8508-4a79-8c51-8ba1b7b52356","stepDefinitionIds":["9845cc58-140c-472b-9387-e6da77305039"],"stepMatchArgumentsLists":[{"stepMatchArguments":[{"group":{"start":26,"value":"\"I have ${1|11,17,23|} cukes on my ${2|belly,table,tree|}\"","children":[{"start":27,"value":"I have ${1|11,17,23|} cukes on my ${2|belly,table,tree|}","children":[{"children":[]}]},{"children":[{"children":[]}]}]},"parameterTypeName":"string"}]}]}]}} -{"testCase":{"pickleId":"a9bfec1e-c45e-4e90-ac03-a2d51b04c3d4","id":"2aa62b9a-d38a-4647-b571-0aaa52a88607","testSteps":[{"id":"38120b7f-4ca0-4fb4-830b-4a440cb4a163","pickleStepId":"6fac1622-2230-4f66-9f1a-76f8c438c94f","stepDefinitionIds":["546ac0e7-2dca-496f-ba93-403d4d7303d4"],"stepMatchArgumentsLists":[{"stepMatchArguments":[]}]},{"id":"65aeb712-b12a-476f-9ca6-2e37e280eb35","pickleStepId":"18087378-7a25-4825-a318-278add2e4328","stepDefinitionIds":["2ac1c870-0e02-4cec-a2a4-e7b941faf4c7"],"stepMatchArgumentsLists":[{"stepMatchArguments":[]}]},{"id":"ab1fc79c-61c4-498a-8058-7da4b737a1b6","pickleStepId":"07a8b42f-4e20-4a5a-8b36-c852741fe29e","stepDefinitionIds":["af28bd8d-12de-4f36-aff0-e40f9407443e"],"stepMatchArgumentsLists":[{"stepMatchArguments":[{"group":{"start":7,"value":"\"cukes\"","children":[{"start":8,"value":"cukes","children":[{"children":[]}]},{"children":[{"children":[]}]}]},"parameterTypeName":"string"}]}]},{"id":"a2f51a5c-efa6-4ec5-9ff3-f31f0d4683c0","pickleStepId":"d1ccde5b-f0b6-46dc-9e1e-69628a5f2157","stepDefinitionIds":["9a952550-7218-413c-a3c8-9d4ff8dd2857"],"stepMatchArgumentsLists":[{"stepMatchArguments":[]}]}]}} -{"testCaseStarted":{"attempt":0,"testCaseId":"8f460faa-adb9-400f-96e1-b9f670a178ab","id":"508d6d04-20db-448b-a4ad-cec5679bffd7","timestamp":{"seconds":1628589261,"nanos":143000000}}} -{"testStepStarted":{"testCaseStartedId":"508d6d04-20db-448b-a4ad-cec5679bffd7","testStepId":"251bbfde-a65a-40b4-8115-7e0bfed0b571","timestamp":{"seconds":1628589261,"nanos":143000000}}} -{"testStepFinished":{"testCaseStartedId":"508d6d04-20db-448b-a4ad-cec5679bffd7","testStepId":"251bbfde-a65a-40b4-8115-7e0bfed0b571","testStepResult":{"duration":{"seconds":0,"nanos":1000000},"status":"PASSED","willBeRetried":false},"timestamp":{"seconds":1628589261,"nanos":144000000}}} -{"testStepStarted":{"testCaseStartedId":"508d6d04-20db-448b-a4ad-cec5679bffd7","testStepId":"3911a022-9617-486b-a19a-38844f4b50b7","timestamp":{"seconds":1628589261,"nanos":144000000}}} -{"testStepFinished":{"testCaseStartedId":"508d6d04-20db-448b-a4ad-cec5679bffd7","testStepId":"3911a022-9617-486b-a19a-38844f4b50b7","testStepResult":{"duration":{"seconds":0,"nanos":1000000},"status":"PASSED","willBeRetried":false},"timestamp":{"seconds":1628589261,"nanos":145000000}}} -{"testStepStarted":{"testCaseStartedId":"508d6d04-20db-448b-a4ad-cec5679bffd7","testStepId":"e9bb60e7-5840-4d98-97c0-11ac1c3157d1","timestamp":{"seconds":1628589261,"nanos":145000000}}} -{"testStepFinished":{"testCaseStartedId":"508d6d04-20db-448b-a4ad-cec5679bffd7","testStepId":"e9bb60e7-5840-4d98-97c0-11ac1c3157d1","testStepResult":{"duration":{"seconds":0,"nanos":4000000},"status":"PASSED","willBeRetried":false},"timestamp":{"seconds":1628589261,"nanos":149000000}}} -{"testStepStarted":{"testCaseStartedId":"508d6d04-20db-448b-a4ad-cec5679bffd7","testStepId":"60a80819-2f26-4903-8adf-b2fc971a7bc8","timestamp":{"seconds":1628589261,"nanos":149000000}}} -{"testStepFinished":{"testCaseStartedId":"508d6d04-20db-448b-a4ad-cec5679bffd7","testStepId":"60a80819-2f26-4903-8adf-b2fc971a7bc8","testStepResult":{"duration":{"seconds":0,"nanos":1000000},"status":"PASSED","willBeRetried":false},"timestamp":{"seconds":1628589261,"nanos":150000000}}} -{"testCaseFinished":{"testCaseStartedId":"508d6d04-20db-448b-a4ad-cec5679bffd7","timestamp":{"seconds":1628589261,"nanos":150000000}}} -{"testCaseStarted":{"attempt":0,"testCaseId":"30c234ed-8d65-4055-9543-07140107c788","id":"837e7aa2-51d7-4437-a5fe-25c29cfd76e5","timestamp":{"seconds":1628589261,"nanos":151000000}}} -{"testStepStarted":{"testCaseStartedId":"837e7aa2-51d7-4437-a5fe-25c29cfd76e5","testStepId":"c09fe512-d49a-4b25-9673-cefa36c829b4","timestamp":{"seconds":1628589261,"nanos":151000000}}} -{"testStepFinished":{"testCaseStartedId":"837e7aa2-51d7-4437-a5fe-25c29cfd76e5","testStepId":"c09fe512-d49a-4b25-9673-cefa36c829b4","testStepResult":{"duration":{"seconds":0,"nanos":0},"status":"PASSED","willBeRetried":false},"timestamp":{"seconds":1628589261,"nanos":151000000}}} -{"testStepStarted":{"testCaseStartedId":"837e7aa2-51d7-4437-a5fe-25c29cfd76e5","testStepId":"6f3d59e5-c417-4b79-8dd2-e317a1fc3284","timestamp":{"seconds":1628589261,"nanos":151000000}}} -{"testStepFinished":{"testCaseStartedId":"837e7aa2-51d7-4437-a5fe-25c29cfd76e5","testStepId":"6f3d59e5-c417-4b79-8dd2-e317a1fc3284","testStepResult":{"duration":{"seconds":0,"nanos":0},"status":"PASSED","willBeRetried":false},"timestamp":{"seconds":1628589261,"nanos":151000000}}} -{"testStepStarted":{"testCaseStartedId":"837e7aa2-51d7-4437-a5fe-25c29cfd76e5","testStepId":"141825f8-5fa3-474a-9b4e-9d6f0a6aec68","timestamp":{"seconds":1628589261,"nanos":151000000}}} -{"testStepFinished":{"testCaseStartedId":"837e7aa2-51d7-4437-a5fe-25c29cfd76e5","testStepId":"141825f8-5fa3-474a-9b4e-9d6f0a6aec68","testStepResult":{"duration":{"seconds":0,"nanos":2000000},"status":"PASSED","willBeRetried":false},"timestamp":{"seconds":1628589261,"nanos":153000000}}} -{"testStepStarted":{"testCaseStartedId":"837e7aa2-51d7-4437-a5fe-25c29cfd76e5","testStepId":"80524e55-d013-4521-882f-38af2909e671","timestamp":{"seconds":1628589261,"nanos":153000000}}} -{"testStepFinished":{"testCaseStartedId":"837e7aa2-51d7-4437-a5fe-25c29cfd76e5","testStepId":"80524e55-d013-4521-882f-38af2909e671","testStepResult":{"duration":{"seconds":0,"nanos":0},"status":"PASSED","willBeRetried":false},"timestamp":{"seconds":1628589261,"nanos":153000000}}} -{"testCaseFinished":{"testCaseStartedId":"837e7aa2-51d7-4437-a5fe-25c29cfd76e5","timestamp":{"seconds":1628589261,"nanos":153000000}}} -{"testCaseStarted":{"attempt":0,"testCaseId":"4bc9cb3f-a0d6-403d-9f74-a21d3fd535d0","id":"0495b0c9-7c7a-432a-be3c-cf77d1d5b447","timestamp":{"seconds":1628589261,"nanos":153000000}}} -{"testStepStarted":{"testCaseStartedId":"0495b0c9-7c7a-432a-be3c-cf77d1d5b447","testStepId":"5d30bd0e-79a2-4f41-ab25-4f1c1271cb7f","timestamp":{"seconds":1628589261,"nanos":153000000}}} -{"testStepFinished":{"testCaseStartedId":"0495b0c9-7c7a-432a-be3c-cf77d1d5b447","testStepId":"5d30bd0e-79a2-4f41-ab25-4f1c1271cb7f","testStepResult":{"duration":{"seconds":0,"nanos":0},"status":"PASSED","willBeRetried":false},"timestamp":{"seconds":1628589261,"nanos":153000000}}} -{"testStepStarted":{"testCaseStartedId":"0495b0c9-7c7a-432a-be3c-cf77d1d5b447","testStepId":"dc993ad8-5ae1-4e2b-9f9d-62432d4f495f","timestamp":{"seconds":1628589261,"nanos":153000000}}} -{"testStepFinished":{"testCaseStartedId":"0495b0c9-7c7a-432a-be3c-cf77d1d5b447","testStepId":"dc993ad8-5ae1-4e2b-9f9d-62432d4f495f","testStepResult":{"duration":{"seconds":0,"nanos":1000000},"status":"PASSED","willBeRetried":false},"timestamp":{"seconds":1628589261,"nanos":154000000}}} -{"testStepStarted":{"testCaseStartedId":"0495b0c9-7c7a-432a-be3c-cf77d1d5b447","testStepId":"998c54e6-d003-4ea8-ac43-1d2244567ece","timestamp":{"seconds":1628589261,"nanos":154000000}}} -{"testStepFinished":{"testCaseStartedId":"0495b0c9-7c7a-432a-be3c-cf77d1d5b447","testStepId":"998c54e6-d003-4ea8-ac43-1d2244567ece","testStepResult":{"duration":{"seconds":0,"nanos":2000000},"status":"PASSED","willBeRetried":false},"timestamp":{"seconds":1628589261,"nanos":156000000}}} -{"testStepStarted":{"testCaseStartedId":"0495b0c9-7c7a-432a-be3c-cf77d1d5b447","testStepId":"d83130b9-4ee6-45a7-86b4-0a92ffc82757","timestamp":{"seconds":1628589261,"nanos":156000000}}} -{"testStepFinished":{"testCaseStartedId":"0495b0c9-7c7a-432a-be3c-cf77d1d5b447","testStepId":"d83130b9-4ee6-45a7-86b4-0a92ffc82757","testStepResult":{"duration":{"seconds":0,"nanos":0},"status":"PASSED","willBeRetried":false},"timestamp":{"seconds":1628589261,"nanos":156000000}}} -{"testStepStarted":{"testCaseStartedId":"0495b0c9-7c7a-432a-be3c-cf77d1d5b447","testStepId":"dc606206-d11e-4ff9-9d0e-eb05dbeaa683","timestamp":{"seconds":1628589261,"nanos":156000000}}} -{"testStepFinished":{"testCaseStartedId":"0495b0c9-7c7a-432a-be3c-cf77d1d5b447","testStepId":"dc606206-d11e-4ff9-9d0e-eb05dbeaa683","testStepResult":{"duration":{"seconds":0,"nanos":0},"status":"PASSED","willBeRetried":false},"timestamp":{"seconds":1628589261,"nanos":156000000}}} -{"testCaseFinished":{"testCaseStartedId":"0495b0c9-7c7a-432a-be3c-cf77d1d5b447","timestamp":{"seconds":1628589261,"nanos":156000000}}} -{"testCaseStarted":{"attempt":0,"testCaseId":"2aa62b9a-d38a-4647-b571-0aaa52a88607","id":"6ff14eb9-25a7-49a9-8164-7026e5534a47","timestamp":{"seconds":1628589261,"nanos":157000000}}} -{"testStepStarted":{"testCaseStartedId":"6ff14eb9-25a7-49a9-8164-7026e5534a47","testStepId":"38120b7f-4ca0-4fb4-830b-4a440cb4a163","timestamp":{"seconds":1628589261,"nanos":157000000}}} -{"testStepFinished":{"testCaseStartedId":"6ff14eb9-25a7-49a9-8164-7026e5534a47","testStepId":"38120b7f-4ca0-4fb4-830b-4a440cb4a163","testStepResult":{"duration":{"seconds":0,"nanos":0},"status":"PASSED","willBeRetried":false},"timestamp":{"seconds":1628589261,"nanos":157000000}}} -{"testStepStarted":{"testCaseStartedId":"6ff14eb9-25a7-49a9-8164-7026e5534a47","testStepId":"65aeb712-b12a-476f-9ca6-2e37e280eb35","timestamp":{"seconds":1628589261,"nanos":157000000}}} -{"testStepFinished":{"testCaseStartedId":"6ff14eb9-25a7-49a9-8164-7026e5534a47","testStepId":"65aeb712-b12a-476f-9ca6-2e37e280eb35","testStepResult":{"duration":{"seconds":0,"nanos":0},"status":"PASSED","willBeRetried":false},"timestamp":{"seconds":1628589261,"nanos":157000000}}} -{"testStepStarted":{"testCaseStartedId":"6ff14eb9-25a7-49a9-8164-7026e5534a47","testStepId":"ab1fc79c-61c4-498a-8058-7da4b737a1b6","timestamp":{"seconds":1628589261,"nanos":157000000}}} -{"testStepFinished":{"testCaseStartedId":"6ff14eb9-25a7-49a9-8164-7026e5534a47","testStepId":"ab1fc79c-61c4-498a-8058-7da4b737a1b6","testStepResult":{"duration":{"seconds":0,"nanos":0},"status":"PASSED","willBeRetried":false},"timestamp":{"seconds":1628589261,"nanos":157000000}}} -{"testStepStarted":{"testCaseStartedId":"6ff14eb9-25a7-49a9-8164-7026e5534a47","testStepId":"a2f51a5c-efa6-4ec5-9ff3-f31f0d4683c0","timestamp":{"seconds":1628589261,"nanos":157000000}}} -{"testStepFinished":{"testCaseStartedId":"6ff14eb9-25a7-49a9-8164-7026e5534a47","testStepId":"a2f51a5c-efa6-4ec5-9ff3-f31f0d4683c0","testStepResult":{"duration":{"seconds":0,"nanos":0},"status":"PASSED","willBeRetried":false},"timestamp":{"seconds":1628589261,"nanos":157000000}}} -{"testCaseFinished":{"testCaseStartedId":"6ff14eb9-25a7-49a9-8164-7026e5534a47","timestamp":{"seconds":1628589261,"nanos":157000000}}} -{"testRunFinished":{"timestamp":{"seconds":1628589261,"nanos":158000000},"success":true}} diff --git a/language-server/javascript/test/makeCucumberInfo.test.ts b/language-server/javascript/test/makeCucumberInfo.test.ts deleted file mode 100644 index bcf5d97059..0000000000 --- a/language-server/javascript/test/makeCucumberInfo.test.ts +++ /dev/null @@ -1,12 +0,0 @@ -import assert from 'assert' -import fs from 'fs' -import { makeCucumberInfo } from '../src/makeCucumberInfo' - -describe('makeCucumberInfo', () => { - it('builds CucumberInfo', async () => { - const messages = fs.readFileSync(__dirname + '/fixtures/suggest.ndjson', 'utf-8') - const cucumberInfo = await makeCucumberInfo('echo', [messages]) - assert.strictEqual(cucumberInfo.stepDocuments.length, 7) - assert.strictEqual(cucumberInfo.expressions.length, 7) - }) -}) diff --git a/language-server/javascript/tsconfig.build.json b/language-server/javascript/tsconfig.build.json deleted file mode 100644 index 98f530f48a..0000000000 --- a/language-server/javascript/tsconfig.build.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../tsconfig.build.json", - "compilerOptions": { - "rootDir": ".", - "outDir": "dist" - }, - "include": [ - "package.json", - "src", - "test" - ] -} diff --git a/language-server/javascript/tsconfig.json b/language-server/javascript/tsconfig.json deleted file mode 100644 index 4082f16a5d..0000000000 --- a/language-server/javascript/tsconfig.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "../../tsconfig.json" -} diff --git a/language-service/.rsync b/language-service/.rsync deleted file mode 100644 index ea5a5de249..0000000000 --- a/language-service/.rsync +++ /dev/null @@ -1 +0,0 @@ -../.templates/default.mk default.mk diff --git a/language-service/Makefile b/language-service/Makefile deleted file mode 100644 index 551e68e27a..0000000000 --- a/language-service/Makefile +++ /dev/null @@ -1 +0,0 @@ -include default.mk diff --git a/language-service/README.md b/language-service/README.md deleted file mode 100644 index 8f80d31daa..0000000000 --- a/language-service/README.md +++ /dev/null @@ -1 +0,0 @@ -See [javascript/README.md](javascript/README.md) diff --git a/language-service/default.mk b/language-service/default.mk deleted file mode 100644 index a0d8dd28fb..0000000000 --- a/language-service/default.mk +++ /dev/null @@ -1,89 +0,0 @@ -# Please update /.templates/default.mk and sync: -# -# source scripts/functions.sh && rsync_files -# -SHELL := /usr/bin/env bash -ALPINE = $(shell which apk 2> /dev/null) -LIBNAME = $(shell basename $$(pwd)) -LANGUAGES ?= $(wildcard */) - -# https://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make -rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d)) - -default: $(patsubst %,default-%,$(LANGUAGES)) -.PHONY: default - -default-%: % - if [[ -d $< ]]; then cd $< && make default; fi -.PHONY: default-% - -# Need to declare these phonies to avoid errors for packages without a particular language -.PHONY: c dotnet go java javascript objective-c perl python ruby - -update-dependencies: $(patsubst %,update-dependencies-%,$(LANGUAGES)) -.PHONY: update-dependencies - -update-dependencies-%: % - if [[ -d $< ]]; then cd $< && make update-dependencies; fi -.PHONY: update-dependencies-% - -update-changelog: -ifdef NEW_VERSION - cat CHANGELOG.md | ../scripts/update_changelog.sh $(NEW_VERSION) > CHANGELOG.md.tmp - mv CHANGELOG.md.tmp CHANGELOG.md -else - @echo -e "\033[0;31mNEW_VERSION is not defined. Can't update version :-(\033[0m" - exit 1 -endif -.PHONY: update-changelog - -pre-release: update-changelog $(patsubst %,pre-release-%,$(LANGUAGES)) -.PHONY: pre-release - -pre-release-%: % - if [[ -d $< ]]; then cd $< && make pre-release; fi -.PHONY: pre-release-% - -release: publish -.PHONY: release - -publish: create-and-push-release-tag $(patsubst %,publish-%,$(LANGUAGES)) -.PHONY: publish - -publish-%: % - if [[ -d $< ]]; then cd $< && make publish; fi -.PHONY: publish-% - -create-and-push-release-tag: - [ -f '/home/cukebot/configure' ] && /home/cukebot/configure - git commit --gpg-sign --all --message "Release $(LIBNAME) v$(NEW_VERSION)" - git tag --sign "$(LIBNAME)/v$(NEW_VERSION)" -m "Release $(LIBNAME) v$(NEW_VERSION)" - git push --tags -.PHONY: create-and-push-release-tag - -post-release: $(patsubst %,post-release-%,$(LANGUAGES)) -.PHONY: post-release - -post-release: commit-and-push-post-release - -post-release-%: % - if [[ -d $< ]]; then cd $< && make post-release; fi -.PHONY: post-release-% - -commit-and-push-post-release: -ifdef NEW_VERSION - git push --tags - git commit --gpg-sign --all --message "Post release $(LIBNAME) v$(NEW_VERSION)" 2> /dev/null || true - git push -else - @echo -e "\033[0;31mNEW_VERSION is not defined.\033[0m" - exit 1 -endif -.PHONY: commit-and-push-post-release - -clean: $(patsubst %,clean-%,$(LANGUAGES)) -.PHONY: clean - -clean-%: % - if [[ -d $< ]]; then cd $< && make clean; fi -.PHONY: clean-% diff --git a/language-service/javascript/.gitignore b/language-service/javascript/.gitignore deleted file mode 100644 index 385b67bb27..0000000000 --- a/language-service/javascript/.gitignore +++ /dev/null @@ -1,19 +0,0 @@ -dist/ -.idea/ -.nyc_output/ -coverage/ -node_modules/ -yarn.lock -package-lock.json -*.log -.deps -.tested* -.linted -.built* -.compared -.codegen -acceptance/ -storybook-static -*-go -*.iml -.vscode-test diff --git a/language-service/javascript/.mocharc.json b/language-service/javascript/.mocharc.json deleted file mode 100644 index d5055eb10d..0000000000 --- a/language-service/javascript/.mocharc.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "require": ["tsconfig-paths/register", "ts-node/register", "source-map-support/register"], - "extension": ["ts", "tsx"], - "recursive": true, - "timeout": 10000 -} diff --git a/language-service/javascript/.rsync b/language-service/javascript/.rsync deleted file mode 100644 index 5592adbd0c..0000000000 --- a/language-service/javascript/.rsync +++ /dev/null @@ -1,2 +0,0 @@ -../../LICENSE LICENSE -../../.templates/javascript/ . diff --git a/language-service/javascript/CHANGELOG.md b/language-service/javascript/CHANGELOG.md deleted file mode 100644 index 1c82195051..0000000000 --- a/language-service/javascript/CHANGELOG.md +++ /dev/null @@ -1,59 +0,0 @@ -# CHANGE LOG -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](http://keepachangelog.com/) -and this project adheres to [Semantic Versioning](http://semver.org/). - ----- -## [Unreleased] - -### Added - -### Changed - -### Deprecated - -### Removed - -### Fixed - -## [0.2.0] - 2021-09-15 - -### Changed - -* Upgrade to `@cucumber/cucumber-expressions 13.0.1` - -## [0.1.1] - 2021-09-08 - -### Fixed - -* Fix insertion of completion items so it always replaces the full line rather than appending to the end. - ([#1737](https://github.com/cucumber/common/pull/1737) - [aslakhellesoy]) - -## [0.1.0] - 2021-09-07 - -### Added - -* Add `CucumberInfoBuilder` and `CucumberInfo` - ([#1734](https://github.com/cucumber/common/pull/1734) - [aslakhellesoy]) -* Document Formatting - ([#1732](https://github.com/cucumber/common/pull/1732) - [aslakhellesoy]) - -## [0.0.1] - 2021-09-02 - -### Added - -* First release - - -[Unreleased]: https://github.com/cucumber/common/compare/language-service/v0.2.0...main -[0.2.0]: https://github.com/cucumber/common/compare/language-service/v0.1.1...v0.2.0 -[0.1.1]: https://github.com/cucumber/common/compare/language-service/v0.1.0...v0.1.1 -[0.1.0]: https://github.com/cucumber/common/compare/language-service/v0.0.1...v0.1.0 -[0.0.1]: https://github.com/cucumber/common/tree/language-service/v0.0.1 - - -[aslakhellesoy]: https://github.com/aslakhellesoy diff --git a/language-service/javascript/LICENSE b/language-service/javascript/LICENSE deleted file mode 100644 index 725ba9f4ac..0000000000 --- a/language-service/javascript/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Cucumber Ltd - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/language-service/javascript/Makefile b/language-service/javascript/Makefile deleted file mode 100644 index 551e68e27a..0000000000 --- a/language-service/javascript/Makefile +++ /dev/null @@ -1 +0,0 @@ -include default.mk diff --git a/language-service/javascript/README.md b/language-service/javascript/README.md deleted file mode 100644 index f572dd6e30..0000000000 --- a/language-service/javascript/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# Cucumber Language Service - -This library implements the services used by [Cucumber Language Server](../../language-server/javascript) -and [Cucumber Monaco](../../monaco/javascript). - -## Supported features - -- [x] Formatting / pretty printing -- [x] Handle parse errors -- [x] Code completion - - [x] Steps - - [ ] Generic Gherkin keywords -- [x] Syntax validation - - [x] Parse errors - - [x] Undefined steps - - [ ] Ambiguous steps - - [x] Ignore Scenario Outline steps -- [x] [Semantic tokens](https://microsoft.github.io/language-server-protocol/specifications/specification-3-17/#textDocument_semanticTokens) (syntax highlighting) - - [x] Gherkin keywords - - [x] Gherkin step parameters - - [x] DocStrings - - [x] Data tables - - [x] Tags - - [x] Scenario Outline step - - [x] Examples tables headers diff --git a/language-service/javascript/default.mk b/language-service/javascript/default.mk deleted file mode 100644 index b04d59c4a2..0000000000 --- a/language-service/javascript/default.mk +++ /dev/null @@ -1,87 +0,0 @@ -SHELL := /usr/bin/env bash -# https://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make -rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d)) -TYPESCRIPT_SOURCE_FILES = $(sort $(call rwildcard,src test,*.ts *.tsx)) -PRIVATE = $(shell node -e "console.log(require('./package.json').private)") -IS_TESTDATA = $(findstring -testdata,${CURDIR}) -NPM_MODULE = $(shell cat package.json | jq .name --raw-output) - -default: .tested -.PHONY: default - -../../node_modules ../../package-lock.json: package.json - cd ../.. && npm install - -.codegen: - touch $@ - -.tested: .tested-npm .built - -.built: $(TYPESCRIPT_SOURCE_FILES) ../../node_modules ../../package-lock.json .codegen - pushd ../.. && \ - npm run build && \ - popd && \ - touch $@ - -.tested-npm: $(TYPESCRIPT_SOURCE_FILES) ../../node_modules ../../package-lock.json .codegen - npm run test - touch $@ - -pre-release: clean update-version update-dependencies default -.PHONY: pre-release - -update-dependencies: ../../node_modules ../../package-lock.json - ../../node_modules/.bin/npm-check-updates --upgrade --reject hast-util-sanitize,@types/node,react-markdown,rehype-raw,rehype-sanitize,remark-gfm -.PHONY: update-dependencies - -update-version: -ifeq ($(IS_TESTDATA),-testdata) - # no-op -else -ifdef NEW_VERSION - npm --no-git-tag-version --allow-same-version version "$(NEW_VERSION)" - # Update all npm packages that depend on us - pushd ../.. && \ - ./scripts/npm-each update_npm_dependency_if_exists package.json "$(NPM_MODULE)" "$(NEW_VERSION)" -else - @echo -e "\033[0;31mNEW_VERSION is not defined. Can't update version :-(\033[0m" - exit 1 -endif -endif -.PHONY: update-version - -publish: .codegen -ifeq ($(IS_TESTDATA),-testdata) - # no-op -else -ifneq (true,$(PRIVATE)) - npm publish --access public -else - @echo "Not publishing private npm module" -endif -endif -.PHONY: publish - -post-release: -.PHONY: post-release - -clean: clean-javascript -.PHONY: clean - -clean-javascript: - rm -rf .deps .codegen .tested* coverage dist acceptance -.PHONY: clean-javascript - -clobber: clean - rm -rf node_modules ../../node_modules -.PHONY: clobber - -### COMMON stuff for all platforms - -BERP_VERSION = 1.3.0 -BERP_GRAMMAR = gherkin.berp - -define berp-generate-parser = --! dotnet tool list --tool-path /usr/bin | grep "berp\s*$(BERP_VERSION)" && dotnet tool update Berp --version $(BERP_VERSION) --tool-path /usr/bin -berp -g $(BERP_GRAMMAR) -t $< -o $@ --noBOM -endef diff --git a/language-service/javascript/package.json b/language-service/javascript/package.json deleted file mode 100644 index 62aa088ed5..0000000000 --- a/language-service/javascript/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "@cucumber/language-service", - "version": "0.2.0", - "description": "Cucumber Language Service", - "main": "dist/src/index.js", - "types": "dist/src/index.d.ts", - "scripts": { - "test": "mocha", - "prepublishOnly": "tsc --build tsconfig.build.json" - }, - "repository": { - "type": "git", - "url": "git://github.com/cucumber/common.git" - }, - "keywords": [ - "cucumber", - "lsp", - "language service" - ], - "author": "Cucumber Limited ", - "license": "MIT", - "bugs": { - "url": "https://github.com/cucumber/common/issues" - }, - "homepage": "https://github.com/cucumber/common#readme", - "devDependencies": { - "@types/mocha": "9.0.0", - "@types/node": "14.17.21", - "mocha": "9.1.2", - "ts-node": "10.2.1", - "typescript": "4.4.3" - }, - "dependencies": { - "@cucumber/cucumber-expressions": "^13.0.1", - "@cucumber/gherkin": "^22.0.0", - "@cucumber/gherkin-utils": "^7.0.0", - "@cucumber/messages": "^17.1.1", - "@cucumber/suggest": "^0.0.4", - "source-map-support": "0.5.20", - "vscode-languageserver-types": "3.17.0-next.4" - } -} diff --git a/language-service/javascript/src/CucumberInfo.ts b/language-service/javascript/src/CucumberInfo.ts deleted file mode 100644 index da28ede23f..0000000000 --- a/language-service/javascript/src/CucumberInfo.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { Expression, ExpressionFactory, ParameterType, ParameterTypeRegistry } from '@cucumber/cucumber-expressions' -import { Envelope, StepDefinitionPatternType } from '@cucumber/messages' -import { walkGherkinDocument } from '@cucumber/gherkin-utils' -import { buildStepDocuments, StepDocument } from '@cucumber/suggest' - -export type CucumberInfo = { - stepDocuments: readonly StepDocument[] - expressions: readonly Expression[] -} - -/** - * Builds CucumberInfo from Cucumber Messages. - */ -export class CucumberInfoBuilder { - private readonly parameterTypeRegistry = new ParameterTypeRegistry() - private readonly expressionFactory = new ExpressionFactory(this.parameterTypeRegistry) - - private readonly expressions: Expression[] = [] - private stepTexts: string[] = [] - - processEnvelope(envelope: Envelope): void { - if (envelope.parameterType) { - const { name, regularExpressions, useForSnippets, preferForRegularExpressionMatch } = - envelope.parameterType - this.parameterTypeRegistry.defineParameterType( - new ParameterType( - name, - regularExpressions, - Object, - () => undefined, - useForSnippets, - preferForRegularExpressionMatch - ) - ) - } - if (envelope.stepDefinition) { - const expr = - envelope.stepDefinition.pattern.type === StepDefinitionPatternType.CUCUMBER_EXPRESSION - ? envelope.stepDefinition.pattern.source - : new RegExp(envelope.stepDefinition.pattern.source) - const expression = this.expressionFactory.createExpression(expr) - this.expressions.push(expression) - } - if (envelope.gherkinDocument) { - const stepTexts = this.stepTexts - this.stepTexts = walkGherkinDocument(envelope.gherkinDocument, this.stepTexts, { - step(step, arr) { - return arr.concat(step.text) - }, - }) - } - } - - build(): CucumberInfo { - return { - stepDocuments: buildStepDocuments(this.stepTexts, this.expressions), - expressions: this.expressions, - } - } -} diff --git a/language-service/javascript/src/getGherkinCompletionItems.ts b/language-service/javascript/src/getGherkinCompletionItems.ts deleted file mode 100644 index 4fdc35d5d2..0000000000 --- a/language-service/javascript/src/getGherkinCompletionItems.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { walkGherkinDocument } from '@cucumber/gherkin-utils' -import { Index, lspCompletionSnippet } from '@cucumber/suggest' -import { CompletionItem, CompletionItemKind, InsertTextFormat } from 'vscode-languageserver-types' -import { parseGherkinDocument } from './parseGherkinDocument' - -// https://microsoft.github.io/language-server-protocol/specifications/specification-3-17/#textDocument_completion -export function getGherkinCompletionItems( - gherkinSource: string, - line: number, - index: Index -): CompletionItem[] { - const { gherkinDocument } = parseGherkinDocument(gherkinSource) - if (!gherkinDocument) { - return [] - } - let text: string - let startCharacter: number - let endCharacter: number - walkGherkinDocument(gherkinDocument, undefined, { - step(step) { - if (step.location.line === line + 1) { - text = step.text - startCharacter = step.location.column + step.keyword.length - 1 - endCharacter = startCharacter + text.length - } - }, - }) - if (text === undefined) return [] - const stepDocuments = index(text) - return stepDocuments.map((stepDocument) => ({ - label: stepDocument.suggestion, - insertTextFormat: InsertTextFormat.Snippet, - kind: CompletionItemKind.Text, - textEdit: { - newText: lspCompletionSnippet(stepDocument.segments), - range: { - start: { - line, - character: startCharacter, - }, - end: { - line, - character: endCharacter - } - } - } - })) -} diff --git a/language-service/javascript/src/getGherkinDiagnostics.ts b/language-service/javascript/src/getGherkinDiagnostics.ts deleted file mode 100644 index e2f5d5e71a..0000000000 --- a/language-service/javascript/src/getGherkinDiagnostics.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { Diagnostic, DiagnosticSeverity } from 'vscode-languageserver-types' - -import { Errors } from '@cucumber/gherkin' -import { Expression } from '@cucumber/cucumber-expressions' -import { walkGherkinDocument } from '@cucumber/gherkin-utils' -import { parseGherkinDocument } from './parseGherkinDocument' - -// https://microsoft.github.io/language-server-protocol/specifications/specification-3-17/#diagnostic -export function getGherkinDiagnostics( - gherkinSource: string, - expressions: readonly Expression[] -): Diagnostic[] { - const lines = gherkinSource.split(/\r?\n/) - const { gherkinDocument, error } = parseGherkinDocument(gherkinSource) - const diagnostics: Diagnostic[] = [] - const errors: Error[] = error instanceof Errors.CompositeParserException ? error.errors : [error] - for (const error of errors) { - if (error instanceof Errors.GherkinException) { - const line = error.location.line - 1 - const character = error.location.column !== undefined ? error.location.column - 1 : 0 - const diagnostic: Diagnostic = { - severity: DiagnosticSeverity.Error, - range: { - start: { - line, - character, - }, - end: { - line, - character: lines[line].length, - }, - }, - message: error.message, - source: 'ex', - } - diagnostics.push(diagnostic) - } - } - - if (!gherkinDocument) { - return diagnostics - } - - let inScenarioOutline = false - - return walkGherkinDocument(gherkinDocument, diagnostics, { - scenario(scenario, arr) { - inScenarioOutline = (scenario.examples || []).length > 0 - return arr - }, - step(step, arr) { - if (inScenarioOutline) { - return arr - } - if (isUndefined(step.text, expressions)) { - const line = step.location.line - 1 - const character = step.location.column - 1 + step.keyword.length - const diagnostic: Diagnostic = { - severity: DiagnosticSeverity.Warning, - range: { - start: { - line, - character, - }, - end: { - line, - character: character + step.text.length, - }, - }, - message: `Undefined step: ${step.text}`, - source: 'ex', - } - return arr.concat(diagnostic) - } - return arr - }, - }) -} - -function isUndefined(stepText: string, expressions: readonly Expression[]): boolean { - for (const expression of expressions) { - if (expression.match(stepText)) return false - } - return true -} diff --git a/language-service/javascript/src/getGherkinFormattingEdits.ts b/language-service/javascript/src/getGherkinFormattingEdits.ts deleted file mode 100644 index 5f6a14a398..0000000000 --- a/language-service/javascript/src/getGherkinFormattingEdits.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { TextEdit } from "vscode-languageserver-types"; -import { parseGherkinDocument } from './parseGherkinDocument' -import { pretty } from '@cucumber/gherkin-utils' - -// https://microsoft.github.io/language-server-protocol/specifications/specification-3-17/#textDocument_formatting -export function getGherkinFormattingEdits(gherkinSource: string): TextEdit[] { - const { gherkinDocument } = parseGherkinDocument(gherkinSource) - const newText = pretty(gherkinDocument) - const lines = gherkinSource.split(/\r?\n/) - const line = lines.length - 1 - const character = lines[line].length - const textEdit: TextEdit = { - newText, - range: { - start: { - line: 0, - character: 0 - }, - end: { - line, - character - } - } - } - return [textEdit] -} diff --git a/language-service/javascript/src/getGherkinSemanticTokens.ts b/language-service/javascript/src/getGherkinSemanticTokens.ts deleted file mode 100644 index a7c6ce2609..0000000000 --- a/language-service/javascript/src/getGherkinSemanticTokens.ts +++ /dev/null @@ -1,163 +0,0 @@ -import * as messages from '@cucumber/messages' -import { walkGherkinDocument } from '@cucumber/gherkin-utils' -import { - SemanticTokenModifiers, - SemanticTokens, - SemanticTokenTypes, -} from 'vscode-languageserver-types' -import { parseGherkinDocument } from './parseGherkinDocument' -import { Expression } from '@cucumber/cucumber-expressions' - -export const semanticTokenTypes: SemanticTokenTypes[] = [ - SemanticTokenTypes.keyword, // Feature, Scenario, Given etc - SemanticTokenTypes.parameter, // step parameters - SemanticTokenTypes.string, // DocString content and ``` delimiter - SemanticTokenTypes.type, // DocString ```type - SemanticTokenTypes.class, // @tags - SemanticTokenTypes.variable, // step - SemanticTokenTypes.property, // examples table header row -] - -export const semanticTokenModifiers: SemanticTokenModifiers[] = [] - -const indexByType = Object.fromEntries(semanticTokenTypes.map((type, index) => [type, index])) - -// https://microsoft.github.io/language-server-protocol/specifications/specification-3-17/#textDocument_semanticTokens -export function getGherkinSemanticTokens( - gherkinSource: string, - expressions: readonly Expression[] -): SemanticTokens { - const { gherkinDocument } = parseGherkinDocument(gherkinSource) - if (!gherkinDocument) { - return { - data: [], - } - } - const lines = gherkinSource.split(/\r?\n/) - let lastLineNumber = 0 - let lastCharacter = 0 - - function makeLocationToken( - location: messages.Location, - token: string, - type: SemanticTokenTypes, - data: readonly number[] - ) { - const lineNumber = location.line - 1 - const character = location.column - 1 - return makeToken(lineNumber, character, token, type, data) - } - - function makeToken( - lineNumber: number, - character: number, - token: string, - type: SemanticTokenTypes, - data: readonly number[] - ) { - const charDelta = lineNumber === lastLineNumber ? character - lastCharacter : character - lastCharacter = character - const lineOffset = lineNumber - lastLineNumber - lastLineNumber = lineNumber - const length = token.length - const typeIndex = indexByType[type] - return data.concat([lineOffset, charDelta, length, typeIndex, 0]) - } - - let inScenarioOutline = false - let inExamples = false - - const data = walkGherkinDocument(gherkinDocument, [], { - tag(tag, arr) { - return makeLocationToken(tag.location, tag.name, SemanticTokenTypes.class, arr) - }, - feature(feature, arr) { - return makeLocationToken(feature.location, feature.keyword, SemanticTokenTypes.keyword, arr) - }, - rule(rule, arr) { - return makeLocationToken(rule.location, rule.keyword, SemanticTokenTypes.keyword, arr) - }, - scenario(scenario, arr) { - inScenarioOutline = (scenario.examples || []).length > 0 - return makeLocationToken(scenario.location, scenario.keyword, SemanticTokenTypes.keyword, arr) - }, - examples(examples, arr) { - inExamples = true - return makeLocationToken(examples.location, examples.keyword, SemanticTokenTypes.keyword, arr) - }, - step(step, arr) { - inExamples = false - arr = makeLocationToken(step.location, step.keyword, SemanticTokenTypes.keyword, arr) - if (inScenarioOutline) { - const regexp = /(<[^>]+>)/g - let match: RegExpMatchArray = null - while ((match = regexp.exec(step.text)) !== null) { - const character = step.location.column - 1 + step.keyword.length + match.index - arr = makeToken( - step.location.line - 1, - character, - match[0], - SemanticTokenTypes.variable, - arr - ) - } - } else { - for (const expression of expressions) { - const args = expression.match(step.text) - if (args) { - for (const arg of args) { - const character = step.location.column - 1 + step.keyword.length + arg.group.start - arr = makeToken( - step.location.line - 1, - character, - arg.group.value, - SemanticTokenTypes.parameter, - arr - ) - } - break - } - } - } - return arr - }, - docString(docString, arr) { - arr = makeLocationToken( - docString.location, - docString.delimiter, - SemanticTokenTypes.string, - arr - ) - if (docString.mediaType) { - const character = docString.location.column - 1 + docString.delimiter.length - arr = makeToken( - docString.location.line - 1, - character, - docString.mediaType, - SemanticTokenTypes.type, - arr - ) - } - const maxLineNumber = docString.location.line + docString.content.split(/\r?\n/).length - for (let lineNumber = docString.location.line; lineNumber <= maxLineNumber; lineNumber++) { - const spaceContent = /^(\s*)(.*)$/.exec(lines[lineNumber]) - const startChar = spaceContent[1].length - const token = spaceContent[2] - arr = makeToken(lineNumber, startChar, token, SemanticTokenTypes.string, arr) - } - return arr - }, - tableRow(tableRow, arr) { - const type = inExamples ? SemanticTokenTypes.property : SemanticTokenTypes.parameter - for (const cell of tableRow.cells) { - arr = makeLocationToken(cell.location, cell.value, type, arr) - } - inExamples = false - return arr - }, - }) - - return { - data, - } -} diff --git a/language-service/javascript/src/index.ts b/language-service/javascript/src/index.ts deleted file mode 100644 index ae3888e33c..0000000000 --- a/language-service/javascript/src/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -export * from './getGherkinSemanticTokens' -export * from './getGherkinDiagnostics' -export * from './getGherkinCompletionItems' -export * from './getGherkinFormattingEdits' -export * from './CucumberInfo' diff --git a/language-service/javascript/src/parseGherkinDocument.ts b/language-service/javascript/src/parseGherkinDocument.ts deleted file mode 100644 index 000585b508..0000000000 --- a/language-service/javascript/src/parseGherkinDocument.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { GherkinDocument, IdGenerator } from '@cucumber/messages' -import { AstBuilder, GherkinClassicTokenMatcher, Parser, Errors } from '@cucumber/gherkin' - -const uuidFn = IdGenerator.uuid() - -export type ParseResult = { - gherkinDocument?: GherkinDocument - error?: Errors.GherkinException -} - -export function parseGherkinDocument(gherkinSource: string): ParseResult { - const builder = new AstBuilder(uuidFn) - const matcher = new GherkinClassicTokenMatcher() - const parser = new Parser(builder, matcher) - try { - return { - gherkinDocument: parser.parse(gherkinSource), - } - } catch (error) { - let gherkinDocument: GherkinDocument - - for (let i = 0; i < 10; i++) { - gherkinDocument = builder.getResult() - if (gherkinDocument) { - return { - gherkinDocument, - error, - } - } - - try { - builder.endRule() - } catch (ignore) {} - } - - return { - error, - } - } -} diff --git a/language-service/javascript/test/getGherkinCompletionItems.test.ts b/language-service/javascript/test/getGherkinCompletionItems.test.ts deleted file mode 100644 index 9bbe8d1073..0000000000 --- a/language-service/javascript/test/getGherkinCompletionItems.test.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { CompletionItem, CompletionItemKind, InsertTextFormat } from 'vscode-languageserver-types' -import assert from 'assert' -import { StepDocument, bruteForceIndex } from '@cucumber/suggest' -import { getGherkinCompletionItems } from '../src' -import { ExpressionFactory, ParameterTypeRegistry } from '@cucumber/cucumber-expressions' - -describe('getGherkinCompletionItems', () => { - it('completes with step text', () => { - const ef = new ExpressionFactory(new ParameterTypeRegistry()) - const doc1: StepDocument = { - suggestion: 'I have {int} cukes in my belly', - segments: ['I have ', ['42', '98'], ' cukes in my belly'], - expression: ef.createExpression('I have {int} cukes in my belly') - } - const doc2: StepDocument = { - suggestion: 'I am a teapot', - segments: ['I am a teapot'], - expression: ef.createExpression('I am a teapot') - } - - const index = bruteForceIndex([doc1, doc2]) - const gherkinSource = `Feature: Hello - Scenario: World - Given cukes -` - const completions = getGherkinCompletionItems(gherkinSource, 2, index) - const expectedCompletions: CompletionItem[] = [ - { - label: 'I have {int} cukes in my belly', - insertTextFormat: InsertTextFormat.Snippet, - kind: CompletionItemKind.Text, - textEdit: { - newText: 'I have ${1|42,98|} cukes in my belly', - range: { - start: { - line: 2, - character: 10 - }, - end: { - line: 2, - character: 15 - } - } - } - }, - ] - assert.deepStrictEqual(completions, expectedCompletions) - }) -}) diff --git a/language-service/javascript/test/getGherkinDiagnostics.test.ts b/language-service/javascript/test/getGherkinDiagnostics.test.ts deleted file mode 100644 index 3c327f0a33..0000000000 --- a/language-service/javascript/test/getGherkinDiagnostics.test.ts +++ /dev/null @@ -1,110 +0,0 @@ -import assert from 'assert' -import { getGherkinDiagnostics } from '../src' -import { Diagnostic, DiagnosticSeverity } from 'vscode-languageserver-types' -import { CucumberExpression, ParameterTypeRegistry } from '@cucumber/cucumber-expressions' - -describe('getGherkinDiagnostics', () => { - it('returns no diagnostics for valid document', () => { - const diagnostics = getGherkinDiagnostics(`Feature: Hello`, []) - assert.deepStrictEqual(diagnostics, []) - }) - - it('returns error diagnostic for unexpected end of file', () => { - const diagnostics = getGherkinDiagnostics( - `Feature: Hello -@tag -`, - [] - ) - assert.deepStrictEqual(diagnostics, [ - { - message: '(3:0): unexpected end of file, expected: #TagLine, #RuleLine, #Comment, #Empty', - range: { - start: { - line: 2, - character: 0, - }, - end: { - line: 2, - character: 0, - }, - }, - severity: DiagnosticSeverity.Error, - source: 'ex', - }, - ]) - }) - - it('returns error diagnostic for missing table separator', () => { - const expression = new CucumberExpression('a table:', new ParameterTypeRegistry()) - const diagnostics = getGherkinDiagnostics( - `Feature: Hello - Scenario: Hi - Given a table: - | a | - | b -`, - [expression] - ) - const expectedDiagnostics: Diagnostic[] = [ - { - message: '(5:7): inconsistent cell count within the table', - range: { - start: { - line: 4, - character: 6, - }, - end: { - line: 4, - character: 9, - }, - }, - severity: DiagnosticSeverity.Error, - source: 'ex', - }, - ] - assert.deepStrictEqual(diagnostics, expectedDiagnostics) - }) - - it('returns warning diagnostic for undefined step', () => { - const diagnostics = getGherkinDiagnostics( - `Feature: Hello - Scenario: Hi - Given an undefined step -`, - [] - ) - const expectedDiagnostics: Diagnostic[] = [ - { - message: 'Undefined step: an undefined step', - range: { - start: { - line: 2, - character: 10, - }, - end: { - line: 2, - character: 27, - }, - }, - severity: DiagnosticSeverity.Warning, - source: 'ex', - }, - ] - assert.deepStrictEqual(diagnostics, expectedDiagnostics) - }) - - it('does not return warning diagnostic for undefined step in Scenario Outline', () => { - const diagnostics = getGherkinDiagnostics( - `Feature: Hello - Scenario: Hi - Given an undefined step - - Examples: Hello -`, - [] - ) - const expectedDiagnostics: Diagnostic[] = [] - assert.deepStrictEqual(diagnostics, expectedDiagnostics) - }) -}) diff --git a/language-service/javascript/test/getGherkinFormattingEdits.test.ts b/language-service/javascript/test/getGherkinFormattingEdits.test.ts deleted file mode 100644 index aad2e09379..0000000000 --- a/language-service/javascript/test/getGherkinFormattingEdits.test.ts +++ /dev/null @@ -1,30 +0,0 @@ -import assert from 'assert' -import { TextEdit } from 'vscode-languageserver-types' -import { getGherkinFormattingEdits } from '../src' - -describe('getGherkinFormattingEdits', () => { - it('returns text edits that prettifies a Gherkin document', () => { - const gherkinSource = `Feature: Hello -Scenario: World -Given something` - const textEdits = getGherkinFormattingEdits(gherkinSource) - const expectedTextEdit: TextEdit = { - newText: `Feature: Hello - - Scenario: World - Given something -`, - range: { - start: { - line: 0, - character: 0, - }, - end: { - line: 2, - character: 15 - } - } - } - assert.deepStrictEqual([expectedTextEdit], textEdits) - }) -}) diff --git a/language-service/javascript/test/getGherkinSemanticTokens.test.ts b/language-service/javascript/test/getGherkinSemanticTokens.test.ts deleted file mode 100644 index b3ca1f95d0..0000000000 --- a/language-service/javascript/test/getGherkinSemanticTokens.test.ts +++ /dev/null @@ -1,175 +0,0 @@ -import { getGherkinSemanticTokens } from '../src' -import { SemanticTokens } from 'vscode-languageserver-types' -import assert from 'assert' -import { CucumberExpression, ParameterTypeRegistry } from '@cucumber/cucumber-expressions' - -describe('getGherkinSemanticTokens', () => { - it('creates tokens for keywords', () => { - const gherkinSource = `# some comment -@foo @bar -Feature: a - This is a description - and so is this - - Scenario: b - Given I have 42 cukes in my belly - """sometype - hello - world - """ - And a table - | a | bbb | - | cc | dd | - - Scenario Outline: c - Given a and - - Examples: - | foo | bar | - | a | b | -` - const expression = new CucumberExpression( - 'I have {int} cukes in my {word}', - new ParameterTypeRegistry() - ) - - const semanticTokens = getGherkinSemanticTokens(gherkinSource, [expression]) - const expectedSemanticTokens: SemanticTokens = { - // See https://microsoft.github.io/language-server-protocol/specifications/specification-3-17/#textDocument_semanticTokens - // for details about how tokens are encoded - data: [ - 1, - 0, - 4, - 4, - 0, // @foo - 0, - 5, - 4, - 4, - 0, // @bar - 1, - 0, - 7, - 0, - 0, // Feature - 4, - 2, - 8, - 0, - 0, // Scenario - 1, - 4, - 6, - 0, - 0, // Given - 0, - 13, - 2, - 1, - 0, // 42 - 0, - 15, - 5, - 1, - 0, // belly - 1, - 6, - 3, - 2, - 0, // """ - 0, - 3, - 8, - 3, - 0, // sometype - 1, - 5, - 5, - 2, - 0, // hello - 1, - 8, - 5, - 2, - 0, // world - 1, - 7, - 3, - 2, - 0, // """ - 1, - 4, - 4, - 0, - 0, // And - 1, - 8, - 1, - 1, - 0, // a - 0, - 5, - 3, - 1, - 0, // bbb - 1, - 8, - 2, - 1, - 0, // cc - 0, - 6, - 2, - 1, - 0, // dd - 2, - 2, - 16, - 0, - 0, // Scenario Outline - 1, - 4, - 6, - 0, - 0, // Given - 0, - 8, - 5, - 5, - 0, // - 0, - 10, - 5, - 5, - 0, // - 2, - 4, - 8, - 0, - 0, // Examples - 1, - 8, - 3, - 6, - 0, // foo - 0, - 6, - 3, - 6, - 0, // bar - 1, - 8, - 1, - 1, - 0, // a - 0, - 6, - 1, - 1, - 0, // b - ], - } - assert.deepStrictEqual(semanticTokens, expectedSemanticTokens) - }) -}) diff --git a/language-service/javascript/test/parseGherkinDocument.test.ts b/language-service/javascript/test/parseGherkinDocument.test.ts deleted file mode 100644 index f3a6a14752..0000000000 --- a/language-service/javascript/test/parseGherkinDocument.test.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { parseGherkinDocument } from '../src/parseGherkinDocument' -import assert from 'assert' - -describe('parseGherkinDocument', () => { - it('returns a GherkinDocument for unexpected EOF', () => { - const source = `Feature: Hello -@tag -` - const { gherkinDocument, error } = parseGherkinDocument(source) - assert.strictEqual(gherkinDocument.feature.name, 'Hello') - assert.strictEqual( - error.message, - 'Parser errors:\n(3:0): unexpected end of file, expected: #TagLine, #RuleLine, #Comment, #Empty' - ) - }) -}) diff --git a/language-service/javascript/tsconfig.build.json b/language-service/javascript/tsconfig.build.json deleted file mode 100644 index 98f530f48a..0000000000 --- a/language-service/javascript/tsconfig.build.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../tsconfig.build.json", - "compilerOptions": { - "rootDir": ".", - "outDir": "dist" - }, - "include": [ - "package.json", - "src", - "test" - ] -} diff --git a/language-service/javascript/tsconfig.json b/language-service/javascript/tsconfig.json deleted file mode 100644 index 4082f16a5d..0000000000 --- a/language-service/javascript/tsconfig.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "../../tsconfig.json" -} diff --git a/monaco/.rsync b/monaco/.rsync deleted file mode 100644 index ea5a5de249..0000000000 --- a/monaco/.rsync +++ /dev/null @@ -1 +0,0 @@ -../.templates/default.mk default.mk diff --git a/monaco/Makefile b/monaco/Makefile deleted file mode 100644 index 551e68e27a..0000000000 --- a/monaco/Makefile +++ /dev/null @@ -1 +0,0 @@ -include default.mk diff --git a/monaco/default.mk b/monaco/default.mk deleted file mode 100644 index a0d8dd28fb..0000000000 --- a/monaco/default.mk +++ /dev/null @@ -1,89 +0,0 @@ -# Please update /.templates/default.mk and sync: -# -# source scripts/functions.sh && rsync_files -# -SHELL := /usr/bin/env bash -ALPINE = $(shell which apk 2> /dev/null) -LIBNAME = $(shell basename $$(pwd)) -LANGUAGES ?= $(wildcard */) - -# https://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make -rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d)) - -default: $(patsubst %,default-%,$(LANGUAGES)) -.PHONY: default - -default-%: % - if [[ -d $< ]]; then cd $< && make default; fi -.PHONY: default-% - -# Need to declare these phonies to avoid errors for packages without a particular language -.PHONY: c dotnet go java javascript objective-c perl python ruby - -update-dependencies: $(patsubst %,update-dependencies-%,$(LANGUAGES)) -.PHONY: update-dependencies - -update-dependencies-%: % - if [[ -d $< ]]; then cd $< && make update-dependencies; fi -.PHONY: update-dependencies-% - -update-changelog: -ifdef NEW_VERSION - cat CHANGELOG.md | ../scripts/update_changelog.sh $(NEW_VERSION) > CHANGELOG.md.tmp - mv CHANGELOG.md.tmp CHANGELOG.md -else - @echo -e "\033[0;31mNEW_VERSION is not defined. Can't update version :-(\033[0m" - exit 1 -endif -.PHONY: update-changelog - -pre-release: update-changelog $(patsubst %,pre-release-%,$(LANGUAGES)) -.PHONY: pre-release - -pre-release-%: % - if [[ -d $< ]]; then cd $< && make pre-release; fi -.PHONY: pre-release-% - -release: publish -.PHONY: release - -publish: create-and-push-release-tag $(patsubst %,publish-%,$(LANGUAGES)) -.PHONY: publish - -publish-%: % - if [[ -d $< ]]; then cd $< && make publish; fi -.PHONY: publish-% - -create-and-push-release-tag: - [ -f '/home/cukebot/configure' ] && /home/cukebot/configure - git commit --gpg-sign --all --message "Release $(LIBNAME) v$(NEW_VERSION)" - git tag --sign "$(LIBNAME)/v$(NEW_VERSION)" -m "Release $(LIBNAME) v$(NEW_VERSION)" - git push --tags -.PHONY: create-and-push-release-tag - -post-release: $(patsubst %,post-release-%,$(LANGUAGES)) -.PHONY: post-release - -post-release: commit-and-push-post-release - -post-release-%: % - if [[ -d $< ]]; then cd $< && make post-release; fi -.PHONY: post-release-% - -commit-and-push-post-release: -ifdef NEW_VERSION - git push --tags - git commit --gpg-sign --all --message "Post release $(LIBNAME) v$(NEW_VERSION)" 2> /dev/null || true - git push -else - @echo -e "\033[0;31mNEW_VERSION is not defined.\033[0m" - exit 1 -endif -.PHONY: commit-and-push-post-release - -clean: $(patsubst %,clean-%,$(LANGUAGES)) -.PHONY: clean - -clean-%: % - if [[ -d $< ]]; then cd $< && make clean; fi -.PHONY: clean-% diff --git a/monaco/javascript/.gitignore b/monaco/javascript/.gitignore deleted file mode 100644 index 385b67bb27..0000000000 --- a/monaco/javascript/.gitignore +++ /dev/null @@ -1,19 +0,0 @@ -dist/ -.idea/ -.nyc_output/ -coverage/ -node_modules/ -yarn.lock -package-lock.json -*.log -.deps -.tested* -.linted -.built* -.compared -.codegen -acceptance/ -storybook-static -*-go -*.iml -.vscode-test diff --git a/monaco/javascript/.mocharc.json b/monaco/javascript/.mocharc.json deleted file mode 100644 index d5055eb10d..0000000000 --- a/monaco/javascript/.mocharc.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "require": ["tsconfig-paths/register", "ts-node/register", "source-map-support/register"], - "extension": ["ts", "tsx"], - "recursive": true, - "timeout": 10000 -} diff --git a/monaco/javascript/.rsync b/monaco/javascript/.rsync deleted file mode 100644 index 5592adbd0c..0000000000 --- a/monaco/javascript/.rsync +++ /dev/null @@ -1,2 +0,0 @@ -../../LICENSE LICENSE -../../.templates/javascript/ . diff --git a/monaco/javascript/CHANGELOG.md b/monaco/javascript/CHANGELOG.md deleted file mode 100644 index 30883eb03e..0000000000 --- a/monaco/javascript/CHANGELOG.md +++ /dev/null @@ -1,66 +0,0 @@ -# CHANGE LOG -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](http://keepachangelog.com/) -and this project adheres to [Semantic Versioning](http://semver.org/). - ----- -## [Unreleased] - -### Added - -### Changed - -### Deprecated - -### Removed - -### Fixed - -## [0.3.0] - 2021-09-09 - -### Changed - -* Changed exports and API so the monaco global is configured once, and each editor configured once each. - -### Fixed - -* Fixed double-rendering of auto-complete - -## [0.2.0] - 2021-09-08 - -### Changed - -* Add an `editor` argument to the `configure` function - ([#1737](https://github.com/cucumber/common/pull/1737) - [aslakhellesoy]) - -### Fixed - -* Fix event listener for diagnostics by listening to the editor directly - ([#1737](https://github.com/cucumber/common/pull/1737) - [aslakhellesoy]) - -## [0.1.0] - 2021-09-07 - -### Added - -* Document Formatting - ([#1732](https://github.com/cucumber/common/pull/1732) - [aslakhellesoy]) - -## [0.0.1] - 2021-09-02 - -### Added - -* First release - - -[Unreleased]: https://github.com/cucumber/common/compare/monaco/v0.3.0...main -[0.3.0]: https://github.com/cucumber/common/compare/monaco/v0.2.0...v0.3.0 -[0.2.0]: https://github.com/cucumber/common/compare/monaco/v0.1.0...v0.2.0 -[0.1.0]: https://github.com/cucumber/common/compare/monaco/v0.0.1...v0.1.0 -[0.0.1]: https://github.com/cucumber/common/tree/monaco/v0.0.1 - - -[aslakhellesoy]: https://github.com/aslakhellesoy diff --git a/monaco/javascript/LICENSE b/monaco/javascript/LICENSE deleted file mode 100644 index 725ba9f4ac..0000000000 --- a/monaco/javascript/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Cucumber Ltd - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/monaco/javascript/Makefile b/monaco/javascript/Makefile deleted file mode 100644 index 551e68e27a..0000000000 --- a/monaco/javascript/Makefile +++ /dev/null @@ -1 +0,0 @@ -include default.mk diff --git a/monaco/javascript/README.md b/monaco/javascript/README.md deleted file mode 100644 index 476cb60ab0..0000000000 --- a/monaco/javascript/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# Cucumber Monaco - -This library configures a [monaco editor](https://github.com/microsoft/monaco-editor) -with editor features similar to the [Visual Studio Code Cucumber Extension](../../vscode/javascript). - -![Screenshot 1](screenshot1.png) - -![Screenshot 2](screenshot2.png) - -The library is a small Monaco adapter for the [@cucumber/language-service](../../language-service/javascript) -library. - -## Example - -To build the example, run the following: - -``` -pushd ../.. -npm install -npm run build -popd - -npm run build -``` - -This should create additional (.gitigored) files in `./example`. Now, start a static web server in that directory: - -``` -cd examples -npx node-static -p 8000 -``` - -Open http://localhost:8000 diff --git a/monaco/javascript/default.mk b/monaco/javascript/default.mk deleted file mode 100644 index b04d59c4a2..0000000000 --- a/monaco/javascript/default.mk +++ /dev/null @@ -1,87 +0,0 @@ -SHELL := /usr/bin/env bash -# https://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make -rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d)) -TYPESCRIPT_SOURCE_FILES = $(sort $(call rwildcard,src test,*.ts *.tsx)) -PRIVATE = $(shell node -e "console.log(require('./package.json').private)") -IS_TESTDATA = $(findstring -testdata,${CURDIR}) -NPM_MODULE = $(shell cat package.json | jq .name --raw-output) - -default: .tested -.PHONY: default - -../../node_modules ../../package-lock.json: package.json - cd ../.. && npm install - -.codegen: - touch $@ - -.tested: .tested-npm .built - -.built: $(TYPESCRIPT_SOURCE_FILES) ../../node_modules ../../package-lock.json .codegen - pushd ../.. && \ - npm run build && \ - popd && \ - touch $@ - -.tested-npm: $(TYPESCRIPT_SOURCE_FILES) ../../node_modules ../../package-lock.json .codegen - npm run test - touch $@ - -pre-release: clean update-version update-dependencies default -.PHONY: pre-release - -update-dependencies: ../../node_modules ../../package-lock.json - ../../node_modules/.bin/npm-check-updates --upgrade --reject hast-util-sanitize,@types/node,react-markdown,rehype-raw,rehype-sanitize,remark-gfm -.PHONY: update-dependencies - -update-version: -ifeq ($(IS_TESTDATA),-testdata) - # no-op -else -ifdef NEW_VERSION - npm --no-git-tag-version --allow-same-version version "$(NEW_VERSION)" - # Update all npm packages that depend on us - pushd ../.. && \ - ./scripts/npm-each update_npm_dependency_if_exists package.json "$(NPM_MODULE)" "$(NEW_VERSION)" -else - @echo -e "\033[0;31mNEW_VERSION is not defined. Can't update version :-(\033[0m" - exit 1 -endif -endif -.PHONY: update-version - -publish: .codegen -ifeq ($(IS_TESTDATA),-testdata) - # no-op -else -ifneq (true,$(PRIVATE)) - npm publish --access public -else - @echo "Not publishing private npm module" -endif -endif -.PHONY: publish - -post-release: -.PHONY: post-release - -clean: clean-javascript -.PHONY: clean - -clean-javascript: - rm -rf .deps .codegen .tested* coverage dist acceptance -.PHONY: clean-javascript - -clobber: clean - rm -rf node_modules ../../node_modules -.PHONY: clobber - -### COMMON stuff for all platforms - -BERP_VERSION = 1.3.0 -BERP_GRAMMAR = gherkin.berp - -define berp-generate-parser = --! dotnet tool list --tool-path /usr/bin | grep "berp\s*$(BERP_VERSION)" && dotnet tool update Berp --version $(BERP_VERSION) --tool-path /usr/bin -berp -g $(BERP_GRAMMAR) -t $< -o $@ --noBOM -endef diff --git a/monaco/javascript/example/.gitignore b/monaco/javascript/example/.gitignore deleted file mode 100644 index 7bd0bcc7db..0000000000 --- a/monaco/javascript/example/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -*.bundle.js* -*.ttf -*.worker.js* diff --git a/monaco/javascript/example/index.html b/monaco/javascript/example/index.html deleted file mode 100644 index acc2699436..0000000000 --- a/monaco/javascript/example/index.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - Cucumber Monaco - - - -

- Monaco Editor with Cucumber Plugin -

-

- Things you can try: -

-
    -
  • ⇧⌥F - Format Document
  • -
  • Modify the first step and see it underlined as undefined
  • -
  • Type a new step and see auto-complete suggestions
  • -
-
-
- - - diff --git a/monaco/javascript/example/index.js b/monaco/javascript/example/index.js deleted file mode 100644 index 606c42470a..0000000000 --- a/monaco/javascript/example/index.js +++ /dev/null @@ -1,51 +0,0 @@ -import * as monaco from 'monaco-editor/esm/vs/editor/editor.api'; -import { buildStepDocuments, jsSearchIndex } from '@cucumber/suggest' -import { ExpressionFactory, ParameterTypeRegistry } from '@cucumber/cucumber-expressions' -import { configureMonaco } from '../dist/src/index' - -// Build some sample step texts and cucumber expressions. These would typically come from a stream -// of Cucumber Messages. -const ef = new ExpressionFactory(new ParameterTypeRegistry()) -const expressions = [ - ef.createExpression('I have {int} cukes in my belly'), - ef.createExpression('there are {int} blind mice') -]; -const docs = buildStepDocuments( - [ - 'I have 42 cukes in my belly', - 'I have 96 cukes in my belly', - 'there are 38 blind mice', - ], - expressions -) -const index = jsSearchIndex(docs) - -const value = `@foo -Feature: Hello -Scenario: Hi - Given I have 58 cukes in my belly - And this is an undefined step - | some | poorly | - | formatted | table | -` - -const editor1 = monaco.editor.create(document.getElementById('editor1'), { - value, - language: 'gherkin', - theme: 'vs-dark', - // semantic tokens provider is disabled by default - 'semanticHighlighting.enabled': true -}) - -const editor2 = monaco.editor.create(document.getElementById('editor2'), { - value, - language: 'gherkin', - theme: 'vs-dark', - // semantic tokens provider is disabled by default - 'semanticHighlighting.enabled': true -}) - -const configureEditor = configureMonaco(monaco, index, expressions) - -configureEditor(editor1) -configureEditor(editor2) diff --git a/monaco/javascript/package.json b/monaco/javascript/package.json deleted file mode 100644 index aab6d3e39a..0000000000 --- a/monaco/javascript/package.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "name": "@cucumber/monaco", - "version": "0.3.0", - "description": "Cucumber Monaco", - "main": "dist/src/index.js", - "types": "dist/src/index.d.ts", - "scripts": { - "test": "mocha", - "build": "webpack", - "prepublishOnly": "tsc --build tsconfig.build.json" - }, - "repository": { - "type": "git", - "url": "git://github.com/cucumber/common.git" - }, - "keywords": [ - "cucumber", - "lsp", - "language service" - ], - "author": "Cucumber Limited ", - "license": "MIT", - "bugs": { - "url": "https://github.com/cucumber/common/issues" - }, - "homepage": "https://github.com/cucumber/common#readme", - "devDependencies": { - "@types/mocha": "9.0.0", - "@types/node": "14.17.21", - "@cucumber/cucumber-expressions": "^13.0.1", - "mocha": "9.1.2", - "monaco-editor": "0.29.0", - "monaco-editor-webpack-plugin": "5.0.0", - "ts-node": "10.2.1", - "typescript": "4.4.3", - "webpack": "5.58.1", - "webpack-cli": "4.9.0" - }, - "dependencies": { - "@cucumber/language-service": "^0.2.0", - "@cucumber/suggest": "^0.0.4" - }, - "peerDependencies": { - "monaco-editor": "^0.29.0" - } -} diff --git a/monaco/javascript/screenshot1.png b/monaco/javascript/screenshot1.png deleted file mode 100644 index 4c8c29cc7afa9c45f1344fd5e25bf033b7b73f04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78163 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 I;xAtPKVn&8Y5)KL diff --git a/monaco/javascript/screenshot2.png b/monaco/javascript/screenshot2.png deleted file mode 100644 index 5abb6008742a884435127c64071e207f9e1cf726..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65613 zcma&O1z42(w>At20wN$Fu<7m?fuR{f1f>y>4v`vKn4wcq5RvX~5Tv^Xl##e_#FEI=>sGrBy5=%&s30*?n9A~kPk8L14jg1 z(`=BC9$J}8N-E1pN>VG^+nSnNnIIv(@Q>6$*HrBwO411n3F$|{3&D3K$k1S+DZ@Zf zL3@cQL!H_j^XT!G$;%(*0nF;~SI-7U2t%Z#ns?HEUc8Zz(js>LG3Ith+D8@r*uv$sX&b zZ}8H#qbm~ktjITzHA1?XW#5mtE|G^<m}kAeD6lMUCaro`mk#bUayUJbz;R69yPxRyi@@avFC8kAJd&m(Q`}(p-Q+8UqqCym%Ncx~_Y|$YZW1~bpjq3j(+=CQ@g!LNhzz!|xJ1*)w z!+s8Ur(x2HuRsC6)IGy_s-N8YM)T{(--wN(h`D3y;p;n5g6tio6`^oceG9x1{P1Y!XnPNdrOm*K^Z+JEDT_zVA zZfg=B<1sD36a0l63CZ6vEr__2ilQ6%+BToel{;g3VtajXS~S1_zsLLWZcc9Q5#ys0 zj3LaH58REMjd+dbRnbBiyZ+B;eV~$u@7=gQ#waAn=t@t?i-=p%R^TN+a(h7^hTQRP zN$E3$g2>~m$xpQuq*#&(KmA5u5HX# z0uuD?W+D#L2yqG{Yme@rSQ7or*W$aNB$HySx}w_2!W%IZaS`FPv9YnTA-b_RBDHZa z+%3?A z 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 void - -export function configureMonaco( - monaco: Monaco, - index: Index, - expressions: readonly Expression[] -): ConfigureEditor { - monaco.languages.register({ id: 'gherkin' }) - - // Syntax Highlighting (Semantic Tokens) - - monaco.languages.registerDocumentSemanticTokensProvider('gherkin', { - getLegend: function () { - return { - tokenTypes: semanticTokenTypes, - tokenModifiers: semanticTokenModifiers, - } - }, - releaseDocumentSemanticTokens: function () { - // no-op - }, - provideDocumentSemanticTokens: function (model) { - const gherkinSource = model.getValue() - const tokens = getGherkinSemanticTokens(gherkinSource, expressions) - const data = new Uint32Array(tokens.data) - return { - data, - } - }, - }) - - // Auto-Complete - - monaco.languages.registerCompletionItemProvider('gherkin', { - provideCompletionItems: function (model, position) { - const gherkinSource = model.getValue() - const completionItems = getGherkinCompletionItems( - gherkinSource, - position.lineNumber - 1, - index - ) - return { - suggestions: completionItems.map((completionItem) => ({ - label: completionItem.label, - kind: monaco.languages.CompletionItemKind.Text, - insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet, - insertText: (completionItem.textEdit as TextEdit).newText, - range: convertRange((completionItem.textEdit as TextEdit).range), - })), - } - }, - }) - - // Document Formatting - monaco.languages.registerDocumentFormattingEditProvider('gherkin', { - provideDocumentFormattingEdits: function (model) { - const gherkinSource = model.getValue() - const textEdits = getGherkinFormattingEdits(gherkinSource) - return textEdits.map((textEdit) => ({ - range: convertRange(textEdit.range), - text: textEdit.newText, - })) - }, - }) - - return function(editor) { - // Diagnostics (Syntax validation) - function setDiagnosticMarkers() { - const model = editor.getModel() - const gherkinSource = model.getValue() - const diagnostics = getGherkinDiagnostics(gherkinSource, expressions) - const markers: monacoEditor.editor.IMarkerData[] = diagnostics.map((diagnostic) => { - return { - ...(convertRange(diagnostic.range)), - severity: monaco.MarkerSeverity.Error, - message: diagnostic.message, - } - }) - monaco.editor.setModelMarkers(model, 'gherkin', markers) - } - - function requestValidation() { - window.requestAnimationFrame(() => { - setDiagnosticMarkers() - }) - } - - requestValidation() - - let validationTimeout: NodeJS.Timeout - editor.onDidChangeModelContent(() => { - clearTimeout(validationTimeout) - validationTimeout = setTimeout(requestValidation, 500) - }) - } -} - -function convertRange(range: Range): IRange { - return { - startLineNumber: range.start.line + 1, - startColumn: range.start.character + 1, - endLineNumber: range.end.line + 1, - endColumn: range.end.character + 1, - } -} diff --git a/monaco/javascript/test/dummy.ts b/monaco/javascript/test/dummy.ts deleted file mode 100644 index 34f0e9da61..0000000000 --- a/monaco/javascript/test/dummy.ts +++ /dev/null @@ -1,5 +0,0 @@ -describe('@cucumber/monaco', () => { - it('does not have any unit tests', () => { - console.log('******* See README.md for details about how to manually test @cucumber/monaco *******') - }) -}) diff --git a/monaco/javascript/tsconfig.build.json b/monaco/javascript/tsconfig.build.json deleted file mode 100644 index 98f530f48a..0000000000 --- a/monaco/javascript/tsconfig.build.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../tsconfig.build.json", - "compilerOptions": { - "rootDir": ".", - "outDir": "dist" - }, - "include": [ - "package.json", - "src", - "test" - ] -} diff --git a/monaco/javascript/tsconfig.json b/monaco/javascript/tsconfig.json deleted file mode 100644 index 4082f16a5d..0000000000 --- a/monaco/javascript/tsconfig.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "../../tsconfig.json" -} diff --git a/monaco/javascript/webpack.config.js b/monaco/javascript/webpack.config.js deleted file mode 100644 index 18ddfff3df..0000000000 --- a/monaco/javascript/webpack.config.js +++ /dev/null @@ -1,32 +0,0 @@ -const path = require('path'); -const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin'); - -module.exports = { - mode: process.env.NODE_ENV, - entry: './example/index.js', - resolve: { - extensions: ['.ts', '.js'] - }, - output: { - globalObject: 'self', - path: path.resolve(__dirname, 'example'), - filename: '[name].bundle.js' - }, - module: { - rules: [ - { - test: /\.css$/, - use: ['style-loader', 'css-loader'] - }, - { - test: /\.ttf$/, - use: ['file-loader'] - } - ] - }, - plugins: [ - new MonacoWebpackPlugin({ - languages: [] - }) - ] -} diff --git a/package-lock.json b/package-lock.json index ad88d3969f..a8d03eb483 100644 --- a/package-lock.json +++ b/package-lock.json @@ -382,53 +382,6 @@ "node": ">= 12" } }, - "language-server/javascript": { - "name": "@cucumber/language-server", - "version": "0.2.0", - "license": "MIT", - "dependencies": { - "@cucumber/cucumber-expressions": "^13.0.1", - "@cucumber/gherkin-utils": "^7.0.0", - "@cucumber/language-service": "^0.2.0", - "@cucumber/messages": "^17.1.1", - "@cucumber/suggest": "^0.0.4", - "source-map-support": "0.5.20", - "vscode-languageserver": "7.0.0", - "vscode-languageserver-textdocument": "1.0.2" - }, - "bin": { - "cucumber-language-server": "bin/cucumber-language-server.js" - }, - "devDependencies": { - "@types/mocha": "9.0.0", - "@types/node": "14.17.21", - "mocha": "9.1.2", - "ts-node": "10.2.1", - "txtgen": "2.2.8", - "typescript": "4.4.3" - } - }, - "language-service/javascript": { - "name": "@cucumber/language-service", - "version": "0.2.0", - "license": "MIT", - "dependencies": { - "@cucumber/cucumber-expressions": "^13.0.1", - "@cucumber/gherkin": "^22.0.0", - "@cucumber/gherkin-utils": "^7.0.0", - "@cucumber/messages": "^17.1.1", - "@cucumber/suggest": "^0.0.4", - "source-map-support": "0.5.20", - "vscode-languageserver-types": "3.17.0-next.4" - }, - "devDependencies": { - "@types/mocha": "9.0.0", - "@types/node": "14.17.21", - "mocha": "9.1.2", - "ts-node": "10.2.1", - "typescript": "4.4.3" - } - }, "message-streams/javascript": { "name": "@cucumber/message-streams", "version": "3.0.0", @@ -470,30 +423,6 @@ "uuid": "dist/bin/uuid" } }, - "monaco/javascript": { - "name": "@cucumber/monaco", - "version": "0.3.0", - "license": "MIT", - "dependencies": { - "@cucumber/language-service": "^0.2.0", - "@cucumber/suggest": "^0.0.4" - }, - "devDependencies": { - "@cucumber/cucumber-expressions": "^13.0.1", - "@types/mocha": "9.0.0", - "@types/node": "14.17.21", - "mocha": "9.1.2", - "monaco-editor": "0.29.0", - "monaco-editor-webpack-plugin": "5.0.0", - "ts-node": "10.2.1", - "typescript": "4.4.3", - "webpack": "5.58.1", - "webpack-cli": "4.9.0" - }, - "peerDependencies": { - "monaco-editor": "^0.29.0" - } - }, "node_modules/@babel/code-frame": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", @@ -2829,14 +2758,6 @@ "resolved": "json-to-messages/javascript", "link": true }, - "node_modules/@cucumber/language-server": { - "resolved": "language-server/javascript", - "link": true - }, - "node_modules/@cucumber/language-service": { - "resolved": "language-service/javascript", - "link": true - }, "node_modules/@cucumber/message-streams": { "resolved": "message-streams/javascript", "link": true @@ -2845,10 +2766,6 @@ "resolved": "messages/javascript", "link": true }, - "node_modules/@cucumber/monaco": { - "resolved": "monaco/javascript", - "link": true - }, "node_modules/@cucumber/query": { "resolved": "query/javascript", "link": true @@ -2857,10 +2774,6 @@ "resolved": "react/javascript", "link": true }, - "node_modules/@cucumber/suggest": { - "resolved": "suggest/javascript", - "link": true - }, "node_modules/@cucumber/tag-expressions": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@cucumber/tag-expressions/-/tag-expressions-4.1.0.tgz", @@ -10122,9 +10035,9 @@ } }, "node_modules/@testing-library/dom": { - "version": "8.7.2", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.7.2.tgz", - "integrity": "sha512-2zN0Zv9dMnaMAd4c/1E1ZChu4QrICyvWtkUvHFQBPhS1oG3VYGcM7SLGLYdda7187ILRXzIUOvOsbXQm4EASjA==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.9.0.tgz", + "integrity": "sha512-fhmAYtGpFqzKdPq5aLNn/T396qfhYkttHT/5RytdDNSCzg9K/0F/WXF5iDsNBK1M3ZIQbPy7Y0qm4Kup5bqT/w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.10.4", @@ -10323,12 +10236,6 @@ "@types/istanbul-lib-report": "*" } }, - "node_modules/@types/js-search": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@types/js-search/-/js-search-1.4.0.tgz", - "integrity": "sha1-8tSvoXak/HsX+0ahWThHiH+h+3s=", - "dev": true - }, "node_modules/@types/jsdom": { "version": "16.2.13", "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.13.tgz", @@ -10589,12 +10496,6 @@ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz", "integrity": "sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg==" }, - "node_modules/@types/vscode": { - "version": "1.61.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.61.0.tgz", - "integrity": "sha512-9k5Nwq45hkRwdfCFY+eKXeQQSbPoA114mF7U/4uJXRBJeGIO7MuJdhF1PnaDN+lllL9iKGQtd6FFXShBXMNaFg==", - "dev": true - }, "node_modules/@types/webpack": { "version": "4.41.31", "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.31.tgz", @@ -11918,16 +11819,6 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, - "node_modules/azure-devops-node-api": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.0.1.tgz", - "integrity": "sha512-YMdjAw9l5p/6leiyIloxj3k7VIvYThKjvqgiQn88r3nhT93ENwsoDS3A83CyJ4uTWzCZ5f5jCi6c27rTU5Pz+A==", - "dev": true, - "dependencies": { - "tunnel": "0.0.6", - "typed-rest-client": "^1.8.4" - } - }, "node_modules/babel-loader": { "version": "8.2.2", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", @@ -12266,15 +12157,6 @@ "node": ">8.0.0" } }, - "node_modules/big-integer": { - "version": "1.6.49", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.49.tgz", - "integrity": "sha512-KJ7VhqH+f/BOt9a3yMwJNmcZjG53ijWMTjSAGMveQWyLwqIiwkjNP5PFgDob3Snnx86SjDj6I89fIbv0dkQeNw==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -12284,19 +12166,6 @@ "node": "*" } }, - "node_modules/binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", - "dev": true, - "dependencies": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - }, - "engines": { - "node": "*" - } - }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -12736,30 +12605,12 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, - "node_modules/buffer-indexof-polyfill": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", - "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, "node_modules/buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, - "node_modules/buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", - "dev": true, - "engines": { - "node": ">=0.2.0" - } - }, "node_modules/builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", @@ -13094,18 +12945,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", - "dev": true, - "dependencies": { - "traverse": ">=0.3.0 <0.4" - }, - "engines": { - "node": "*" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -13149,43 +12988,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/cheerio": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", - "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", - "dev": true, - "dependencies": { - "cheerio-select": "^1.5.0", - "dom-serializer": "^1.3.2", - "domhandler": "^4.2.0", - "htmlparser2": "^6.1.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", - "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", - "dev": true, - "dependencies": { - "css-select": "^4.1.3", - "css-what": "^5.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0", - "domutils": "^2.7.0" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, "node_modules/chokidar": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", @@ -13912,9 +13714,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.18.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.18.2.tgz", - "integrity": "sha512-25VJYCJtGjZwLguj7d66oiHfmnVw3TMOZ0zV8DyMJp/aeQ3OjR519iOOeck08HMyVVRAqXxafc2Hl+5QstJrsQ==", + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.18.3.tgz", + "integrity": "sha512-4zP6/y0a2RTHN5bRGT7PTq9lVt3WzvffTNjqnTKsXhkAYNDTkdCLOIfAdOLcQ/7TDdyRj3c+NeHe1NmF1eDScw==", "dev": true, "dependencies": { "browserslist": "^4.17.3", @@ -13935,9 +13737,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.18.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.18.2.tgz", - "integrity": "sha512-4hMMLUlZhKJKOWbbGD1/VDUxGPEhEoN/T01k7bx271WiBKCvCfkgPzy0IeRS4PB50p6/N1q/SZL4B/TRsTE5bA==", + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.18.3.tgz", + "integrity": "sha512-qfskyO/KjtbYn09bn1IPkuhHl5PlJ6IzJ9s9sraJ1EqcuGyLGKzhSM1cY0zgyL9hx42eulQLZ6WaeK5ycJCkqw==", "dev": true, "hasInstallScript": true, "funding": { @@ -14686,10 +14488,6 @@ "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==", "dev": true }, - "node_modules/cucumber": { - "resolved": "vscode/javascript", - "link": true - }, "node_modules/cyclist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", @@ -14899,12 +14697,6 @@ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true }, - "node_modules/denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", - "dev": true - }, "node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -15250,45 +15042,6 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/duplexer2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/duplexer2/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/duplexer2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", @@ -15376,9 +15129,9 @@ "integrity": "sha1-ZVQbswnd3Qz5Ty0ciGGyvmUbsNU=" }, "node_modules/electron-to-chromium": { - "version": "1.3.864", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.864.tgz", - "integrity": "sha512-v4rbad8GO6/yVI92WOeU9Wgxc4NA0n4f6P1FvZTY+jyY7JHEhw3bduYu60v3Q1h81Cg6eo4ApZrFPuycwd5hGw==", + "version": "1.3.867", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.867.tgz", + "integrity": "sha512-WbTXOv7hsLhjJyl7jBfDkioaY++iVVZomZ4dU6TMe/SzucV6mUAs2VZn/AehBwuZMiNEQDaPuTGn22YK5o+aDw==", "dev": true }, "node_modules/element-resize-detector": { @@ -15916,12 +15669,13 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz", - "integrity": "sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.0.tgz", + "integrity": "sha512-hqSE88MmHl3ru9SYvDyGrlo0JwROlf9fiEMplEV7j/EAuq9iSlIlyCFbBT6pdULQBSnBYtYKiMLps+hKkyP7Gg==", "dev": true, "dependencies": { "debug": "^3.2.7", + "find-up": "^2.1.0", "pkg-dir": "^2.0.0" }, "engines": { @@ -17595,45 +17349,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/fstream/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/fstream/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -19780,9 +19495,9 @@ "dev": true }, "node_modules/istanbul-lib-coverage": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.1.tgz", - "integrity": "sha512-GvCYYTxaCPqwMjobtVcVKvSHtAGe48MNhGjpK8LtVF8K0ISX7hCKl85LgtuaSneWVyQmaGcW3iXVV3GaZSLpmQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.2.tgz", + "integrity": "sha512-o5+eTUYzCJ11/+JhW5/FUCdfsdoYVdQ/8I/OveE2XsjehYn5DdeSnNQAbjYaO8gQ6hvGTN6GM6ddQqpTVG5j8g==", "dev": true, "engines": { "node": ">=8" @@ -19869,9 +19584,9 @@ } }, "node_modules/istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "dependencies": { "debug": "^4.1.1", @@ -19879,7 +19594,7 @@ "source-map": "^0.6.1" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/istanbul-lib-source-maps/node_modules/source-map": { @@ -19892,9 +19607,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.3.tgz", - "integrity": "sha512-0i77ZFLsb9U3DHi22WzmIngVzfoyxxbQcZRqlF3KoKmCJGq9nhFHoGi8FqBztN2rE8w6hURnZghetn0xpkVb6A==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-bFjUnc95rHjdCR63WMHUS7yfJJh8T9IPSWavvR02hhjVwezWALZ5axF9EqjmwZHpXqkzbgAMP8DmAtiyNxrdrQ==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -19965,11 +19680,6 @@ "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=", "dev": true }, - "node_modules/js-search": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/js-search/-/js-search-2.0.0.tgz", - "integrity": "sha512-lJ8KzjlwcelIWuAdKyzsXv45W6OIwRpayzc7XmU8mzgWadg5UVOKVmnq/tXudddEB9Ceic3tVaGu6QOK/eebhg==" - }, "node_modules/js-string-escape": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", @@ -20338,15 +20048,6 @@ "yarn": ">=1.0.0" } }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -20438,21 +20139,6 @@ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, - "node_modules/linkify-it": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", - "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", - "dev": true, - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "node_modules/listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=", - "dev": true - }, "node_modules/load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -20665,6 +20351,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -20799,28 +20486,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/markdown-it": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", - "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "entities": "~2.0.0", - "linkify-it": "^2.0.0", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it/node_modules/entities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", - "dev": true - }, "node_modules/markdown-table": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", @@ -21953,39 +21618,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/monaco-editor": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.29.0.tgz", - "integrity": "sha512-7bOTapOZG8gNfzk9HJstNClnRjD9TEkVqo7qB3W6y+4cypS31A55MBQ7dpnEdnQBU+Hz3isyx61mi3/e05S7Xg==", - "dev": true - }, - "node_modules/monaco-editor-webpack-plugin": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-5.0.0.tgz", - "integrity": "sha512-KrUUTmMO3lDCNK4honZ6rrrKjOI7FFLeyCktPetIo5HlRqr5dfE6ewaA9qNLH96XY7CekE3Z+v/+I6ufAs3ObA==", - "dev": true, - "dependencies": { - "loader-utils": "^2.0.0" - }, - "peerDependencies": { - "monaco-editor": "0.29.x", - "webpack": "^4.5.0 || 5.x" - } - }, - "node_modules/monaco-editor-webpack-plugin/node_modules/loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, "node_modules/move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -22054,12 +21686,6 @@ "node": ">=8" } }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, "node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -22074,7 +21700,8 @@ "version": "2.15.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "dev": true + "dev": true, + "optional": true }, "node_modules/nanoid": { "version": "3.1.25", @@ -23284,34 +22911,6 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, "node_modules/overlayscrollbars": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/overlayscrollbars/-/overlayscrollbars-1.13.1.tgz", @@ -23674,38 +23273,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-semver": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", - "integrity": "sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg=", - "dev": true, - "dependencies": { - "semver": "^5.1.0" - } - }, - "node_modules/parse-semver/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dev": true, - "dependencies": { - "parse5": "^6.0.1" - } - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -25893,18 +25465,6 @@ "react": "^16.8.0 || ^17.0.0" } }, - "node_modules/read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", - "dev": true, - "dependencies": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/read-package-json-fast": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", @@ -26855,12 +26415,6 @@ } } }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, "node_modules/saxes": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", @@ -26941,6 +26495,7 @@ "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -28848,35 +28403,6 @@ "node": ">=12" } }, - "node_modules/traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/tree-sitter-cli": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/tree-sitter-cli/-/tree-sitter-cli-0.20.0.tgz", - "integrity": "sha512-4D1qapWbJXZ5rrSUGM5rcw5Vuq/smzn9KbiFRhlON6KeuuXjra+KAtDYVrDgAoLIG4ku+jbEEGrJxCptUGi3dg==", - "dev": true, - "hasInstallScript": true, - "bin": { - "tree-sitter": "cli.js" - } - }, - "node_modules/tree-sitter-java": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/tree-sitter-java/-/tree-sitter-java-0.19.1.tgz", - "integrity": "sha512-yVm+4q1D4niaHcEf2iqhOcIaiSp3wxHjeC4eoLAqSQNVxSrhThmT1FEfM4yDgHV4XaxH+62xpKHCwYG9NzRt6Q==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "nan": "^2.14.1" - } - }, "node_modules/trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", @@ -29185,15 +28711,6 @@ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, - "node_modules/tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "dev": true, - "engines": { - "node": ">=0.6.11 <=0.7.0 || >=0.7.3" - } - }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -29212,15 +28729,6 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, - "node_modules/txtgen": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/txtgen/-/txtgen-2.2.8.tgz", - "integrity": "sha512-b3wteOTrO1RPV1f6dhYaNz2G48a6dCH+pvTBRMdtjTWSeVBBE4rFypoc+2uT0F7OFSgBlOQefDuDvp9VYqA73g==", - "dev": true, - "engines": { - "node": ">= 10.14.2" - } - }, "node_modules/type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", @@ -29272,17 +28780,6 @@ "node": ">= 0.6" } }, - "node_modules/typed-rest-client": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.6.tgz", - "integrity": "sha512-xcQpTEAJw2DP7GqVNECh4dD+riS+C1qndXLfBCJ3xk0kqprtGN491P5KlmrDbKdtuW8NEcP/5ChxiJI3S9WYTA==", - "dev": true, - "dependencies": { - "qs": "^6.9.1", - "tunnel": "0.0.6", - "underscore": "^1.12.1" - } - }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -29311,12 +28808,6 @@ "node": ">=4.2.0" } }, - "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true - }, "node_modules/unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", @@ -29342,12 +28833,6 @@ "through": "^2.3.8" } }, - "node_modules/underscore": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", - "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==", - "dev": true - }, "node_modules/unfetch": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", @@ -29675,60 +29160,6 @@ "node": ">=8" } }, - "node_modules/unzipper": { - "version": "0.10.11", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", - "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", - "dev": true, - "dependencies": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "^1.0.12", - "graceful-fs": "^4.2.2", - "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", - "setimmediate": "~1.0.4" - } - }, - "node_modules/unzipper/node_modules/bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", - "dev": true - }, - "node_modules/unzipper/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/unzipper/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/unzipper/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", @@ -29859,12 +29290,6 @@ "querystring": "0.2.0" } }, - "node_modules/url-join": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz", - "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=", - "dev": true - }, "node_modules/url-loader": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", @@ -30211,193 +29636,6 @@ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "dev": true }, - "node_modules/vsce": { - "version": "1.100.1", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.100.1.tgz", - "integrity": "sha512-1VjLyse5g6e2eQ6jUpslu7IDq44velwF8Jy8s7ePdwGNuG8EzfmaOfVyig3ZSMJ0l8DiJmZllx5bRAB4RMdnHg==", - "dev": true, - "dependencies": { - "azure-devops-node-api": "^11.0.1", - "chalk": "^2.4.2", - "cheerio": "^1.0.0-rc.9", - "commander": "^6.1.0", - "denodeify": "^1.2.1", - "glob": "^7.0.6", - "hosted-git-info": "^4.0.2", - "leven": "^3.1.0", - "lodash": "^4.17.15", - "markdown-it": "^10.0.0", - "mime": "^1.3.4", - "minimatch": "^3.0.3", - "osenv": "^0.1.3", - "parse-semver": "^1.1.1", - "read": "^1.0.7", - "semver": "^5.1.0", - "tmp": "^0.2.1", - "typed-rest-client": "^1.8.4", - "url-join": "^1.1.0", - "xml2js": "^0.4.23", - "yauzl": "^2.3.1", - "yazl": "^2.2.2" - }, - "bin": { - "vsce": "out/vsce" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/vsce/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/vsce/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/vsce/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/vsce/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/vsce/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/vsce/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/vsce/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/vsce/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/vscode-jsonrpc": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", - "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", - "engines": { - "node": ">=8.0.0 || >=10.0.0" - } - }, - "node_modules/vscode-languageclient": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz", - "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==", - "dependencies": { - "minimatch": "^3.0.4", - "semver": "^7.3.4", - "vscode-languageserver-protocol": "3.16.0" - }, - "engines": { - "vscode": "^1.52.0" - } - }, - "node_modules/vscode-languageserver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", - "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", - "dependencies": { - "vscode-languageserver-protocol": "3.16.0" - }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" - } - }, - "node_modules/vscode-languageserver-protocol": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", - "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", - "dependencies": { - "vscode-jsonrpc": "6.0.0", - "vscode-languageserver-types": "3.16.0" - } - }, - "node_modules/vscode-languageserver-protocol/node_modules/vscode-languageserver-types": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", - "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" - }, - "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.2.tgz", - "integrity": "sha512-T7uPC18+f8mYE4lbVZwb3OSmvwTZm3cuFhrdx9Bn2l11lmp3SvSuSVjy2JtvrghzjAo4G6Trqny2m9XGnFnWVA==" - }, - "node_modules/vscode-languageserver-types": { - "version": "3.17.0-next.4", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.0-next.4.tgz", - "integrity": "sha512-MraVkZDhfqa3ftnKW9rEDeqsV+ji8OrtEjx6mVjzVGm5U2XXT+mdqDWyQ+y0Gvb2/aa2oJJQyTAaDmRTUKiUbg==" - }, - "node_modules/vscode-test": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.6.1.tgz", - "integrity": "sha512-086q88T2ca1k95mUzffvbzb7esqQNvJgiwY4h29ukPhFo8u+vXOOmelUoU5EQUHs3Of8+JuQ3oGdbVCqaxuTXA==", - "dev": true, - "dependencies": { - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "rimraf": "^3.0.2", - "unzipper": "^0.10.11" - }, - "engines": { - "node": ">=8.9.3" - } - }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -30774,11 +30012,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/web-tree-sitter": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.19.4.tgz", - "integrity": "sha512-8G0xBj05hqZybCqBtW7RPZ/hWEtP3DiLTauQzGJZuZYfVRgw7qj7iaZ+8djNqJ4VPrdOO+pS2dR1JsTbsLxdYg==" - }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -31399,28 +30632,6 @@ "node": ">=12" } }, - "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", @@ -31447,7 +30658,8 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/yaml": { "version": "1.10.2", @@ -31566,15 +30778,6 @@ "fd-slicer": "~1.1.0" } }, - "node_modules/yazl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", - "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3" - } - }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -31701,59 +30904,6 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true - }, - "suggest/javascript": { - "name": "@cucumber/suggest", - "version": "0.0.4", - "license": "MIT", - "dependencies": { - "@cucumber/cucumber-expressions": "^13.0.1", - "fuse.js": "6.4.6", - "js-search": "2.0.0", - "web-tree-sitter": "0.19.4" - }, - "devDependencies": { - "@cucumber/cucumber": "7.3.1", - "@types/js-search": "1.4.0", - "@types/mocha": "9.0.0", - "@types/node": "14.17.21", - "mocha": "9.1.2", - "tree-sitter-cli": "0.20.0", - "tree-sitter-java": "0.19.1", - "ts-node": "10.2.1", - "txtgen": "2.2.8", - "typescript": "4.4.3" - } - }, - "suggest/javascript/node_modules/fuse.js": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-6.4.6.tgz", - "integrity": "sha512-/gYxR/0VpXmWSfZOIPS3rWwU8SHgsRTwWuXhyb2O6s7aRuVtHtxCkR33bNYu3wyLyNx/Wpv0vU7FZy8Vj53VNw==", - "engines": { - "node": ">=10" - } - }, - "vscode/javascript": { - "name": "cucumber", - "version": "0.0.1", - "dependencies": { - "@cucumber/language-server": "^0.2.0", - "vscode-languageclient": "7.0.0" - }, - "devDependencies": { - "@types/glob": "7.1.4", - "@types/mocha": "9.0.0", - "@types/node": "14.x", - "@types/vscode": "1.61.0", - "glob": "7.2.0", - "mocha": "9.1.2", - "typescript": "4.4.3", - "vsce": "1.100.1", - "vscode-test": "1.6.1" - }, - "engines": { - "vscode": "^1.59.0" - } } }, "dependencies": { @@ -33654,42 +32804,6 @@ } } }, - "@cucumber/language-server": { - "version": "file:language-server/javascript", - "requires": { - "@cucumber/cucumber-expressions": "^13.0.1", - "@cucumber/gherkin-utils": "^7.0.0", - "@cucumber/language-service": "^0.2.0", - "@cucumber/messages": "^17.1.1", - "@cucumber/suggest": "^0.0.4", - "@types/mocha": "9.0.0", - "@types/node": "14.17.21", - "mocha": "9.1.2", - "source-map-support": "0.5.20", - "ts-node": "10.2.1", - "txtgen": "2.2.8", - "typescript": "4.4.3", - "vscode-languageserver": "7.0.0", - "vscode-languageserver-textdocument": "1.0.2" - } - }, - "@cucumber/language-service": { - "version": "file:language-service/javascript", - "requires": { - "@cucumber/cucumber-expressions": "^13.0.1", - "@cucumber/gherkin": "^22.0.0", - "@cucumber/gherkin-utils": "^7.0.0", - "@cucumber/messages": "^17.1.1", - "@cucumber/suggest": "^0.0.4", - "@types/mocha": "9.0.0", - "@types/node": "14.17.21", - "mocha": "9.1.2", - "source-map-support": "0.5.20", - "ts-node": "10.2.1", - "typescript": "4.4.3", - "vscode-languageserver-types": "3.17.0-next.4" - } - }, "@cucumber/message-streams": { "version": "file:message-streams/javascript", "requires": { @@ -33722,23 +32836,6 @@ } } }, - "@cucumber/monaco": { - "version": "file:monaco/javascript", - "requires": { - "@cucumber/cucumber-expressions": "^13.0.1", - "@cucumber/language-service": "^0.2.0", - "@cucumber/suggest": "^0.0.4", - "@types/mocha": "9.0.0", - "@types/node": "14.17.21", - "mocha": "9.1.2", - "monaco-editor": "0.29.0", - "monaco-editor-webpack-plugin": "5.0.0", - "ts-node": "10.2.1", - "typescript": "4.4.3", - "webpack": "5.58.1", - "webpack-cli": "4.9.0" - } - }, "@cucumber/query": { "version": "file:query/javascript", "requires": { @@ -33826,32 +32923,6 @@ } } }, - "@cucumber/suggest": { - "version": "file:suggest/javascript", - "requires": { - "@cucumber/cucumber": "7.3.1", - "@cucumber/cucumber-expressions": "^13.0.1", - "@types/js-search": "1.4.0", - "@types/mocha": "9.0.0", - "@types/node": "14.17.21", - "fuse.js": "6.4.6", - "js-search": "2.0.0", - "mocha": "9.1.2", - "tree-sitter-cli": "0.20.0", - "tree-sitter-java": "0.19.1", - "ts-node": "10.2.1", - "txtgen": "2.2.8", - "typescript": "4.4.3", - "web-tree-sitter": "0.19.4" - }, - "dependencies": { - "fuse.js": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-6.4.6.tgz", - "integrity": "sha512-/gYxR/0VpXmWSfZOIPS3rWwU8SHgsRTwWuXhyb2O6s7aRuVtHtxCkR33bNYu3wyLyNx/Wpv0vU7FZy8Vj53VNw==" - } - } - }, "@cucumber/tag-expressions": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/@cucumber/tag-expressions/-/tag-expressions-4.1.0.tgz", @@ -39607,9 +38678,9 @@ "integrity": "sha512-TL1adzq1HdxUf9WYduLcQ/DNGYiz71U31QRgbnr0Ef1cPyOUOsBojxHVWpFeOSUucB6Lrs0LxFRA14ntgtkc9w==" }, "@testing-library/dom": { - "version": "8.7.2", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.7.2.tgz", - "integrity": "sha512-2zN0Zv9dMnaMAd4c/1E1ZChu4QrICyvWtkUvHFQBPhS1oG3VYGcM7SLGLYdda7187ILRXzIUOvOsbXQm4EASjA==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.9.0.tgz", + "integrity": "sha512-fhmAYtGpFqzKdPq5aLNn/T396qfhYkttHT/5RytdDNSCzg9K/0F/WXF5iDsNBK1M3ZIQbPy7Y0qm4Kup5bqT/w==", "dev": true, "requires": { "@babel/code-frame": "^7.10.4", @@ -39795,12 +38866,6 @@ "@types/istanbul-lib-report": "*" } }, - "@types/js-search": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@types/js-search/-/js-search-1.4.0.tgz", - "integrity": "sha1-8tSvoXak/HsX+0ahWThHiH+h+3s=", - "dev": true - }, "@types/jsdom": { "version": "16.2.13", "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-16.2.13.tgz", @@ -40060,12 +39125,6 @@ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz", "integrity": "sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg==" }, - "@types/vscode": { - "version": "1.61.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.61.0.tgz", - "integrity": "sha512-9k5Nwq45hkRwdfCFY+eKXeQQSbPoA114mF7U/4uJXRBJeGIO7MuJdhF1PnaDN+lllL9iKGQtd6FFXShBXMNaFg==", - "dev": true - }, "@types/webpack": { "version": "4.41.31", "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.31.tgz", @@ -41128,16 +40187,6 @@ "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, - "azure-devops-node-api": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.0.1.tgz", - "integrity": "sha512-YMdjAw9l5p/6leiyIloxj3k7VIvYThKjvqgiQn88r3nhT93ENwsoDS3A83CyJ4uTWzCZ5f5jCi6c27rTU5Pz+A==", - "dev": true, - "requires": { - "tunnel": "0.0.6", - "typed-rest-client": "^1.8.4" - } - }, "babel-loader": { "version": "8.2.2", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", @@ -41412,28 +40461,12 @@ "open": "^7.0.3" } }, - "big-integer": { - "version": "1.6.49", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.49.tgz", - "integrity": "sha512-KJ7VhqH+f/BOt9a3yMwJNmcZjG53ijWMTjSAGMveQWyLwqIiwkjNP5PFgDob3Snnx86SjDj6I89fIbv0dkQeNw==", - "dev": true - }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, - "binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", - "dev": true, - "requires": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - } - }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -41784,24 +40817,12 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, - "buffer-indexof-polyfill": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", - "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", - "dev": true - }, "buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, - "buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", - "dev": true - }, "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", @@ -42057,15 +41078,6 @@ "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==" }, - "chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", - "dev": true, - "requires": { - "traverse": ">=0.3.0 <0.4" - } - }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -42091,34 +41103,6 @@ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" }, - "cheerio": { - "version": "1.0.0-rc.10", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", - "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", - "dev": true, - "requires": { - "cheerio-select": "^1.5.0", - "dom-serializer": "^1.3.2", - "domhandler": "^4.2.0", - "htmlparser2": "^6.1.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "tslib": "^2.2.0" - } - }, - "cheerio-select": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz", - "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==", - "dev": true, - "requires": { - "css-select": "^4.1.3", - "css-what": "^5.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0", - "domutils": "^2.7.0" - } - }, "chokidar": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", @@ -42719,9 +41703,9 @@ "dev": true }, "core-js-compat": { - "version": "3.18.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.18.2.tgz", - "integrity": "sha512-25VJYCJtGjZwLguj7d66oiHfmnVw3TMOZ0zV8DyMJp/aeQ3OjR519iOOeck08HMyVVRAqXxafc2Hl+5QstJrsQ==", + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.18.3.tgz", + "integrity": "sha512-4zP6/y0a2RTHN5bRGT7PTq9lVt3WzvffTNjqnTKsXhkAYNDTkdCLOIfAdOLcQ/7TDdyRj3c+NeHe1NmF1eDScw==", "dev": true, "requires": { "browserslist": "^4.17.3", @@ -42737,9 +41721,9 @@ } }, "core-js-pure": { - "version": "3.18.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.18.2.tgz", - "integrity": "sha512-4hMMLUlZhKJKOWbbGD1/VDUxGPEhEoN/T01k7bx271WiBKCvCfkgPzy0IeRS4PB50p6/N1q/SZL4B/TRsTE5bA==", + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.18.3.tgz", + "integrity": "sha512-qfskyO/KjtbYn09bn1IPkuhHl5PlJ6IzJ9s9sraJ1EqcuGyLGKzhSM1cY0zgyL9hx42eulQLZ6WaeK5ycJCkqw==", "dev": true }, "core-util-is": { @@ -43355,22 +42339,6 @@ "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==", "dev": true }, - "cucumber": { - "version": "file:vscode/javascript", - "requires": { - "@cucumber/language-server": "^0.2.0", - "@types/glob": "7.1.4", - "@types/mocha": "9.0.0", - "@types/node": "14.x", - "@types/vscode": "1.61.0", - "glob": "7.2.0", - "mocha": "9.1.2", - "typescript": "4.4.3", - "vsce": "1.100.1", - "vscode-languageclient": "7.0.0", - "vscode-test": "1.6.1" - } - }, "cyclist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", @@ -43535,12 +42503,6 @@ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", "dev": true }, - "denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", - "dev": true - }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -43824,47 +42786,6 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", @@ -43951,9 +42872,9 @@ "integrity": "sha1-ZVQbswnd3Qz5Ty0ciGGyvmUbsNU=" }, "electron-to-chromium": { - "version": "1.3.864", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.864.tgz", - "integrity": "sha512-v4rbad8GO6/yVI92WOeU9Wgxc4NA0n4f6P1FvZTY+jyY7JHEhw3bduYu60v3Q1h81Cg6eo4ApZrFPuycwd5hGw==", + "version": "1.3.867", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.867.tgz", + "integrity": "sha512-WbTXOv7hsLhjJyl7jBfDkioaY++iVVZomZ4dU6TMe/SzucV6mUAs2VZn/AehBwuZMiNEQDaPuTGn22YK5o+aDw==", "dev": true }, "element-resize-detector": { @@ -44439,12 +43360,13 @@ } }, "eslint-module-utils": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz", - "integrity": "sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.0.tgz", + "integrity": "sha512-hqSE88MmHl3ru9SYvDyGrlo0JwROlf9fiEMplEV7j/EAuq9iSlIlyCFbBT6pdULQBSnBYtYKiMLps+hKkyP7Gg==", "dev": true, "requires": { "debug": "^3.2.7", + "find-up": "^2.1.0", "pkg-dir": "^2.0.0" }, "dependencies": { @@ -45720,38 +44642,6 @@ "dev": true, "optional": true }, - "fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "dependencies": { - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } - } - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -47326,9 +46216,9 @@ "dev": true }, "istanbul-lib-coverage": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.1.tgz", - "integrity": "sha512-GvCYYTxaCPqwMjobtVcVKvSHtAGe48MNhGjpK8LtVF8K0ISX7hCKl85LgtuaSneWVyQmaGcW3iXVV3GaZSLpmQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.2.tgz", + "integrity": "sha512-o5+eTUYzCJ11/+JhW5/FUCdfsdoYVdQ/8I/OveE2XsjehYn5DdeSnNQAbjYaO8gQ6hvGTN6GM6ddQqpTVG5j8g==", "dev": true }, "istanbul-lib-hook": { @@ -47398,9 +46288,9 @@ } }, "istanbul-lib-source-maps": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz", - "integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "requires": { "debug": "^4.1.1", @@ -47417,9 +46307,9 @@ } }, "istanbul-reports": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.3.tgz", - "integrity": "sha512-0i77ZFLsb9U3DHi22WzmIngVzfoyxxbQcZRqlF3KoKmCJGq9nhFHoGi8FqBztN2rE8w6hURnZghetn0xpkVb6A==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-bFjUnc95rHjdCR63WMHUS7yfJJh8T9IPSWavvR02hhjVwezWALZ5axF9EqjmwZHpXqkzbgAMP8DmAtiyNxrdrQ==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -47476,11 +46366,6 @@ "integrity": "sha1-o6vicYryQaKykE+EpiWXDzia4yo=", "dev": true }, - "js-search": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/js-search/-/js-search-2.0.0.tgz", - "integrity": "sha512-lJ8KzjlwcelIWuAdKyzsXv45W6OIwRpayzc7XmU8mzgWadg5UVOKVmnq/tXudddEB9Ceic3tVaGu6QOK/eebhg==" - }, "js-string-escape": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", @@ -47776,12 +46661,6 @@ "dotenv-expand": "^5.1.0" } }, - "leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true - }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -47854,21 +46733,6 @@ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", "dev": true }, - "linkify-it": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", - "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", - "dev": true, - "requires": { - "uc.micro": "^1.0.1" - } - }, - "listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=", - "dev": true - }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -48041,6 +46905,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, "requires": { "yallist": "^4.0.0" } @@ -48140,27 +47005,6 @@ "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", "dev": true }, - "markdown-it": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz", - "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "entities": "~2.0.0", - "linkify-it": "^2.0.0", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "dependencies": { - "entities": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz", - "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", - "dev": true - } - } - }, "markdown-table": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", @@ -49002,34 +47846,6 @@ } } }, - "monaco-editor": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.29.0.tgz", - "integrity": "sha512-7bOTapOZG8gNfzk9HJstNClnRjD9TEkVqo7qB3W6y+4cypS31A55MBQ7dpnEdnQBU+Hz3isyx61mi3/e05S7Xg==", - "dev": true - }, - "monaco-editor-webpack-plugin": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-5.0.0.tgz", - "integrity": "sha512-KrUUTmMO3lDCNK4honZ6rrrKjOI7FFLeyCktPetIo5HlRqr5dfE6ewaA9qNLH96XY7CekE3Z+v/+I6ufAs3ObA==", - "dev": true, - "requires": { - "loader-utils": "^2.0.0" - }, - "dependencies": { - "loader-utils": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", - "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - } - } - } - }, "move-concurrently": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", @@ -49088,12 +47904,6 @@ "minimatch": "^3.0.4" } }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, "mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", @@ -49108,7 +47918,8 @@ "version": "2.15.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", - "dev": true + "dev": true, + "optional": true }, "nanoid": { "version": "3.1.25", @@ -50080,28 +48891,6 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, "overlayscrollbars": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/overlayscrollbars/-/overlayscrollbars-1.13.1.tgz", @@ -50390,37 +49179,11 @@ "lines-and-columns": "^1.1.6" } }, - "parse-semver": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", - "integrity": "sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg=", - "dev": true, - "requires": { - "semver": "^5.1.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, "parse5": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" }, - "parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dev": true, - "requires": { - "parse5": "^6.0.1" - } - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -52086,15 +50849,6 @@ "use-latest": "^1.0.0" } }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", - "dev": true, - "requires": { - "mute-stream": "~0.0.4" - } - }, "read-package-json-fast": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", @@ -52823,12 +51577,6 @@ "neo-async": "^2.6.2" } }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, "saxes": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", @@ -52894,6 +51642,7 @@ "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, "requires": { "lru-cache": "^6.0.0" } @@ -54452,27 +53201,6 @@ "punycode": "^2.1.1" } }, - "traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", - "dev": true - }, - "tree-sitter-cli": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/tree-sitter-cli/-/tree-sitter-cli-0.20.0.tgz", - "integrity": "sha512-4D1qapWbJXZ5rrSUGM5rcw5Vuq/smzn9KbiFRhlON6KeuuXjra+KAtDYVrDgAoLIG4ku+jbEEGrJxCptUGi3dg==", - "dev": true - }, - "tree-sitter-java": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/tree-sitter-java/-/tree-sitter-java-0.19.1.tgz", - "integrity": "sha512-yVm+4q1D4niaHcEf2iqhOcIaiSp3wxHjeC4eoLAqSQNVxSrhThmT1FEfM4yDgHV4XaxH+62xpKHCwYG9NzRt6Q==", - "dev": true, - "requires": { - "nan": "^2.14.1" - } - }, "trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", @@ -54705,12 +53433,6 @@ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, - "tunnel": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", - "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", - "dev": true - }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -54726,12 +53448,6 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, - "txtgen": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/txtgen/-/txtgen-2.2.8.tgz", - "integrity": "sha512-b3wteOTrO1RPV1f6dhYaNz2G48a6dCH+pvTBRMdtjTWSeVBBE4rFypoc+2uT0F7OFSgBlOQefDuDvp9VYqA73g==", - "dev": true - }, "type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", @@ -54768,17 +53484,6 @@ "mime-types": "~2.1.24" } }, - "typed-rest-client": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.6.tgz", - "integrity": "sha512-xcQpTEAJw2DP7GqVNECh4dD+riS+C1qndXLfBCJ3xk0kqprtGN491P5KlmrDbKdtuW8NEcP/5ChxiJI3S9WYTA==", - "dev": true, - "requires": { - "qs": "^6.9.1", - "tunnel": "0.0.6", - "underscore": "^1.12.1" - } - }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -54800,12 +53505,6 @@ "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", "dev": true }, - "uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "dev": true - }, "unbox-primitive": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", @@ -54828,12 +53527,6 @@ "through": "^2.3.8" } }, - "underscore": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", - "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==", - "dev": true - }, "unfetch": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", @@ -55080,62 +53773,6 @@ "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", "dev": true }, - "unzipper": { - "version": "0.10.11", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", - "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", - "dev": true, - "requires": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "^1.0.12", - "graceful-fs": "^4.2.2", - "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", - "setimmediate": "~1.0.4" - }, - "dependencies": { - "bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, "upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", @@ -55253,12 +53890,6 @@ } } }, - "url-join": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz", - "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=", - "dev": true - }, "url-loader": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", @@ -55511,161 +54142,6 @@ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "dev": true }, - "vsce": { - "version": "1.100.1", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.100.1.tgz", - "integrity": "sha512-1VjLyse5g6e2eQ6jUpslu7IDq44velwF8Jy8s7ePdwGNuG8EzfmaOfVyig3ZSMJ0l8DiJmZllx5bRAB4RMdnHg==", - "dev": true, - "requires": { - "azure-devops-node-api": "^11.0.1", - "chalk": "^2.4.2", - "cheerio": "^1.0.0-rc.9", - "commander": "^6.1.0", - "denodeify": "^1.2.1", - "glob": "^7.0.6", - "hosted-git-info": "^4.0.2", - "leven": "^3.1.0", - "lodash": "^4.17.15", - "markdown-it": "^10.0.0", - "mime": "^1.3.4", - "minimatch": "^3.0.3", - "osenv": "^0.1.3", - "parse-semver": "^1.1.1", - "read": "^1.0.7", - "semver": "^5.1.0", - "tmp": "^0.2.1", - "typed-rest-client": "^1.8.4", - "url-join": "^1.1.0", - "xml2js": "^0.4.23", - "yauzl": "^2.3.1", - "yazl": "^2.2.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "vscode-jsonrpc": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", - "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==" - }, - "vscode-languageclient": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz", - "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==", - "requires": { - "minimatch": "^3.0.4", - "semver": "^7.3.4", - "vscode-languageserver-protocol": "3.16.0" - } - }, - "vscode-languageserver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", - "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", - "requires": { - "vscode-languageserver-protocol": "3.16.0" - } - }, - "vscode-languageserver-protocol": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", - "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", - "requires": { - "vscode-jsonrpc": "6.0.0", - "vscode-languageserver-types": "3.16.0" - }, - "dependencies": { - "vscode-languageserver-types": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", - "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" - } - } - }, - "vscode-languageserver-textdocument": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.2.tgz", - "integrity": "sha512-T7uPC18+f8mYE4lbVZwb3OSmvwTZm3cuFhrdx9Bn2l11lmp3SvSuSVjy2JtvrghzjAo4G6Trqny2m9XGnFnWVA==" - }, - "vscode-languageserver-types": { - "version": "3.17.0-next.4", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.0-next.4.tgz", - "integrity": "sha512-MraVkZDhfqa3ftnKW9rEDeqsV+ji8OrtEjx6mVjzVGm5U2XXT+mdqDWyQ+y0Gvb2/aa2oJJQyTAaDmRTUKiUbg==" - }, - "vscode-test": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.6.1.tgz", - "integrity": "sha512-086q88T2ca1k95mUzffvbzb7esqQNvJgiwY4h29ukPhFo8u+vXOOmelUoU5EQUHs3Of8+JuQ3oGdbVCqaxuTXA==", - "dev": true, - "requires": { - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "rimraf": "^3.0.2", - "unzipper": "^0.10.11" - } - }, "w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -55993,11 +54469,6 @@ "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" }, - "web-tree-sitter": { - "version": "0.19.4", - "resolved": "https://registry.npmjs.org/web-tree-sitter/-/web-tree-sitter-0.19.4.tgz", - "integrity": "sha512-8G0xBj05hqZybCqBtW7RPZ/hWEtP3DiLTauQzGJZuZYfVRgw7qj7iaZ+8djNqJ4VPrdOO+pS2dR1JsTbsLxdYg==" - }, "webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -56451,22 +54922,6 @@ "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", "dev": true }, - "xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dev": true, - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - } - }, - "xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "dev": true - }, "xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", @@ -56487,7 +54942,8 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "yaml": { "version": "1.10.2", @@ -56577,15 +55033,6 @@ "fd-slicer": "~1.1.0" } }, - "yazl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", - "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3" - } - }, "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/suggest/.rsync b/suggest/.rsync deleted file mode 100644 index ea5a5de249..0000000000 --- a/suggest/.rsync +++ /dev/null @@ -1 +0,0 @@ -../.templates/default.mk default.mk diff --git a/suggest/Makefile b/suggest/Makefile deleted file mode 100644 index 551e68e27a..0000000000 --- a/suggest/Makefile +++ /dev/null @@ -1 +0,0 @@ -include default.mk diff --git a/suggest/default.mk b/suggest/default.mk deleted file mode 100644 index a0d8dd28fb..0000000000 --- a/suggest/default.mk +++ /dev/null @@ -1,89 +0,0 @@ -# Please update /.templates/default.mk and sync: -# -# source scripts/functions.sh && rsync_files -# -SHELL := /usr/bin/env bash -ALPINE = $(shell which apk 2> /dev/null) -LIBNAME = $(shell basename $$(pwd)) -LANGUAGES ?= $(wildcard */) - -# https://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make -rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d)) - -default: $(patsubst %,default-%,$(LANGUAGES)) -.PHONY: default - -default-%: % - if [[ -d $< ]]; then cd $< && make default; fi -.PHONY: default-% - -# Need to declare these phonies to avoid errors for packages without a particular language -.PHONY: c dotnet go java javascript objective-c perl python ruby - -update-dependencies: $(patsubst %,update-dependencies-%,$(LANGUAGES)) -.PHONY: update-dependencies - -update-dependencies-%: % - if [[ -d $< ]]; then cd $< && make update-dependencies; fi -.PHONY: update-dependencies-% - -update-changelog: -ifdef NEW_VERSION - cat CHANGELOG.md | ../scripts/update_changelog.sh $(NEW_VERSION) > CHANGELOG.md.tmp - mv CHANGELOG.md.tmp CHANGELOG.md -else - @echo -e "\033[0;31mNEW_VERSION is not defined. Can't update version :-(\033[0m" - exit 1 -endif -.PHONY: update-changelog - -pre-release: update-changelog $(patsubst %,pre-release-%,$(LANGUAGES)) -.PHONY: pre-release - -pre-release-%: % - if [[ -d $< ]]; then cd $< && make pre-release; fi -.PHONY: pre-release-% - -release: publish -.PHONY: release - -publish: create-and-push-release-tag $(patsubst %,publish-%,$(LANGUAGES)) -.PHONY: publish - -publish-%: % - if [[ -d $< ]]; then cd $< && make publish; fi -.PHONY: publish-% - -create-and-push-release-tag: - [ -f '/home/cukebot/configure' ] && /home/cukebot/configure - git commit --gpg-sign --all --message "Release $(LIBNAME) v$(NEW_VERSION)" - git tag --sign "$(LIBNAME)/v$(NEW_VERSION)" -m "Release $(LIBNAME) v$(NEW_VERSION)" - git push --tags -.PHONY: create-and-push-release-tag - -post-release: $(patsubst %,post-release-%,$(LANGUAGES)) -.PHONY: post-release - -post-release: commit-and-push-post-release - -post-release-%: % - if [[ -d $< ]]; then cd $< && make post-release; fi -.PHONY: post-release-% - -commit-and-push-post-release: -ifdef NEW_VERSION - git push --tags - git commit --gpg-sign --all --message "Post release $(LIBNAME) v$(NEW_VERSION)" 2> /dev/null || true - git push -else - @echo -e "\033[0;31mNEW_VERSION is not defined.\033[0m" - exit 1 -endif -.PHONY: commit-and-push-post-release - -clean: $(patsubst %,clean-%,$(LANGUAGES)) -.PHONY: clean - -clean-%: % - if [[ -d $< ]]; then cd $< && make clean; fi -.PHONY: clean-% diff --git a/suggest/javascript/.gitignore b/suggest/javascript/.gitignore deleted file mode 100644 index 385b67bb27..0000000000 --- a/suggest/javascript/.gitignore +++ /dev/null @@ -1,19 +0,0 @@ -dist/ -.idea/ -.nyc_output/ -coverage/ -node_modules/ -yarn.lock -package-lock.json -*.log -.deps -.tested* -.linted -.built* -.compared -.codegen -acceptance/ -storybook-static -*-go -*.iml -.vscode-test diff --git a/suggest/javascript/.mocharc.json b/suggest/javascript/.mocharc.json deleted file mode 100644 index d5055eb10d..0000000000 --- a/suggest/javascript/.mocharc.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "require": ["tsconfig-paths/register", "ts-node/register", "source-map-support/register"], - "extension": ["ts", "tsx"], - "recursive": true, - "timeout": 10000 -} diff --git a/suggest/javascript/.rsync b/suggest/javascript/.rsync deleted file mode 100644 index 5592adbd0c..0000000000 --- a/suggest/javascript/.rsync +++ /dev/null @@ -1,2 +0,0 @@ -../../LICENSE LICENSE -../../.templates/javascript/ . diff --git a/suggest/javascript/.vscodeignore b/suggest/javascript/.vscodeignore deleted file mode 100644 index f369b5e55b..0000000000 --- a/suggest/javascript/.vscodeignore +++ /dev/null @@ -1,4 +0,0 @@ -.vscode/** -.vscode-test/** -.gitignore -vsc-extension-quickstart.md diff --git a/suggest/javascript/CHANGELOG.md b/suggest/javascript/CHANGELOG.md deleted file mode 100644 index cc8653914b..0000000000 --- a/suggest/javascript/CHANGELOG.md +++ /dev/null @@ -1,64 +0,0 @@ -# CHANGE LOG -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](http://keepachangelog.com/) -and this project adheres to [Semantic Versioning](http://semver.org/). - ----- -## [Unreleased] - -### Added - -### Changed - -* The `StepDocument` type now includes an `expression: Expression` field. - -### Deprecated - -### Removed - -### Fixed - -## [0.0.4] - 2021-09-15 - -### Changed - -* Upgrade to `@cucumber/cucumber-expressions 13.0.1` - -## [0.0.3] - 2021-09-01 - -### Added - -* Build choices based on all values for a parameter type, across steps - ([#1671](https://github.com/cucumber/common/pull/1671) - [aslakhellesoy]) - -## [0.0.2] - 2021-07-15 - -### Added - -* Added `suggestion` string property on `StepDocument` - ([#1657](https://github.com/cucumber/common/pull/1657) - [aslakhellesoy]) - -### Changed - -* The `StepDocument` type has changed to `{ suggestion: string, segments: StepSegments }` - ([#1657](https://github.com/cucumber/common/pull/1657) - [aslakhellesoy]) - -## [0.0.1] - -### Added - -* First release! - - -[Unreleased]: https://github.com/cucumber/common/compare/suggest/v0.0.4...main -[0.0.4]: https://github.com/cucumber/common/tree/suggest/v0.0.3 -[0.0.3]: https://github.com/cucumber/common/tree/suggest/v0.0.2 -[0.0.2]: https://github.com/cucumber/common/tree/suggest/v0.0.1 -[0.0.1]: https://github.com/cucumber/common/tree/suggest/v0.0.1 - - -[aslakhellesoy]: https://github.com/aslakhellesoy diff --git a/suggest/javascript/LICENSE b/suggest/javascript/LICENSE deleted file mode 100644 index 725ba9f4ac..0000000000 --- a/suggest/javascript/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Cucumber Ltd - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/suggest/javascript/Makefile b/suggest/javascript/Makefile deleted file mode 100644 index 551e68e27a..0000000000 --- a/suggest/javascript/Makefile +++ /dev/null @@ -1 +0,0 @@ -include default.mk diff --git a/suggest/javascript/Monaco.gif b/suggest/javascript/Monaco.gif deleted file mode 100644 index 7b9d89d649818c376cdbe842b0ed32e01adcd31b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167993 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

*kh88_|n1tt}h&EgBz#lr3sA0UZ`QVoY! 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 readonly StepDocument[]` - -There are three experimental search index implementations in this library: - -* `fuseIndex` (based on [Fuse.js](https://fusejs.io/)) -* `jsSearchIndex` (based on [JS Search](http://bvaughn.github.io/js-search/)) -* `bruteForceIndex` (based on [String.prototype.includes()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/includes)) - -They are currently only in the test code, but one of them might be promoted to be part of the library at a later stage -when we have tried them out on real data. - -See the `Index.test.ts` contract test for more details about how the indexes behave. - -### Not in this library - -It's beyond the scope of this library to implement an LSP server. -An LSP server could be built on this library though. - -It is also beyond the scope of this library to provide any kind of UI component. -For LSP-capable editors this isn't even needed - it is built into the editor. - -For non-LSP capable editors written in JavaScript (such as CodeMirror) it would be possible to -build an auto-complete plugin that uses one of the `Index` implementations in this library. -Building the `StepDocument`s could happen on a server somewhere, and could be transferred to -the browser over HTTP/JSON. diff --git a/suggest/javascript/cucumber.js b/suggest/javascript/cucumber.js deleted file mode 100644 index 8b06ffad1b..0000000000 --- a/suggest/javascript/cucumber.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - default: "--publish-quiet --require features/support/env.js --require 'features/**/*.ts' README.md", - lsp: "--publish-quiet --require features/support/env.js --require 'features/**/*.ts' README.md --dry-run --format message", -} diff --git a/suggest/javascript/default.mk b/suggest/javascript/default.mk deleted file mode 100644 index b04d59c4a2..0000000000 --- a/suggest/javascript/default.mk +++ /dev/null @@ -1,87 +0,0 @@ -SHELL := /usr/bin/env bash -# https://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make -rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d)) -TYPESCRIPT_SOURCE_FILES = $(sort $(call rwildcard,src test,*.ts *.tsx)) -PRIVATE = $(shell node -e "console.log(require('./package.json').private)") -IS_TESTDATA = $(findstring -testdata,${CURDIR}) -NPM_MODULE = $(shell cat package.json | jq .name --raw-output) - -default: .tested -.PHONY: default - -../../node_modules ../../package-lock.json: package.json - cd ../.. && npm install - -.codegen: - touch $@ - -.tested: .tested-npm .built - -.built: $(TYPESCRIPT_SOURCE_FILES) ../../node_modules ../../package-lock.json .codegen - pushd ../.. && \ - npm run build && \ - popd && \ - touch $@ - -.tested-npm: $(TYPESCRIPT_SOURCE_FILES) ../../node_modules ../../package-lock.json .codegen - npm run test - touch $@ - -pre-release: clean update-version update-dependencies default -.PHONY: pre-release - -update-dependencies: ../../node_modules ../../package-lock.json - ../../node_modules/.bin/npm-check-updates --upgrade --reject hast-util-sanitize,@types/node,react-markdown,rehype-raw,rehype-sanitize,remark-gfm -.PHONY: update-dependencies - -update-version: -ifeq ($(IS_TESTDATA),-testdata) - # no-op -else -ifdef NEW_VERSION - npm --no-git-tag-version --allow-same-version version "$(NEW_VERSION)" - # Update all npm packages that depend on us - pushd ../.. && \ - ./scripts/npm-each update_npm_dependency_if_exists package.json "$(NPM_MODULE)" "$(NEW_VERSION)" -else - @echo -e "\033[0;31mNEW_VERSION is not defined. Can't update version :-(\033[0m" - exit 1 -endif -endif -.PHONY: update-version - -publish: .codegen -ifeq ($(IS_TESTDATA),-testdata) - # no-op -else -ifneq (true,$(PRIVATE)) - npm publish --access public -else - @echo "Not publishing private npm module" -endif -endif -.PHONY: publish - -post-release: -.PHONY: post-release - -clean: clean-javascript -.PHONY: clean - -clean-javascript: - rm -rf .deps .codegen .tested* coverage dist acceptance -.PHONY: clean-javascript - -clobber: clean - rm -rf node_modules ../../node_modules -.PHONY: clobber - -### COMMON stuff for all platforms - -BERP_VERSION = 1.3.0 -BERP_GRAMMAR = gherkin.berp - -define berp-generate-parser = --! dotnet tool list --tool-path /usr/bin | grep "berp\s*$(BERP_VERSION)" && dotnet tool update Berp --version $(BERP_VERSION) --tool-path /usr/bin -berp -g $(BERP_GRAMMAR) -t $< -o $@ --noBOM -endef diff --git a/suggest/javascript/features/step_definitions/steps.ts b/suggest/javascript/features/step_definitions/steps.ts deleted file mode 100644 index 773aba0e52..0000000000 --- a/suggest/javascript/features/step_definitions/steps.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { DataTable, Given, Then, When } from '@cucumber/cucumber' -import World from '../support/World' -import assert from 'assert' -import { ExpressionFactory, ParameterTypeRegistry } from '@cucumber/cucumber-expressions' -import { lspCompletionSnippet, bruteForceIndex, buildStepDocuments } from '../../src' - -Given('the following Gherkin step texts exist:', function (this: World, stepsTable: DataTable) { - this.steps = stepsTable.rows().map((row) => row[0]) -}) - -Given( - 'the following Step Definitions exist:', - function (this: World, stepDefinitionsTable: DataTable) { - const parameterTypeRegistry = new ParameterTypeRegistry() - const expressionFactory = new ExpressionFactory(parameterTypeRegistry) - this.expressions = stepDefinitionsTable.rows().map((row) => { - const expressionSource = row[0] - const match = expressionSource.match(/^\/(.*)\/$/) - const stringOrRegexp = match ? new RegExp(match[1]) : expressionSource - return expressionFactory.createExpression(stringOrRegexp) - }) - } -) - -When('I type {string}', function (this: World, text: string) { - const stepDocuments = buildStepDocuments(this.steps, this.expressions) - const index = bruteForceIndex(stepDocuments) - this.suggestedStepDocuments = index(text) -}) - -When('I select the {ordinal} snippet', function (this: World, selectedSuggestionIndex: number) { - this.selectedSuggestionIndex = selectedSuggestionIndex -}) - -Then('the suggestions should be:', function (this: World, expectedSuggetionsTable: DataTable) { - const expectedSuggestions: readonly string[] = expectedSuggetionsTable.rows().map((row) => row[0]) - assert.deepStrictEqual( - this.suggestedStepDocuments.map((doc) => doc.suggestion), - expectedSuggestions - ) -}) - -Then('the suggestions should be empty', function (this: World) { - assert.deepStrictEqual(this.suggestedStepDocuments, []) -}) - -Then('the LSP snippet should be {string}', function (this: World, expectedText: string) { - const selectedSuggestion = this.suggestedStepDocuments[this.selectedSuggestionIndex] - assert.strictEqual(lspCompletionSnippet(selectedSuggestion.segments), expectedText) -}) diff --git a/suggest/javascript/features/support/World.ts b/suggest/javascript/features/support/World.ts deleted file mode 100644 index f69b643362..0000000000 --- a/suggest/javascript/features/support/World.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { setWorldConstructor, defineParameterType } from '@cucumber/cucumber' -import { Expression } from '@cucumber/cucumber-expressions' -import { StepDocument } from '../../src' - -defineParameterType({ - name: 'ordinal', - regexp: /(\d+)(?:st|nd|rd|th)/, - transformer(s) { - return +s - 1 - }, -}) - -export default class World { - /** - * The known Gherkin steps - */ - steps: readonly string[] = [] - - /** - * The known [Cucumber|Regular]Expressions from the step definitions - */ - expressions: readonly Expression[] = [] - - /** - * The results of calling the index(text) function - */ - suggestedStepDocuments: readonly StepDocument[] - - /** - * The index of the selected suggestion - */ - selectedSuggestionIndex: number -} - -setWorldConstructor(World) diff --git a/suggest/javascript/features/support/env.js b/suggest/javascript/features/support/env.js deleted file mode 100644 index 21c88add72..0000000000 --- a/suggest/javascript/features/support/env.js +++ /dev/null @@ -1,4 +0,0 @@ -require('ts-node').register({ - transpileOnly: true -}) -require('source-map-support/register') diff --git a/suggest/javascript/package.json b/suggest/javascript/package.json deleted file mode 100644 index c7af286f16..0000000000 --- a/suggest/javascript/package.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "name": "@cucumber/suggest", - "version": "0.0.4", - "description": "Library for suggesting steps", - "main": "dist/src/index.js", - "types": "dist/src/index.d.ts", - "scripts": { - "test": "npm run cucumber && npm run mocha", - "mocha": "mocha", - "cucumber": "cucumber-js", - "prepublishOnly": "tsc --build tsconfig.build.json", - "build-wasm": "npx tree-sitter build-wasm ../../node_modules/tree-sitter-java" - }, - "repository": { - "type": "git", - "url": "git://github.com/cucumber/cucumber.git" - }, - "keywords": [ - "cucumber", - "suggest", - "autocomplete" - ], - "author": "Cucumber Limited ", - "license": "MIT", - "bugs": { - "url": "https://github.com/cucumber/common/issues" - }, - "homepage": "https://github.com/cucumber/common#readme", - "devDependencies": { - "@cucumber/cucumber": "7.3.1", - "@types/js-search": "1.4.0", - "@types/mocha": "9.0.0", - "@types/node": "14.17.21", - "mocha": "9.1.2", - "txtgen": "2.2.8", - "tree-sitter-cli": "0.20.0", - "tree-sitter-java": "0.19.1", - "ts-node": "10.2.1", - "typescript": "4.4.3" - }, - "dependencies": { - "@cucumber/cucumber-expressions": "^13.0.1", - "fuse.js": "6.4.6", - "js-search": "2.0.0", - "web-tree-sitter": "0.19.4" - } -} diff --git a/suggest/javascript/src/buildStepDocuments.ts b/suggest/javascript/src/buildStepDocuments.ts deleted file mode 100644 index ae76d80cb3..0000000000 --- a/suggest/javascript/src/buildStepDocuments.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { StepDocument } from './types' -import { Expression } from '@cucumber/cucumber-expressions' - -type TextOrParameterTypeNameExpression = TextOrParameterTypeNameSegment[] -type TextOrParameterTypeNameSegment = string | ParameterTypeData -type ParameterTypeData = { name: string; regexpStrings: string } - -/** - * Builds an array of {@link StepDocument} from steps and step definitions. - * - * @param stepTexts - * @param expressions - * @param maxChoices - */ -export function buildStepDocuments( - stepTexts: readonly string[], - expressions: readonly Expression[], - maxChoices = 10 -): readonly StepDocument[] { - const jsonTextOrParameterTypeNameExpression = new Set() - const choicesByParameterTypeRegexpStrings = new Map>() - const expressionByJson = new Map() - - for (const expression of expressions) { - for (const text of stepTexts) { - const args = expression.match(text) - if (args) { - const parameterTypes = args.map((arg) => arg.getParameterType()) - const textOrParameterTypeNameExpression: TextOrParameterTypeNameExpression = [] - let index = 0 - for (let argIndex = 0; argIndex < args.length; argIndex++) { - const arg = args[argIndex] - - const segment = text.substring(index, arg.group.start) - textOrParameterTypeNameExpression.push(segment) - const parameterType = parameterTypes[argIndex] - const regexpStrings = parameterType.regexpStrings.join('|') - textOrParameterTypeNameExpression.push({ name: parameterType.name || '', regexpStrings }) - let choices = choicesByParameterTypeRegexpStrings.get(regexpStrings) - if (!choices) { - choices = new Set() - choicesByParameterTypeRegexpStrings.set(regexpStrings, choices) - } - choices.add(arg.group.value) - - index = arg.group.end - } - const lastSegment = text.substring(index) - if (lastSegment !== '') { - textOrParameterTypeNameExpression.push(lastSegment) - } - const json = JSON.stringify(textOrParameterTypeNameExpression) - expressionByJson.set(json, expression) - jsonTextOrParameterTypeNameExpression.add(json) - } - } - } - - return [...jsonTextOrParameterTypeNameExpression].sort().map((json) => { - const textOrParameterTypeNameExpression: TextOrParameterTypeNameExpression = JSON.parse(json) - const expression = expressionByJson.get(json) - - const suggestion = textOrParameterTypeNameExpression - .map((segment) => { - if (typeof segment === 'string') { - return segment - } else { - return `{${segment.name}}` - } - }) - .join('') - - const segments = textOrParameterTypeNameExpression.map((segment) => { - if (typeof segment === 'string') { - return segment - } else { - const choices = choicesByParameterTypeRegexpStrings.get(segment.regexpStrings) - return [...choices].sort().slice(0, maxChoices) - } - }) - - const stepDocument: StepDocument = { - suggestion, - segments, - expression - } - - return stepDocument - }) -} diff --git a/suggest/javascript/src/expressions/java.ts b/suggest/javascript/src/expressions/java.ts deleted file mode 100644 index bda7f40d33..0000000000 --- a/suggest/javascript/src/expressions/java.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { Expression, ExpressionFactory, ParameterType, ParameterTypeRegistry } from '@cucumber/cucumber-expressions' -import Parser from 'web-tree-sitter' - -export function buildExpressions(parser: Parser, Java: Parser.Language, sources: string[]): readonly Expression[] { - let matches: Parser.QueryMatch[] = [] - for (const source of sources) { - matches = matches.concat(queryMethodAnnotations(parser, Java, source)) - } - const parameterTypeRegistry = new ParameterTypeRegistry() - - for (const match of matches) { - const parameterType = buildParameterType(match) - if(parameterType) { - parameterTypeRegistry.defineParameterType(parameterType) - } - } - - let expressions: Expression[] = [] - const expressionFactory = new ExpressionFactory(parameterTypeRegistry) - for (const match of matches) { - const expression = buildExpression(match, expressionFactory) - if(expression) { - expressions.push(expression) - } - } - return expressions -} - -function queryMethodAnnotations(parser: Parser, Java: Parser.Language, source: string): readonly Parser.QueryMatch[] { - parser.setLanguage(Java) - const tree = parser.parse(source) - // See https://github.com/tree-sitter/tree-sitter/issues/1392 - const methodAnnotationQuery = Java.query(` -(method_declaration - (modifiers - (annotation - name: [(identifier) (scoped_identifier)] @annotation-name - arguments: (annotation_argument_list - (string_literal)? @literal-value - ) - ) - ) - name: (identifier) @method-name -) - `) - return methodAnnotationQuery.matches(tree.rootNode) -} - -function buildParameterType(match: Parser.QueryMatch): ParameterType | null { - const annotationNameNode = match.captures.find(c => c.name === 'annotation-name').node - const annotationName = annotationNameNode.text - if (!isParameterType(annotationName)) return null - - let name = match.captures.find(c => c.name === 'method-name').node.text - let quotedRegexp: string - const literalValue = match.captures.find(c => c.name === 'literal-value') - if (literalValue) { - quotedRegexp = literalValue.node.text - } else { - const annotationNode = annotationNameNode.parent - const pairs = annotationNode.descendantsOfType('element_value_pair') - for (const pair of pairs) { - const key = pair.childForFieldName('key') - const value = pair.childForFieldName('value') - if (key.text === 'name') { - name = value.text.substring(1, value.text.length - 1) - } - if (key.text === 'value') { - quotedRegexp = value.text - } - } - } - const regexps = quotedRegexp.substring(1, quotedRegexp.length -1) - return new ParameterType( - name, - regexps, - Object, - () => undefined, - false, - false - ) -} - - -function buildExpression(match: Parser.QueryMatch, expressionFactory: ExpressionFactory): Expression | null { - const annotationNameNode = match.captures.find(c => c.name === 'annotation-name').node - const annotationName = annotationNameNode.text - if (!isStep(annotationName)) return null - - const literalValue = match.captures.find(c => c.name === 'literal-value').node.text - return expressionFactory.createExpression(literalValue.substring(1, literalValue.length - 1)) -} - -function isParameterType(annotation: any) { - return ['ParameterType', 'io.cucumber.java.ParameterType'].includes(annotation) -} - -function isStep(annotation: string) { - return ['Given', 'When', 'Then'].includes(annotation) -} - diff --git a/suggest/javascript/src/index.ts b/suggest/javascript/src/index.ts deleted file mode 100644 index 52cf893db3..0000000000 --- a/suggest/javascript/src/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './types' -export * from './buildStepDocuments' -export * from './lspCompletionSnippet' -export * from './index/index' diff --git a/suggest/javascript/src/index/bruteForceIndex.ts b/suggest/javascript/src/index/bruteForceIndex.ts deleted file mode 100644 index ecdc932e86..0000000000 --- a/suggest/javascript/src/index/bruteForceIndex.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Index } from './types' -import { StepDocument } from '../types' - -/** - * A brute force (not very performant or fuzzy-search capable) index that matches permutation expressions with string.includes() - * - * @param stepDocuments - */ -export function bruteForceIndex(stepDocuments: readonly StepDocument[]): Index { - return (text) => { - if (!text) return [] - const predicate = (segment: string) => segment.toLowerCase().includes(text.toLowerCase()) - return stepDocuments.filter((permutationExpression) => - matches(permutationExpression, predicate) - ) - } -} - -function matches(stepDocument: StepDocument, predicate: (segment: string) => boolean): boolean { - return !!stepDocument.segments.find((segment) => - typeof segment === 'string' ? predicate(segment) : !!segment.find(predicate) - ) -} diff --git a/suggest/javascript/src/index/fuseIndex.ts b/suggest/javascript/src/index/fuseIndex.ts deleted file mode 100644 index 79c33bf4ac..0000000000 --- a/suggest/javascript/src/index/fuseIndex.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Index } from './types' -import { StepDocument } from '../types' -import Fuse from 'fuse.js' - -type Doc = { - text: string -} - -export function fuseIndex(stepDocuments: readonly StepDocument[]): Index { - const docs: Doc[] = stepDocuments.map((stepDocument) => { - return { - text: stepDocument.segments - .map((segment) => (typeof segment === 'string' ? segment : segment.join(' '))) - .join(''), - } - }) - const fuse = new Fuse(docs, { - keys: ['text'], - minMatchCharLength: 2, - threshold: 0.1, - ignoreLocation: true, - }) - - return (text) => { - if (!text) return [] - const results = fuse.search(text, { limit: 10 }) - return results.map((result) => stepDocuments[result.refIndex]) - } -} diff --git a/suggest/javascript/src/index/index.ts b/suggest/javascript/src/index/index.ts deleted file mode 100644 index 56e94ee8f2..0000000000 --- a/suggest/javascript/src/index/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './types' -export * from './bruteForceIndex' -export * from './fuseIndex' -export * from './jsSearchIndex' diff --git a/suggest/javascript/src/index/jsSearchIndex.ts b/suggest/javascript/src/index/jsSearchIndex.ts deleted file mode 100644 index 6ea9024539..0000000000 --- a/suggest/javascript/src/index/jsSearchIndex.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Index } from './types' -import { StepDocument } from '../types' -import { Search } from 'js-search' - -type Doc = { - id: number - text: string -} - -export function jsSearchIndex(stepDocuments: readonly StepDocument[]): Index { - const docs: Doc[] = stepDocuments.map((stepDocument, id) => { - return { - id, - text: stepDocument.segments - .map((segment) => (typeof segment === 'string' ? segment : segment.join(' '))) - .join(''), - } - }) - - const search = new Search('id') - search.addIndex('text') - search.addDocuments(docs) - - return (text) => { - if (!text) return [] - const results = search.search(text) - return results.map((result: Doc) => stepDocuments[result.id]) - } -} diff --git a/suggest/javascript/src/index/types.ts b/suggest/javascript/src/index/types.ts deleted file mode 100644 index 99ae2dd688..0000000000 --- a/suggest/javascript/src/index/types.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { StepDocument } from '../types' - -/** - * A search index function. - * - * @param text a text to search for - * @return results in the form of step documents - */ -export type Index = (text: string) => readonly StepDocument[] diff --git a/suggest/javascript/src/lspCompletionSnippet.ts b/suggest/javascript/src/lspCompletionSnippet.ts deleted file mode 100644 index 46d4746238..0000000000 --- a/suggest/javascript/src/lspCompletionSnippet.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Generates an [LSP Completion Snippet]{@link https://microsoft.github.io/language-server-protocol/specifications/specification-3-17/#snippet_syntax} - * - * @param expression the expression to generate the snippet from - */ -import { StepSegments } from './types' - -export function lspCompletionSnippet(stepSegments: StepSegments): string { - let n = 1 - return stepSegments - .map((segment) => (Array.isArray(segment) ? lspPlaceholder(n++, segment) : segment)) - .join('') -} - -function lspPlaceholder(i: number, choices: readonly string[]) { - return `\${${i}|${choices.join(',')}|}` -} diff --git a/suggest/javascript/src/types.ts b/suggest/javascript/src/types.ts deleted file mode 100644 index 9ee59424ee..0000000000 --- a/suggest/javascript/src/types.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Expression } from '@cucumber/cucumber-expressions' - -/** - * A document that can be indexed. It's recommended to index the segments rather than the suggestion. - * When indexing the segments, the nested arrays (representing choices) may be given lower weight - * than the string segments (which represent the "sentence") - */ -export type StepDocument = { - /** - * The suggestion is what the user will see in the autocomplete. - */ - suggestion: string - - /** - * The segments are used to build the contents that will be inserted into the editor - * after selecting a suggestion. - * - * For LSP compatible editors, this can be formatted to an LSP snippet with the - * lspCompletionSnippet function. - */ - segments: StepSegments - - /** - * The Cucumber Expression or Regular Expression - */ - expression: Expression -} - -export type StepSegments = readonly StepSegment[] -type Text = string -type Choices = readonly string[] -export type StepSegment = Text | Choices diff --git a/suggest/javascript/test/buildStepDocuments.test.ts b/suggest/javascript/test/buildStepDocuments.test.ts deleted file mode 100644 index f819efdd0a..0000000000 --- a/suggest/javascript/test/buildStepDocuments.test.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { Expression, ExpressionFactory, ParameterTypeRegistry } from '@cucumber/cucumber-expressions' -import assert from 'assert' -import { StepDocument, buildStepDocuments } from '../src' - -describe('buildStepDocuments', () => { - it('builds step documents with global choices', () => { - const ef = new ExpressionFactory(new ParameterTypeRegistry()) - const e1 = ef.createExpression('The {word} song') - const e2 = ef.createExpression('The {word} boat') - - assertStepDocuments( - ['The nice song', 'The big boat'], - [e1, e2], - [ - { - suggestion: 'The {word} boat', - segments: ['The ', ['big', 'nice'], ' boat'], - expression: e2 - }, - { - suggestion: 'The {word} song', - segments: ['The ', ['big', 'nice'], ' song'], - expression: e1 - }, - ] - ) - }) - - it('builds step documents from CucumberExpression', () => { - const ef = new ExpressionFactory(new ParameterTypeRegistry()) - const expression = ef.createExpression('I have {int} cukes in/on my {word}') - assertStepDocuments( - [ - 'I have 42 cukes in my belly', - 'I have 54 cukes on my table', - 'I have 54 cukes in my basket', - ], - [expression], - [ - { - suggestion: 'I have {int} cukes in my {word}', - segments: ['I have ', ['42', '54'], ' cukes in my ', ['basket', 'belly', 'table']], - expression - }, - { - suggestion: 'I have {int} cukes on my {word}', - segments: ['I have ', ['42', '54'], ' cukes on my ', ['basket', 'belly', 'table']], - expression, - }, - ] - ) - }) - - it('builds step documents from RegularExpression', () => { - const ef = new ExpressionFactory(new ParameterTypeRegistry()) - const expression = ef.createExpression(/I have (\d\d) cukes in my "(belly|suitcase)"/) - assertStepDocuments( - ['I have 42 cukes in my "belly"', 'I have 54 cukes in my "suitcase"'], - [expression], - [ - { - suggestion: 'I have {} cukes in my "{}"', - segments: ['I have ', ['42', '54'], ' cukes in my "', ['belly', 'suitcase'], '"'], - expression - }, - ] - ) - }) - - it('builds step documents with a max number of choices', () => { - const ef = new ExpressionFactory(new ParameterTypeRegistry()) - const expression = ef.createExpression('I have {int} cukes in/on my {word}') - assertStepDocuments( - [ - 'I have 42 cukes in my belly', - 'I have 54 cukes on my table', - 'I have 67 cukes in my belly', - 'I have 54 cukes in my basket', - ], - [expression], - [ - { - suggestion: 'I have {int} cukes in my {word}', - segments: ['I have ', ['42', '54'], ' cukes in my ', ['basket', 'belly']], - expression, - }, - { - suggestion: 'I have {int} cukes on my {word}', - segments: ['I have ', ['42', '54'], ' cukes on my ', ['basket', 'belly']], - expression, - }, - ], - 2 - ) - }) -}) - -function assertStepDocuments( - stepTexts: readonly string[], - expressions: readonly Expression[], - expectedStepDocuments: StepDocument[], - maxChoices = 10 -) { - const stepDocuments = buildStepDocuments( - stepTexts, - expressions, - maxChoices - ) - assert.deepStrictEqual(stepDocuments, expectedStepDocuments) -} diff --git a/suggest/javascript/test/expressions/java.test.ts b/suggest/javascript/test/expressions/java.test.ts deleted file mode 100644 index e0a6587cbe..0000000000 --- a/suggest/javascript/test/expressions/java.test.ts +++ /dev/null @@ -1,59 +0,0 @@ -import Parser from 'web-tree-sitter' -import assert from 'assert' -import { buildExpressions } from '../../src/expressions/java' - -describe('buildExpressions', () => { - let parser: Parser - let Java: Parser.Language - - beforeEach(async () => { - await Parser.init() - parser = new Parser() - Java = await Parser.Language.load('tree-sitter-java.wasm') - parser.setLanguage(Java) - }) - - it('builds expressions from .java source', async () => { - const stepdefs = ` -class StepDefinitions { - @Given("I have {int} cukes in my belly" ) - void method1() { - } - - @When( "you have some time") - void method2() { - } - - @Then("a {iso-date}") - void method3() { - } - - @Then("a {date}") - void method4() { - } -} -` - - const parameterTypes = ` -class ParameterTypes { - @ParameterType("(?:.*) \\\\d{1,2}, \\\\d{4}") - public Date date(String date) throws ParseException { - return getDateInstance(MEDIUM, ENGLISH).parse(date); - } - - @ParameterType(name = "iso-date", value = "\\\\d{4}-\\\\d{2}-\\\\d{2}") - public Date isoDate(String date) throws ParseException { - return new SimpleDateFormat("yyyy-mm-dd").parse(date); - } -} -` - - const expressions = buildExpressions(parser, Java, [stepdefs, parameterTypes]) - assert.deepStrictEqual(expressions.map(e => e.source), [ - 'I have {int} cukes in my belly', - 'you have some time', - 'a {iso-date}', - 'a {date}', - ]) - }) -}) diff --git a/suggest/javascript/test/index/Index.test.ts b/suggest/javascript/test/index/Index.test.ts deleted file mode 100644 index c31a261b5b..0000000000 --- a/suggest/javascript/test/index/Index.test.ts +++ /dev/null @@ -1,91 +0,0 @@ -import assert from 'assert' -import { Index, StepDocument, bruteForceIndex, fuseIndex, jsSearchIndex } from '../../src' -import * as txtgen from 'txtgen' -import { ExpressionFactory, ParameterTypeRegistry } from '@cucumber/cucumber-expressions' - -type BuildIndex = (stepDocuments: readonly StepDocument[]) => Index - -function verifyIndexContract(name: string, buildIndex: BuildIndex) { - describe(name, () => { - describe('basics', () => { - const ef = new ExpressionFactory(new ParameterTypeRegistry()) - - const doc1: StepDocument = { - suggestion: 'I have {int} cukes in my belly', - segments: ['I have ', ['42', '98'], ' cukes in my belly'], - expression: ef.createExpression('I have {int} cukes in my belly') - } - const doc2: StepDocument = { - suggestion: 'I am a teapot', - segments: ['I am a teapot'], - expression: ef.createExpression('I am a teapot') - } - let index: Index - beforeEach(() => { - index = buildIndex([doc1, doc2]) - }) - - it('matches two words in the beginning of an expression', () => { - const suggestions = index('have') - assert.deepStrictEqual(suggestions, [doc1]) - }) - - it('matches a word in an expression', () => { - const suggestions = index('cukes') - assert.deepStrictEqual(suggestions, [doc1]) - }) - - it('matches a word in a choice', () => { - const suggestions = index('98') - assert.deepStrictEqual(suggestions, [doc1]) - }) - - it('matches nothing', () => { - const suggestions = index('nope') - assert.deepStrictEqual(suggestions, []) - }) - }) - - describe('performance / fuzz', () => { - it('matches how quickly exactly?', () => { - const ef = new ExpressionFactory(new ParameterTypeRegistry()) - for (let i = 0; i < 100; i++) { - const length = 100 - const stepDocuments: StepDocument[] = Array(length) - .fill(0) - .map(() => { - const sentence = txtgen.sentence() - return { - suggestion: sentence, - segments: [sentence], - expression: ef.createExpression(sentence) - } - }) - const index = buildIndex(stepDocuments) - - const sentence = stepDocuments[Math.floor(length / 2)].segments[0] as string - const words = sentence.split(' ') - // Find a word longer than 5 letters (fall back to the middle word if there are none) - const word = words.find((word) => word.length > 5) || words[Math.floor(words.length / 2)] - const term = word.replace(/[.?!;,']/g, '').toLowerCase() - - const suggestions = index(term) - if (suggestions.length === 0) { - console.error(`WARNING: ${name} - no hits for "${term}"`) - } - for (const suggestion of suggestions) { - const s = (suggestion.segments[0] as string).toLowerCase() - if (!s.includes(term)) { - // console.log(JSON.stringify(stepDocuments, null, 2)) - console.error(`WARNING: ${name} - "${s}" does not include "${term}"`) - } - } - } - }) - }) - }) -} - -verifyIndexContract('bruteForceIndex', bruteForceIndex) -verifyIndexContract('fuseIndex', fuseIndex) -verifyIndexContract('jsSearchIndex', jsSearchIndex) diff --git a/suggest/javascript/test/lspSnippet.test.ts b/suggest/javascript/test/lspSnippet.test.ts deleted file mode 100644 index 92c9406a1d..0000000000 --- a/suggest/javascript/test/lspSnippet.test.ts +++ /dev/null @@ -1,17 +0,0 @@ -import assert from 'assert' -import { StepSegments, lspCompletionSnippet } from '../src' - -describe('lspSnippet', () => { - it('converts a PermutationExpression to an LSP snippet', () => { - const stepSegments: StepSegments = [ - 'I have ', - ['42', '54'], - ' cukes in my ', - ['basket', 'belly', 'table'], - ] - assert.strictEqual( - lspCompletionSnippet(stepSegments), - 'I have ${1|42,54|} cukes in my ${2|basket,belly,table|}' - ) - }) -}) diff --git a/suggest/javascript/tree-sitter-java.wasm b/suggest/javascript/tree-sitter-java.wasm deleted file mode 100755 index 5de1ba3347828be013a94ee4cf2223065d804b3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 232273 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 diff --git a/suggest/javascript/tsconfig.build.json b/suggest/javascript/tsconfig.build.json deleted file mode 100644 index 98f530f48a..0000000000 --- a/suggest/javascript/tsconfig.build.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../tsconfig.build.json", - "compilerOptions": { - "rootDir": ".", - "outDir": "dist" - }, - "include": [ - "package.json", - "src", - "test" - ] -} diff --git a/suggest/javascript/tsconfig.json b/suggest/javascript/tsconfig.json deleted file mode 100644 index 4082f16a5d..0000000000 --- a/suggest/javascript/tsconfig.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "../../tsconfig.json" -} diff --git a/tsconfig.build.json b/tsconfig.build.json index 375fcabd78..4089755a5a 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -42,21 +42,6 @@ }, { "path": "./json-to-messages/javascript-testdata/tsconfig.build.json" - }, - { - "path": "./suggest/javascript/tsconfig.build.json" - }, - { - "path": "./language-service/javascript/tsconfig.build.json" - }, - { - "path": "./language-server/javascript/tsconfig.build.json" - }, - { - "path": "./monaco/javascript/tsconfig.build.json" - }, - { - "path": "./vscode/javascript/tsconfig.build.json" } ] } diff --git a/tsconfig.json b/tsconfig.json index 08c648c65a..d67f53f4e0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,12 +12,7 @@ "@cucumber/fake-cucumber": ["fake-cucumber/javascript/src/index.ts"], "@cucumber/query": ["query/javascript/src/index.ts"], "@cucumber/compatibility-kit": ["compatibility-kit/javascript/src/index.ts"], - "@cucumber/react": ["react/javascript/src/index.ts"], - "@cucumber/suggest": ["suggest/javascript/src/index.ts"], - "@cucumber/language-service": ["language-service/javascript/src/index.ts"], - "@cucumber/language-server": ["language-server/javascript/src/index.ts"], - "@cucumber/monaco": ["monaco/javascript/src/index.ts"], - "@cucumber/vscode": ["vscode/javascript/src/index.ts"] + "@cucumber/react": ["react/javascript/src/index.ts"] }, "noEmit": true } diff --git a/vscode/.rsync b/vscode/.rsync deleted file mode 100644 index ea5a5de249..0000000000 --- a/vscode/.rsync +++ /dev/null @@ -1 +0,0 @@ -../.templates/default.mk default.mk diff --git a/vscode/Makefile b/vscode/Makefile deleted file mode 100644 index 551e68e27a..0000000000 --- a/vscode/Makefile +++ /dev/null @@ -1 +0,0 @@ -include default.mk diff --git a/vscode/default.mk b/vscode/default.mk deleted file mode 100644 index a0d8dd28fb..0000000000 --- a/vscode/default.mk +++ /dev/null @@ -1,89 +0,0 @@ -# Please update /.templates/default.mk and sync: -# -# source scripts/functions.sh && rsync_files -# -SHELL := /usr/bin/env bash -ALPINE = $(shell which apk 2> /dev/null) -LIBNAME = $(shell basename $$(pwd)) -LANGUAGES ?= $(wildcard */) - -# https://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make -rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d)) - -default: $(patsubst %,default-%,$(LANGUAGES)) -.PHONY: default - -default-%: % - if [[ -d $< ]]; then cd $< && make default; fi -.PHONY: default-% - -# Need to declare these phonies to avoid errors for packages without a particular language -.PHONY: c dotnet go java javascript objective-c perl python ruby - -update-dependencies: $(patsubst %,update-dependencies-%,$(LANGUAGES)) -.PHONY: update-dependencies - -update-dependencies-%: % - if [[ -d $< ]]; then cd $< && make update-dependencies; fi -.PHONY: update-dependencies-% - -update-changelog: -ifdef NEW_VERSION - cat CHANGELOG.md | ../scripts/update_changelog.sh $(NEW_VERSION) > CHANGELOG.md.tmp - mv CHANGELOG.md.tmp CHANGELOG.md -else - @echo -e "\033[0;31mNEW_VERSION is not defined. Can't update version :-(\033[0m" - exit 1 -endif -.PHONY: update-changelog - -pre-release: update-changelog $(patsubst %,pre-release-%,$(LANGUAGES)) -.PHONY: pre-release - -pre-release-%: % - if [[ -d $< ]]; then cd $< && make pre-release; fi -.PHONY: pre-release-% - -release: publish -.PHONY: release - -publish: create-and-push-release-tag $(patsubst %,publish-%,$(LANGUAGES)) -.PHONY: publish - -publish-%: % - if [[ -d $< ]]; then cd $< && make publish; fi -.PHONY: publish-% - -create-and-push-release-tag: - [ -f '/home/cukebot/configure' ] && /home/cukebot/configure - git commit --gpg-sign --all --message "Release $(LIBNAME) v$(NEW_VERSION)" - git tag --sign "$(LIBNAME)/v$(NEW_VERSION)" -m "Release $(LIBNAME) v$(NEW_VERSION)" - git push --tags -.PHONY: create-and-push-release-tag - -post-release: $(patsubst %,post-release-%,$(LANGUAGES)) -.PHONY: post-release - -post-release: commit-and-push-post-release - -post-release-%: % - if [[ -d $< ]]; then cd $< && make post-release; fi -.PHONY: post-release-% - -commit-and-push-post-release: -ifdef NEW_VERSION - git push --tags - git commit --gpg-sign --all --message "Post release $(LIBNAME) v$(NEW_VERSION)" 2> /dev/null || true - git push -else - @echo -e "\033[0;31mNEW_VERSION is not defined.\033[0m" - exit 1 -endif -.PHONY: commit-and-push-post-release - -clean: $(patsubst %,clean-%,$(LANGUAGES)) -.PHONY: clean - -clean-%: % - if [[ -d $< ]]; then cd $< && make clean; fi -.PHONY: clean-% diff --git a/vscode/javascript/.gitignore b/vscode/javascript/.gitignore deleted file mode 100644 index 385b67bb27..0000000000 --- a/vscode/javascript/.gitignore +++ /dev/null @@ -1,19 +0,0 @@ -dist/ -.idea/ -.nyc_output/ -coverage/ -node_modules/ -yarn.lock -package-lock.json -*.log -.deps -.tested* -.linted -.built* -.compared -.codegen -acceptance/ -storybook-static -*-go -*.iml -.vscode-test diff --git a/vscode/javascript/.mocharc.json b/vscode/javascript/.mocharc.json deleted file mode 100644 index d5055eb10d..0000000000 --- a/vscode/javascript/.mocharc.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "require": ["tsconfig-paths/register", "ts-node/register", "source-map-support/register"], - "extension": ["ts", "tsx"], - "recursive": true, - "timeout": 10000 -} diff --git a/vscode/javascript/.rsync b/vscode/javascript/.rsync deleted file mode 100644 index 5592adbd0c..0000000000 --- a/vscode/javascript/.rsync +++ /dev/null @@ -1,2 +0,0 @@ -../../LICENSE LICENSE -../../.templates/javascript/ . diff --git a/vscode/javascript/.vscode/.gitignore b/vscode/javascript/.vscode/.gitignore deleted file mode 100644 index 66cda8a724..0000000000 --- a/vscode/javascript/.vscode/.gitignore +++ /dev/null @@ -1 +0,0 @@ -loader.js diff --git a/vscode/javascript/.vscode/extensions.json b/vscode/javascript/.vscode/extensions.json deleted file mode 100644 index 3ac9aeb61e..0000000000 --- a/vscode/javascript/.vscode/extensions.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - // See http://go.microsoft.com/fwlink/?LinkId=827846 - // for the documentation about the extensions.json format - "recommendations": [ - "dbaeumer.vscode-eslint" - ] -} diff --git a/vscode/javascript/.vscode/launch.json b/vscode/javascript/.vscode/launch.json deleted file mode 100644 index a20358a067..0000000000 --- a/vscode/javascript/.vscode/launch.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "name": "Run Extension", - "type": "extensionHost", - "request": "launch", - "args": [ - "--extensionDevelopmentPath=${workspaceFolder}" - ], - "outFiles": [ - "${workspaceFolder}/dist/**/*.js" - ], - "log": true, - "preLaunchTask": { - "type": "npm", - "script": "watch" - } - }, - { - "name": "Extension Tests", - "type": "extensionHost", - "request": "launch", - "args": [ - "--extensionDevelopmentPath=${workspaceFolder}", - "--extensionTestsPath=${workspaceFolder}/dist/src/test/suite/index" - ], - "outFiles": [ - "${workspaceFolder}/dist/src/test/**/*.js" - ], - "preLaunchTask": "${defaultBuildTask}" - } - ] -} diff --git a/vscode/javascript/.vscode/settings.json b/vscode/javascript/.vscode/settings.json deleted file mode 100644 index 2952be3c8e..0000000000 --- a/vscode/javascript/.vscode/settings.json +++ /dev/null @@ -1,11 +0,0 @@ -// Place your settings in this file to overwrite default and user settings. -{ - "files.exclude": { - "dist": true // set this to true to hide the "out" folder with the compiled JS files - }, - "search.exclude": { - "dist": true // set this to false to include "out" folder in search results - }, - // Turn off tsc task auto detection since we have the necessary tasks as npm scripts - "typescript.tsc.autoDetect": "off" -} diff --git a/vscode/javascript/.vscode/tasks.json b/vscode/javascript/.vscode/tasks.json deleted file mode 100644 index b81bf0928c..0000000000 --- a/vscode/javascript/.vscode/tasks.json +++ /dev/null @@ -1,21 +0,0 @@ -// See https://go.microsoft.com/fwlink/?LinkId=733558 -// for the documentation about the tasks.json format -{ - "version": "2.0.0", - "tasks": [ - { - "type": "npm", - "script": "watch", - "problemMatcher": "$tsc-watch", - "isBackground": true, - "presentation": { - "reveal": "always", - "panel": "new" - }, - "group": { - "kind": "build", - "isDefault": true - } - } - ] -} diff --git a/vscode/javascript/.vscodeignore b/vscode/javascript/.vscodeignore deleted file mode 100644 index 389996760c..0000000000 --- a/vscode/javascript/.vscodeignore +++ /dev/null @@ -1,10 +0,0 @@ -.vscode/** -.vscode-test/** -src/** -.gitignore -.yarnrc -vsc-extension-quickstart.md -**/tsconfig.json -**/.eslintrc.json -**/*.map -**/*.ts diff --git a/vscode/javascript/CHANGELOG.md b/vscode/javascript/CHANGELOG.md deleted file mode 100644 index 55095b42ba..0000000000 --- a/vscode/javascript/CHANGELOG.md +++ /dev/null @@ -1,25 +0,0 @@ -# CHANGE LOG -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](http://keepachangelog.com/) -and this project adheres to [Semantic Versioning](http://semver.org/). - ----- -## [Unreleased] - -### Added - -### Changed - -### Deprecated - -### Removed - -### Fixed - - -[Unreleased]: https://github.com/cucumber/common/compare/vscode/v0.0.1...main -[0.0.1]: https://github.com/cucumber/common/tree/vscode/v0.0.1 - - -[aslakhellesoy]: https://github.com/aslakhellesoy diff --git a/vscode/javascript/LICENSE b/vscode/javascript/LICENSE deleted file mode 100644 index 725ba9f4ac..0000000000 --- a/vscode/javascript/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) Cucumber Ltd - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vscode/javascript/Makefile b/vscode/javascript/Makefile deleted file mode 100644 index 551e68e27a..0000000000 --- a/vscode/javascript/Makefile +++ /dev/null @@ -1 +0,0 @@ -include default.mk diff --git a/vscode/javascript/README.md b/vscode/javascript/README.md deleted file mode 100644 index 777208b85f..0000000000 --- a/vscode/javascript/README.md +++ /dev/null @@ -1,102 +0,0 @@ -# VSCode Cucumber Extension - -This is the official Cucumber extension for VSCode - -## Features - -- [x] Syntax highlighting -- [ ] Code folding -- [x] Zero configuration - - [ ] Override cucumber messages command in settings -- [ ] Auto complete - - [x] Parameterized snippets - - [x] Fuzzy search - - [ ] Gherkin keywords -- [x] Syntax validation - - [x] Syntax errors - - [x] Undefined steps - - [ ] Ambiguous steps -- [ ] Quick fix for undefined steps -- [ ] Go to Step Definition(s) from Gherkin step -- [ ] Go to Gherkin step(s) from Step Definition -- [x] Formatting -- [x] I18n support -- [ ] Platforms - - [x] Cucumber-js - - [ ] Cucumber-ruby - - [ ] Cucumber-jvm - -TODOs: - -- [x] Logo -- [ ] Publish - - [ ] https://open-vsx.org/ -- [ ] Enable src/test/runTest in CI - - - - -Describe specific features of your extension including screenshots of your extension in action. Image paths are relative to this README file. - -For example if there is an image subfolder under your extension project workspace: - -\!\[feature X\]\(images/feature-x.png\) - -> Tip: Many popular extensions utilize animations. This is an excellent way to show off your extension! We recommend short, focused animations that are easy to follow. - -## Requirements - -If you have any requirements or dependencies, add a section describing those and how to install and configure them. - -## Extension Settings - -Include if your extension adds any VS Code settings through the `contributes.configuration` extension point. - -For example: - -This extension contributes the following settings: - -* `myExtension.enable`: enable/disable this extension -* `myExtension.thing`: set to `blah` to do something - -## Known Issues - -Calling out known issues can help limit users opening duplicate issues against your extension. - -## Release Notes - -Users appreciate release notes as you update your extension. - -### 1.0.0 - -Initial release of ... - -### 1.0.1 - -Fixed issue #. - -### 1.1.0 - -Added features X, Y, and Z. - ------------------------------------------------------------------------------------------------------------ -## Following extension guidelines - -Ensure that you've read through the extensions guidelines and follow the best practices for creating your extension. - -* [Extension Guidelines](https://code.visualstudio.com/api/references/extension-guidelines) - -## Working with Markdown - -**Note:** You can author your README using Visual Studio Code. Here are some useful editor keyboard shortcuts: - -* Split the editor (`Cmd+\` on macOS or `Ctrl+\` on Windows and Linux) -* Toggle preview (`Shift+CMD+V` on macOS or `Shift+Ctrl+V` on Windows and Linux) -* Press `Ctrl+Space` (Windows, Linux) or `Cmd+Space` (macOS) to see a list of Markdown snippets - -### For more information - -* [Visual Studio Code's Markdown Support](http://code.visualstudio.com/docs/languages/markdown) -* [Markdown Syntax Reference](https://help.github.com/articles/markdown-basics/) - -**Enjoy!** diff --git a/vscode/javascript/default.mk b/vscode/javascript/default.mk deleted file mode 100644 index b04d59c4a2..0000000000 --- a/vscode/javascript/default.mk +++ /dev/null @@ -1,87 +0,0 @@ -SHELL := /usr/bin/env bash -# https://stackoverflow.com/questions/2483182/recursive-wildcards-in-gnu-make -rwildcard=$(foreach d,$(wildcard $(1:=/*)),$(call rwildcard,$d,$2) $(filter $(subst *,%,$2),$d)) -TYPESCRIPT_SOURCE_FILES = $(sort $(call rwildcard,src test,*.ts *.tsx)) -PRIVATE = $(shell node -e "console.log(require('./package.json').private)") -IS_TESTDATA = $(findstring -testdata,${CURDIR}) -NPM_MODULE = $(shell cat package.json | jq .name --raw-output) - -default: .tested -.PHONY: default - -../../node_modules ../../package-lock.json: package.json - cd ../.. && npm install - -.codegen: - touch $@ - -.tested: .tested-npm .built - -.built: $(TYPESCRIPT_SOURCE_FILES) ../../node_modules ../../package-lock.json .codegen - pushd ../.. && \ - npm run build && \ - popd && \ - touch $@ - -.tested-npm: $(TYPESCRIPT_SOURCE_FILES) ../../node_modules ../../package-lock.json .codegen - npm run test - touch $@ - -pre-release: clean update-version update-dependencies default -.PHONY: pre-release - -update-dependencies: ../../node_modules ../../package-lock.json - ../../node_modules/.bin/npm-check-updates --upgrade --reject hast-util-sanitize,@types/node,react-markdown,rehype-raw,rehype-sanitize,remark-gfm -.PHONY: update-dependencies - -update-version: -ifeq ($(IS_TESTDATA),-testdata) - # no-op -else -ifdef NEW_VERSION - npm --no-git-tag-version --allow-same-version version "$(NEW_VERSION)" - # Update all npm packages that depend on us - pushd ../.. && \ - ./scripts/npm-each update_npm_dependency_if_exists package.json "$(NPM_MODULE)" "$(NEW_VERSION)" -else - @echo -e "\033[0;31mNEW_VERSION is not defined. Can't update version :-(\033[0m" - exit 1 -endif -endif -.PHONY: update-version - -publish: .codegen -ifeq ($(IS_TESTDATA),-testdata) - # no-op -else -ifneq (true,$(PRIVATE)) - npm publish --access public -else - @echo "Not publishing private npm module" -endif -endif -.PHONY: publish - -post-release: -.PHONY: post-release - -clean: clean-javascript -.PHONY: clean - -clean-javascript: - rm -rf .deps .codegen .tested* coverage dist acceptance -.PHONY: clean-javascript - -clobber: clean - rm -rf node_modules ../../node_modules -.PHONY: clobber - -### COMMON stuff for all platforms - -BERP_VERSION = 1.3.0 -BERP_GRAMMAR = gherkin.berp - -define berp-generate-parser = --! dotnet tool list --tool-path /usr/bin | grep "berp\s*$(BERP_VERSION)" && dotnet tool update Berp --version $(BERP_VERSION) --tool-path /usr/bin -berp -g $(BERP_GRAMMAR) -t $< -o $@ --noBOM -endef diff --git a/vscode/javascript/images/icon.png b/vscode/javascript/images/icon.png deleted file mode 100644 index d5e3dc635d64bd722256ceaab115fa197a87fe98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29212 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 u3^y)CLCD6#tD!-d{8ELnV>D2wyP=)0 process.env.VSCODE_DEBUG_MODE === 'true' - -// this method is called when your extension is activated -// your extension is activated the very first time the command is executed -export function activate(context: vscode.ExtensionContext) { - let serverModule: string - if (isDebugMode()) { - serverModule = context.asAbsolutePath( - path.join('../../language-server/javascript/bin/cucumber-language-server.js') - ) - } else { - serverModule = require.resolve('@cucumber/language-server/bin/cucumber-language-server.js') - } - const debugOptions = { execArgv: ['--nolazy', '--inspect=6009'] } - - const serverOptions: ServerOptions = { - run: { module: serverModule, transport: TransportKind.ipc }, - debug: { - module: serverModule, - transport: TransportKind.ipc, - options: debugOptions, - }, - } - - const clientOptions: LanguageClientOptions = { - documentSelector: [{ scheme: 'file', language: 'gherkin' }], - } - - client = new LanguageClient('cucumber', 'Cucumber Language Server', serverOptions, clientOptions) - - const disposeClient = client.start() - context.subscriptions.push(disposeClient) - - console.log('Cucumber extension activated') -} - -// this method is called when your extension is deactivated -export function deactivate() { - // no-op -} diff --git a/vscode/javascript/src/test/runTest.ts b/vscode/javascript/src/test/runTest.ts deleted file mode 100644 index afa325d44b..0000000000 --- a/vscode/javascript/src/test/runTest.ts +++ /dev/null @@ -1,29 +0,0 @@ -import path from 'path' - -import { runTests } from 'vscode-test' - -async function main() { - if (process.env['CI']) { - // https://app.circleci.com/pipelines/github/cucumber/common/7908/workflows/10de1a58-5b66-4834-8a5e-e9ac11748e43/jobs/311298 - console.error('Skipping test of vscode plugin in CI') - return - } - - try { - // The folder containing the Extension Manifest package.json - // Passed to `--extensionDevelopmentPath` - const extensionDevelopmentPath = path.resolve(__dirname, '../../') - - // The path to test runner - // Passed to --extensionTestsPath - const extensionTestsPath = path.resolve(__dirname, './suite/index') - - // Download VS Code, unzip it and run the integration test - await runTests({ extensionDevelopmentPath, extensionTestsPath }) - } catch (err) { - console.error('Failed to run tests') - process.exit(1) - } -} - -main() diff --git a/vscode/javascript/src/test/suite/extension.test.ts b/vscode/javascript/src/test/suite/extension.test.ts deleted file mode 100644 index bd26264101..0000000000 --- a/vscode/javascript/src/test/suite/extension.test.ts +++ /dev/null @@ -1,15 +0,0 @@ -import assert from 'assert' - -// You can import and use all API from the 'vscode' module -// as well as import your extension to test it -import * as vscode from 'vscode' -// import * as myExtension from '../../extension'; - -suite('Extension Test Suite', () => { - vscode.window.showInformationMessage('Start all tests.') - - test('Sample test', () => { - assert.strictEqual(-1, [1, 2, 3].indexOf(5)) - assert.strictEqual(-1, [1, 2, 3].indexOf(0)) - }) -}) diff --git a/vscode/javascript/src/test/suite/index.ts b/vscode/javascript/src/test/suite/index.ts deleted file mode 100644 index 753efc8ca4..0000000000 --- a/vscode/javascript/src/test/suite/index.ts +++ /dev/null @@ -1,38 +0,0 @@ -import path from 'path' -import Mocha from 'mocha' -import glob from 'glob' - -export function run(): Promise { - // Create the mocha test - const mocha = new Mocha({ - ui: 'tdd', - color: true, - }) - - const testsRoot = path.resolve(__dirname, '..') - - return new Promise((c, e) => { - glob('**/**.test.js', { cwd: testsRoot }, (err, files) => { - if (err) { - return e(err) - } - - // Add files to the test suite - files.forEach((f) => mocha.addFile(path.resolve(testsRoot, f))) - - try { - // Run the mocha test - mocha.run((failures) => { - if (failures > 0) { - e(new Error(`${failures} tests failed.`)) - } else { - c() - } - }) - } catch (err) { - console.error(err) - e(err) - } - }) - }) -} diff --git a/vscode/javascript/syntaxes/gherkin-classic.tmLanguage b/vscode/javascript/syntaxes/gherkin-classic.tmLanguage deleted file mode 100644 index db976ff0ba..0000000000 --- a/vscode/javascript/syntaxes/gherkin-classic.tmLanguage +++ /dev/null @@ -1,294 +0,0 @@ - - - - - fileTypes - - feature - - firstLineMatch - - 기능|機能|功能|フィーチャ|خاصية|תכונה|Функціонал|Функция|Функционалност|Функционал|Свойство|Особина|Могућност|Özellik|Właściwość|Tính - năng|Trajto|Savybė|Požiadavka|Požadavek|Osobina|Ominaisuus|Omadus|OH - HAI|Mogućnost|Mogucnost|Jellemző|Fīča|Funzionalità|Funktionalitéit|Funktionalität|Funkcionalnost|Funkcionalitāte|Funcționalitate|Funcţionalitate|Functionaliteit|Functionalitate|Funcionalitat|Funcionalidade|Fonctionnalité|Fitur|Feature|Eiginleiki|Egenskap|Egenskab|Crikey|Característica|Arwedd|Ahoy - matey!(.*) - - foldingStartMarker - ^\s*\b(예|시나리오 - 개요|시나리오|배경|背景|場景大綱|場景|场景大纲|场景|劇本大綱|劇本|例子|例|テンプレ|シナリオテンプレート|シナリオテンプレ|シナリオアウトライン|シナリオ|サンプル|سيناريو - مخطط|سيناريو|امثلة|الخلفية|תרחיש|תבנית תרחיש|רקע|דוגמאות|Тарих|Сценарій|Сценарији|Сценарио|Сценарий - структураси|Сценарий|Структура сценарію|Структура сценарија|Структура сценария|Скица|Рамка на - сценарий|Примеры|Примери|Пример|Приклади|Предыстория|Предистория|Позадина|Передумова|Основа|Мисоллар|Концепт|Контекст|Örnekler|Założenia|Yo-ho-ho|Wharrimean - is|Voorbeelden|Variantai|Tình huống|The thing of it - is|Tausta|Taust|Tapausaihio|Tapaus|Tapaukset|Szenariogrundriss|Szenario|Szablon - scenariusza|Stsenaarium|Struktura scenarija|Structură scenariu|Structura scenariu|Skica|Skenario - konsep|Skenario|Situācija|Shiver me timbers|Senaryo taslağı|Senaryo|Scénář|Scénario|Schema dello - scenario|Scenārijs pēc - parauga|Scenārijs|Scenár|Scenaro|Scenariusz|Scenariu|Scenarios|Scenariomall|Scenariomal|Scenario - Template|Scenario Outline|Scenario Amlinellol|Scenario|Scenarijus|Scenariji|Scenarijaus - šablonas|Scenarijai|Scenarij|Scenarie|Rerefons|Raamstsenaarium|Příklady|Példák|Príklady|Przykłady|Primjeri|Primeri|Primer|Pozadí|Pozadina|Pozadie|Plang - vum Szenario|Plan du scénario|Plan du Scénario|Piemēri|Pavyzdžiai|Paraugs|Osnova scénáře|Osnova|Náčrt - Scénáře|Náčrt Scenáru|Mate|MISHUN SRSLY|MISHUN|Lýsing Dæma|Lýsing Atburðarásar|Kịch bản|Konturo de la - scenaro|Kontext|Konteksts|Kontekstas|Kontekst|Koncept|Khung tình huống|Khung kịch bản|Juhtumid|Háttér|Heave - to|Hannergrond|Grundlage|Geçmiş|Forgatókönyv - vázlat|Forgatókönyv|Fono|Exemplos|Exemples|Exemple|Exempel|Examples|Esquema do Cenário|Esquema do - Cenario|Esquema del escenario|Esquema de - l'escenari|Esempi|Escenario|Escenari|Enghreifftiau|Ekzemploj|Eksempler|Ejemplos|EXAMPLZ|Dữ liệu|Dæmi|Dis is - what went down|Dead men tell no - tales|Dasar|Contoh|Contexto|Contexte|Context|Contesto|Cobber|Cenário|Cenario|Cefndir|Bối - cảnh|Blokes|Beispiller|Beispiele|Bakgrunnur|Bakgrunn|Bakgrund|Baggrund|Background|B4|Atburðarásir|Atburðarás|Antecedents|Antecedentes|All - y'all|Achtergrond|Abstrakt Scenario|Abstract Scenario) - - foldingStopMarker - ^\s*$ - keyEquivalent - ^~C - name - Gherkin - patterns - - - include - #feature_element_keyword - - - include - #feature_keyword - - - include - #step_keyword - - - include - #strings_triple_quote - - - include - #strings_single_quote - - - include - #strings_double_quote - - - include - #comments - - - include - #tags - - - include - #scenario_outline_variable - - - include - #table - - - repository - - comments - - captures - - 0 - - name - comment.line.number-sign - - - match - \s*(#.*) - - table - - begin - ^\s*\| - end - \|\s*$ - name - keyword.control.cucumber.table - patterns - - - match - \w - name - source - - - - feature_keyword - - captures - - 1 - - name - keyword.language.gherkin.feature - - 2 - - name - string.language.gherkin.feature.title - - - match - - ^\s*(기능|機能|功能|フィーチャ|خاصية|תכונה|Функціонал|Функция|Функционалност|Функционал|Свойство|Особина|Могућност|Özellik|Właściwość|Tính - năng|Trajto|Savybė|Požiadavka|Požadavek|Osobina|Ominaisuus|Omadus|OH - HAI|Mogućnost|Mogucnost|Jellemző|Fīča|Funzionalità|Funktionalitéit|Funktionalität|Funkcionalnost|Funkcionalitāte|Funcționalitate|Funcţionalitate|Functionaliteit|Functionalitate|Funcionalitat|Funcionalidade|Fonctionnalité|Fitur|Feature|Eiginleiki|Egenskap|Egenskab|Crikey|Característica|Arwedd|Ahoy - matey!):(.*)\b - - - step_keyword - - captures - - 1 - - name - keyword.language.gherkin.feature.step - - - match - ^\s*(하지만|조건|먼저|만일|만약|단|그리고|그러면|那麼|那么|而且|當|当|前提|假設|假如|但是|但し|並且|もし|ならば|ただし|しかし|かつ|و |متى |لكن - |عندما |ثم |بفرض |اذاً |כאשר |וגם |בהינתן |אזי |אז |אבל |Якщо |Унда |Тоді |Тогда |То |Та |Пусть - |Припустимо, що |Припустимо |Онда |Но |Нехай |Лекин |Коли |Когда |Когато |Када |Кад |К тому же |И - |Задато |Задати |Задате |Если |Допустим |Дано |Дадено |Ва |Бирок |Аммо |Али |Але |Агар |А також |А - |І |Și |Şi |Þá |Þegar |Étant donnés |Étant données |Étant donnée |Étant donné |És |wann |ugeholl |mä - |dann |awer |an |a |Zatati |Zakładając |Zadato |Zadate |Zadano |Zadani |Zadan |Youse know when youse - got |Youse know like when |Yna |Ya know how |Ya gotta |Y |Wun |Wtedy |When y'all |When |Wenn |WEN - |Và |Ve |Und |Un |Thì |Then y'all |Then |Tapi |Tak |Tada |Tad |Så |Stel |Soit |Siis |Si |Sed |Se - |Quando |Quand |Quan |Pryd |Pokud |Pokiaľ |Però |Pero |Pak |Oraz |Onda |Ond |Oletetaan |Og |Och |O - zaman |Når |När |Niin |Nhưng |N |Mutta |Men |Mas |Maka |Mając |Majd |Mais |Maar |Ma |Lorsque - |Lorsqu'|Let go and haul |Kun |Kuid |Kui |Khi |Keď |Ketika |Když |Kaj |Kai |Kada |Kad |Jeżeli |Jeśli - |Ja |Ir |I CAN HAZ |I |Ha |Givun |Givet |Given y'all |Given |Gitt |Gegeven |Gegeben sei |Gangway! - |Fakat |Eğer ki |Etant donnés |Etant données |Etant donnée |Etant donné |Et |Então |Entonces |Entao - |En |Ef |Eeldades |E |Duota |Dun |Donitaĵo |Donat |Donada |Do |Diyelim ki |Dengan |Den youse gotta - |De |Dați fiind |Daţi fiind |Dato |Dati fiind |Dati |Date fiind |Date |Data |Dat fiind |Dar |Dann - |Dan |Dados |Dado |Dadas |Dada |DEN |Când |Cuando |Cho |Cept |Cand |Cal |But y'all |But |Buh - |Blimey! |Biết |Bet |BUT |Aye |Avast! |Atès |Atunci |Atesa |Anrhegedig a |Angenommen |And y'all |And - |An |Amikor |Amennyiben |Ama |Als |Alors |Allora |Ali |Aleshores |Ale |Akkor |Adott |Aber |AN |A - také |A |\* ) - - - feature_element_keyword - - captures - - 1 - - name - keyword.language.gherkin.feature.scenario - - 2 - - name - string.language.gherkin.scenario.title.title - - - match - ^\s*(예|시나리오 - 개요|시나리오|배경|背景|場景大綱|場景|场景大纲|场景|劇本大綱|劇本|例子|例|テンプレ|シナリオテンプレート|シナリオテンプレ|シナリオアウトライン|シナリオ|サンプル|سيناريو - مخطط|سيناريو|امثلة|الخلفية|תרחיש|תבנית תרחיש|רקע|דוגמאות|Тарих|Сценарій|Сценарији|Сценарио|Сценарий - структураси|Сценарий|Структура сценарію|Структура сценарија|Структура сценария|Скица|Рамка на - сценарий|Примеры|Примери|Пример|Приклади|Предыстория|Предистория|Позадина|Передумова|Основа|Мисоллар|Концепт|Контекст|Örnekler|Założenia|Yo-ho-ho|Wharrimean - is|Voorbeelden|Variantai|Tình huống|The thing of it - is|Tausta|Taust|Tapausaihio|Tapaus|Tapaukset|Szenariogrundriss|Szenario|Szablon - scenariusza|Stsenaarium|Struktura scenarija|Structură scenariu|Structura scenariu|Skica|Skenario - konsep|Skenario|Situācija|Shiver me timbers|Senaryo taslağı|Senaryo|Scénář|Scénario|Schema dello - scenario|Scenārijs pēc - parauga|Scenārijs|Scenár|Scenaro|Scenariusz|Scenariu|Scenarios|Scenariomall|Scenariomal|Scenario - Template|Scenario Outline|Scenario Amlinellol|Scenario|Scenarijus|Scenariji|Scenarijaus - šablonas|Scenarijai|Scenarij|Scenarie|Rerefons|Raamstsenaarium|Příklady|Példák|Príklady|Przykłady|Primjeri|Primeri|Primer|Pozadí|Pozadina|Pozadie|Plang - vum Szenario|Plan du scénario|Plan du Scénario|Piemēri|Pavyzdžiai|Paraugs|Osnova - scénáře|Osnova|Náčrt Scénáře|Náčrt Scenáru|Mate|MISHUN SRSLY|MISHUN|Lýsing Dæma|Lýsing - Atburðarásar|Kịch bản|Konturo de la scenaro|Kontext|Konteksts|Kontekstas|Kontekst|Koncept|Khung tình - huống|Khung kịch bản|Juhtumid|Háttér|Heave to|Hannergrond|Grundlage|Geçmiş|Forgatókönyv - vázlat|Forgatókönyv|Fono|Exemplos|Exemples|Exemple|Exempel|Examples|Esquema do Cenário|Esquema do - Cenario|Esquema del escenario|Esquema de - l'escenari|Esempi|Escenario|Escenari|Enghreifftiau|Ekzemploj|Eksempler|Ejemplos|EXAMPLZ|Dữ - liệu|Dæmi|Dis is what went down|Dead men tell no - tales|Dasar|Contoh|Contexto|Contexte|Context|Contesto|Cobber|Cenário|Cenario|Cefndir|Bối - cảnh|Blokes|Beispiller|Beispiele|Bakgrunnur|Bakgrunn|Bakgrund|Baggrund|Background|B4|Atburðarásir|Atburðarás|Antecedents|Antecedentes|All - y'all|Achtergrond|Abstrakt Scenario|Abstract Scenario):(.*) - - - scenario_outline_variable - - begin - < - end - > - name - variable.other - - strings_double_quote - - begin - " - end - " - name - string.quoted.double - patterns - - - match - \\. - name - constant.character.escape.untitled - - - - strings_single_quote - - begin - (?<![a-zA-Z"])' - end - '(?![a-zA-Z]) - name - string.quoted.single - patterns - - - match - \\. - name - constant.character.escape - - - - strings_triple_quote - - begin - """ - end - """ - name - string.quoted.single - - tags - - captures - - 0 - - name - storage.type.tag.cucumber - - - match - (@[^@\r\n\t ]+) - - - scopeName - text.gherkin.feature - uuid - 85E2C52C-9B16-4A54-81E7-6D8D3ADAEFA8 - - diff --git a/vscode/javascript/tsconfig.build.json b/vscode/javascript/tsconfig.build.json deleted file mode 100644 index 98f530f48a..0000000000 --- a/vscode/javascript/tsconfig.build.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../tsconfig.build.json", - "compilerOptions": { - "rootDir": ".", - "outDir": "dist" - }, - "include": [ - "package.json", - "src", - "test" - ] -} diff --git a/vscode/javascript/tsconfig.json b/vscode/javascript/tsconfig.json deleted file mode 100644 index 4082f16a5d..0000000000 --- a/vscode/javascript/tsconfig.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "../../tsconfig.json" -} diff --git a/vscode/javascript/vsc-extension-quickstart.md b/vscode/javascript/vsc-extension-quickstart.md deleted file mode 100644 index b510bff34d..0000000000 --- a/vscode/javascript/vsc-extension-quickstart.md +++ /dev/null @@ -1,42 +0,0 @@ -# Welcome to your VS Code Extension - -## What's in the folder - -* This folder contains all of the files necessary for your extension. -* `package.json` - this is the manifest file in which you declare your extension and command. - * The sample plugin registers a command and defines its title and command name. With this information VS Code can show the command in the command palette. It doesn’t yet need to load the plugin. -* `src/extension.ts` - this is the main file where you will provide the implementation of your command. - * The file exports one function, `activate`, which is called the very first time your extension is activated (in this case by executing the command). Inside the `activate` function we call `registerCommand`. - * We pass the function containing the implementation of the command as the second parameter to `registerCommand`. - -## Get up and running straight away - -* Press `F5` to open a new window with your extension loaded. -* Run your command from the command palette by pressing (`Ctrl+Shift+P` or `Cmd+Shift+P` on Mac) and typing `Hello World`. -* Set breakpoints in your code inside `src/extension.ts` to debug your extension. -* Find output from your extension in the debug console. - -## Make changes - -* You can relaunch the extension from the debug toolbar after changing code in `src/extension.ts`. -* You can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes. - - -## Explore the API - -* You can open the full set of our API when you open the file `node_modules/@types/vscode/index.d.ts`. - -## Run tests - -* Open the debug viewlet (`Ctrl+Shift+D` or `Cmd+Shift+D` on Mac) and from the launch configuration dropdown pick `Extension Tests`. -* Press `F5` to run the tests in a new window with your extension loaded. -* See the output of the test result in the debug console. -* Make changes to `src/test/suite/extension.test.ts` or create new test files inside the `test/suite` folder. - * The provided test runner will only consider files matching the name pattern `**.test.ts`. - * You can create folders inside the `test` folder to structure your tests any way you want. - -## Go further - - * Reduce the extension size and improve the startup time by [bundling your extension](https://code.visualstudio.com/api/working-with-extensions/bundling-extension). - * [Publish your extension](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VSCode extension marketplace. - * Automate builds by setting up [Continuous Integration](https://code.visualstudio.com/api/working-with-extensions/continuous-integration).