From 072d038758592f6ef5c9e10d4fd2abb8f7dabf0f Mon Sep 17 00:00:00 2001 From: FidgetingBits Date: Wed, 6 Mar 2024 22:59:12 +0800 Subject: [PATCH] Revert "merge upstream" This reverts commit 54430205e28fdb61c48ecc7eee32e8a2aa618da8. --- .editorconfig | 2 +- .eslintrc.json | 20 +- .github/CODEOWNERS | 5 +- .github/workflows/deploy.yaml | 2 +- .github/workflows/pre-commit.yml | 2 +- .github/workflows/test-docs.yml | 2 +- .github/workflows/test.yml | 4 +- .pre-commit-config.yaml | 21 +- .prettierignore | 1 - .vscode/launch.json | 31 +- .vscode/settings.json | 3 +- .vscode/tasks.json | 52 +- CHANGELOG.md | 2 +- README.md | 2 +- ...2023-09-addedArgumentTargetToCallAction.md | 6 - ...nationAndScopeTypeToInsertSnippetAction.md | 6 - changelog/2023-09-addedJoinLinesAction.md | 6 - changelog/2023-09-updatedHatShapes.md | 6 - .../2023-11-modalKeyboardVscodeCommands.md | 6 - changelog/2023-12-addedBreakLineAction.md | 6 - changelog/2023-12-addedVisibleModifier.md | 6 - changelog/2023-12.addedGrandScopeModifier.md | 6 - ...24-02-addedIncrementAndDecrementActions.md | 8 - cursorless-talon-dev/src/cursorless_dev.talon | 5 - .../src/cursorless_test.talon | 16 - .../src/default_vocabulary.py | 4 + cursorless-talon-dev/src/spoken_form_test.py | 19 - cursorless-talon/src/actions/actions.py | 8 +- cursorless-talon/src/actions/call.py | 27 +- cursorless-talon/src/actions/find.py | 11 + cursorless-talon/src/actions/get_text.py | 29 +- .../src/apps/cursorless_vscode.py | 26 +- cursorless-talon/src/cheatsheet/get_list.py | 21 +- .../src/cheatsheet/sections/actions.py | 16 +- .../cheatsheet/sections/compound_targets.py | 14 +- .../sections/get_scope_visualizer.py | 10 - .../src/cheatsheet/sections/modifiers.py | 11 - .../src/cheatsheet/sections/scopes.py | 28 +- cursorless-talon/src/csv_overrides.py | 255 +- cursorless-talon/src/cursorless.py | 11 +- cursorless-talon/src/cursorless.talon | 9 - cursorless-talon/src/marks/decorated_mark.py | 2 +- cursorless-talon/src/modifiers/glyph_scope.py | 30 - cursorless-talon/src/modifiers/scopes.py | 28 +- .../src/modifiers/simple_scope_modifier.py | 18 +- cursorless-talon/src/number_small.py | 1 - .../private_api/extract_decorated_marks.py | 47 - .../src/private_api/private_api.py | 66 - cursorless-talon/src/snippets.py | 43 +- cursorless-talon/src/spoken_forms.json | 20 +- cursorless-talon/src/spoken_forms.py | 95 +- cursorless-talon/src/spoken_forms_output.py | 48 - cursorless-talon/src/terms.py | 1 - data/playground/go/branch.go | 57 - data/playground/hat-test.txt | 2 - docs/contributing/CONTRIBUTING.md | 6 +- docs/contributing/adding-a-new-language.md | 6 +- docs/contributing/adding-a-new-package.md | 5 +- .../architecture/hat-snapshots.md | 2 +- docs/user/README.md | 94 +- docs/user/customization.md | 15 +- docs/user/experimental/keyboard/modal.md | 44 +- docs/user/experimental/snippets.md | 4 +- docs/user/hatAssignment.md | 2 +- docs/user/how-to.md | 48 - docs/user/installation.md | 24 +- docs/user/localCommandHIstory.md | 15 - docs/user/reference/destinations.md | 21 - docs/user/scope-sidebar.md | 3 - docs/user/unicode.md | 4 +- fonts/cursorless.woff | Bin 3200 -> 2012 bytes images/hats/bolt.svg | 4 +- images/hats/crosshairs.svg | 4 +- images/hats/curve.svg | 4 +- images/hats/default.svg | 4 +- images/hats/ex.svg | 4 +- images/hats/eye.svg | 4 +- images/hats/fox.svg | 4 +- images/hats/frame.svg | 4 +- images/hats/hole.svg | 4 +- images/hats/play.svg | 4 +- images/hats/wing.svg | 4 +- images/logo-white.png | Bin 55040 -> 0 bytes images/logo.svg | 6 - package.json | 40 +- packages/cheatsheet-local/package.json | 25 +- packages/cheatsheet-local/postcss.config.js | 3 + .../cheatsheet-local/src/webpack.config.ts | 8 +- packages/cheatsheet-local/tailwind.config.js | 23 +- packages/cheatsheet-local/tsconfig.json | 5 +- packages/cheatsheet/jest.config.js | 5 + packages/cheatsheet/jest.config.ts | 8 - packages/cheatsheet/package.json | 19 +- .../lib/sampleSpokenFormInfos/defaults.json | 66 +- packages/common/package.json | 20 +- packages/common/scripts/my-ts-node.js | 106 - packages/common/src/StoredTargetKey.ts | 7 - packages/common/src/cursorlessCommandIds.ts | 22 +- packages/common/src/cursorlessSideBarIds.ts | 1 - packages/common/src/ide/PassthroughIDEBase.ts | 22 +- packages/common/src/ide/fake/FakeIDE.ts | 18 +- .../common/src/ide/types/Configuration.ts | 2 - .../common/src/ide/types/FileSystem.types.ts | 23 - packages/common/src/ide/types/ide.types.ts | 27 - packages/common/src/index.ts | 15 +- .../getLanguageScopeSupport.ts | 30 - .../common/src/scopeSupportFacets/html.ts | 74 - .../common/src/scopeSupportFacets/java.ts | 20 - .../src/scopeSupportFacets/javascript.ts | 96 - .../common/src/scopeSupportFacets/json.ts | 13 - .../common/src/scopeSupportFacets/python.ts | 29 - .../scopeSupportFacetInfos.ts | 358 - .../scopeSupportFacets.types.ts | 139 - .../common/src/scopeSupportFacets/talon.ts | 12 - .../textualScopeSupportFacetInfos.ts | 57 - .../src/scopeSupportFacets/typescript.ts | 19 - .../common/src/testUtil/TestCaseSnapshot.ts | 17 +- .../common/src/testUtil/fromPlainObject.ts | 2 +- .../src/testUtil/getCursorlessRepoRoot.ts | 13 +- .../common/src/testUtil/getFixturePaths.ts | 26 +- .../common/src/testUtil/spyToPlainObject.ts | 30 - .../src/{util => testUtil}/toPlainObject.ts | 35 +- packages/common/src/types/Position.ts | 18 +- packages/common/src/types/SpokenForm.ts | 47 - packages/common/src/types/TestCaseFixture.ts | 2 +- .../src/types/command/ActionDescriptor.ts | 9 +- .../command/PartialTargetDescriptor.types.ts | 184 +- packages/common/src/types/commandHistory.ts | 24 - .../types/generalizedRangeContains.test.ts | 2 +- .../src/types/generalizedRangeTouches.test.ts | 2 +- .../src/types/isGeneralizedRangeEqual.test.ts | 2 +- packages/common/src/util/CompositeKeyMap.ts | 5 - .../common/src/util/camelCaseToAllDown.ts | 17 - packages/common/src/util/disposableFrom.ts | 24 - packages/cursorless-engine/package.json | 24 +- .../cursorless-engine/src/CommandHistory.ts | 219 - .../src/CommandHistoryAnalyzer.ts | 140 - .../ScopeRangeProvider.ts | 5 +- .../ScopeRangeWatcher.ts | 19 +- .../ScopeSupportChecker.ts | 2 +- .../getIterationRange.ts | 0 .../getIterationScopeRanges.ts | 3 +- .../getScopeRanges.ts | 4 +- .../src/ScopeVisualizer/getTargetRanges.ts | 12 + .../cursorless-engine/src/actions/Actions.ts | 21 +- .../src/actions/BreakLine.ts | 72 - .../cursorless-engine/src/actions/Find.ts | 25 +- .../src/actions/InsertSnippet.ts | 4 +- .../src/actions/JoinLines.ts | 69 - ...ecialTarget.ts => SetInstanceReference.ts} | 9 +- .../src/actions/ShowParseTree.ts | 121 - .../src/actions/actions.types.ts | 12 - .../src/actions/incrementDecrement.ts | 110 - .../src/api/CursorlessEngineApi.ts | 33 +- .../src/api}/ScopeProvider.ts | 63 +- .../src/asyncIteratorToList.ts | 9 - .../cursorless-engine/src/core/Cheatsheet.ts | 29 +- .../cursorless-engine/src/core/Debouncer.ts | 7 +- .../src/core/StoredTargets.ts | 16 +- .../core/commandRunner/CommandRunnerImpl.ts | 10 +- .../upgradeV1ToV2/upgradeStrictHere.ts | 4 +- .../src/core/mergeSnippets.test.ts | 2 +- .../core/updateSelections/updateSelections.ts | 2 +- .../cursorless-engine/src/cursorlessEngine.ts | 57 +- .../src/generateCommandHistoryEntries.ts | 25 - .../CustomSpokenFormGeneratorImpl.test.ts | 35 - .../CustomSpokenFormGeneratorImpl.ts | 68 - .../generateSpokenForm/NoSpokenFormError.ts | 6 +- .../generateSpokenForm/SpokenFormComponent.ts | 40 - .../defaultSpokenForms/actions.ts | 8 +- .../defaultSpokenForms/marks.ts | 1 - .../defaultSpokenForms/modifiers.ts | 188 +- .../surroundingPairsDelimiters.ts | 23 - .../generateSpokenForm.test.ts | 64 +- .../generateSpokenForm/generateSpokenForm.ts | 436 +- .../getSpokenFormComponentMap.ts | 63 - .../primitiveTargetToSpokenForm.ts | 494 +- packages/cursorless-engine/src/index.ts | 5 +- .../src/languages/LanguageDefinition.ts | 97 +- .../src/languages/LanguageDefinitions.ts | 60 +- .../PredicateOperatorSchemaTypes.ts | 2 +- .../TreeSitterQuery/QueryPredicateOperator.ts | 48 +- .../checkCaptureStartEnd.test.ts | 2 +- .../constructZodErrorMessages.ts | 2 +- .../operatorArgumentSchemaTypes.ts | 2 +- .../TreeSitterQuery/parsePredicates.test.ts | 2 +- .../queryPredicateOperators.ts | 84 +- .../rewriteStartOfEndOf.test.ts | 2 +- .../validateQueryCaptures.test.ts | 110 - .../TreeSitterQuery/validateQueryCaptures.ts | 110 - .../src/languages/clojure.ts | 6 +- .../cursorless-engine/src/languages/cpp.ts | 2 +- .../cursorless-engine/src/languages/csharp.ts | 2 +- .../src/languages/elseIfExtractor.ts | 14 +- .../src/languages/getNodeMatcher.ts | 13 +- .../src/languages/getTextFragmentExtractor.ts | 45 + .../cursorless-engine/src/languages/html.ts | 59 + .../cursorless-engine/src/languages/java.ts | 114 +- .../cursorless-engine/src/languages/json.ts | 32 + .../src/languages/markdown.ts | 88 +- .../cursorless-engine/src/languages/php.ts | 72 +- .../cursorless-engine/src/languages/python.ts | 52 +- .../cursorless-engine/src/languages/rust.ts | 2 +- .../cursorless-engine/src/languages/scala.ts | 2 +- .../src/languages/typescript.ts | 274 + .../src/nodeCommon/README.md | 3 - .../nodeCommon/TalonSpokenFormsJsonReader.ts | 77 - .../src/processTargets/.eslintrc.json | 5 - .../processTargets/MarkStageFactoryImpl.ts | 13 +- .../ModifierStageFactoryImpl.ts | 23 +- .../processTargets/TargetPipelineRunner.ts | 31 +- .../createContinuousRangeTarget.ts | 73 - .../src/processTargets/marks/CursorStage.ts | 2 +- .../marks/DecoratedSymbolStage.ts | 2 +- .../processTargets/marks/ExplicitMarkStage.ts | 2 +- .../src/processTargets/marks/ImplicitStage.ts | 2 +- .../processTargets/marks/LineNumberStage.ts | 2 +- .../src/processTargets/marks/NothingStage.ts | 2 +- .../processTargets/marks/RangeMarkStage.ts | 2 +- .../processTargets/marks/StoredTargetStage.ts | 3 +- .../processTargets/marks/TargetMarkStage.ts | 2 +- .../modifiers/CascadingStage.ts | 2 +- .../modifiers/EveryScopeStage.ts | 21 +- .../processTargets/modifiers/InstanceStage.ts | 20 +- .../modifiers/ItemStage/ItemStage.ts | 20 +- .../modifiers/ItemStage/index.ts | 3 +- .../modifiers/RangeModifierStage.ts | 2 +- .../modifiers/RawSelectionStage.ts | 2 +- .../modifiers/RelativeExclusiveScopeStage.ts | 2 +- .../modifiers/RelativeScopeStage.ts | 4 +- .../modifiers/SurroundingPairStage.ts | 2 +- .../processTargets/modifiers/VisibleStage.ts | 19 - .../modifiers/constructScopeRangeTarget.ts | 3 +- .../modifiers/getContainingScopeTarget.ts | 5 +- .../scopeHandlers/BaseScopeHandler.test.ts | 4 +- .../scopeHandlers/BaseScopeHandler.ts | 2 +- .../scopeHandlers/CharacterScopeHandler.ts | 45 +- .../scopeHandlers/DocumentScopeHandler.ts | 4 +- .../scopeHandlers/IdentifierScopeHandler.ts | 4 +- .../scopeHandlers/LineScopeHandler.ts | 17 +- .../scopeHandlers/NestedScopeHandler.ts | 4 +- .../NotHierarchicalScopeError.ts | 2 +- .../scopeHandlers/OneOfScopeHandler.ts | 4 +- .../scopeHandlers/ParagraphScopeHandler.ts | 4 +- .../scopeHandlers/RegexScopeHandler.ts | 25 +- .../scopeHandlers/ScopeHandlerFactoryImpl.ts | 27 +- .../SentenceScopeHandler.ts | 6 +- .../SentenceScopeHandler/SentenceSegmenter.ts | 2 +- .../SurroundingPairScopeHandler.ts | 4 +- .../scopeHandlers/TokenScopeHandler.ts | 31 +- .../BaseTreeSitterScopeHandler.ts | 2 +- .../TreeSitterScopeHandler.ts | 40 +- .../WordScopeHandler/WordScopeHandler.ts | 6 +- .../WordScopeHandler/WordTokenizer.ts | 2 +- .../modifiers/scopeHandlers/index.ts | 10 + .../scopeHandlers/isPreferredOverHelper.ts | 28 - .../BoundedNonWhitespaceStage.ts | 4 +- .../LegacyContainingSyntaxScopeStage.ts | 2 +- .../scopeTypeStages/NotebookCellStage.ts | 2 +- .../surroundingPair/delimiterMaps.ts | 7 +- .../modifiers/targetSequenceUtils.ts | 4 +- .../createContinuousRange.ts | 24 +- ...limitedSequenceInsertionRemovalBehavior.ts | 5 +- .../TokenInsertionRemovalBehavior.ts | 11 +- .../insertionRemovalBehavior.types.ts | 4 +- .../src/processTargets/targets/BaseTarget.ts | 58 +- .../processTargets/targets/DestinationImpl.ts | 60 +- .../processTargets/targets/DocumentTarget.ts | 5 +- .../processTargets/targets/ImplicitTarget.ts | 4 +- .../processTargets/targets/InteriorTarget.ts | 49 +- .../src/processTargets/targets/LineTarget.ts | 58 +- .../targets/NotebookCellDestination.ts | 2 +- .../targets/NotebookCellTarget.ts | 4 +- .../processTargets/targets/ParagraphTarget.ts | 56 +- .../src/processTargets/targets/PlainTarget.ts | 23 +- .../targets/RawSelectionTarget.ts | 4 +- .../processTargets/targets/ScopeTypeTarget.ts | 94 +- .../targets/SubTokenWordTarget.ts | 46 +- .../targets/SurroundingPairTarget.ts | 13 +- .../src/processTargets/targets/TokenTarget.ts | 6 +- .../processTargets/targets/UntypedTarget.ts | 26 +- .../src/processTargets/targets/index.ts | 14 + packages/cursorless-engine/src/runCommand.ts | 17 +- .../src/runIntegrationTests.ts | 6 +- .../src/scopeProviders/ScopeInfoProvider.ts | 188 - .../src/scopeProviders/ScopeSupportWatcher.ts | 121 - .../src/scopeProviders/TalonSpokenForms.ts | 44 - .../src/scopeProviders/getTargetRanges.ts | 48 - .../src/scopeProviders/scopeTypeToString.ts | 21 - .../transformRecordedTests/checkMarks.ts | 6 +- .../cursorless-engine/src/snippets/snippet.ts | 4 - .../src/spokenForms/CustomSpokenForms.ts | 177 - .../src/spokenForms/SpokenFormMap.ts | 92 - .../src/spokenForms/SpokenFormType.ts | 66 - .../src/spokenForms/defaultSpokenFormMap.ts | 35 - .../spokenForms/defaultSpokenFormMap.types.ts | 28 - .../spokenForms/defaultSpokenFormMapCore.ts | 140 - .../src/spokenForms/spokenFormMapUtil.ts | 35 - .../src/test/fixtures/spokenFormTest.ts | 3 +- .../src/test/fixtures/talonApi.fixture.ts | 92 - .../src/test/sentenceSegmenter.test.ts | 2 +- .../src/test/spokenForms.talon.test.ts | 2 +- .../src/test/subtoken.test.ts | 2 +- .../src/testCaseRecorder/TestCase.ts | 3 +- .../src/testCaseRecorder/TestCaseRecorder.ts | 22 +- .../src/testUtil/takeSnapshot.ts | 29 +- .../tokenGraphemeSplitter.ts | 2 +- .../src/typings/target.types.ts | 34 +- .../src/util/getScopeType.ts | 33 - .../src/util/nodeMatchers.ts | 26 +- packages/cursorless-engine/src/util/object.ts | 24 - .../cursorless-engine/src/util/rangeUtils.ts | 30 +- .../src/util/setSelectionsAndFocusEditor.ts | 8 +- .../src/util/tryConstructTarget.ts | 40 +- .../src/util/uniqWithHash.test.ts | 0 .../src/util/uniqWithHash.ts | 0 packages/cursorless-org-docs/babel.config.js | 3 + packages/cursorless-org-docs/babel.config.mjs | 3 - .../cursorless-org-docs/docusaurus.config.js | 147 + .../cursorless-org-docs/docusaurus.config.mts | 175 - packages/cursorless-org-docs/package.json | 27 +- packages/cursorless-org-docs/sidebar.js | 2 +- .../cursorless-org-docs/src/css/custom.css | 4 - .../cursorless-org-docs/static/favicon.ico | Bin 0 -> 15406 bytes packages/cursorless-org-docs/static/icon.svg | 3220 ++++++ .../cursorless-org-docs/static/logo-dark.svg | 6 - packages/cursorless-org-docs/static/logo.svg | 6 - packages/cursorless-org-docs/tsconfig.json | 1 - packages/cursorless-org/mdx-components.tsx | 15 - packages/cursorless-org/next.config.js | 12 +- packages/cursorless-org/package.json | 32 +- packages/cursorless-org/postcss.config.js | 6 + .../cursorless-org/public/andrew-dant.jpeg | Bin 25740 -> 0 bytes .../public/android-chrome-192x192.png | Bin 9645 -> 11115 bytes .../public/android-chrome-512x512.png | Bin 28823 -> 27858 bytes .../public/apple-touch-icon.png | Bin 2556 -> 9866 bytes packages/cursorless-org/public/big-hats.png | Bin 121100 -> 0 bytes .../cursorless-org/public/browserconfig.xml | 9 - .../cursorless-org/public/favicon-16x16.png | Bin 621 -> 410 bytes .../cursorless-org/public/favicon-32x32.png | Bin 970 -> 1016 bytes packages/cursorless-org/public/favicon.ico | Bin 15086 -> 15406 bytes packages/cursorless-org/public/favicon.png | Bin 651 -> 0 bytes packages/cursorless-org/public/favicon.svg | 17 - .../public/fonts/Inconsolata-Bold.ttf | Bin 102152 -> 0 bytes .../public/fonts/Inconsolata-ExtraLight.ttf | Bin 101972 -> 0 bytes .../public/fonts/Inconsolata-Light.ttf | Bin 101832 -> 0 bytes .../public/fonts/Inconsolata-Medium.ttf | Bin 102176 -> 0 bytes .../public/fonts/Inconsolata-Regular.ttf | Bin 101752 -> 0 bytes .../public/fonts/Inconsolata-SemiBold.ttf | Bin 102268 -> 0 bytes .../cursorless-org/public/james-stout.jpeg | Bin 62215 -> 0 bytes packages/cursorless-org/public/logo-dark.svg | 6 - packages/cursorless-org/public/logo.svg | 6 - .../public/max-foxley-marrable.jpeg | Bin 151067 -> 0 bytes .../cursorless-org/public/mstile-144x144.png | Bin 2857 -> 0 bytes .../cursorless-org/public/mstile-150x150.png | Bin 2958 -> 0 bytes .../cursorless-org/public/mstile-310x150.png | Bin 3214 -> 0 bytes .../cursorless-org/public/mstile-310x310.png | Bin 6386 -> 0 bytes .../cursorless-org/public/mstile-70x70.png | Bin 2090 -> 0 bytes .../cursorless-org/public/nathan-heffley.jpeg | Bin 15300 -> 0 bytes .../public/safari-pinned-tab.svg | 43 - .../cursorless-org/public/site.webmanifest | 6 +- .../cursorless-org/public/sohee-yang.jpeg | Bin 43256 -> 0 bytes .../public/video-share-thumbnail.jpg | Bin 169731 -> 80949 bytes .../src/components/IndexSocial.tsx | 13 - .../cursorless-org/src/components/Layout.tsx | 135 - .../components/{BaseSocial.tsx => Social.tsx} | 110 +- .../src/components/SpamProofEmailLink.tsx | 72 - .../src/content/enablement-group.mdx | 220 - .../src/content/enablement-group.mdx.d.ts | 6 - .../src/pages/enablement-group.tsx | 41 - packages/cursorless-org/src/pages/index.tsx | 6 +- packages/cursorless-org/src/pages/logo.svg | 10 +- .../cursorless-org/src/parseEmailAddress.ts | 8 - .../cursorless-org/src/styles/globals.css | 64 - packages/cursorless-org/tailwind.config.js | 88 +- packages/cursorless-org/tsconfig.json | 3 +- packages/cursorless-vscode-e2e/package.json | 10 +- .../src/suite/commandHistory.vscode.test.ts | 155 - .../crossCellsSetSelection.vscode.test.ts | 5 +- .../src/suite/editNewCell.vscode.test.ts | 3 + .../fixtures/recorded/actions/breakBat.yml | 33 - .../recorded/actions/breakCommentSit.yml | 45 - .../recorded/actions/breakJustThis.yml | 32 - .../recorded/actions/breakJustThis2.yml | 32 - .../fixtures/recorded/actions/callFine.yml | 1 + .../recorded/actions/callFineOnBatt.yml | 41 - .../fixtures/recorded/actions/callVest.yml | 1 + .../recorded/actions/callVestOnCap.yml | 1 + .../actions/changeNextInstanceChar.yml | 42 - .../recorded/actions/decrementFile.yml | 162 - .../fixtures/recorded/actions/findVest.yml | 37 + .../fixtures/recorded/actions/fromThis.yml | 35 - .../fixtures/recorded/actions/getTextAir.yml | 2 +- .../recorded/actions/incrementFile.yml | 162 - .../incrementLineFourAndEveryTokenOne.yml | 74 - .../recorded/actions/incrementThree.yml | 31 - .../fixtures/recorded/actions/joinAir.yml | 33 - .../fixtures/recorded/actions/joinAir2.yml | 33 - .../fixtures/recorded/actions/joinAir3.yml | 33 - .../fixtures/recorded/actions/joinAir4.yml | 33 - .../fixtures/recorded/actions/joinBlock.yml | 33 - .../fixtures/recorded/actions/joinFile.yml | 35 - .../recorded/actions/joinLineThis.yml | 33 - .../recorded/actions/joinTwoLines.yml | 38 - .../recorded/actions/parseTreeFile.yml | 30 - .../fixtures/recorded/actions/scoutAir.yml | 31 - .../fixtures/recorded/actions/scoutAllAir.yml | 31 - .../snippets/customInsertAfterWhale2.yml | 3 +- .../recorded/actions/snippets/ifWrapCap.yml | 40 - .../actions/snippets/snipPrintAfterPit.yml | 47 - .../containingScope/changeGrandState.yml | 27 - .../containingScope/changeGrandState2.yml | 26 - .../containingScope/changeGrandState3.yml | 29 - .../recorded/containingScope/clearWord.yml | 2 +- .../recorded/containingScope/clearWord2.yml | 2 +- .../recorded/customRegex/clearWhite.yml | 4 +- .../decorations/chuckBlockAirUntilBatt.yml | 3 +- .../decorations/chuckBlockBattUntilAir.yml | 4 +- .../recorded/everyScope/changeEveryLine.yml | 39 - .../implicitExpansion/chuckSecondWordThat.yml | 2 +- .../clearFirstCarSecondWordHarp.yml | 2 +- .../clearFirstWordPastTrap.yml | 2 +- .../implicitExpansion/clearFirstWordThat.yml | 2 +- .../clearLeadingSecondWord.yml | 2 +- .../implicitExpansion/clearSecondWord.yml | 2 +- .../implicitExpansion/clearSecondWord2.yml | 2 +- .../implicitExpansion/clearSecondWordAir.yml | 2 +- .../recorded/inference/takeFirstWord.yml | 2 +- .../inference/takeHarpAndStringEach.yml | 6 +- .../inference/takeHarpPastStringEach.yml | 6 +- .../inference/takeStringHarpAndEach.yml | 6 +- .../inference/takeStringHarpPastEach.yml | 6 +- .../recorded/itemTextual/cloneTwoArgs.yml | 26 - .../recorded/itemTextual/cloneTwoItems.yml | 26 - .../recorded/languages/cpp/clearSubject.yml | 6 +- .../recorded/languages/cpp/clearSubject2.yml | 6 +- .../recorded/languages/cpp/takeString.yml | 6 +- .../languages/csharp/clearSubject.yml | 6 +- .../languages/csharp/clearSubject2.yml | 6 +- .../recorded/languages/go/changeBranch.yml | 23 - .../recorded/languages/go/changeBranch2.yml | 23 - .../recorded/languages/go/changeBranch3.yml | 23 - .../recorded/languages/go/changeBranchAir.yml | 36 - .../recorded/languages/go/changeBranchCap.yml | 35 - .../languages/go/changeBranchCap2.yml | 37 - .../languages/go/changeBranchDrum.yml | 36 - .../languages/go/changeEveryBranch.yml | 27 - .../languages/go/changeEveryBranch2.yml | 27 - .../languages/go/changeEveryBranchEach.yml | 38 - .../languages/go/changeEveryBranchSun.yml | 38 - .../recorded/languages/go/chuckBranch.yml | 23 - .../recorded/languages/go/chuckBranch2.yml | 23 - .../recorded/languages/go/chuckBranch3.yml | 23 - .../recorded/languages/go/cloneBranch.yml | 23 - .../recorded/languages/go/cloneBranch2.yml | 23 - .../recorded/languages/go/cloneBranch3.yml | 23 - .../recorded/languages/go/cloneBranchCap.yml | 38 - .../recorded/languages/go/cloneBranchDrum.yml | 39 - .../recorded/languages/go/cloneBranchEach.yml | 39 - .../languages/go/cloneBranchEach2.yml | 38 - .../recorded/languages/go/drinkBranchCap.yml | 38 - .../recorded/languages/go/drinkBranchEach.yml | 38 - .../recorded/languages/go/pourBranchDrum.yml | 38 - .../recorded/languages/go/pourBranchEach.yml | 38 - .../recorded/languages/go/takeString.yml | 6 +- .../recorded/languages/html/chuckValue.yml | 23 - .../languages/html/clearEveryItem.yml | 24 + .../recorded/languages/html/clearItem.yml | 22 + .../recorded/languages/java/changeBranch.yml | 42 - .../recorded/languages/java/changeBranch2.yml | 42 - .../recorded/languages/java/changeBranch3.yml | 42 - .../recorded/languages/java/changeBranch4.yml | 33 - .../recorded/languages/java/changeBranch5.yml | 33 - .../recorded/languages/java/changeCallee.yml | 6 +- .../recorded/languages/java/changeCallee3.yml | 6 +- .../languages/java/changeCondition.yml | 43 - .../languages/java/changeCondition2.yml | 43 - .../languages/java/changeCondition3.yml | 33 - .../languages/java/changeCondition4.yml | 23 - .../languages/java/changeEveryBranch.yml | 43 - .../languages/java/changeEveryBranch2.yml | 41 - .../languages/java/changeEveryBranch3.yml | 39 - .../languages/java/changeEveryCondition.yml | 45 - .../languages/java/changeEveryCondition2.yml | 41 - .../languages/java/changeEveryName.yml | 33 - .../recorded/languages/java/changeIfState.yml | 38 - .../recorded/languages/java/changeName.yml | 37 - .../recorded/languages/java/changeType2.yml | 47 - .../recorded/languages/java/changeType3.yml | 39 - .../recorded/languages/java/changeType4.yml | 33 - .../recorded/languages/java/changeType5.yml | 33 - .../recorded/languages/java/changeType6.yml | 29 - .../recorded/languages/java/changeValue.yml | 37 - .../recorded/languages/java/changeValue3.yml | 23 - .../recorded/languages/java/changeValue4.yml | 23 - .../recorded/languages/java/chuckBranch.yml | 46 - .../recorded/languages/java/chuckValue2.yml | 31 - .../recorded/languages/java/chuckValue3.yml | 29 - .../recorded/languages/java/clearSubject.yml | 6 +- .../recorded/languages/java/clearSubject2.yml | 6 +- .../java/{clearName2.yml => takeName.yml} | 12 +- .../recorded/languages/java/takeName3.yml | 16 +- .../recorded/languages/java/takeString.yml | 6 +- .../recorded/languages/java/takeType4.yml | 33 - .../{clearTypeGust.yml => takeTypeGust.yml} | 10 +- .../{clearTypeGust2.yml => takeTypeGust2.yml} | 10 +- .../{clearTypeSoon.yml => takeTypeSoon.yml} | 10 +- .../{clearTypeSoon2.yml => takeTypeSoon2.yml} | 10 +- .../{clearTypeTrap.yml => takeTypeTrap.yml} | 10 +- .../{clearTypeTrap2.yml => takeTypeTrap2.yml} | 10 +- .../java/{clearValue4.yml => takeValue.yml} | 8 +- .../languages/javascript/changeEveryValue.yml | 33 - .../javascript/changeEveryValue2.yml | 29 - .../languages/javascript/changeName.yml | 23 - .../languages/javascript/changeName2.yml | 105 - .../languages/javascript/changeName3.yml | 47 - .../languages/javascript/changeName4.yml | 23 - .../languages/javascript/changeName5.yml | 23 - .../languages/javascript/changeValue.yml | 47 - .../languages/javascript/changeValue2.yml | 109 - .../languages/javascript/changeValue3.yml | 43 - .../languages/javascript/changeValue4.yml | 23 - .../languages/javascript/changeValue5.yml | 23 - .../languages/javascript/chuckName.yml | 67 - .../languages/javascript/chuckName2.yml | 23 - .../languages/javascript/chuckName3.yml | 47 - .../languages/javascript/chuckValue.yml | 47 - .../languages/javascript/chuckValue2.yml | 101 - .../recorded/languages/json/takeString.yml | 6 +- .../languages/jsx/changeEveryItem.yml | 25 - .../languages/jsx/changeEveryValue.yml | 25 - .../languages/jsx/changeEveryValue2.yml | 25 - .../recorded/languages/jsx/changeItem.yml | 23 - .../recorded/languages/jsx/chuckValue.yml | 23 - .../languages/markdown/changeEveryItem.yml | 47 - .../languages/markdown/changeLeadingItem.yml | 31 - .../languages/markdown/changeTrailingItem.yml | 31 - .../recorded/languages/markdown/chuckItem.yml | 1 + .../languages/markdown/chuckItem2.yml | 5 +- .../languages/markdown/chuckItem3.yml | 30 - .../languages/markdown/chuckItem4.yml | 28 - .../languages/markdown/chuckItem5.yml | 26 - .../recorded/languages/markdown/cloneItem.yml | 30 - .../languages/markdown/cloneUpItem.yml | 30 - .../languages/markdown/drinkItem2.yml | 30 - .../recorded/languages/markdown/pourItem3.yml | 30 - .../recorded/languages/php/changeFunk2.yml | 38 - .../recorded/languages/php/changeFunk3.yml | 31 - .../recorded/languages/php/changeFunk4.yml | 29 - .../recorded/languages/php/changeList.yml | 32 - .../recorded/languages/php/changeRound.yml | 18 +- .../recorded/languages/php/changeRound2.yml | 29 - .../recorded/languages/php/changeRound3.yml | 29 - .../recorded/languages/php/changeState.yml | 29 - .../recorded/languages/php/chuckFunk.yml | 16 +- .../recorded/languages/php/chuckFunk2.yml | 23 +- .../languages/python/changeEveryName.yml | 33 - .../languages/python/changeEveryName2.yml | 31 - .../languages/python/changeEveryName3.yml | 29 - .../languages/python/changeEveryType.yml | 29 - .../languages/python/changeEveryType2.yml | 31 - .../recorded/languages/python/changeName.yml | 27 - .../recorded/languages/python/changeName2.yml | 27 - .../recorded/languages/python/changeName3.yml | 27 - .../recorded/languages/python/changeState.yml | 26 - .../recorded/languages/python/changeType.yml | 27 - .../recorded/languages/python/changeType2.yml | 21 - .../languages/python/changeValue3.yml | 27 - .../languages/python/changeValue4.yml | 27 - .../languages/python/changeValue5.yml | 27 - .../languages/python/changeValue6.yml | 23 - .../languages/python/changeValue7.yml | 23 - .../recorded/languages/python/chuckItem.yml | 23 - .../recorded/languages/python/chuckName.yml | 31 - .../languages/python/clearAccessAir.yml | 31 - .../languages/python/clearAccessBat.yml | 31 - .../languages/python/clearAccessBat3.yml | 31 - .../languages/python/clearAccessBat5.yml | 33 - .../languages/python/clearAccessCap.yml | 31 - .../languages/python/clearAccessCap2.yml | 31 - .../languages/python/clearAccessCap3.yml | 31 - .../languages/python/clearAccessDrum.yml | 31 - .../languages/python/clearAccessDrum2.yml | 31 - .../languages/python/clearAccessEach.yml | 31 - .../languages/python/clearAccessEach2.yml | 31 - .../languages/python/clearAccessFine.yml | 31 - .../languages/python/clearCondition6.yml | 6 +- .../languages/python/clearEveryAccessAir.yml | 43 - .../languages/python/clearSubject.yml | 6 +- .../languages/python/ditchCondition2.yml | 2 +- .../languages/python/takeEveryAccess.yml | 27 - .../languages/python/takeEveryAccessAir.yml | 37 - .../languages/python/takeEveryAccessAir2.yml | 33 - .../languages/python/takeEveryAccessBat.yml | 37 - .../languages/python/takeEveryAccessBat2.yml | 33 - .../languages/python/takeEveryAccessCap.yml | 37 - .../languages/python/takeEveryAccessCap2.yml | 33 - .../languages/python/takeEveryAccessDrum.yml | 37 - .../languages/python/takeEveryAccessDrum2.yml | 33 - .../languages/python/takeEveryAccessEach.yml | 37 - .../languages/python/takeEveryAccessEach2.yml | 33 - .../recorded/languages/python/takeString.yml | 6 +- .../recorded/languages/python/takeString2.yml | 6 +- .../recorded/languages/python/takeString3.yml | 6 +- .../recorded/languages/python/takeString4.yml | 6 +- .../recorded/languages/rust/changeSubject.yml | 6 +- .../recorded/languages/rust/clearBranch5.yml | 6 +- .../recorded/languages/rust/clearBranch6.yml | 6 +- .../recorded/languages/rust/ditchBranch2.yml | 2 +- .../recorded/languages/scala/clearString.yml | 6 +- .../recorded/languages/scala/clearString2.yml | 6 +- .../languages/scala/clearStringOdd.yml | 6 +- .../recorded/languages/scala/clearSubject.yml | 6 +- .../languages/scm/changeEveryName.yml | 10 +- .../recorded/languages/scm/changeName.yml | 6 +- .../recorded/languages/scm/changeName2.yml | 6 +- .../recorded/languages/scm/changeName3.yml | 6 +- .../recorded/languages/scm/chuckName.yml | 2 +- .../recorded/languages/scm/chuckName2.yml | 6 +- .../languages/scm/clearEveryEntry4.yml | 2 +- .../recorded/languages/scm/clearEveryName.yml | 6 +- .../languages/scm/clearEveryName2.yml | 6 +- .../languages/scm/clearEveryName3.yml | 6 +- .../recorded/languages/scm/clearName.yml | 6 +- .../recorded/languages/scm/clearName2.yml | 6 +- .../recorded/languages/scm/clearName3.yml | 6 +- .../recorded/languages/scm/clearName4.yml | 6 +- .../recorded/languages/scm/clearName5.yml | 6 +- .../recorded/languages/scm/clearName6.yml | 6 +- .../recorded/languages/scm/clearName7.yml | 6 +- .../recorded/languages/scm/drinkName.yml | 6 +- .../recorded/languages/scm/pourName.yml | 6 +- .../recorded/languages/scm/pourName2.yml | 6 +- .../recorded/languages/scm/takeName.yml | 2 +- .../languages/scss/changeFirstWordLook.yml | 2 +- .../languages/scss/changeLastWordLook.yml | 2 +- .../scss/changeLeadingLastWordLook.yml | 2 +- .../languages/scss/changeSecondWordLook.yml | 2 +- .../scss/changeTrailingFirstWordLook.yml | 2 +- .../languages/scss/chuckFirstWordCap.yml | 2 +- .../languages/scss/chuckLastWordCap.yml | 2 +- .../moveFirstWordZipBeforeFineTakeFine.yml | 2 +- .../moveFirstWordZipBeforeFineTakeZip.yml | 2 +- .../scss/moveLastWordZipAfterFineTakeFine.yml | 2 +- .../scss/moveLastWordZipAfterFineTakeZip.yml | 2 +- .../shellscript/changeThirdWordDash.yml | 2 +- .../shellscript/chuckFirstWordBat.yml | 2 +- .../shellscript/chuckSecondWordCap.yml | 2 +- .../languages/typescript/changeCallee5.yml | 6 +- .../languages/typescript/changeCallee6.yml | 6 +- .../languages/typescript/changeCallee7.yml | 6 +- .../languages/typescript/changeEveryArg.yml | 35 - .../languages/typescript/changeEveryArg2.yml | 35 - .../languages/typescript/changeEveryType.yml | 29 - .../languages/typescript/changeEveryType2.yml | 33 - .../languages/typescript/changeEveryType3.yml | 25 - .../languages/typescript/changeName6.yml | 31 - .../languages/typescript/changeNextValue.yml | 30 - .../languages/typescript/changeType10.yml | 31 - .../languages/typescript/changeType11.yml | 23 - .../languages/typescript/changeType12.yml | 23 - .../languages/typescript/changeType13.yml | 23 - .../languages/typescript/changeType14.yml | 23 - .../languages/typescript/changeType15.yml | 31 - .../languages/typescript/changeType16.yml | 29 - .../languages/typescript/changeType17.yml | 23 - .../languages/typescript/changeType18.yml | 23 - .../languages/typescript/changeType19.yml | 23 - .../languages/typescript/changeType20.yml | 23 - .../languages/typescript/changeType21.yml | 31 - .../languages/typescript/changeType22.yml | 31 - .../languages/typescript/changeType23.yml | 29 - .../languages/typescript/changeType7.yml | 113 - .../languages/typescript/changeType8.yml | 43 - .../languages/typescript/changeType9.yml | 23 - .../languages/typescript/changeValue2.yml | 31 - .../languages/typescript/changeValue3.yml | 23 - .../languages/typescript/changeValue4.yml | 23 - .../languages/typescript/changeValue5.yml | 25 - .../languages/typescript/chuckKey2.yml | 23 - .../languages/typescript/chuckName.yml | 55 - .../languages/typescript/chuckType.yml | 103 - .../languages/typescript/chuckType2.yml | 43 - .../languages/typescript/chuckType3.yml | 23 - .../languages/typescript/chuckType4.yml | 31 - .../languages/typescript/chuckType5.yml | 23 - .../languages/typescript/chuckType6.yml | 23 - .../languages/typescript/chuckValue2.yml | 85 - .../languages/typescript/chuckValue3.yml | 43 - .../languages/typescript/chuckValue4.yml | 23 - .../languages/typescript/clearAccessAir.yml | 31 - .../languages/typescript/clearAccessAir2.yml | 31 - .../languages/typescript/clearAccessAir3.yml | 31 - .../languages/typescript/clearAccessBat.yml | 31 - .../languages/typescript/clearAccessBat2.yml | 31 - .../languages/typescript/clearAccessBat3.yml | 31 - .../languages/typescript/clearAccessBat4.yml | 31 - .../languages/typescript/clearAccessBat5.yml | 33 - .../languages/typescript/clearAccessCap.yml | 31 - .../languages/typescript/clearAccessCap2.yml | 31 - .../languages/typescript/clearAccessCap3.yml | 31 - .../languages/typescript/clearAccessDrum.yml | 31 - .../languages/typescript/clearAccessDrum2.yml | 31 - .../languages/typescript/clearAccessEach.yml | 31 - .../languages/typescript/clearAccessEach2.yml | 31 - .../languages/typescript/clearAccessFine.yml | 31 - .../languages/typescript/clearBranch4.yml | 6 +- .../languages/typescript/clearBranch5.yml | 6 +- .../typescript/clearEveryAccessAir.yml | 39 - .../languages/typescript/clearEveryItem.yml | 24 + .../languages/typescript/clearItem4.yml | 22 + .../languages/typescript/clearSubject.yml | 6 +- .../languages/typescript/clearSubject2.yml | 6 +- .../languages/typescript/clearType.yml | 6 +- .../languages/typescript/clearTypeNear.yml | 6 +- .../languages/typescript/clearTypeNear2.yml | 6 +- .../languages/typescript/clearTypeUrge.yml | 6 +- .../languages/typescript/cloneBranch.yml | 40 - .../languages/typescript/ditchBranch.yml | 2 +- .../languages/typescript/ditchBranch2.yml | 2 +- .../languages/typescript/takeEveryAccess.yml | 27 - .../typescript/takeEveryAccessAir.yml | 37 - .../typescript/takeEveryAccessAir2.yml | 33 - .../typescript/takeEveryAccessBat.yml | 37 - .../typescript/takeEveryAccessBat2.yml | 33 - .../typescript/takeEveryAccessBat3.yml | 33 - .../typescript/takeEveryAccessCap.yml | 37 - .../typescript/takeEveryAccessCap2.yml | 33 - .../typescript/takeEveryAccessDrum.yml | 37 - .../typescript/takeEveryAccessDrum2.yml | 33 - .../typescript/takeEveryAccessEach.yml | 37 - .../typescript/takeEveryAccessEach2.yml | 33 - .../{clearEveryKey.yml => takeEveryKey.yml} | 12 +- .../{clearEveryKey2.yml => takeEveryKey2.yml} | 12 +- .../languages/typescript/takeString.yml | 6 +- .../languages/yaml/changeEveryItem.yml | 28 - .../languages/yaml/changeEveryItem2.yml | 25 - .../languages/yaml/changeEveryItem3.yml | 31 - .../languages/yaml/changeEveryItem4.yml | 25 - .../languages/yaml/changeEveryKey.yml | 29 - .../languages/yaml/changeEveryKey2.yml | 25 - .../languages/yaml/changeEveryValue.yml | 29 - .../languages/yaml/changeEveryValue2.yml | 25 - .../recorded/languages/yaml/changeItem.yml | 23 - .../recorded/languages/yaml/changeItem2.yml | 29 - .../recorded/languages/yaml/changeItem3.yml | 23 - .../recorded/languages/yaml/changeItem4.yml | 25 - .../recorded/languages/yaml/changeKey.yml | 23 - .../languages/yaml/changeLeadingItem.yml | 31 - .../languages/yaml/changeLeadingValue.yml | 24 - .../recorded/languages/yaml/changeList.yml | 28 - .../recorded/languages/yaml/changeList2.yml | 23 - .../recorded/languages/yaml/changeList3.yml | 25 - .../recorded/languages/yaml/changeMap.yml | 23 - .../recorded/languages/yaml/changeMap2.yml | 25 - .../languages/yaml/changeTrailingItem.yml | 31 - .../languages/yaml/changeTrailingKey.yml | 24 - .../recorded/languages/yaml/changeValue.yml | 23 - .../recorded/languages/yaml/chuckItem.yml | 28 - .../recorded/languages/yaml/chuckItem10.yml | 28 - .../recorded/languages/yaml/chuckItem11.yml | 26 - .../recorded/languages/yaml/chuckItem2.yml | 28 - .../recorded/languages/yaml/chuckItem3.yml | 23 - .../recorded/languages/yaml/chuckItem4.yml | 23 - .../recorded/languages/yaml/chuckItem5.yml | 25 - .../recorded/languages/yaml/chuckItem6.yml | 25 - .../recorded/languages/yaml/chuckItem7.yml | 25 - .../recorded/languages/yaml/chuckItem8.yml | 25 - .../recorded/languages/yaml/chuckItem9.yml | 30 - .../recorded/languages/yaml/drinkItem.yml | 25 - .../recorded/languages/yaml/drinkItem2.yml | 25 - .../recorded/languages/yaml/drinkItem3.yml | 28 - .../recorded/languages/yaml/pourItem.yml | 23 - .../recorded/languages/yaml/pourItem2.yml | 25 - .../recorded/languages/yaml/pourItem3.yml | 25 - .../recorded/languages/yaml/pourItem4.yml | 28 - .../recorded/modifiers/changeVisible.yml | 29 - .../modifiers/everyScope/clearEveryLine.yml | 4 +- .../instance/clearTwoInstancesLastWordAir.yml | 2 +- .../ordinalScopes/clearFirstPaint.yml | 4 +- .../ordinalScopes/clearFirstPaint2.yml | 4 +- .../recorded/ordinalScopes/clearLastPaint.yml | 4 +- .../ordinalScopes/clearLastPaint2.yml | 4 +- .../scope/glyph/clearEveryGlyphAir.yml | 25 - .../scope/glyph/clearFinalGlyphAir.yml | 25 - .../recorded/scope/glyph/clearGlyphAir.yml | 23 - .../scope/glyph/clearNextGlyphBat.yml | 26 - .../scope/glyph/clearNextGlyphDollar.yml | 26 - .../scope/glyph/clearNextGlyphOnyx.yml | 27 - .../recorded/scopes/character/changeChar.yml | 49 - .../recorded/scopes/token/changeToken.yml | 49 - .../recorded/selectionTypes/chuckWord.yml | 2 +- .../recorded/selectionTypes/chuckWord2.yml | 2 +- .../selectionTypes/clearCustomRegex.yml | 4 +- .../selectionTypes/clearEveryCustomRegex.yml | 4 +- .../recorded/selectionTypes/clearNextWord.yml | 2 +- .../selectionTypes/clearNextWord2.yml | 2 +- .../selectionTypes/clearNextWord3.yml | 2 +- .../selectionTypes/clearPreviousWord.yml | 2 +- .../selectionTypes/clearPreviousWord2.yml | 2 +- .../selectionTypes/clearPreviousWord3.yml | 2 +- .../selectionTypes/clearSecondLastWord.yml | 2 +- .../selectionTypes/clearSecondNextWord.yml | 2 +- .../recorded/selectionTypes/clearWord.yml | 2 +- .../recorded/selectionTypes/clearWord2.yml | 2 +- .../recorded/selectionTypes/clearWord3.yml | 2 +- .../recorded/selectionTypes/clearWord4.yml | 2 +- .../recorded/selectionTypes/clearWord5.yml | 2 +- .../recorded/selectionTypes/clearWord6.yml | 2 +- .../recorded/selectionTypes/clearWord7.yml | 2 +- .../recorded/selectionTypes/takeEveryLine.yml | 4 +- .../recorded/selectionTypes/takeEveryWord.yml | 2 +- .../recorded/subtoken/chuckFinalTwoWords.yml | 2 +- .../recorded/subtoken/chuckFirstTwoWords.yml | 2 +- .../recorded/subtoken/chuckFirstWordVest.yml | 2 +- .../recorded/subtoken/chuckLastWord.yml | 2 +- .../recorded/subtoken/chuckLastWordVest.yml | 2 +- .../subtoken/chuckSecondUntilFourthWord.yml | 34 - .../recorded/subtoken/chuckSecondWordVest.yml | 2 +- .../recorded/subtoken/clearFirstWordVest.yml | 2 +- .../recorded/subtoken/clearLastWordVest.yml | 2 +- .../recorded/subtoken/clearNextWord.yml | 2 +- .../recorded/subtoken/clearSecondWordVest.yml | 2 +- .../recorded/subtoken/clearSixthNextWord.yml | 2 +- .../recorded/subtoken/ditchFourthWordLine.yml | 2 +- .../recorded/subtoken/ditchLastWordLine.yml | 2 +- .../recorded/subtoken/ditchThirdWordLine.yml | 2 +- .../fixtures/recorded/subtoken/pourWord.yml | 2 +- .../recorded/subtoken/pourWordAir.yml | 2 +- .../recorded/subtoken/takeEveryWordLine.yml | 2 +- .../recorded/subtoken/takeEveryWordLine2.yml | 2 +- .../subtoken/takeFirstPastLastWordHarp.yml | 2 +- .../subtoken/takeFirstPastSecondWordHarp.yml | 2 +- .../subtoken/takeFirstTwoWordHarp.yml | 2 +- .../recorded/subtoken/takeFirstWord.yml | 2 +- .../subtoken/takeLastPastFirstWordHarp.yml | 2 +- .../recorded/subtoken/takeLastTwoWordHarp.yml | 2 +- .../recorded/subtoken/takeSecondWord.yml | 2 +- .../subtoken/takeThirdPastSecondWordHarp.yml | 2 +- .../fixtures/scopes/html/attribute.scope | 17 - .../fixtures/scopes/html/comment.block.scope | 15 - .../suite/fixtures/scopes/html/element.scope | 14 - .../suite/fixtures/scopes/html/endTag.scope | 13 - .../fixtures/scopes/html/key.attribute.scope | 20 - .../fixtures/scopes/html/key.attribute2.scope | 17 - .../suite/fixtures/scopes/html/startTag.scope | 13 - .../src/suite/fixtures/scopes/html/tags.scope | 20 - .../scopes/html/value.attribute.scope | 20 - .../fixtures/scopes/java/name.foreach.scope | 29 - .../fixtures/scopes/java/type.foreach.scope | 29 - .../fixtures/scopes/java/value.foreach.scope | 25 - .../scopes/javascript/anonymousFunction.scope | 15 - .../javascript/anonymousFunction2.scope | 15 - .../javascript/anonymousFunction3.scope | 10 - .../argument.actual.iteration.scope | 10 - .../scopes/javascript/argument.actual.scope | 10 - .../argument.formal.iteration.scope | 15 - .../scopes/javascript/argument.formal.scope | 12 - .../scopes/javascript/attribute.scope | 17 - .../javascript/branch.if.iteration.scope | 24 - .../scopes/javascript/branch.if.scope | 52 - .../branch.switchCase.iteration.scope | 14 - .../scopes/javascript/branch.switchCase.scope | 19 - .../scopes/javascript/branch.ternary.scope | 37 - .../scopes/javascript/branch.try.scope | 45 - .../fixtures/scopes/javascript/class.scope | 15 - .../scopes/javascript/className.scope | 29 - .../scopes/javascript/comment.block.scope | 15 - .../scopes/javascript/comment.block2.scope | 15 - .../scopes/javascript/comment.line.scope | 10 - .../scopes/javascript/condition.doWhile.scope | 18 - .../scopes/javascript/condition.for.scope | 25 - .../scopes/javascript/condition.if.scope | 18 - .../javascript/condition.switchCase.scope | 22 - .../scopes/javascript/condition.ternary.scope | 20 - .../scopes/javascript/condition.while.scope | 18 - .../fixtures/scopes/javascript/element.scope | 14 - .../fixtures/scopes/javascript/endTag.scope | 13 - .../scopes/javascript/fieldAccess.scope | 19 - .../javascript/functionCall.constructor.scope | 10 - .../scopes/javascript/functionCall.scope | 10 - .../functionCallee.constructor.scope | 13 - .../scopes/javascript/functionCallee.scope | 13 - .../scopes/javascript/functionName.scope | 22 - .../scopes/javascript/ifStatement.scope | 15 - .../scopes/javascript/key.attribute.scope | 20 - .../scopes/javascript/key.attribute2.scope | 17 - .../javascript/key.mapPair.iteration.scope | 7 - .../scopes/javascript/key.mapPair.scope | 20 - .../fixtures/scopes/javascript/list.scope | 10 - .../fixtures/scopes/javascript/map.scope | 10 - .../javascript/name.assignment.pattern.scope | 20 - .../scopes/javascript/name.assignment.scope | 20 - .../scopes/javascript/name.class.scope | 29 - .../scopes/javascript/name.field.scope | 48 - .../scopes/javascript/name.foreach.scope | 29 - .../scopes/javascript/name.function.scope | 22 - .../javascript/name.variable.pattern.scope | 24 - .../scopes/javascript/name.variable.scope | 24 - .../javascript/namedFunction.method.scope | 27 - .../scopes/javascript/namedFunction.scope | 15 - .../scopes/javascript/namedFunction2.scope | 15 - .../scopes/javascript/regularExpression.scope | 10 - .../fixtures/scopes/javascript/startTag.scope | 13 - .../statement.iteration.block.scope | 21 - .../statement.iteration.document.scope | 25 - .../scopes/javascript/statement.scope | 10 - .../scopes/javascript/string.multiLine.scope | 13 - .../scopes/javascript/string.singleLine.scope | 10 - .../javascript/switchStatementSubject.scope | 18 - .../fixtures/scopes/javascript/tags.scope | 20 - .../scopes/javascript/value.assignment.scope | 20 - .../scopes/javascript/value.attribute.scope | 20 - .../scopes/javascript/value.field.scope | 22 - .../scopes/javascript/value.foreach.scope | 25 - .../javascript/value.mapPair.iteration.scope | 13 - .../scopes/javascript/value.mapPair.scope | 20 - .../javascript/value.return.lambda.scope | 20 - .../scopes/javascript/value.return.scope | 22 - .../scopes/javascript/value.variable.scope | 20 - .../fixtures/scopes/json/comment.block.scope | 15 - .../fixtures/scopes/json/comment.line.scope | 10 - .../fixtures/scopes/python/name.foreach.scope | 27 - .../python/name.resource.iteration.scope | 19 - .../scopes/python/name.resource.scope | 23 - .../scopes/python/name.resource2.scope | 72 - .../scopes/python/name.resource3.scope | 75 - .../scopes/python/value.foreach.scope | 23 - .../python/value.resource.iteration.scope | 19 - .../python/value.resource.iteration2.scope | 33 - .../scopes/python/value.resource.scope | 23 - .../scopes/python/value.resource2.scope | 69 - .../scopes/python/value.resource3.scope | 23 - .../scopes/python/value.resource4.scope | 72 - .../scopes/python/value.resource5.scope | 75 - .../fixtures/scopes/python/value.yield.scope | 21 - .../suite/fixtures/scopes/talon/command.scope | 17 - .../fixtures/scopes/textual/character.scope | 28 - .../fixtures/scopes/textual/document.scope | 32 - .../fixtures/scopes/textual/identifier.scope | 10 - .../suite/fixtures/scopes/textual/line.scope | 10 - .../suite/fixtures/scopes/textual/line2.scope | 69 - .../textual/nonWhitespaceSequence.scope | 17 - .../fixtures/scopes/textual/paragraph.scope | 40 - .../fixtures/scopes/textual/sentence.scope | 10 - .../suite/fixtures/scopes/textual/token.scope | 21 - .../suite/fixtures/scopes/textual/url.scope | 10 - .../suite/fixtures/scopes/textual/word.scope | 33 - .../suite/fixtures/scopes/textual/word2.scope | 19 - .../scopes/typescript/name.field.scope | 109 - .../scopes/typescript/type.alias.scope | 10 - .../scopes/typescript/type.alias2.scope | 10 - .../scopes/typescript/type.field.scope | 102 - .../typescript/type.formalParameter.scope | 22 - .../scopes/typescript/type.interface.scope | 15 - .../scopes/typescript/type.return.scope | 25 - .../scopes/typescript/type.variable.scope | 24 - .../scopes/typescript/value.field.scope | 82 - .../src/suite/followLink.vscode.test.ts | 6 +- .../suite/instanceAcrossSplit.vscode.test.ts | 165 - .../intraCellSetSelection.vscode.test.ts | 5 +- .../src/suite/keyboard/basic.vscode.test.ts | 184 +- .../src/suite/recorded.vscode.test.ts | 39 +- .../assertCalledWithScopeInfo.ts | 41 - .../scopeProvider/runBasicScopeInfoTest.ts | 73 - .../runCustomRegexScopeInfoTest.ts | 103 - .../runCustomSpokenFormScopeInfoTest.ts | 228 - .../runSurroundingPairScopeInfoTest.ts | 50 - .../scopeProvider.vscode.test.ts | 27 - .../src/suite/scopes.vscode.test.ts | 163 - .../src/suite/scroll.vscode.test.ts | 14 +- .../src/suite/serializeHeader.ts | 60 - .../src/suite/serializeScopeFixture.ts | 328 - .../src/suite/serializeTargetRange.ts | 68 - .../src/suite/skipIfWindowsCi.ts | 7 + .../suite/toggleDecorations.vscode.test.ts | 2 +- .../src/suite/visible.vscode.test.ts | 66 - packages/cursorless-vscode/images/logo.png | Bin 6157 -> 0 bytes packages/cursorless-vscode/package.json | 428 +- .../scripts/install-from-pr.sh | 12 +- .../src/ScopeTreeProvider.ts | 346 - .../src/ScopeVisualizerCommandApi.ts | 11 +- .../src/constructTestHelpers.ts | 10 +- packages/cursorless-vscode/src/extension.ts | 93 +- .../handleMultipleLines.test.ts | 2 +- .../VscodeIterationScopeVisualizer.ts | 8 +- .../VscodeScopeTargetVisualizer.ts | 5 +- .../VscodeScopeVisualizer.ts | 3 +- .../blendRangeTypeColors.ts | 2 +- .../createVscodeScopeVisualizer.ts | 3 +- .../src/ide/vscode/VscodeConfiguration.ts | 33 - .../src/ide/vscode/VscodeFileSystem.ts | 105 +- .../src/ide/vscode/VscodeFocusEditor.ts | 17 +- .../src/ide/vscode/VscodeGlobalState.ts | 6 +- .../src/ide/vscode/VscodeIDE.ts | 28 +- .../src/ide/vscode/hatStyles.types.ts | 12 +- .../src/ide/vscode/hats/VscodeHatRenderer.ts | 195 +- .../src/ide/vscode/hats/VscodeHats.ts | 5 +- .../hats/performPr1868ShapeUpdateInit.ts | 115 - .../src/ide/vscode/hats/shapeAdjustments.ts | 43 +- .../src/ide/vscode/notebook/notebook.ts | 36 +- .../ide/vscode/notebook/notebookCurrent.ts | 24 - .../src/ide/vscode/notebook/notebookLegacy.ts | 12 +- .../src/keyboard/KeyboardActionType.ts | 55 - .../src/keyboard/KeyboardCommandHandler.ts | 108 - .../keyboard/KeyboardCommandTypeHelpers.ts | 40 - .../src/keyboard/KeyboardCommands.ts | 17 +- .../src/keyboard/KeyboardCommandsModal.ts | 254 +- .../keyboard/KeyboardCommandsModalLayer.ts | 87 - .../src/keyboard/KeyboardCommandsTargeted.ts | 263 +- .../src/keyboard/KeyboardConfig.ts | 146 - .../src/keyboard/KeyboardHandler.ts | 10 +- .../src/keyboard/TokenTypeHelpers.ts | 18 - .../src/keyboard/TokenTypes.ts | 80 - .../src/keyboard/buildSuffixTrie.test.ts | 145 - .../src/keyboard/buildSuffixTrie.ts | 115 - .../src/keyboard/defaultKeymaps.ts | 24 + .../src/keyboard/getTokenTypeKeyMaps.ts | 117 - .../grammar/CommandRulePostProcessor.ts | 22 - .../src/keyboard/grammar/generated/grammar.ts | 119 - .../grammar/getAcceptableTokenTypes.test.ts | 159 - .../grammar/getAcceptableTokenTypes.ts | 151 - .../src/keyboard/grammar/grammar.ne | 99 - .../src/keyboard/grammar/grammar.test.ts | 161 - .../src/keyboard/grammar/grammarHelpers.ts | 168 - .../src/keyboard/grammar/keyboardLexer.ts | 57 - .../src/keyboard/grammar/stringifyTokens.ts | 11 - .../src/keyboard/keyboard-config.fixture.json | 101 - .../cursorless-vscode/src/logQuickActions.ts | 41 - .../cursorless-vscode/src/registerCommands.ts | 16 +- .../src/revisualizeOnCustomRegexChange.ts | 62 - .../src/scripts/populateDist/assets.ts | 3 +- .../src/scripts/populateDist/populateDist.ts | 3 +- .../src/scripts/preprocessSvgHats.ts | 12 +- .../src/storedTargetHighlighter.ts | 76 - .../cursorless-vscode/src/usingSetting.ts | 38 - packages/meta-updater/package.json | 5 +- .../src/getCursorlessVscodeFields.ts | 5 - .../meta-updater/src/updatePackageJson.ts | 98 +- packages/meta-updater/src/updateTSConfig.ts | 16 +- packages/test-harness/package.json | 21 +- packages/test-harness/scripts/build-tests.sh | 6 - packages/test-harness/src/runAllTests.ts | 10 +- .../test-harness/src/scripts/runTestsCI.ts | 2 +- packages/vscode-common/package.json | 15 +- packages/vscode-common/src/TestHelpers.ts | 55 - packages/vscode-common/src/getExtensionApi.ts | 54 +- packages/vscode-common/src/index.ts | 1 - .../src/testUtil/openNewEditor.ts | 2 +- ...usaurus__theme-search-algolia@2.3.1.patch} | 8 +- patches/@types__nearley@2.11.5.patch | 50 - patches/nearley@2.20.1.patch | 32 - pnpm-lock.yaml | 8662 ++++++++--------- pyproject.toml | 16 +- queries/go.scm | 52 - queries/html.scm | 99 - queries/java.scm | 328 - queries/javascript.core.scm | 655 +- queries/javascript.fieldAccess.scm | 105 - queries/javascript.jsx.scm | 38 - queries/javascript.scm | 7 +- queries/json.scm | 36 - queries/jsonc.scm | 1 - queries/jsonl.scm | 1 - queries/markdown.scm | 43 - queries/php.scm | 86 - queries/python.fieldAccess.scm | 93 - queries/python.scm | 366 +- queries/scm.name.scm | 54 +- queries/scm.scm | 4 +- queries/talon.scm | 40 +- queries/typescript.core.scm | 327 - queries/typescript.scm | 85 +- queries/typescriptreact.scm | 2 +- queries/xml.scm | 80 - queries/yaml.scm | 77 - schemas/cursorless-snippets.json | 1 + scripts/build-and-assemble-website.sh | 3 - scripts/forbid-todo.sh | 13 - tsconfig.base.json | 6 +- typings/object.d.ts | 29 +- 1081 files changed, 11528 insertions(+), 33912 deletions(-) delete mode 100644 changelog/2023-09-addedArgumentTargetToCallAction.md delete mode 100644 changelog/2023-09-addedDestinationAndScopeTypeToInsertSnippetAction.md delete mode 100644 changelog/2023-09-addedJoinLinesAction.md delete mode 100644 changelog/2023-09-updatedHatShapes.md delete mode 100644 changelog/2023-11-modalKeyboardVscodeCommands.md delete mode 100644 changelog/2023-12-addedBreakLineAction.md delete mode 100644 changelog/2023-12-addedVisibleModifier.md delete mode 100644 changelog/2023-12.addedGrandScopeModifier.md delete mode 100644 changelog/2024-02-addedIncrementAndDecrementActions.md create mode 100644 cursorless-talon/src/actions/find.py delete mode 100644 cursorless-talon/src/modifiers/glyph_scope.py delete mode 100644 cursorless-talon/src/private_api/extract_decorated_marks.py delete mode 100644 cursorless-talon/src/private_api/private_api.py delete mode 100644 cursorless-talon/src/spoken_forms_output.py delete mode 100644 data/playground/go/branch.go delete mode 100644 docs/user/how-to.md delete mode 100644 docs/user/localCommandHIstory.md delete mode 100644 docs/user/reference/destinations.md delete mode 100644 docs/user/scope-sidebar.md delete mode 100644 images/logo-white.png delete mode 100644 images/logo.svg create mode 100644 packages/cheatsheet-local/postcss.config.js create mode 100644 packages/cheatsheet/jest.config.js delete mode 100644 packages/cheatsheet/jest.config.ts delete mode 100755 packages/common/scripts/my-ts-node.js delete mode 100644 packages/common/src/StoredTargetKey.ts delete mode 100644 packages/common/src/cursorlessSideBarIds.ts delete mode 100644 packages/common/src/scopeSupportFacets/getLanguageScopeSupport.ts delete mode 100644 packages/common/src/scopeSupportFacets/html.ts delete mode 100644 packages/common/src/scopeSupportFacets/java.ts delete mode 100644 packages/common/src/scopeSupportFacets/javascript.ts delete mode 100644 packages/common/src/scopeSupportFacets/json.ts delete mode 100644 packages/common/src/scopeSupportFacets/python.ts delete mode 100644 packages/common/src/scopeSupportFacets/scopeSupportFacetInfos.ts delete mode 100644 packages/common/src/scopeSupportFacets/scopeSupportFacets.types.ts delete mode 100644 packages/common/src/scopeSupportFacets/talon.ts delete mode 100644 packages/common/src/scopeSupportFacets/textualScopeSupportFacetInfos.ts delete mode 100644 packages/common/src/scopeSupportFacets/typescript.ts delete mode 100644 packages/common/src/testUtil/spyToPlainObject.ts rename packages/common/src/{util => testUtil}/toPlainObject.ts (79%) delete mode 100644 packages/common/src/types/SpokenForm.ts delete mode 100644 packages/common/src/types/commandHistory.ts delete mode 100644 packages/common/src/util/camelCaseToAllDown.ts delete mode 100644 packages/common/src/util/disposableFrom.ts delete mode 100644 packages/cursorless-engine/src/CommandHistory.ts delete mode 100644 packages/cursorless-engine/src/CommandHistoryAnalyzer.ts rename packages/cursorless-engine/src/{scopeProviders => ScopeVisualizer}/ScopeRangeProvider.ts (97%) rename packages/cursorless-engine/src/{scopeProviders => ScopeVisualizer}/ScopeRangeWatcher.ts (96%) rename packages/cursorless-engine/src/{scopeProviders => ScopeVisualizer}/ScopeSupportChecker.ts (98%) rename packages/cursorless-engine/src/{scopeProviders => ScopeVisualizer}/getIterationRange.ts (100%) rename packages/cursorless-engine/src/{scopeProviders => ScopeVisualizer}/getIterationScopeRanges.ts (94%) rename packages/cursorless-engine/src/{scopeProviders => ScopeVisualizer}/getScopeRanges.ts (91%) create mode 100644 packages/cursorless-engine/src/ScopeVisualizer/getTargetRanges.ts delete mode 100644 packages/cursorless-engine/src/actions/BreakLine.ts delete mode 100644 packages/cursorless-engine/src/actions/JoinLines.ts rename packages/cursorless-engine/src/actions/{SetSpecialTarget.ts => SetInstanceReference.ts} (54%) delete mode 100644 packages/cursorless-engine/src/actions/ShowParseTree.ts delete mode 100644 packages/cursorless-engine/src/actions/incrementDecrement.ts rename packages/{common/src/types => cursorless-engine/src/api}/ScopeProvider.ts (66%) delete mode 100644 packages/cursorless-engine/src/asyncIteratorToList.ts delete mode 100644 packages/cursorless-engine/src/generateCommandHistoryEntries.ts delete mode 100644 packages/cursorless-engine/src/generateSpokenForm/CustomSpokenFormGeneratorImpl.test.ts delete mode 100644 packages/cursorless-engine/src/generateSpokenForm/CustomSpokenFormGeneratorImpl.ts delete mode 100644 packages/cursorless-engine/src/generateSpokenForm/SpokenFormComponent.ts delete mode 100644 packages/cursorless-engine/src/generateSpokenForm/defaultSpokenForms/surroundingPairsDelimiters.ts delete mode 100644 packages/cursorless-engine/src/generateSpokenForm/getSpokenFormComponentMap.ts delete mode 100644 packages/cursorless-engine/src/languages/TreeSitterQuery/validateQueryCaptures.test.ts delete mode 100644 packages/cursorless-engine/src/languages/TreeSitterQuery/validateQueryCaptures.ts create mode 100644 packages/cursorless-engine/src/languages/html.ts create mode 100644 packages/cursorless-engine/src/languages/json.ts create mode 100644 packages/cursorless-engine/src/languages/typescript.ts delete mode 100644 packages/cursorless-engine/src/nodeCommon/README.md delete mode 100644 packages/cursorless-engine/src/nodeCommon/TalonSpokenFormsJsonReader.ts delete mode 100644 packages/cursorless-engine/src/processTargets/.eslintrc.json delete mode 100644 packages/cursorless-engine/src/processTargets/createContinuousRangeTarget.ts delete mode 100644 packages/cursorless-engine/src/processTargets/modifiers/VisibleStage.ts delete mode 100644 packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/isPreferredOverHelper.ts rename packages/cursorless-engine/src/processTargets/{targets/util => targetUtil}/createContinuousRange.ts (64%) rename packages/cursorless-engine/src/processTargets/{targets/util => targetUtil}/insertionRemovalBehaviors/DelimitedSequenceInsertionRemovalBehavior.ts (75%) rename packages/cursorless-engine/src/processTargets/{targets/util => targetUtil}/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts (92%) rename packages/cursorless-engine/src/processTargets/{targets/util => targetUtil}/insertionRemovalBehaviors/insertionRemovalBehavior.types.ts (66%) delete mode 100644 packages/cursorless-engine/src/scopeProviders/ScopeInfoProvider.ts delete mode 100644 packages/cursorless-engine/src/scopeProviders/ScopeSupportWatcher.ts delete mode 100644 packages/cursorless-engine/src/scopeProviders/TalonSpokenForms.ts delete mode 100644 packages/cursorless-engine/src/scopeProviders/getTargetRanges.ts delete mode 100644 packages/cursorless-engine/src/scopeProviders/scopeTypeToString.ts delete mode 100644 packages/cursorless-engine/src/spokenForms/CustomSpokenForms.ts delete mode 100644 packages/cursorless-engine/src/spokenForms/SpokenFormMap.ts delete mode 100644 packages/cursorless-engine/src/spokenForms/SpokenFormType.ts delete mode 100644 packages/cursorless-engine/src/spokenForms/defaultSpokenFormMap.ts delete mode 100644 packages/cursorless-engine/src/spokenForms/defaultSpokenFormMap.types.ts delete mode 100644 packages/cursorless-engine/src/spokenForms/defaultSpokenFormMapCore.ts delete mode 100644 packages/cursorless-engine/src/spokenForms/spokenFormMapUtil.ts delete mode 100644 packages/cursorless-engine/src/util/getScopeType.ts rename packages/{common => cursorless-engine}/src/util/uniqWithHash.test.ts (100%) rename packages/{common => cursorless-engine}/src/util/uniqWithHash.ts (100%) create mode 100644 packages/cursorless-org-docs/babel.config.js delete mode 100644 packages/cursorless-org-docs/babel.config.mjs create mode 100644 packages/cursorless-org-docs/docusaurus.config.js delete mode 100644 packages/cursorless-org-docs/docusaurus.config.mts create mode 100644 packages/cursorless-org-docs/static/favicon.ico create mode 100644 packages/cursorless-org-docs/static/icon.svg delete mode 100644 packages/cursorless-org-docs/static/logo-dark.svg delete mode 100644 packages/cursorless-org-docs/static/logo.svg delete mode 100644 packages/cursorless-org/mdx-components.tsx create mode 100644 packages/cursorless-org/postcss.config.js delete mode 100644 packages/cursorless-org/public/andrew-dant.jpeg delete mode 100644 packages/cursorless-org/public/big-hats.png delete mode 100644 packages/cursorless-org/public/browserconfig.xml delete mode 100644 packages/cursorless-org/public/favicon.png delete mode 100644 packages/cursorless-org/public/favicon.svg delete mode 100644 packages/cursorless-org/public/fonts/Inconsolata-Bold.ttf delete mode 100644 packages/cursorless-org/public/fonts/Inconsolata-ExtraLight.ttf delete mode 100644 packages/cursorless-org/public/fonts/Inconsolata-Light.ttf delete mode 100644 packages/cursorless-org/public/fonts/Inconsolata-Medium.ttf delete mode 100644 packages/cursorless-org/public/fonts/Inconsolata-Regular.ttf delete mode 100644 packages/cursorless-org/public/fonts/Inconsolata-SemiBold.ttf delete mode 100644 packages/cursorless-org/public/james-stout.jpeg delete mode 100644 packages/cursorless-org/public/logo-dark.svg delete mode 100644 packages/cursorless-org/public/logo.svg delete mode 100644 packages/cursorless-org/public/max-foxley-marrable.jpeg delete mode 100644 packages/cursorless-org/public/mstile-144x144.png delete mode 100644 packages/cursorless-org/public/mstile-150x150.png delete mode 100644 packages/cursorless-org/public/mstile-310x150.png delete mode 100644 packages/cursorless-org/public/mstile-310x310.png delete mode 100644 packages/cursorless-org/public/mstile-70x70.png delete mode 100644 packages/cursorless-org/public/nathan-heffley.jpeg delete mode 100644 packages/cursorless-org/public/safari-pinned-tab.svg delete mode 100644 packages/cursorless-org/public/sohee-yang.jpeg delete mode 100644 packages/cursorless-org/src/components/IndexSocial.tsx delete mode 100644 packages/cursorless-org/src/components/Layout.tsx rename packages/cursorless-org/src/components/{BaseSocial.tsx => Social.tsx} (55%) delete mode 100644 packages/cursorless-org/src/components/SpamProofEmailLink.tsx delete mode 100644 packages/cursorless-org/src/content/enablement-group.mdx delete mode 100644 packages/cursorless-org/src/content/enablement-group.mdx.d.ts delete mode 100644 packages/cursorless-org/src/pages/enablement-group.tsx delete mode 100644 packages/cursorless-org/src/parseEmailAddress.ts delete mode 100644 packages/cursorless-vscode-e2e/src/suite/commandHistory.vscode.test.ts delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/breakBat.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/breakCommentSit.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/breakJustThis.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/breakJustThis2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/callFineOnBatt.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/changeNextInstanceChar.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/decrementFile.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/findVest.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/fromThis.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/incrementFile.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/incrementLineFourAndEveryTokenOne.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/incrementThree.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinAir.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinAir2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinAir3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinAir4.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinBlock.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinFile.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinLineThis.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinTwoLines.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/parseTreeFile.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/scoutAir.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/scoutAllAir.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/snippets/ifWrapCap.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/snippets/snipPrintAfterPit.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/containingScope/changeGrandState.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/containingScope/changeGrandState2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/containingScope/changeGrandState3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/everyScope/changeEveryLine.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/itemTextual/cloneTwoArgs.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/itemTextual/cloneTwoItems.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranch.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranch2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranch3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranchAir.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranchCap.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranchCap2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranchDrum.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeEveryBranch.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeEveryBranch2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeEveryBranchEach.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeEveryBranchSun.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/chuckBranch.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/chuckBranch2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/chuckBranch3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranch.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranch2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranch3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranchCap.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranchDrum.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranchEach.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranchEach2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/drinkBranchCap.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/drinkBranchEach.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/pourBranchDrum.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/pourBranchEach.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/html/chuckValue.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/html/clearEveryItem.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/html/clearItem.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch4.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch5.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition4.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryBranch.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryBranch2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryBranch3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryCondition.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryCondition2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryName.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeIfState.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeName.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType4.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType5.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType6.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeValue.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeValue3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeValue4.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/chuckBranch.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/chuckValue2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/chuckValue3.yml rename packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/{clearName2.yml => takeName.yml} (73%) delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeType4.yml rename packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/{clearTypeGust.yml => takeTypeGust.yml} (81%) rename packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/{clearTypeGust2.yml => takeTypeGust2.yml} (81%) rename packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/{clearTypeSoon.yml => takeTypeSoon.yml} (80%) rename packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/{clearTypeSoon2.yml => takeTypeSoon2.yml} (80%) rename packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/{clearTypeTrap.yml => takeTypeTrap.yml} (80%) rename packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/{clearTypeTrap2.yml => takeTypeTrap2.yml} (80%) rename packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/{clearValue4.yml => takeValue.yml} (76%) delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeEveryValue.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeEveryValue2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeName.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeName2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeName3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeName4.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeName5.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeValue.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeValue2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeValue3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeValue4.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeValue5.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/chuckName.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/chuckName2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/chuckName3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/chuckValue.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/chuckValue2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/jsx/changeEveryItem.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/jsx/changeEveryValue.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/jsx/changeEveryValue2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/jsx/changeItem.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/jsx/chuckValue.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/changeEveryItem.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/changeLeadingItem.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/changeTrailingItem.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/chuckItem3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/chuckItem4.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/chuckItem5.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/cloneItem.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/cloneUpItem.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/drinkItem2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/pourItem3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/php/changeFunk2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/php/changeFunk3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/php/changeFunk4.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/php/changeList.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/php/changeRound2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/php/changeRound3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/php/changeState.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/changeEveryName.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/changeEveryName2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/changeEveryName3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/changeEveryType.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/changeEveryType2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/changeName.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/changeName2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/changeName3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/changeState.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/changeType.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/changeType2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/changeValue3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/changeValue4.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/changeValue5.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/changeValue6.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/changeValue7.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/chuckItem.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/chuckName.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessAir.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessBat.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessBat3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessBat5.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessCap.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessCap2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessCap3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessDrum.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessDrum2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessEach.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessEach2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessFine.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearEveryAccessAir.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccess.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessAir.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessAir2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessBat.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessBat2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessCap.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessCap2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessDrum.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessDrum2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessEach.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessEach2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeEveryArg.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeEveryArg2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeEveryType.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeEveryType2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeEveryType3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeName6.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeNextValue.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType10.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType11.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType12.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType13.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType14.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType15.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType16.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType17.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType18.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType19.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType20.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType21.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType22.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType23.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType7.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType8.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType9.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeValue2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeValue3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeValue4.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeValue5.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckKey2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckName.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckType.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckType2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckType3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckType4.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckType5.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckType6.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckValue2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckValue3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckValue4.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessAir.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessAir2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessAir3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessBat.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessBat2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessBat3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessBat4.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessBat5.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessCap.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessCap2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessCap3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessDrum.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessDrum2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessEach.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessEach2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessFine.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearEveryAccessAir.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearEveryItem.yml create mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearItem4.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/cloneBranch.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccess.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessAir.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessAir2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessBat.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessBat2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessBat3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessCap.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessCap2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessDrum.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessDrum2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessEach.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessEach2.yml rename packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/{clearEveryKey.yml => takeEveryKey.yml} (75%) rename packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/{clearEveryKey2.yml => takeEveryKey2.yml} (74%) delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryItem.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryItem2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryItem3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryItem4.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryKey.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryKey2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryValue.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryValue2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeItem.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeItem2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeItem3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeItem4.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeKey.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeLeadingItem.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeLeadingValue.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeList.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeList2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeList3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeMap.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeMap2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeTrailingItem.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeTrailingKey.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeValue.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem10.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem11.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem4.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem5.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem6.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem7.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem8.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem9.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/drinkItem.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/drinkItem2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/drinkItem3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/pourItem.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/pourItem2.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/pourItem3.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/pourItem4.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scope/glyph/clearEveryGlyphAir.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scope/glyph/clearFinalGlyphAir.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scope/glyph/clearGlyphAir.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scope/glyph/clearNextGlyphBat.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scope/glyph/clearNextGlyphDollar.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scope/glyph/clearNextGlyphOnyx.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scopes/character/changeChar.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scopes/token/changeToken.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckSecondUntilFourthWord.yml delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/attribute.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/comment.block.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/element.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/endTag.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/key.attribute.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/key.attribute2.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/startTag.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/tags.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/value.attribute.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/java/name.foreach.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/java/type.foreach.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/java/value.foreach.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/anonymousFunction.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/anonymousFunction2.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/anonymousFunction3.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/argument.actual.iteration.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/argument.actual.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/argument.formal.iteration.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/argument.formal.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/attribute.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/branch.if.iteration.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/branch.if.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/branch.switchCase.iteration.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/branch.switchCase.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/branch.ternary.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/branch.try.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/class.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/className.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/comment.block.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/comment.block2.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/comment.line.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/condition.doWhile.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/condition.for.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/condition.if.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/condition.switchCase.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/condition.ternary.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/condition.while.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/element.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/endTag.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/fieldAccess.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/functionCall.constructor.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/functionCall.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/functionCallee.constructor.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/functionCallee.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/functionName.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/ifStatement.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/key.attribute.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/key.attribute2.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/key.mapPair.iteration.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/key.mapPair.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/list.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/map.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.assignment.pattern.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.assignment.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.class.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.field.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.foreach.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.function.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.variable.pattern.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.variable.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/namedFunction.method.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/namedFunction.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/namedFunction2.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/regularExpression.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/startTag.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/statement.iteration.block.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/statement.iteration.document.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/statement.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/string.multiLine.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/string.singleLine.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/switchStatementSubject.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/tags.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.assignment.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.attribute.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.field.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.foreach.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.mapPair.iteration.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.mapPair.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.return.lambda.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.return.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.variable.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/json/comment.block.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/json/comment.line.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/name.foreach.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/name.resource.iteration.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/name.resource.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/name.resource2.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/name.resource3.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.foreach.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource.iteration.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource.iteration2.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource2.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource3.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource4.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource5.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.yield.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/talon/command.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/character.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/document.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/identifier.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/line.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/line2.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/nonWhitespaceSequence.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/paragraph.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/sentence.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/token.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/url.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/word.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/word2.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/name.field.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.alias.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.alias2.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.field.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.formalParameter.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.interface.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.return.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.variable.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/value.field.scope delete mode 100644 packages/cursorless-vscode-e2e/src/suite/instanceAcrossSplit.vscode.test.ts delete mode 100644 packages/cursorless-vscode-e2e/src/suite/scopeProvider/assertCalledWithScopeInfo.ts delete mode 100644 packages/cursorless-vscode-e2e/src/suite/scopeProvider/runBasicScopeInfoTest.ts delete mode 100644 packages/cursorless-vscode-e2e/src/suite/scopeProvider/runCustomRegexScopeInfoTest.ts delete mode 100644 packages/cursorless-vscode-e2e/src/suite/scopeProvider/runCustomSpokenFormScopeInfoTest.ts delete mode 100644 packages/cursorless-vscode-e2e/src/suite/scopeProvider/runSurroundingPairScopeInfoTest.ts delete mode 100644 packages/cursorless-vscode-e2e/src/suite/scopeProvider/scopeProvider.vscode.test.ts delete mode 100644 packages/cursorless-vscode-e2e/src/suite/scopes.vscode.test.ts delete mode 100644 packages/cursorless-vscode-e2e/src/suite/serializeHeader.ts delete mode 100644 packages/cursorless-vscode-e2e/src/suite/serializeScopeFixture.ts delete mode 100644 packages/cursorless-vscode-e2e/src/suite/serializeTargetRange.ts create mode 100644 packages/cursorless-vscode-e2e/src/suite/skipIfWindowsCi.ts delete mode 100644 packages/cursorless-vscode-e2e/src/suite/visible.vscode.test.ts delete mode 100644 packages/cursorless-vscode/images/logo.png delete mode 100644 packages/cursorless-vscode/src/ScopeTreeProvider.ts delete mode 100644 packages/cursorless-vscode/src/ide/vscode/hats/performPr1868ShapeUpdateInit.ts delete mode 100644 packages/cursorless-vscode/src/ide/vscode/notebook/notebookCurrent.ts delete mode 100644 packages/cursorless-vscode/src/keyboard/KeyboardActionType.ts delete mode 100644 packages/cursorless-vscode/src/keyboard/KeyboardCommandHandler.ts delete mode 100644 packages/cursorless-vscode/src/keyboard/KeyboardCommandTypeHelpers.ts delete mode 100644 packages/cursorless-vscode/src/keyboard/KeyboardCommandsModalLayer.ts delete mode 100644 packages/cursorless-vscode/src/keyboard/KeyboardConfig.ts delete mode 100644 packages/cursorless-vscode/src/keyboard/TokenTypeHelpers.ts delete mode 100644 packages/cursorless-vscode/src/keyboard/TokenTypes.ts delete mode 100644 packages/cursorless-vscode/src/keyboard/buildSuffixTrie.test.ts delete mode 100644 packages/cursorless-vscode/src/keyboard/buildSuffixTrie.ts create mode 100644 packages/cursorless-vscode/src/keyboard/defaultKeymaps.ts delete mode 100644 packages/cursorless-vscode/src/keyboard/getTokenTypeKeyMaps.ts delete mode 100644 packages/cursorless-vscode/src/keyboard/grammar/CommandRulePostProcessor.ts delete mode 100644 packages/cursorless-vscode/src/keyboard/grammar/generated/grammar.ts delete mode 100644 packages/cursorless-vscode/src/keyboard/grammar/getAcceptableTokenTypes.test.ts delete mode 100644 packages/cursorless-vscode/src/keyboard/grammar/getAcceptableTokenTypes.ts delete mode 100644 packages/cursorless-vscode/src/keyboard/grammar/grammar.ne delete mode 100644 packages/cursorless-vscode/src/keyboard/grammar/grammar.test.ts delete mode 100644 packages/cursorless-vscode/src/keyboard/grammar/grammarHelpers.ts delete mode 100644 packages/cursorless-vscode/src/keyboard/grammar/keyboardLexer.ts delete mode 100644 packages/cursorless-vscode/src/keyboard/grammar/stringifyTokens.ts delete mode 100644 packages/cursorless-vscode/src/keyboard/keyboard-config.fixture.json delete mode 100644 packages/cursorless-vscode/src/logQuickActions.ts delete mode 100644 packages/cursorless-vscode/src/revisualizeOnCustomRegexChange.ts delete mode 100644 packages/cursorless-vscode/src/storedTargetHighlighter.ts delete mode 100644 packages/cursorless-vscode/src/usingSetting.ts delete mode 100755 packages/test-harness/scripts/build-tests.sh delete mode 100644 packages/vscode-common/src/TestHelpers.ts rename patches/{@docusaurus__theme-search-algolia@3.1.0.patch => @docusaurus__theme-search-algolia@2.3.1.patch} (85%) delete mode 100644 patches/@types__nearley@2.11.5.patch delete mode 100644 patches/nearley@2.20.1.patch delete mode 100644 queries/html.scm delete mode 100644 queries/java.scm delete mode 100644 queries/javascript.fieldAccess.scm delete mode 100644 queries/json.scm delete mode 100644 queries/jsonc.scm delete mode 100644 queries/jsonl.scm delete mode 100644 queries/markdown.scm delete mode 100644 queries/php.scm delete mode 100644 queries/python.fieldAccess.scm delete mode 100644 queries/typescript.core.scm delete mode 100644 queries/xml.scm delete mode 100644 queries/yaml.scm delete mode 100755 scripts/forbid-todo.sh diff --git a/.editorconfig b/.editorconfig index 1b66cc3776e..3d2dcf13eb2 100644 --- a/.editorconfig +++ b/.editorconfig @@ -28,7 +28,7 @@ trim_trailing_whitespace = false [Makefile] indent_style = tab -[**/{vendor,generated}/**] +[**/vendor/**] charset = unset end_of_line = unset indent_size = unset diff --git a/.eslintrc.json b/.eslintrc.json index cafdb631304..26ea892256a 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -11,13 +11,7 @@ "ecmaVersion": 6, "sourceType": "module" }, - "plugins": [ - "@typescript-eslint", - "unused-imports", - "import", - "unicorn", - "mocha" - ], + "plugins": ["@typescript-eslint", "unused-imports", "import"], "rules": { "import/no-relative-packages": "error", "@typescript-eslint/consistent-type-assertions": [ @@ -58,10 +52,7 @@ "MemberExpression[object.property.name='constructor'][property.name='name']" ], "no-throw-literal": "warn", - "semi": "off", - "unicorn/prefer-module": "error", - "mocha/no-skipped-tests": "error", - "mocha/no-exclusive-tests": "error" + "semi": "off" }, "overrides": [ { @@ -86,10 +77,5 @@ } } }, - "ignorePatterns": [ - "**/vendor/**/*.ts", - "**/vendor/**/*.js", - "**/out/**", - "**/generated/**" - ] + "ignorePatterns": ["**/vendor/**/*.ts", "**/vendor/**/*.js", "**/out/**"] } diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 80da61819a6..33f266adbb8 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,4 +1 @@ -* @pokey @AndreasArvidsson - -*keyboard* @pokey @josharian -*Keyboard* @pokey @josharian +* @pokey diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index 65988878df4..e3e68ecf15e 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -20,7 +20,7 @@ jobs: - uses: pnpm/action-setup@v2 - uses: actions/setup-node@v3 with: - node-version-file: package.json + node-version: 16 cache: pnpm - run: pnpm --color install - run: pnpm --color compile diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index ad44e79843a..ecfb4bbc4e1 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -21,7 +21,7 @@ jobs: - uses: pnpm/action-setup@v2 - uses: actions/setup-node@v3 with: - node-version-file: package.json + node-version: 16 cache: pnpm - run: pnpm --color install - uses: pre-commit/action@v3.0.0 diff --git a/.github/workflows/test-docs.yml b/.github/workflows/test-docs.yml index 67492de7f60..cbeca08f001 100644 --- a/.github/workflows/test-docs.yml +++ b/.github/workflows/test-docs.yml @@ -16,6 +16,6 @@ jobs: - uses: pnpm/action-setup@v2 - uses: actions/setup-node@v3 with: - node-version-file: package.json + node-version: 16 cache: pnpm - run: bash -x scripts/build-and-assemble-website.sh diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a540df4ea46..40c5107e5cb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -31,7 +31,7 @@ jobs: - uses: pnpm/action-setup@v2 - uses: actions/setup-node@v3 with: - node-version-file: package.json + node-version: 16 cache: pnpm - run: mkdir -p "${{ env.VSCODE_CRASH_DIR }}" "${{ env.VSCODE_LOGS_DIR }}" shell: bash @@ -72,5 +72,3 @@ jobs: name: dumps path: ${{ env.VSCODE_CRASH_DIR }} if: failure() - - name: Forbid TODOs - run: ./scripts/forbid-todo.sh diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2d29e3efe74..65150c9f46b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -30,9 +30,8 @@ repos: - id: detect-private-key - id: end-of-file-fixer exclude_types: [svg] - exclude: ^patches/.*\.patch$|\.scope$ + exclude: patches/.*\.patch - id: fix-byte-order-marker - - id: forbid-submodules - id: mixed-line-ending - id: trailing-whitespace # Trailing whitespace breaks yaml files if you use a multiline string @@ -40,7 +39,7 @@ repos: # tests use strings with trailing white space to represent the final # document contents. For example # packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/ruby/changeCondition.yml - exclude: ^packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/.*/[^/]*\.yml$|\.scope$|/generated/|^patches/ + exclude: ^packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/.*/[^/]*\.yml$ - repo: local hooks: - id: eslint @@ -63,24 +62,24 @@ repos: name: format-recorded-tests files: ^packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/.*/[^/]*\.yml$ language: system - entry: pnpm exec ./packages/common/scripts/my-ts-node.js packages/cursorless-engine/src/scripts/transformRecordedTests/index.ts + entry: pnpm exec tsx --conditions=cursorless:bundler packages/cursorless-engine/src/scripts/transformRecordedTests/index.ts - repo: local hooks: - id: check-recorded-test-marks name: check-recorded-test-marks files: ^packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/.*/[^/]*\.yml$ language: system - entry: pnpm exec ./packages/common/scripts/my-ts-node.js packages/cursorless-engine/src/scripts/transformRecordedTests/index.ts --check-marks - - repo: https://github.com/ikamensh/flynt - rev: "1.0.1" + entry: pnpm exec tsx --conditions=cursorless:bundler packages/cursorless-engine/src/scripts/transformRecordedTests/index.ts --check-marks + - repo: https://github.com/ikamensh/flynt/ + rev: "0.78" hooks: - id: flynt - - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.1.11 + - repo: https://github.com/charliermarsh/ruff-pre-commit + rev: "v0.0.260" hooks: - id: ruff args: [--fix, --exit-non-zero-on-fix] - - repo: https://github.com/psf/black-pre-commit-mirror - rev: 24.1.1 + - repo: https://github.com/psf/black + rev: 23.3.0 hooks: - id: black diff --git a/.prettierignore b/.prettierignore index bfd0fe8192b..fdcbdf96554 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,5 +1,4 @@ **/vendor -**/generated # We use our own format for our recorded yaml tests to keep them compact /packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/**/*.yml diff --git a/.vscode/launch.json b/.vscode/launch.json index 0ff02741bfb..0be1e310e76 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -34,7 +34,7 @@ "args": [ "--profile=cursorlessDevelopment", "--extensionDevelopmentPath=${workspaceFolder}/packages/cursorless-vscode/dist", - "--extensionTestsPath=${workspaceFolder}/packages/test-harness/dist/extensionTests.cjs" + "--extensionTestsPath=${workspaceFolder}/packages/test-harness/out/runners/extensionTests" ], "outFiles": ["${workspaceFolder}/**/out/**/*.js"], "preLaunchTask": "${defaultBuildTask}", @@ -55,7 +55,7 @@ "args": [ "--profile=cursorlessDevelopment", "--extensionDevelopmentPath=${workspaceFolder}/packages/cursorless-vscode/dist", - "--extensionTestsPath=${workspaceFolder}/packages/test-harness/dist/extensionTests.cjs" + "--extensionTestsPath=${workspaceFolder}/packages/test-harness/out/runners/extensionTests" ], "outFiles": ["${workspaceFolder}/**/out/**/*.js"], "preLaunchTask": "Prepare test subset", @@ -68,7 +68,7 @@ "name": "Talon tests", "type": "node", "request": "launch", - "program": "${workspaceFolder}/packages/test-harness/dist/runTalonTests.cjs", + "program": "${workspaceFolder}/packages/test-harness/out/scripts/runTalonTests", "env": { "CURSORLESS_TEST": "true", "CURSORLESS_REPO_ROOT": "${workspaceFolder}" @@ -84,7 +84,7 @@ "name": "Talon tests subset", "type": "node", "request": "launch", - "program": "${workspaceFolder}/packages/test-harness/dist/runTalonTests.cjs", + "program": "${workspaceFolder}/packages/test-harness/out/scripts/runTalonTests", "env": { "CURSORLESS_TEST": "true", "CURSORLESS_RUN_TEST_SUBSET": "true", @@ -101,7 +101,7 @@ "name": "Unit tests only", "type": "node", "request": "launch", - "program": "${workspaceFolder}/packages/test-harness/dist/runUnitTestsOnly.cjs", + "program": "${workspaceFolder}/packages/test-harness/out/scripts/runUnitTestsOnly", "env": { "CURSORLESS_TEST": "true", "CURSORLESS_REPO_ROOT": "${workspaceFolder}" @@ -125,7 +125,7 @@ "args": [ "--profile=cursorlessDevelopment", "--extensionDevelopmentPath=${workspaceFolder}/packages/cursorless-vscode/dist", - "--extensionTestsPath=${workspaceFolder}/packages/test-harness/dist/extensionTests.cjs" + "--extensionTestsPath=${workspaceFolder}/packages/test-harness/out/runners/extensionTests" ], "outFiles": ["${workspaceFolder}/**/out/**/*.js"], "preLaunchTask": "${defaultBuildTask}", @@ -147,7 +147,7 @@ "args": [ "--profile=cursorlessDevelopment", "--extensionDevelopmentPath=${workspaceFolder}/packages/cursorless-vscode/dist", - "--extensionTestsPath=${workspaceFolder}/packages/test-harness/dist/extensionTests.cjs" + "--extensionTestsPath=${workspaceFolder}/packages/test-harness/out/runners/extensionTests" ], "outFiles": ["${workspaceFolder}/**/out/**/*.js"], "preLaunchTask": "${defaultBuildTask}", @@ -156,23 +156,6 @@ "!**/node_modules/**" ] }, - { - "name": "Update fixtures, unit tests only", - "type": "node", - "request": "launch", - "program": "${workspaceFolder}/packages/test-harness/dist/runUnitTestsOnly.cjs", - "env": { - "CURSORLESS_TEST": "true", - "CURSORLESS_TEST_UPDATE_FIXTURES": "true", - "CURSORLESS_REPO_ROOT": "${workspaceFolder}" - }, - "outFiles": ["${workspaceFolder}/**/out/**/*.js"], - "preLaunchTask": "${defaultBuildTask}", - "resolveSourceMapLocations": [ - "${workspaceFolder}/**", - "!**/node_modules/**" - ] - }, { "name": "Docusaurus start", "type": "node", diff --git a/.vscode/settings.json b/.vscode/settings.json index 96ba760122d..7b4cac949ed 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -24,6 +24,5 @@ ], "files.eol": "\n", "typescript.enablePromptUseWorkspaceTsdk": true, - "typescript.tsdk": "node_modules/typescript/lib", - "eslint.workingDirectories": [{ "pattern": "packages/*/" }] + "typescript.tsdk": "node_modules/typescript/lib" } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 69cd1ca783e..53b180b9aeb 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -5,12 +5,7 @@ "tasks": [ { "label": "Build", - "dependsOn": [ - "Populate dist", - "ESBuild", - "TSBuild", - "Build test harness" - ], + "dependsOn": ["Populate dist", "ESBuild", "TSBuild"], "group": { "kind": "build", "isDefault": true @@ -26,19 +21,8 @@ "type": "npm", "script": "esbuild", "path": "packages/cursorless-vscode", - "dependsOn": ["Generate grammar"], "presentation": { - "reveal": "silent" - }, - "group": "build" - }, - { - "label": "Build test harness", - "type": "npm", - "script": "build", - "path": "packages/test-harness", - "presentation": { - "reveal": "silent" + "reveal": "never" }, "group": "build" }, @@ -48,7 +32,7 @@ "script": "compile", "problemMatcher": "$tsc", "presentation": { - "reveal": "silent" + "reveal": "never" }, "group": "build" }, @@ -58,17 +42,7 @@ "script": "populate-dist", "path": "packages/cursorless-vscode", "presentation": { - "reveal": "silent" - }, - "group": "build" - }, - { - "label": "Generate grammar", - "type": "npm", - "script": "generate-grammar", - "path": "packages/cursorless-vscode", - "presentation": { - "reveal": "silent" + "reveal": "never" }, "group": "build" }, @@ -99,25 +73,9 @@ "dependsOrder": "sequence", "group": "test" }, - { - "label": "watch", - "dependsOn": ["Watch esbuild", "Watch typescript"], - "group": "build" - }, - { - "type": "npm", - "script": "watch:esbuild", - "label": "Watch esbuild", - "isBackground": true, - "presentation": { - "reveal": "never" - }, - "group": "build" - }, { "type": "npm", - "script": "watch:tsc", - "label": "Watch typescript", + "script": "watch", "problemMatcher": "$tsc-watch", "isBackground": true, "presentation": { diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a1817e535d..c47102693f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -139,7 +139,7 @@ There's too much new stuff in this release to fit in a highlights reel, so we'll - Improve and unify selection updating behaviour to handle overlapping ranges [\#138](https://github.com/cursorless-dev/cursorless/issues/138) - Duplicate symbols after VS Code update [\#111](https://github.com/cursorless-dev/cursorless/issues/111) - Fold action not working properly with multiple list elements [\#39](https://github.com/cursorless-dev/cursorless/issues/39) -- The `clear` command clashes with community commands [\#68](https://github.com/pokey/cursorless-talon/issues/68) +- The `clear` command clashes with Knausj commands [\#68](https://github.com/pokey/cursorless-talon/issues/68) **Closed issues:** diff --git a/README.md b/README.md index f2aaadc4725..9b003354396 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Tests - Maintenance + Maintenance License: MIT diff --git a/changelog/2023-09-addedArgumentTargetToCallAction.md b/changelog/2023-09-addedArgumentTargetToCallAction.md deleted file mode 100644 index bc5ff89dce7..00000000000 --- a/changelog/2023-09-addedArgumentTargetToCallAction.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -tags: [enhancement, talon] -pullRequest: 1900 ---- - -- Added optional second target to action `call` to specify argument. eg: `"call air on bat"`. diff --git a/changelog/2023-09-addedDestinationAndScopeTypeToInsertSnippetAction.md b/changelog/2023-09-addedDestinationAndScopeTypeToInsertSnippetAction.md deleted file mode 100644 index b04b6e92711..00000000000 --- a/changelog/2023-09-addedDestinationAndScopeTypeToInsertSnippetAction.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -tags: [enhancement, talon] -pullRequest: 1879 ---- - -- Added `destination: CursorlessDestination` and `scope_type: Optional[Union[str, list[str]]]` arguments to the public Talon api action `user.cursorless_insert_snippet`. See the [talon-side api docs](https://www.cursorless.org/docs/user/customization/#public-talon-actions) for more. diff --git a/changelog/2023-09-addedJoinLinesAction.md b/changelog/2023-09-addedJoinLinesAction.md deleted file mode 100644 index 9ef41817021..00000000000 --- a/changelog/2023-09-addedJoinLinesAction.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -tags: [enhancement] -pullRequest: 1901 ---- - -- Added `join` action. This action will join multiple lines together. eg `"join air"` or `"join three lines air"`. diff --git a/changelog/2023-09-updatedHatShapes.md b/changelog/2023-09-updatedHatShapes.md deleted file mode 100644 index d6045d773a5..00000000000 --- a/changelog/2023-09-updatedHatShapes.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -tags: [enhancement] -pullRequest: 1868 ---- - -- Updated the default Cursorless hat shapes. All the hat shapes have been reworked with the goal to improve visibility. Many of the shapes have been made thicker to enhance color recognition. See the [shape docs](https://www.cursorless.org/docs/#shapes) for more info. diff --git a/changelog/2023-11-modalKeyboardVscodeCommands.md b/changelog/2023-11-modalKeyboardVscodeCommands.md deleted file mode 100644 index befdee416b6..00000000000 --- a/changelog/2023-11-modalKeyboardVscodeCommands.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -tags: [enhancement, keyboard] -pullRequest: 2026 ---- - -- Add support for running VSCode commands from the experimental modal keyboard interface. See the [keyboard modal docs](https://www.cursorless.org/docs/user/experimental/keyboard/modal/) for more info. diff --git a/changelog/2023-12-addedBreakLineAction.md b/changelog/2023-12-addedBreakLineAction.md deleted file mode 100644 index 63cf69d2aaf..00000000000 --- a/changelog/2023-12-addedBreakLineAction.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -tags: [enhancement] -pullRequest: 2103 ---- - -- Added `break` action. This action will break a line in two. eg `"break air"` diff --git a/changelog/2023-12-addedVisibleModifier.md b/changelog/2023-12-addedVisibleModifier.md deleted file mode 100644 index b37a5fa600b..00000000000 --- a/changelog/2023-12-addedVisibleModifier.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -tags: [enhancement] -pullRequest: 2094 ---- - -- Added `visible` modifier. This modifier returns all visible ranges. In most cases this will just be a single range starting from the first visible line and ending at the last visible line. If there are visible folded regions these break the visible range into po multiple ranges. diff --git a/changelog/2023-12.addedGrandScopeModifier.md b/changelog/2023-12.addedGrandScopeModifier.md deleted file mode 100644 index 394d516509c..00000000000 --- a/changelog/2023-12.addedGrandScopeModifier.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -tags: [enhancement] -pullRequest: 2130 ---- - -- Added `grand` modifier. This modifier will take the containing grandparent scope. eg `"take grand statement air"` diff --git a/changelog/2024-02-addedIncrementAndDecrementActions.md b/changelog/2024-02-addedIncrementAndDecrementActions.md deleted file mode 100644 index 54e8b301519..00000000000 --- a/changelog/2024-02-addedIncrementAndDecrementActions.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -tags: [enhancement] -pullRequest: 2236 ---- - -- Added increment action. Will increment a number. eg `"increment this"` to change `1` to `2`. - -- Added decrement action. Will decrement a number. eg `"decrement this"` to change `2` to `1`. diff --git a/cursorless-talon-dev/src/cursorless_dev.talon b/cursorless-talon-dev/src/cursorless_dev.talon index e777549d88a..54582af86da 100644 --- a/cursorless-talon-dev/src/cursorless_dev.talon +++ b/cursorless-talon-dev/src/cursorless_dev.talon @@ -1,5 +1,3 @@ -mode: command -mode: user.cursorless_spoken_form_test tag: user.cursorless - @@ -30,6 +28,3 @@ tag: user.cursorless test snippet make : user.private_cursorless_make_snippet_test(cursorless_target) - -parse tree : - user.cursorless_command("private.showParseTree", cursorless_target) diff --git a/cursorless-talon-dev/src/cursorless_test.talon b/cursorless-talon-dev/src/cursorless_test.talon index e7a4c00c593..03250a32518 100644 --- a/cursorless-talon-dev/src/cursorless_test.talon +++ b/cursorless-talon-dev/src/cursorless_test.talon @@ -7,31 +7,15 @@ test api command : user.cursorless_command("setSelection", cursorless_target) test api command bring : user.cursorless_command("replaceWithTarget", cursorless_target) -test api get text : - user.cursorless_get_text(cursorless_target) -test api get text list on : - user.cursorless_get_text_list(cursorless_target) -test api get text hide decorations : - user.cursorless_get_text(cursorless_target, true) -test api get text hide decorations list on : - user.cursorless_get_text_list(cursorless_target, true) - test api insert : user.cursorless_insert(cursorless_destination, word) test api insert and : user.cursorless_insert(cursorless_destination, word_list) - test api insert snippet: user.cursorless_insert_snippet("Hello, $foo! My name is $bar!") -test api insert snippet : - user.cursorless_insert_snippet("Hello, $foo! My name is $bar!", cursorless_destination, "statement") test api insert snippet by name: user.cursorless_insert_snippet_by_name("functionDeclaration") test api wrap with snippet : user.cursorless_wrap_with_snippet("Hello, $foo! My name is $bar!", cursorless_target, "foo", "statement") test api wrap with snippet by name : user.cursorless_wrap_with_snippet_by_name("functionDeclaration", "body", cursorless_target) -test api extract decorated marks : - user.private_cursorless_test_extract_decorated_marks(cursorless_target) -test api alternate highlight nothing: - user.private_cursorless_test_alternate_highlight_nothing() diff --git a/cursorless-talon-dev/src/default_vocabulary.py b/cursorless-talon-dev/src/default_vocabulary.py index 6fada1a7733..c2347135a6f 100644 --- a/cursorless-talon-dev/src/default_vocabulary.py +++ b/cursorless-talon-dev/src/default_vocabulary.py @@ -13,6 +13,10 @@ # https://github.com/talonhub/community/blob/9acb6c9659bb0c9b794a7b7126d025603b4ed726/core/keys/keys.py#L139C1-L171C2 punctuation_words = { + # TODO: I'm not sure why we need these, I think it has something to do with + # Dragon. Possibly it has been fixed by later improvements to talon? -rntz + # "`": "`", + # ",": ",", # <== these things "back tick": "`", "comma": ",", # Workaround for issue with conformer b-series; see #946 diff --git a/cursorless-talon-dev/src/spoken_form_test.py b/cursorless-talon-dev/src/spoken_form_test.py index 055df9d0ff6..f50c56090e8 100644 --- a/cursorless-talon-dev/src/spoken_form_test.py +++ b/cursorless-talon-dev/src/spoken_form_test.py @@ -97,25 +97,6 @@ def private_cursorless_spoken_form_test( except Exception as e: print(f"{e.__class__.__name__}: {e}") - def private_cursorless_test_extract_decorated_marks(target: Any): - """Run test for Cursorless private extract decorated marks api""" - marks = actions.user.cursorless_private_extract_decorated_marks(target) - all_decorated_marks_target = actions.user.cursorless_private_build_list_target( - [ - actions.user.cursorless_private_build_primitive_target([], mark) - for mark in marks - ] - ) - actions.user.cursorless_private_action_highlight( - all_decorated_marks_target, "highlight1" - ) - - def private_cursorless_test_alternate_highlight_nothing(): - """Run test for Cursorless private highlight nothing api""" - actions.user.cursorless_private_action_highlight( - actions.user.cursorless_private_target_nothing(), "highlight1" - ) - def enable_modes(): for mode in saved_modes: diff --git a/cursorless-talon/src/actions/actions.py b/cursorless-talon/src/actions/actions.py index 2b44f08492c..55a8bd77633 100644 --- a/cursorless-talon/src/actions/actions.py +++ b/cursorless-talon/src/actions/actions.py @@ -8,6 +8,7 @@ ImplicitDestination, ) from .bring_move import BringMoveTargets +from .call import cursorless_call_action from .execute_command import cursorless_execute_command_action from .homophones import cursorless_homophones_action from .replace import cursorless_replace_action @@ -43,12 +44,12 @@ "wrap_action", "insert_snippet_action", "reformat_action", - "call_action", "experimental_action", - "custom_action", ] callback_actions: dict[str, Callable[[CursorlessTarget], None]] = { + "callAsFunction": cursorless_call_action, + "findInDocument": actions.user.private_cursorless_find, "nextHomophone": cursorless_homophones_action, } @@ -69,7 +70,6 @@ "{user.cursorless_simple_action} |" "{user.cursorless_experimental_action} |" "{user.cursorless_callback_action} |" - "{user.cursorless_call_action} |" "{user.cursorless_custom_action}" ) ) @@ -96,8 +96,6 @@ def cursorless_command(action_name: str, target: CursorlessTarget): actions.user.private_cursorless_bring_move( action_name, BringMoveTargets(target, ImplicitDestination()) ) - elif action_name == "callAsFunction": - actions.user.private_cursorless_call(target) elif action_name in no_wait_actions: action = {"name": action_name, "target": target} actions.user.private_cursorless_command_no_wait(action) diff --git a/cursorless-talon/src/actions/call.py b/cursorless-talon/src/actions/call.py index 6601d7ba5fe..083adf26b81 100644 --- a/cursorless-talon/src/actions/call.py +++ b/cursorless-talon/src/actions/call.py @@ -1,22 +1,13 @@ -from talon import Module, actions +from talon import actions from ..targets.target_types import CursorlessTarget, ImplicitTarget -mod = Module() -mod.list("cursorless_call_action", desc="Cursorless call action") - -@mod.action_class -class Actions: - def private_cursorless_call( - callee: CursorlessTarget, - argument: CursorlessTarget = ImplicitTarget(), - ): - """Execute Cursorless call action""" - actions.user.private_cursorless_command_and_wait( - { - "name": "callAsFunction", - "callee": callee, - "argument": argument, - } - ) +def cursorless_call_action(target: CursorlessTarget): + actions.user.private_cursorless_command_and_wait( + { + "name": "callAsFunction", + "callee": target, + "argument": ImplicitTarget(), + } + ) diff --git a/cursorless-talon/src/actions/find.py b/cursorless-talon/src/actions/find.py new file mode 100644 index 00000000000..8023e000505 --- /dev/null +++ b/cursorless-talon/src/actions/find.py @@ -0,0 +1,11 @@ +from talon import Module + +from ..targets.target_types import CursorlessTarget + +mod = Module() + + +@mod.action_class +class Actions: + def private_cursorless_find(target: CursorlessTarget): + """Execute Cursorless find action. Find text of target in editor""" diff --git a/cursorless-talon/src/actions/get_text.py b/cursorless-talon/src/actions/get_text.py index e95f35de90f..8ee8849da8e 100644 --- a/cursorless-talon/src/actions/get_text.py +++ b/cursorless-talon/src/actions/get_text.py @@ -1,36 +1,9 @@ from typing import Optional -from talon import Module, actions +from talon import actions from ..targets.target_types import CursorlessTarget -mod = Module() - - -@mod.action_class -class Actions: - def cursorless_get_text( - target: CursorlessTarget, - hide_decorations: bool = False, - ) -> str: - """Get target text. If hide_decorations is True, don't show decorations""" - return cursorless_get_text_action( - target, - show_decorations=not hide_decorations, - ensure_single_target=True, - )[0] - - def cursorless_get_text_list( - target: CursorlessTarget, - hide_decorations: bool = False, - ) -> list[str]: - """Get texts for multiple targets. If hide_decorations is True, don't show decorations""" - return cursorless_get_text_action( - target, - show_decorations=not hide_decorations, - ensure_single_target=False, - ) - def cursorless_get_text_action( target: CursorlessTarget, diff --git a/cursorless-talon/src/apps/cursorless_vscode.py b/cursorless-talon/src/apps/cursorless_vscode.py index 63c20daa944..7fda2ac7973 100644 --- a/cursorless-talon/src/apps/cursorless_vscode.py +++ b/cursorless-talon/src/apps/cursorless_vscode.py @@ -1,4 +1,7 @@ -from talon import Context, actions +from talon import Context, actions, app + +from ..actions.get_text import cursorless_get_text_action +from ..targets.target_types import CursorlessTarget ctx = Context() @@ -11,16 +14,21 @@ @ctx.action_class("user") class Actions: + def private_cursorless_find(target: CursorlessTarget): + """Find text of target in editor""" + texts = cursorless_get_text_action(target, ensure_single_target=True) + search_text = texts[0] + if len(search_text) > 200: + search_text = search_text[:200] + app.notify("Search text is longer than 200 characters; truncating") + actions.user.private_cursorless_run_rpc_command_no_wait("actions.find") + actions.sleep("50ms") + actions.insert(search_text) + def private_cursorless_show_settings_in_ide(): """Show Cursorless-specific settings in ide""" actions.user.private_cursorless_run_rpc_command_no_wait( - "workbench.action.openSettings", "@ext:pokey.cursorless " + "workbench.action.openGlobalSettings" ) actions.sleep("250ms") - actions.key("right") - - def private_cursorless_show_sidebar(): - """Show Cursorless sidebar""" - actions.user.private_cursorless_run_rpc_command_and_wait( - "workbench.view.extension.cursorless" - ) + actions.insert("cursorless") diff --git a/cursorless-talon/src/cheatsheet/get_list.py b/cursorless-talon/src/cheatsheet/get_list.py index c74f3643449..001feaa1cc1 100644 --- a/cursorless-talon/src/cheatsheet/get_list.py +++ b/cursorless-talon/src/cheatsheet/get_list.py @@ -40,21 +40,6 @@ def get_raw_list(name: str) -> Mapping[str, str]: return registry.lists[cursorless_list_name][0].copy() -def get_spoken_form_from_list(list_name: str, value: str) -> str: - """Get the spoken form of a value from a list. - - Args: - list_name (str): The name of the list. - value (str): The value to look up. - - Returns: - str: The spoken form of the value. - """ - return next( - spoken_form for spoken_form, v in get_raw_list(list_name).items() if v == value - ) - - def make_dict_readable( type: str, dict: Mapping[str, str], descriptions: Mapping[str, str] ) -> list[ListItemDescriptor]: @@ -74,12 +59,8 @@ def make_dict_readable( def make_readable(text: str) -> str: - text, is_private = ( - (text[8:], True) if text.startswith("private.") else (text, False) - ) text = text.replace(".", " ") - text = de_camel(text).lower().capitalize() - return f"{text} (PRIVATE)" if is_private else text + return de_camel(text).lower().capitalize() def de_camel(text: str) -> str: diff --git a/cursorless-talon/src/cheatsheet/sections/actions.py b/cursorless-talon/src/cheatsheet/sections/actions.py index b83c3e5ec8a..37486d4ab1b 100644 --- a/cursorless-talon/src/cheatsheet/sections/actions.py +++ b/cursorless-talon/src/cheatsheet/sections/actions.py @@ -12,7 +12,6 @@ def get_actions(): "moveToTarget", "swapTargets", "applyFormatter", - "callAsFunction", "wrapWithPairedDelimiter", "rewrap", "pasteFromClipboard", @@ -35,6 +34,7 @@ def get_actions(): "action", simple_actions, { + "callAsFunction": "Call on selection", "editNewLineAfter": "Edit new line/scope after", "editNewLineBefore": "Edit new line/scope before", }, @@ -101,20 +101,6 @@ def get_actions(): } ], }, - { - "id": "callAsFunction", - "type": "action", - "variations": [ - { - "spokenForm": f"{complex_actions['callAsFunction']} ", - "description": "Call on selection", - }, - { - "spokenForm": f"{complex_actions['callAsFunction']} on ", - "description": "Call on ", - }, - ], - }, { "id": "wrapWithPairedDelimiter", "type": "action", diff --git a/cursorless-talon/src/cheatsheet/sections/compound_targets.py b/cursorless-talon/src/cheatsheet/sections/compound_targets.py index 9f1b85b4390..faf7383d888 100644 --- a/cursorless-talon/src/cheatsheet/sections/compound_targets.py +++ b/cursorless-talon/src/cheatsheet/sections/compound_targets.py @@ -1,4 +1,4 @@ -from ..get_list import get_raw_list, get_spoken_form_from_list +from ..get_list import get_raw_list FORMATTERS = { "rangeExclusive": lambda start, end: f"between {start} and {end}", @@ -10,10 +10,16 @@ def get_compound_targets(): - list_connective_term = get_spoken_form_from_list( - "list_connective", "listConnective" + list_connective_term = next( + spoken_form + for spoken_form, value in get_raw_list("list_connective").items() + if value == "listConnective" + ) + vertical_range_term = next( + spoken_form + for spoken_form, value in get_raw_list("range_type").items() + if value == "verticalRange" ) - vertical_range_term = get_spoken_form_from_list("range_type", "verticalRange") return [ { diff --git a/cursorless-talon/src/cheatsheet/sections/get_scope_visualizer.py b/cursorless-talon/src/cheatsheet/sections/get_scope_visualizer.py index 69115fbe1ef..b7483ae96c2 100644 --- a/cursorless-talon/src/cheatsheet/sections/get_scope_visualizer.py +++ b/cursorless-talon/src/cheatsheet/sections/get_scope_visualizer.py @@ -24,14 +24,4 @@ def get_scope_visualizer(): ], ], }, - { - "id": "show_scope_sidebar", - "type": "command", - "variations": [ - { - "spokenForm": "bar cursorless", - "description": "Show cursorless sidebar", - }, - ], - }, ] diff --git a/cursorless-talon/src/cheatsheet/sections/modifiers.py b/cursorless-talon/src/cheatsheet/sections/modifiers.py index 55d3f396a3d..576edc47210 100644 --- a/cursorless-talon/src/cheatsheet/sections/modifiers.py +++ b/cursorless-talon/src/cheatsheet/sections/modifiers.py @@ -22,7 +22,6 @@ def get_modifiers(): "extendThroughStartOf", "extendThroughEndOf", "every", - "ancestor", "first", "last", "previous", @@ -102,16 +101,6 @@ def get_modifiers(): }, ], }, - { - "id": "ancestor", - "type": "modifier", - "variations": [ - { - "spokenForm": f"{complex_modifiers['ancestor']} ", - "description": "Grandparent containing instance of ", - }, - ], - }, { "id": "relativeScope", "type": "modifier", diff --git a/cursorless-talon/src/cheatsheet/sections/scopes.py b/cursorless-talon/src/cheatsheet/sections/scopes.py index 462074beaed..49722a814a0 100644 --- a/cursorless-talon/src/cheatsheet/sections/scopes.py +++ b/cursorless-talon/src/cheatsheet/sections/scopes.py @@ -1,25 +1,9 @@ -from ..get_list import get_lists, get_spoken_form_from_list +from ..get_list import get_lists def get_scopes(): - glyph_spoken_form = get_spoken_form_from_list("glyph_scope_type", "glyph") - return [ - *get_lists( - ["scope_type"], - "scopeType", - { - "argumentOrParameter": "Argument", - "boundedNonWhitespaceSequence": "Non whitespace sequence stopped by surrounding pair delimeters", - }, - ), - { - "id": "glyph", - "type": "scopeType", - "variations": [ - { - "spokenForm": f"{glyph_spoken_form} ", - "description": "Instance of single character ", - }, - ], - }, - ] + return get_lists( + ["scope_type"], + "scopeType", + {"argumentOrParameter": "Argument"}, + ) diff --git a/cursorless-talon/src/csv_overrides.py b/cursorless-talon/src/csv_overrides.py index f9891139697..4c51b7c3a49 100644 --- a/cursorless-talon/src/csv_overrides.py +++ b/cursorless-talon/src/csv_overrides.py @@ -1,12 +1,10 @@ import csv -from collections import defaultdict from collections.abc import Container -from dataclasses import dataclass from datetime import datetime from pathlib import Path -from typing import Callable, Iterable, Optional, TypedDict +from typing import Optional -from talon import Context, Module, actions, app, fs, settings +from talon import Context, Module, actions, app, fs from .conventions import get_cursorless_list_name from .vendor.inflection import pluralize @@ -20,98 +18,59 @@ "cursorless_default_vocabulary", desc="Use default cursorless vocabulary instead of user custom", ) -mod.setting( +cursorless_settings_directory = mod.setting( "cursorless_settings_directory", type=str, default="cursorless-settings", desc="The directory to use for cursorless settings csvs relative to talon user directory", ) -# The global context we use for our lists -ctx = Context() - -# A context that contains default vocabulary, for use in testing -normalized_ctx = Context() -normalized_ctx.matches = r""" +default_ctx = Context() +default_ctx.matches = r""" tag: user.cursorless_default_vocabulary """ -# Maps from Talon list name to a map from spoken form to value -ListToSpokenForms = dict[str, dict[str, str]] - - -@dataclass -class SpokenFormEntry: - list_name: str - id: str - spoken_forms: list[str] - - def init_csv_and_watch_changes( filename: str, - default_values: ListToSpokenForms, - handle_new_values: Optional[Callable[[list[SpokenFormEntry]], None]] = None, - *, + default_values: dict[str, dict[str, str]], extra_ignored_values: Optional[list[str]] = None, - extra_allowed_values: Optional[list[str]] = None, allow_unknown_values: bool = False, default_list_name: Optional[str] = None, headers: list[str] = [SPOKEN_FORM_HEADER, CURSORLESS_IDENTIFIER_HEADER], + ctx: Context = Context(), no_update_file: bool = False, - pluralize_lists: Optional[list[str]] = None, + pluralize_lists: Optional[list[str]] = [], ): """ Initialize a cursorless settings csv, creating it if necessary, and watch for changes to the csv. Talon lists will be generated based on the keys of `default_values`. For example, if there is a key `foo`, there will be a - list created called `user.cursorless_foo` that will contain entries from the - original dict at the key `foo`, updated according to customization in the - csv at + list created called `user.cursorless_foo` that will contain entries from + the original dict at the key `foo`, updated according to customization in + the csv at - ``` - actions.path.talon_user() / "cursorless-settings" / filename - ``` + actions.path.talon_user() / "cursorless-settings" / filename Note that the settings directory location can be customized using the `user.cursorless_settings_directory` setting. Args: filename (str): The name of the csv file to be placed in - `cursorles-settings` dir - default_values (ListToSpokenForms): The default values for the lists to - be customized in the given csv - handle_new_values (Optional[Callable[[list[SpokenFormEntry]], None]]): A - callback to be called when the lists are updated - extra_ignored_values (Optional[list[str]]): Don't throw an exception if - any of these appear as values; just ignore them and don't add them - to any list - allow_unknown_values (bool): If unknown values appear, just put them in - the list - default_list_name (Optional[str]): If unknown values are - allowed, put any unknown values in this list - headers (list[str]): The headers to use for the csv - no_update_file (bool): Set this to `True` to indicate that we should not - update the csv. This is used generally in case there was an issue - coming up with the default set of values so we don't want to persist - those to disk - pluralize_lists (list[str]): Create plural version of given lists + `cursorles-settings` dir + default_values (dict[str, dict]): The default values for the lists to + be customized in the given csv + extra_ignored_values list[str]: Don't throw an exception if any of + these appear as values; just ignore them and don't add them to any list + allow_unknown_values bool: If unknown values appear, just put them in the list + default_list_name Optional[str]: If unknown values are allowed, put any + unknown values in this list + no_update_file Optional[bool]: Set this to `TRUE` to indicate that we should + not update the csv. This is used generally in case there was an issue coming up with the default set of values so we don't want to persist those to disk + pluralize_lists: Create plural version of given lists """ - # Don't allow both `extra_allowed_values` and `allow_unknown_values` - assert not (extra_allowed_values and allow_unknown_values) - - # If `extra_allowed_values` or `allow_unknown_values` is given, we need a - # `default_list_name` to put unknown values in - assert not ( - (extra_allowed_values or allow_unknown_values) and not default_list_name - ) - if extra_ignored_values is None: extra_ignored_values = [] - if extra_allowed_values is None: - extra_allowed_values = [] - if pluralize_lists is None: - pluralize_lists = [] file_path = get_full_path(filename) super_default_values = get_super_values(default_values) @@ -124,58 +83,53 @@ def init_csv_and_watch_changes( def on_watch(path, flags): if file_path.match(path): current_values, has_errors = read_file( - path=file_path, - headers=headers, - default_identifiers=super_default_values.values(), - extra_ignored_values=extra_ignored_values, - extra_allowed_values=extra_allowed_values, - allow_unknown_values=allow_unknown_values, + file_path, + headers, + super_default_values.values(), + extra_ignored_values, + allow_unknown_values, ) update_dicts( - default_values=default_values, - current_values=current_values, - extra_ignored_values=extra_ignored_values, - extra_allowed_values=extra_allowed_values, - allow_unknown_values=allow_unknown_values, - default_list_name=default_list_name, - pluralize_lists=pluralize_lists, - handle_new_values=handle_new_values, + default_values, + current_values, + extra_ignored_values, + allow_unknown_values, + default_list_name, + pluralize_lists, + ctx, ) fs.watch(str(file_path.parent), on_watch) if file_path.is_file(): current_values = update_file( - path=file_path, - headers=headers, - default_values=super_default_values, - extra_ignored_values=extra_ignored_values, - extra_allowed_values=extra_allowed_values, - allow_unknown_values=allow_unknown_values, - no_update_file=no_update_file, + file_path, + headers, + super_default_values, + extra_ignored_values, + allow_unknown_values, + no_update_file, ) update_dicts( - default_values=default_values, - current_values=current_values, - extra_ignored_values=extra_ignored_values, - extra_allowed_values=extra_allowed_values, - allow_unknown_values=allow_unknown_values, - default_list_name=default_list_name, - pluralize_lists=pluralize_lists, - handle_new_values=handle_new_values, + default_values, + current_values, + extra_ignored_values, + allow_unknown_values, + default_list_name, + pluralize_lists, + ctx, ) else: if not no_update_file: create_file(file_path, headers, super_default_values) update_dicts( - default_values=default_values, - current_values=super_default_values, - extra_ignored_values=extra_ignored_values, - extra_allowed_values=extra_allowed_values, - allow_unknown_values=allow_unknown_values, - default_list_name=default_list_name, - pluralize_lists=pluralize_lists, - handle_new_values=handle_new_values, + default_values, + super_default_values, + extra_ignored_values, + allow_unknown_values, + default_list_name, + pluralize_lists, + ctx, ) def unsubscribe(): @@ -211,70 +165,48 @@ def create_default_vocabulary_dicts( if active_key: updated_dict[active_key] = value2 default_values_updated[key] = updated_dict - assign_lists_to_context(normalized_ctx, default_values_updated, pluralize_lists) + assign_lists_to_context(default_ctx, default_values_updated, pluralize_lists) def update_dicts( - default_values: ListToSpokenForms, - current_values: dict[str, str], + default_values: dict[str, dict], + current_values: dict, extra_ignored_values: list[str], - extra_allowed_values: list[str], allow_unknown_values: bool, default_list_name: Optional[str], pluralize_lists: list[str], - handle_new_values: Optional[Callable[[list[SpokenFormEntry]], None]], + ctx: Context, ): # Create map with all default values - results_map: dict[str, ResultsListEntry] = {} - for list_name, obj in default_values.items(): - for spoken, id in obj.items(): - results_map[id] = {"spoken": spoken, "id": id, "list": list_name} + results_map = {} + for list_name, dict in default_values.items(): + for key, value in dict.items(): + results_map[value] = {"key": key, "value": value, "list": list_name} # Update result with current values - for spoken, id in current_values.items(): + for key, value in current_values.items(): try: - results_map[id]["spoken"] = spoken + results_map[value]["key"] = key except KeyError: - if id in extra_ignored_values: + if value in extra_ignored_values: pass - elif allow_unknown_values or id in extra_allowed_values: - assert default_list_name is not None - results_map[id] = { - "spoken": spoken, - "id": id, + elif allow_unknown_values: + results_map[value] = { + "key": key, + "value": value, "list": default_list_name, } else: raise - spoken_form_entries = list(generate_spoken_forms(results_map.values())) - - # Assign result to talon context list - lists: ListToSpokenForms = defaultdict(dict) - for entry in spoken_form_entries: - for spoken_form in entry.spoken_forms: - lists[entry.list_name][spoken_form] = entry.id - assign_lists_to_context(ctx, lists, pluralize_lists) - - if handle_new_values is not None: - handle_new_values(spoken_form_entries) - - -class ResultsListEntry(TypedDict): - spoken: str - id: str - list: str - - -def generate_spoken_forms(results_list: Iterable[ResultsListEntry]): - for obj in results_list: - id = obj["id"] - spoken = obj["spoken"] - - spoken_forms = [] - if not is_removed(spoken): - for k in spoken.split("|"): - if id == "pasteFromClipboard" and k.endswith(" to"): + # Convert result map back to result list + results = {res["list"]: {} for res in results_map.values()} + for obj in results_map.values(): + value = obj["value"] + key = obj["key"] + if not is_removed(key): + for k in key.split("|"): + if value == "pasteFromClipboard" and k.endswith(" to"): # FIXME: This is a hack to work around the fact that the # spoken form of the `pasteFromClipboard` action used to be # "paste to", but now the spoken form is just "paste" and @@ -282,21 +214,18 @@ def generate_spoken_forms(results_list: Iterable[ResultsListEntry]): # cursorless before this change would have "paste to" as # their spoken form and so would need to say "paste to to". k = k[:-3] - spoken_forms.append(k.strip()) + results[obj["list"]][k.strip()] = value - yield SpokenFormEntry( - list_name=obj["list"], - id=id, - spoken_forms=spoken_forms, - ) + # Assign result to talon context list + assign_lists_to_context(ctx, results, pluralize_lists) def assign_lists_to_context( ctx: Context, - lists: ListToSpokenForms, + results: dict, pluralize_lists: list[str], ): - for list_name, dict in lists.items(): + for list_name, dict in results.items(): list_singular_name = get_cursorless_list_name(list_name) ctx.lists[list_singular_name] = dict if list_name in pluralize_lists: @@ -309,17 +238,15 @@ def update_file( headers: list[str], default_values: dict[str, str], extra_ignored_values: list[str], - extra_allowed_values: list[str], allow_unknown_values: bool, no_update_file: bool, ): current_values, has_errors = read_file( - path=path, - headers=headers, - default_identifiers=default_values.values(), - extra_ignored_values=extra_ignored_values, - extra_allowed_values=extra_allowed_values, - allow_unknown_values=allow_unknown_values, + path, + headers, + default_values.values(), + extra_ignored_values, + allow_unknown_values, ) current_identifiers = current_values.values() @@ -384,7 +311,6 @@ def read_file( headers: list[str], default_identifiers: Container[str], extra_ignored_values: list[str], - extra_allowed_values: list[str], allow_unknown_values: bool, ): with open(path) as csv_file: @@ -427,7 +353,6 @@ def read_file( if ( value not in default_identifiers and value not in extra_ignored_values - and value not in extra_allowed_values and not allow_unknown_values ): has_errors = True @@ -453,7 +378,7 @@ def get_full_path(filename: str): filename = f"{filename}.csv" user_dir: Path = actions.path.talon_user() - settings_directory = Path(settings.get("user.cursorless_settings_directory")) + settings_directory = Path(cursorless_settings_directory.get()) if not settings_directory.is_absolute(): settings_directory = user_dir / settings_directory @@ -461,7 +386,7 @@ def get_full_path(filename: str): return (settings_directory / filename).resolve() -def get_super_values(values: ListToSpokenForms): +def get_super_values(values: dict[str, dict[str, str]]): result: dict[str, str] = {} for value_dict in values.values(): result.update(value_dict) diff --git a/cursorless-talon/src/cursorless.py b/cursorless-talon/src/cursorless.py index 9617f515933..86147fb1ebe 100644 --- a/cursorless-talon/src/cursorless.py +++ b/cursorless-talon/src/cursorless.py @@ -1,4 +1,4 @@ -from talon import Module, actions +from talon import Module mod = Module() @@ -12,12 +12,3 @@ class Actions: def private_cursorless_show_settings_in_ide(): """Show Cursorless-specific settings in ide""" - - def private_cursorless_show_sidebar(): - """Show Cursorless-specific settings in ide""" - - def private_cursorless_show_command_statistics(): - """Show Cursorless command statistics""" - actions.user.private_cursorless_run_rpc_command_no_wait( - "cursorless.analyzeCommandHistory" - ) diff --git a/cursorless-talon/src/cursorless.talon b/cursorless-talon/src/cursorless.talon index f12bab8a3e1..0f2f331dff7 100644 --- a/cursorless-talon/src/cursorless.talon +++ b/cursorless-talon/src/cursorless.talon @@ -18,9 +18,6 @@ tag: user.cursorless {user.cursorless_reformat_action} at : user.private_cursorless_reformat(cursorless_target, formatters) -{user.cursorless_call_action} on : - user.private_cursorless_call(cursorless_target_1, cursorless_target_2) - {user.cursorless_wrap_action} : user.private_cursorless_wrap_with_paired_delimiter(cursorless_wrap_action, cursorless_target, cursorless_wrapper_paired_delimiter) @@ -40,9 +37,3 @@ tag: user.cursorless {user.cursorless_homophone} settings: user.private_cursorless_show_settings_in_ide() - -bar {user.cursorless_homophone}: - user.private_cursorless_show_sidebar() - -{user.cursorless_homophone} stats: - user.private_cursorless_show_command_statistics() diff --git a/cursorless-talon/src/marks/decorated_mark.py b/cursorless-talon/src/marks/decorated_mark.py index 2eaa338f524..75675ee8954 100644 --- a/cursorless-talon/src/marks/decorated_mark.py +++ b/cursorless-talon/src/marks/decorated_mark.py @@ -138,7 +138,7 @@ def setup_hat_styles_csv(hat_colors: dict[str, str], hat_shapes: dict[str, str]) "hat_color": active_hat_colors, "hat_shape": active_hat_shapes, }, - extra_ignored_values=[*hat_colors.values(), *hat_shapes.values()], + [*hat_colors.values(), *hat_shapes.values()], no_update_file=is_shape_error or is_color_error, ) diff --git a/cursorless-talon/src/modifiers/glyph_scope.py b/cursorless-talon/src/modifiers/glyph_scope.py deleted file mode 100644 index beff4c35ed1..00000000000 --- a/cursorless-talon/src/modifiers/glyph_scope.py +++ /dev/null @@ -1,30 +0,0 @@ -from talon import Module - -mod = Module() - -mod.list( - "cursorless_glyph_scope_type", - desc="Cursorless glyph scope type", -) -mod.list( - "cursorless_glyph_scope_type_plural", - desc="Plural version of Cursorless glyph scope type", -) - - -@mod.capture(rule="{user.cursorless_glyph_scope_type} ") -def cursorless_glyph_scope_type(m) -> dict[str, str]: - return { - "type": "glyph", - "character": m.any_alphanumeric_key, - } - - -@mod.capture( - rule="{user.cursorless_glyph_scope_type_plural} " -) -def cursorless_glyph_scope_type_plural(m) -> dict[str, str]: - return { - "type": "glyph", - "character": m.any_alphanumeric_key, - } diff --git a/cursorless-talon/src/modifiers/scopes.py b/cursorless-talon/src/modifiers/scopes.py index ee1efb9b2c6..02b98da19ed 100644 --- a/cursorless-talon/src/modifiers/scopes.py +++ b/cursorless-talon/src/modifiers/scopes.py @@ -15,39 +15,25 @@ @mod.capture( - rule="{user.cursorless_scope_type} | | {user.cursorless_custom_regex_scope_type}" + rule="{user.cursorless_scope_type} | {user.cursorless_custom_regex_scope_type}" ) def cursorless_scope_type(m) -> dict[str, str]: """Cursorless scope type singular""" try: return {"type": m.cursorless_scope_type} except AttributeError: - pass - - try: - return m.cursorless_glyph_scope_type - except AttributeError: - pass - - return {"type": "customRegex", "regex": m.cursorless_custom_regex_scope_type} + return {"type": "customRegex", "regex": m.cursorless_custom_regex_scope_type} @mod.capture( - rule="{user.cursorless_scope_type_plural} | | {user.cursorless_custom_regex_scope_type_plural}" + rule="{user.cursorless_scope_type_plural} | {user.cursorless_custom_regex_scope_type_plural}" ) def cursorless_scope_type_plural(m) -> dict[str, str]: """Cursorless scope type plural""" try: return {"type": m.cursorless_scope_type_plural} except AttributeError: - pass - - try: - return m.cursorless_glyph_scope_type_plural - except AttributeError: - pass - - return { - "type": "customRegex", - "regex": m.cursorless_custom_regex_scope_type_plural, - } + return { + "type": "customRegex", + "regex": m.cursorless_custom_regex_scope_type_plural, + } diff --git a/cursorless-talon/src/modifiers/simple_scope_modifier.py b/cursorless-talon/src/modifiers/simple_scope_modifier.py index 5d51ba8a4e2..77256233044 100644 --- a/cursorless-talon/src/modifiers/simple_scope_modifier.py +++ b/cursorless-talon/src/modifiers/simple_scope_modifier.py @@ -15,23 +15,7 @@ ) def cursorless_simple_scope_modifier(m) -> dict[str, Any]: """Containing scope, every scope, etc""" - if hasattr(m, "cursorless_simple_scope_modifier"): - modifier = m.cursorless_simple_scope_modifier - - if modifier == "every": - return { - "type": "everyScope", - "scopeType": m.cursorless_scope_type, - } - - if modifier == "ancestor": - return { - "type": "containingScope", - "scopeType": m.cursorless_scope_type, - "ancestorIndex": 1, - } - return { - "type": "containingScope", + "type": "everyScope" if m[0] == "every" else "containingScope", "scopeType": m.cursorless_scope_type, } diff --git a/cursorless-talon/src/number_small.py b/cursorless-talon/src/number_small.py index 28ce298f702..16be32cfaa4 100644 --- a/cursorless-talon/src/number_small.py +++ b/cursorless-talon/src/number_small.py @@ -2,7 +2,6 @@ This file allows us to use a custom `number_small` capture. See #1021 for more info. """ - from talon import Context, Module mod = Module() diff --git a/cursorless-talon/src/private_api/extract_decorated_marks.py b/cursorless-talon/src/private_api/extract_decorated_marks.py deleted file mode 100644 index 230e5d18c29..00000000000 --- a/cursorless-talon/src/private_api/extract_decorated_marks.py +++ /dev/null @@ -1,47 +0,0 @@ -from typing import Any - -from ..actions.bring_move import BringMoveTargets -from ..actions.swap import SwapTargets -from ..targets.target_types import ( - ImplicitDestination, - ImplicitTarget, - ListDestination, - ListTarget, - PrimitiveDestination, - PrimitiveTarget, - RangeTarget, -) - - -def extract_decorated_marks(capture: Any) -> list[Any]: - match capture: - case PrimitiveTarget(mark=mark): - if mark is None or mark["type"] != "decoratedSymbol": - return [] - return [mark] - case ImplicitTarget(): - return [] - case RangeTarget(anchor=anchor, active=active): - return extract_decorated_marks(anchor) + extract_decorated_marks(active) - case ListTarget(elements=elements): - return [ - mark for target in elements for mark in extract_decorated_marks(target) - ] - case PrimitiveDestination(target=target): - return extract_decorated_marks(target) - case ImplicitDestination(): - return [] - case ListDestination(destinations=destinations): - return [ - mark - for destination in destinations - for mark in extract_decorated_marks(destination) - ] - case BringMoveTargets(source=source, destination=destination): - return extract_decorated_marks(source) + extract_decorated_marks( - destination - ) - case SwapTargets(target1=target1, target2=target2): - return extract_decorated_marks(target1) + extract_decorated_marks(target2) - case _: - raise TypeError(f"Unknown capture type: {type(capture)}") diff --git a/cursorless-talon/src/private_api/private_api.py b/cursorless-talon/src/private_api/private_api.py deleted file mode 100644 index d6fd88e779d..00000000000 --- a/cursorless-talon/src/private_api/private_api.py +++ /dev/null @@ -1,66 +0,0 @@ -from typing import Any, Optional, Union - -from talon import Module, actions - -from ..targets.target_types import ( - CursorlessTarget, - ListTarget, - PrimitiveTarget, - RangeTarget, -) -from .extract_decorated_marks import extract_decorated_marks - -mod = Module() - - -@mod.action_class -class MiscActions: - def cursorless_private_extract_decorated_marks(capture: Any) -> list[dict]: - """Cursorless private api: Extract all decorated marks from a Talon capture""" - return extract_decorated_marks(capture) - - -@mod.action_class -class TargetBuilderActions: - """Cursorless private api low-level target builder actions""" - - def cursorless_private_build_primitive_target( - modifiers: list[dict], mark: Optional[dict] - ) -> PrimitiveTarget: - """Cursorless private api low-level target builder: Create a primitive target""" - return PrimitiveTarget(mark, modifiers) - - def cursorless_private_build_list_target( - elements: list[Union[PrimitiveTarget, RangeTarget]] - ) -> Union[PrimitiveTarget, ListTarget]: - """Cursorless private api low-level target builder: Create a list target""" - if len(elements) == 1: - return elements[0] - - return ListTarget(elements) - - -@mod.action_class -class TargetActions: - def cursorless_private_target_nothing() -> PrimitiveTarget: - """Cursorless private api: Creates the "nothing" target""" - return PrimitiveTarget({"type": "nothing"}, []) - - -@mod.action_class -class ActionActions: - def cursorless_private_action_highlight( - target: CursorlessTarget, highlightId: Optional[str] = None - ) -> None: - """Cursorless private api: Highlights a target""" - payload = { - "name": "highlight", - "target": target, - } - - if highlightId is not None: - payload["highlightId"] = highlightId - - actions.user.private_cursorless_command_and_wait( - payload, - ) diff --git a/cursorless-talon/src/snippets.py b/cursorless-talon/src/snippets.py index 5cd9a83214d..3f15bcde46f 100644 --- a/cursorless-talon/src/snippets.py +++ b/cursorless-talon/src/snippets.py @@ -1,5 +1,5 @@ from dataclasses import dataclass -from typing import Any, Optional, Union +from typing import Any, Optional from talon import Module, actions @@ -90,20 +90,14 @@ def insert_named_snippet( insert_snippet(snippet, destination) -def insert_custom_snippet( - body: str, - destination: CursorlessDestination, - scope_types: Optional[list[dict]] = None, -): - snippet = { - "type": "custom", - "body": body, - } - - if scope_types: - snippet["scopeTypes"] = scope_types - - insert_snippet(snippet, destination) +def insert_custom_snippet(body: str, destination: CursorlessDestination): + insert_snippet( + { + "type": "custom", + "body": body, + }, + destination, + ) @mod.action_class @@ -133,21 +127,12 @@ def cursorless_insert_snippet_by_name(name: str): ImplicitDestination(), ) - def cursorless_insert_snippet( - body: str, - destination: Optional[CursorlessDestination] = ImplicitDestination(), - scope_type: Optional[Union[str, list[str]]] = None, - ): + def cursorless_insert_snippet(body: str): """Cursorless: Insert custom snippet """ - if isinstance(scope_type, str): - scope_type = [scope_type] - - if scope_type is not None: - scope_types = [{"type": st} for st in scope_type] - else: - scope_types = None - - insert_custom_snippet(body, destination, scope_types) + insert_custom_snippet( + body, + ImplicitDestination(), + ) def cursorless_wrap_with_snippet_by_name( name: str, variable_name: str, target: CursorlessTarget diff --git a/cursorless-talon/src/spoken_forms.json b/cursorless-talon/src/spoken_forms.json index 863808f455a..db5acfab047 100644 --- a/cursorless-talon/src/spoken_forms.json +++ b/cursorless-talon/src/spoken_forms.json @@ -3,7 +3,6 @@ "actions.csv": { "simple_action": { "bottom": "scrollToBottom", - "break": "breakLine", "break point": "toggleLineBreakpoint", "carve": "cutToClipboard", "center": "scrollToCenter", @@ -14,7 +13,6 @@ "comment": "toggleLineComment", "copy": "copyToClipboard", "crown": "scrollToTop", - "decrement": "decrement", "dedent": "outdentLine", "define": "revealDefinition", "drink": "editNewLineBefore", @@ -26,10 +24,8 @@ "give": "deselect", "highlight": "highlight", "hover": "showHover", - "increment": "increment", "indent": "indentLine", "inspect": "showDebugHover", - "join": "joinLines", "post": "setSelectionAfter", "pour": "editNewLineAfter", "pre": "setSelectionBefore", @@ -38,7 +34,6 @@ "reference": "showReferences", "rename": "rename", "reverse": "reverseTargets", - "scout": "findInDocument", "scout all": "findInWorkspace", "shuffle": "randomizeTargets", "snippet make": "generateSnippet", @@ -48,6 +43,8 @@ "unfold": "unfoldRegion" }, "callback_action": { + "call": "callAsFunction", + "scout": "findInDocument", "phones": "nextHomophone" }, "paste_action": { "paste": "pasteFromClipboard" }, @@ -58,8 +55,7 @@ "swap_action": { "swap": "swapTargets" }, "wrap_action": { "wrap": "wrapWithPairedDelimiter", "repack": "rewrap" }, "insert_snippet_action": { "snippet": "insertSnippet" }, - "reformat_action": { "format": "applyFormatter" }, - "call_action": { "call": "callAsFunction" } + "reformat_action": { "format": "applyFormatter" } }, "target_connectives.csv": { "range_connective": { @@ -80,10 +76,9 @@ "trailing": "trailing", "content": "keepContentFilter", "empty": "keepEmptyFilter", - "its": "inferPreviousMark", - "visible": "visible" + "its": "inferPreviousMark" }, - "simple_scope_modifier": { "every": "every", "grand": "ancestor" }, + "simple_scope_modifier": { "every": "every" }, "interior_modifier": { "inside": "interiorOnly" }, @@ -159,7 +154,7 @@ "environment": "environment", "command": "command", "char": "character", - "sub": "word", + "word": "word", "token": "token", "identifier": "identifier", "line": "line", @@ -173,9 +168,6 @@ }, "surrounding_pair_scope_type": { "string": "string" - }, - "glyph_scope_type": { - "glyph": "glyph" } }, "paired_delimiters.csv": { diff --git a/cursorless-talon/src/spoken_forms.py b/cursorless-talon/src/spoken_forms.py index 30ad16498df..a0c804a992c 100644 --- a/cursorless-talon/src/spoken_forms.py +++ b/cursorless-talon/src/spoken_forms.py @@ -4,30 +4,27 @@ from talon import app, fs -from .csv_overrides import ( - SPOKEN_FORM_HEADER, - ListToSpokenForms, - SpokenFormEntry, - init_csv_and_watch_changes, -) +from .csv_overrides import SPOKEN_FORM_HEADER, init_csv_and_watch_changes from .marks.decorated_mark import init_hats -from .spoken_forms_output import SpokenFormsOutput JSON_FILE = Path(__file__).parent / "spoken_forms.json" disposables: list[Callable] = [] +def watch_file(spoken_forms: dict, filename: str) -> Callable: + return init_csv_and_watch_changes( + filename, + spoken_forms[filename], + ) + + P = ParamSpec("P") R = TypeVar("R") def auto_construct_defaults( - spoken_forms: dict[str, ListToSpokenForms], - handle_new_values: Callable[[str, list[SpokenFormEntry]], None], - f: Callable[ - Concatenate[str, ListToSpokenForms, Callable[[list[SpokenFormEntry]], None], P], - R, - ], + spoken_forms: dict[str, dict[str, dict[str, str]]], + f: Callable[Concatenate[str, dict[str, dict[str, str]], P], R], ): """ Decorator that automatically constructs the default values for the @@ -40,79 +37,27 @@ def auto_construct_defaults( of `init_csv_and_watch_changes` to remove the `default_values` parameter. Args: - spoken_forms (dict[str, ListToSpokenForms]): The spoken forms - handle_new_values (Callable[[ListToSpokenForms], None]): A callback to be called when the lists are updated - f (Callable[Concatenate[str, ListToSpokenForms, P], R]): Will always be `init_csv_and_watch_changes` + spoken_forms (dict[str, dict[str, dict[str, str]]]): The spoken forms + f (Callable[Concatenate[str, dict[str, dict[str, str]], P], R]): Will always be `init_csv_and_watch_changes` """ def ret(filename: str, *args: P.args, **kwargs: P.kwargs) -> R: default_values = spoken_forms[filename] - return f( - filename, - default_values, - lambda new_values: handle_new_values(filename, new_values), - *args, - **kwargs, - ) + return f(filename, default_values, *args, **kwargs) return ret -# Maps from Talon list name to the type of the value in that list, e.g. -# `pairedDelimiter` or `simpleScopeTypeType` -# FIXME: This is a hack until we generate spoken_forms.json from Typescript side -# At that point we can just include its type as part of that file -LIST_TO_TYPE_MAP = { - "wrapper_selectable_paired_delimiter": "pairedDelimiter", - "selectable_only_paired_delimiter": "pairedDelimiter", - "wrapper_only_paired_delimiter": "pairedDelimiter", - "surrounding_pair_scope_type": "pairedDelimiter", - "scope_type": "simpleScopeTypeType", - "glyph_scope_type": "complexScopeTypeType", - "custom_regex_scope_type": "customRegex", -} - - def update(): global disposables for disposable in disposables: disposable() - with open(JSON_FILE, encoding="utf-8") as file: + with open(JSON_FILE) as file: spoken_forms = json.load(file) - initialized = False - - # Maps from csv name to list of SpokenFormEntry - custom_spoken_forms: dict[str, list[SpokenFormEntry]] = {} - spoken_forms_output = SpokenFormsOutput() - spoken_forms_output.init() - - def update_spoken_forms_output(): - spoken_forms_output.write( - [ - { - "type": LIST_TO_TYPE_MAP[entry.list_name], - "id": entry.id, - "spokenForms": entry.spoken_forms, - } - for spoken_form_list in custom_spoken_forms.values() - for entry in spoken_form_list - if entry.list_name in LIST_TO_TYPE_MAP - ] - ) - - def handle_new_values(csv_name: str, values: list[SpokenFormEntry]): - custom_spoken_forms[csv_name] = values - if initialized: - # On first run, we just do one update at the end, so we suppress - # writing until we get there - update_spoken_forms_output() - - handle_csv = auto_construct_defaults( - spoken_forms, handle_new_values, init_csv_and_watch_changes - ) + handle_csv = auto_construct_defaults(spoken_forms, init_csv_and_watch_changes) disposables = [ handle_csv("actions.csv"), @@ -126,12 +71,7 @@ def handle_new_values(csv_name: str, values: list[SpokenFormEntry]): handle_csv("experimental/miscellaneous.csv"), handle_csv( "modifier_scope_types.csv", - pluralize_lists=["scope_type", "glyph_scope_type"], - extra_allowed_values=[ - "private.fieldAccess", - "private.switchStatementSubject", - ], - default_list_name="scope_type", + pluralize_lists=["scope_type"], ), handle_csv( "experimental/wrapper_snippets.csv", @@ -167,9 +107,6 @@ def handle_new_values(csv_name: str, values: list[SpokenFormEntry]): ), ] - update_spoken_forms_output() - initialized = True - def on_watch(path, flags): if JSON_FILE.match(path): diff --git a/cursorless-talon/src/spoken_forms_output.py b/cursorless-talon/src/spoken_forms_output.py deleted file mode 100644 index 20f1f8623b8..00000000000 --- a/cursorless-talon/src/spoken_forms_output.py +++ /dev/null @@ -1,48 +0,0 @@ -import json -from pathlib import Path -from typing import TypedDict - -from talon import app - -SPOKEN_FORMS_OUTPUT_PATH = Path.home() / ".cursorless" / "state.json" -STATE_JSON_VERSION_NUMBER = 0 - - -class SpokenFormEntry(TypedDict): - type: str - id: str - spokenForms: list[str] - - -class SpokenFormsOutput: - """ - Writes spoken forms to a json file for use by the Cursorless vscode extension - """ - - def init(self): - try: - SPOKEN_FORMS_OUTPUT_PATH.parent.mkdir(parents=True, exist_ok=True) - except Exception: - error_message = ( - f"Error creating spoken form dir {SPOKEN_FORMS_OUTPUT_PATH.parent}" - ) - print(error_message) - app.notify(error_message) - - def write(self, spoken_forms: list[SpokenFormEntry]): - with open(SPOKEN_FORMS_OUTPUT_PATH, "w", encoding="UTF-8") as out: - try: - out.write( - json.dumps( - { - "version": STATE_JSON_VERSION_NUMBER, - "spokenForms": spoken_forms, - } - ) - ) - except Exception: - error_message = ( - f"Error writing spoken form json {SPOKEN_FORMS_OUTPUT_PATH}" - ) - print(error_message) - app.notify(error_message) diff --git a/cursorless-talon/src/terms.py b/cursorless-talon/src/terms.py index f8ef66c693c..688d305a261 100644 --- a/cursorless-talon/src/terms.py +++ b/cursorless-talon/src/terms.py @@ -1,7 +1,6 @@ """ Stores terms that are used in many different places """ - from talon import Context, Module mod = Module() diff --git a/data/playground/go/branch.go b/data/playground/go/branch.go deleted file mode 100644 index c1fb90e5beb..00000000000 --- a/data/playground/go/branch.go +++ /dev/null @@ -1,57 +0,0 @@ -package p - -func switches(x any) { - switch x { - case 1: - // bar - case 2: - x = nil - case "s": - case 4, "t": - x = 7 - // qux - case 5: - // foo - fallthrough - default: - panic("x") - } - switch x := x.(type) { - case int: - x++ - case string, struct{}: - println(x) - default: - panic(x) - } - switch { - case x == 1: - panic("one") - case false: - // unreachable - } -} - -func ifElseChains(x int) { - if y := 0; x == 1 { - // foo - } else if z:=0; x == 2 { - x-- - x-- - x-- - } else if z:=0; x == 2 { - x-- - x-- - x-- - } else if x == 3 { - x++ - } else if x == 3 { - x++ - } else { - x *= 2 - } - - if x == 4{ - x++ - } -} diff --git a/data/playground/hat-test.txt b/data/playground/hat-test.txt index 23b6891c23b..514795065db 100644 --- a/data/playground/hat-test.txt +++ b/data/playground/hat-test.txt @@ -6,5 +6,3 @@ g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | {{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} {}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{} - -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/contributing/CONTRIBUTING.md b/docs/contributing/CONTRIBUTING.md index af5b8961cb1..8ad61eac257 100644 --- a/docs/contributing/CONTRIBUTING.md +++ b/docs/contributing/CONTRIBUTING.md @@ -9,7 +9,7 @@ extension](#running--testing-extension-locally). You may also find the [VSCode A - [Git](https://git-scm.com/) - [Node.js](https://nodejs.org/en/) -- [Corepack](https://nodejs.org/api/corepack.html) or [pnpm](https://pnpm.io/installation) +- [pnpm](https://pnpm.io/installation) - [VSCode](https://code.visualstudio.com/); minimum version for local development is 1.72.0 in order to support settings profiles for sandboxed development. Please file an issue if that is a problem. ### Steps @@ -43,9 +43,7 @@ extension](#running--testing-extension-locally). You may also find the [VSCode A code --profile=cursorlessDevelopment --install-extension some.extension ``` - where `some.extension` is the id of the extension you'd like to install into the sandbox. - - Note that if you are adding support for a new language that isn't in the default list of [language identifiers](https://code.visualstudio.com/docs/languages/identifiers#_known-language-identifiers) supported by VSCode, you may need to add an extension dependency. See [Adding a new language](./adding-a-new-language.md#2-ensure-file-type-is-supported-by-vscode) for more details. + where `some.extension` is the id of the extension you'd like to install into the sandbox 6. Copy / symlink `cursorless-talon-dev` into your Talon user directory for some useful voice commands for developing Cursorless. diff --git a/docs/contributing/adding-a-new-language.md b/docs/contributing/adding-a-new-language.md index b692992cb32..860b817f299 100644 --- a/docs/contributing/adding-a-new-language.md +++ b/docs/contributing/adding-a-new-language.md @@ -9,11 +9,7 @@ of a document. See the [docs](https://github.com/pokey/vscode-parse-tree/#adding-a-new-language) there for how to add support for a new parser -## 2. Ensure file type is supported by VSCode - -If you are adding support for a new language that isn't natively detected by VSCode, you will need to add the appropriate extension to the list of dependencies. The list of languages officially supported by VSCode is listed [in the VSCode docs](https://code.visualstudio.com/docs/languages/identifiers#_known-language-identifiers). If your language is in that list, you can skip this step and proceed to step 3. If your language is not in that list, you need to find a VSCode extension that adds support for your language, and add the id of the given extension to [`packages/common/src/extensionDependencies.ts`](../../packages/common/src/extensionDependencies.ts) and then re-run `pnpm init-vscode-sandbox` to ensure it is installed. If you do not do this you will encounter errors when attempting to execute cursorless commands in the next step. See [#1895](https://github.com/cursorless-dev/cursorless/issues/1895) for more info. - -## 3. Define parse tree patterns in Cursorless +## 2. Define parse tree patterns in Cursorless First a few notes / tips: diff --git a/docs/contributing/adding-a-new-package.md b/docs/contributing/adding-a-new-package.md index ebdb2f136dc..e6aa4a3136a 100644 --- a/docs/contributing/adding-a-new-package.md +++ b/docs/contributing/adding-a-new-package.md @@ -7,8 +7,7 @@ Replace `foo` with your new package name in the instructions below. 3. `pnpm init` 4. `code package.json` and update the `description` field 5. `pnpm install` -6. `pnpm -w fix:meta` -7. If your package is not a library (ie it's an entrypoint), add a `"private": true,` line to your `package.json`, then run another `pnpm -w fix:meta` for good measure. +6. `pnpm -w meta-updater` For any packages that you need to depend on, you can run @@ -16,4 +15,4 @@ For any packages that you need to depend on, you can run pnpm add some-package ``` -from the `packages/foo` directory. Note that `some-package` could be a local package, eg `@cursorless/common`. In that case, you need to re-run `pnpm -w fix:meta` after adding the dependency, so that the Typescript references can be updated. +from the `packages/foo` directory. Note that `some-package` could be a local package, eg `@cursorless/common`. In that case, you need to re-run `pnpm -w meta-updater` after adding the dependency, so that the Typescript references can be updated. diff --git a/docs/contributing/architecture/hat-snapshots.md b/docs/contributing/architecture/hat-snapshots.md index de4c33c4f31..1ead2566993 100644 --- a/docs/contributing/architecture/hat-snapshots.md +++ b/docs/contributing/architecture/hat-snapshots.md @@ -2,7 +2,7 @@ In order to allow long chained command phrases, we take a snapshot of the hat token map at the start of a phrase and continue to use this map during the course of the entire phrase. This way you can be sure that any commands issued during the course of a single phrase that refer to a decorated token will continue to refer to the same logical token no matter what happens in the document during phrase execution. Note that the ranges of tokens will be kept current as the document changes so that they refer to the same logical range, but the same logical token will keep the same key in the hat token map over the course of a phrase. -To make this work, first the voice engine [touches](https://github.com/talonhub/community/blob/e373780af16256ab8fd5638af32d97fa23c4c0fc/apps/vscode/command_client/command_client.py#L398) a file within the signals subdirectory of the command server communication directory after the phrase has been parsed but right before execution begins. Then cursorless will check the version of the signal file before it [reads](https://github.com/cursorless-dev/cursorless/blob/2a624888369d41b0531e472d001d63d09912c8aa/src/core/HatTokenMap.ts#L88) or [updates](https://github.com/cursorless-dev/cursorless/blob/0d1004bafc6764734bee62afbfbb02500630a264/src/core/HatTokenMap.ts#L70) the hat token map via the command server [signal API](https://github.com/pokey/command-server/blob/2b9f9ea2a38b6e95aa60ff9553a804165e527308/src/extension.ts#L29). If the signal has been emitted since the last time cursorless took a snapshot of the hat token map, it will take a new snapshot and continue to use that snapshot of the hats until the next time the signal is emitted. Note that the signal transmission is asynchronous so cursorless just needs to make sure to check the version of the signal before it either updates or reads the map. +To make this work, first the voice engine [touches](https://github.com/knausj85/knausj_talon/blob/e373780af16256ab8fd5638af32d97fa23c4c0fc/apps/vscode/command_client/command_client.py#L398) a file within the signals subdirectory of the command server communication directory after the phrase has been parsed but right before execution begins. Then cursorless will check the version of the signal file before it [reads](https://github.com/cursorless-dev/cursorless/blob/2a624888369d41b0531e472d001d63d09912c8aa/src/core/HatTokenMap.ts#L88) or [updates](https://github.com/cursorless-dev/cursorless/blob/0d1004bafc6764734bee62afbfbb02500630a264/src/core/HatTokenMap.ts#L70) the hat token map via the command server [signal API](https://github.com/pokey/command-server/blob/2b9f9ea2a38b6e95aa60ff9553a804165e527308/src/extension.ts#L29). If the signal has been emitted since the last time cursorless took a snapshot of the hat token map, it will take a new snapshot and continue to use that snapshot of the hats until the next time the signal is emitted. Note that the signal transmission is asynchronous so cursorless just needs to make sure to check the version of the signal before it either updates or reads the map. In the diagram below, we document the flow of a couple different cases. Dotted lines represent asynchronous / fire-and-forget communication: diff --git a/docs/user/README.md b/docs/user/README.md index 5b425e8f810..15850b3acac 100644 --- a/docs/user/README.md +++ b/docs/user/README.md @@ -8,7 +8,7 @@ Welcome to Cursorless! You may find it helpful to start with the [tutorial video This guide assumes you've already [installed Cursorless](installation.md). -Once you understand the concepts, you can pull up a cheatsheet for reference by saying either `"cursorless reference"` or `"cursorless cheatsheet"` with VSCode focused. +Once you understand the concepts, you can pull up a cheatsheet for reference using either `"cursorless reference"` or `"cursorless cheatsheet"` commands within VSCode. You can get back to these docs by saying `"cursorless docs"`, `"cursorless help"` within VSCode. @@ -82,16 +82,16 @@ The following shapes are supported. Note that to target the default (dot) shape | Spoken form | Shape | Internal ID | Enabled by default? | | ----------- | ----------------------------------------------- | ------------ | ------------------- | | N/A | ![Default](../../images/hats/default.svg) | `default` | ✅ | -| `"bolt"` | ![Bolt](../../images/hats/bolt.svg) | `bolt` | ❌ | -| `"curve"` | ![Curve](../../images/hats/curve.svg) | `curve` | ❌ | +| `"ex"` | ![Ex](../../images/hats/ex.svg) | `ex` | ❌ | | `"fox"` | ![Fox](../../images/hats/fox.svg) | `fox` | ❌ | -| `"frame"` | ![Frame](../../images/hats/frame.svg) | `frame` | ❌ | -| `"play"` | ![Play](../../images/hats/play.svg) | `play` | ❌ | | `"wing"` | ![Wing](../../images/hats/wing.svg) | `wing` | ❌ | | `"hole"` | ![Hole](../../images/hats/hole.svg) | `hole` | ❌ | -| `"ex"` | ![Ex](../../images/hats/ex.svg) | `ex` | ❌ | -| `"cross"` | ![Crosshairs](../../images/hats/crosshairs.svg) | `crosshairs` | ❌ | +| `"frame"` | ![Frame](../../images/hats/frame.svg) | `frame` | ❌ | +| `"curve"` | ![Curve](../../images/hats/curve.svg) | `curve` | ❌ | | `"eye"` | ![Eye](../../images/hats/eye.svg) | `eye` | ❌ | +| `"play"` | ![Play](../../images/hats/play.svg) | `play` | ❌ | +| `"cross"` | ![Crosshairs](../../images/hats/crosshairs.svg) | `crosshairs` | ❌ | +| `"bolt"` | ![Bolt](../../images/hats/bolt.svg) | `bolt` | ❌ | You can enable or disable shapes in your VSCode settings, by searching for `cursorless.hatEnablement.shapes` and checking the box next to the internal ID for the given shape as listed above. To navigate to your VSCode settings, either say "show settings", or go to File --> Preferences --> Settings. @@ -184,9 +184,7 @@ We support several modifiers that allow you to refer to scopes relative to the i Here is a diagram of the possible relative / ordinal modifiers using the `funk` scope as an example: -
- ![Relative ordinal diagram](images/relative_ordinal.png) -
+![Relative ordinal diagram](images/relative_ordinal.png) ([Image source](https://github.com/cursorless-dev/cursorless/blob/main/docs/user/images/relative_ordinal.tex)) @@ -209,36 +207,27 @@ And here is a table of the spoken forms: ##### `"every"` -The modifier `"every"` can be used to select a syntactic element and all of its matching siblings. +The command `"every"` can be used to select a syntactic element and all of its matching siblings. - `"take every key air"` - `"take every funk air"` - `"take every key"` (if cursor is currently within a key) -For example, the command `"take every key [blue] air"` will select every key in the map/object/dict including the token with a blue hat over the letter 'a'. - -##### `"grand"` - -The modifier `"grand"` can be used to select the parent of the containing syntactic element. - -- `"take grand statement air"` -- `"take grand funk air"` - -For example, the command `"take grand statement [blue] air"` will select that parent statement of the statement containing the token with a blue hat over the letter 'a'. +For example, the command `take every key [blue] air` will select every key in the map/object/dict including the token with a blue hat over the letter 'a'. ##### Sub-token modifiers -###### `"sub"` +###### `"word"` -If you need to refer to the individual words within a `camelCase`/`snake_case` token, you can use the `"sub"` modifier. For example, +If you need to refer to the individual words within a `camelCase`/`snake_case` token, you can use the `"word"` modifier. For example, -- `"second sub air"` -- `"second past fourth sub air"` -- `"last sub air"` +- `"second word air"` +- `"second past fourth word air"` +- `"last word air"` For example, the following command: - "take second past fourth sub blue air" + "take second past fourth word blue air" Selects the second, third and fourth word in the token containing letter 'a' with a blue hat. @@ -362,15 +351,6 @@ If your cursor is touching a token, you can say `"take every instance"` to selec Pro tip: if you say eg `"take five instances air"`, and it turns out you need more, you can say eg `"take that and next two instances that"` to select the next two instances after the last instance you selected. -###### Experimental: `"from"` - -We have experimental support for prefixing a command with `"from "` to narrow the range within which `"every instance"` searches, or to set the start point from which `"next instance"` searches. For example: - -- `"from funk take every instance air"`: selects all instances of the token with a hat over the letter `a` in the current function -- `"from air take next instance bat"`: selects the next instance of the token with a hat over the letter `b` starting from the token with a hat over the letter `a` - -Note that the `"from"` modifier is not enabled by default; you must remove the `-` at the start of the line starting with `-from` in your `experimental/experimental_actions.csv` [settings csv](./customization.md). Note also that this feature is considered experimental and may change in the future. - ##### `"just"` The `"just"` modifier strips the target of any semantic information, treating it as just a raw range, with the following effects: @@ -387,7 +367,7 @@ The `"just"` modifier strips the target of any semantic information, treating it - `"chuck just line"` will delete only the content of the current line, without removing the line ending, resulting in a blank line, unlike the default behaviour of `"chuck line"` that removes the line entirely, leaving no blank line. -- A raw range does not have its own insertion delimiters. +- A raw range does not have its own insertion delimitiers. - For example, `"paste after just air"` will paste directly after the air token, without inserting a space, as opposed to the way `"paste after air"` would insert a space before the pasted content. - If you use `"just"` on the destination of a `"bring"` command, it will inherit its insertion delimiters from the source of the `"bring"` action. For example, in the command `"bring arg air and bat after just paren"`, the `"air"` and `"bat"` arguments will be joined by commas. In contrast, `"bring arg air and bat after token paren"` would join the arguments with spaces. - In the case of [`"instance"`](#instance), by default `"every instance air"` will only consider instances of the air token that are themselves full tokens, but `"every instance just air"` doesn't have such a restriction, because we've stripped air of its semantic "token-ness". @@ -398,6 +378,15 @@ Some examples: - `"chuck just line"`: deletes just the content of the line, leaving a blank line. - `"bring bat after just air"`: results in something like `aaabbb` where the bat token was copied after the air token with no delimeter between them. +###### Experimental: `"from"` + +We have experimental support for prefixing a command with `"from "` to narrow the range within which `"every instance"` searches, or to set the start point from which `"next instance"` searches. For example: + +- `"from funk take every instance air"`: selects all instances of the token with a hat over the letter `a` in the current function +- `"from air take next instance bat"`: selects the next instance of the token with a hat over the letter `b` starting from the token with a hat over the letter `a` + +Note that the `"from"` modifier is not enabled by default; you must remove the `-` at the start of the line starting with `-from` in your `experimental/experimental_actions.csv` [settings csv](./customization.md). Note also that this feature is considered experimental and may change in the future. + ##### Surrounding pair Cursorless has support for expanding the selection to the nearest containing paired delimiter, eg the surrounding parentheses, curly brackets, etc. @@ -565,11 +554,10 @@ Copies the token containing letter 'a' with a blue hat. ### Swap -Swaps two targets. If the first target is omitted, it will target the current selection. If `` and `` each consist of multiple targets, they will be zipped together. +Swaps two targets. If the first target is omitted, it will target the current selection. If the targets are list targets they will be zipped together. - `"swap with "` - `"swap with "` -- `"swap air and bat with cap and drum"` is equivalent to `"swap air with cap"` and `"swap bat with drum"` eg: `swap blue air with green bat` @@ -586,11 +574,6 @@ For example: - `"indent air"` - `"dedent funk bat"` -### Increment / decrement - -- `"increment "`: increment number target. eg change `1` to `2`. -- `"decrement "`: decrement number target. eg change `2` to `1`. - ### Insert empty lines - `"drink "`: Inserts a new line above the target line, and moves the cursor to the newly created line @@ -696,8 +679,6 @@ Each of these commands performs a vscode action of the same or a similar name on - `"reference "` search the workspace for all references to the target - `"hover "` displays the tooltip that would appear if you hovered the mouse over the target - `"quick fix "` displays quick fixes and refactors suggested by the vscode -- `"scout "` search the document for the target -- `"scout all "` search the workspace for the target eg: `define blue air` @@ -723,27 +704,6 @@ eg: Extracts the function call containing the decorated 'a' into its own variable. -### Join - -Join multiple lines together. - -- `"join "` - -eg: - -- `join air`: Join the line with the token containing the letter 'a' with its next line. -- `join block air`: Joines all lines in the paragraph with the token containing the letter 'a' together into a single line. - -### Break - -Break line in two. - -- `"break "` - -eg: - -- `break air`: Break the line with the token containing the letter 'a'. 'a' is now the first token on the new line. - ## Paired delimiters | Default spoken form | Delimiter name | Symbol inserted before target | Symbol inserted after target | Is wrapper? | Is selectable? | diff --git a/docs/user/customization.md b/docs/user/customization.md index c9039286d7f..5fda1a7720a 100644 --- a/docs/user/customization.md +++ b/docs/user/customization.md @@ -30,12 +30,13 @@ The directory location can be customized using the `user.cursorless_settings_dir Note that these csv's: - support empty lines, -- support multiple spoken forms for a single identifier using `|` as a separator, eg `ditch|chuck, remove`, +- supports multiple spoken forms for a single action - support comment lines beginning with `#`, and -- ignore leading / trailing whitespace on identifiers and spoken forms +- ignore any leading / trailing whitespace on spoken forms and cursorless + identifiers If the spoken form begins with a `-`, it will be disabled. Please do not remove -any lines, because that will trigger cursorless to add them back on next +these lines, because that will trigger cursorless to add them back on next reload, as cursorless uses these lines to track disabled spoken forms. ### Changing a spoken form @@ -117,10 +118,6 @@ Cursorless exposes a couple talon actions and captures that you can use to defin - `user.cursorless_ide_command(command_id: str, target: cursorless_target)`: Performs a built-in IDE command on the given target eg: `user.cursorless_ide_command("editor.action.addCommentLine", cursorless_target)` -- `user.cursorless_get_text(target: CursorlessTarget, hide_decorations: bool = False) -> str` - Get text from target. If `hide_decorations` is `true`, will not show decorations. -- `user.cursorless_get_text_list(target: CursorlessTarget, hide_decorations: bool = False) -> list[str]` - Get texts from multiple targets. If `hide_decorations` is `true`, will not show decorations. - `user.cursorless_insert(destination: CursorlessDestination, text: Union[str, List[str]])`: Insert text at destination. eg: `user.cursorless_insert(cursorless_destination, "hello")` @@ -130,8 +127,8 @@ Cursorless exposes a couple talon actions and captures that you can use to defin See [snippets](./experimental/snippets.md) for more information about Cursorless snippets. - `user.cursorless_insert_snippet_by_name(name: str)`: Insert a snippet with the given name, eg `functionDeclaration` -- `user.cursorless_insert_snippet(body: str, destination: Optional[CursorlessDestination], scope_type: Optional[Union[str, list[str]]])`: Insert a snippet with the given body defined using our snippet body syntax (see the [snippet format docs](./experimental/snippet-format.md)). The body should be a single string, which could contain newline `\n` characters, rather than a list of strings as is expected in our snippet json representation. Destination is where the snippet will be inserted. If omitted will default to current selection. An optional scope type can be provided for the target to expand to. `"snip if after air"` for example could be desired to go after the statement containing `air` instead of the token. -- `user.cursorless_wrap_with_snippet_by_name(name: str, variable_name: str, target: CursorlessTarget)`: Wrap the given target with a snippet with the given name, eg `functionDeclaration`. Note that `variable_name` should be one of the variables defined in the named snippet. Eg, if the named snippet has a variable `$foo`, you can pass in `"foo"` for `variable_name`, and `target` will be inserted into the position of `$foo` in the given named snippet. +- `user.cursorless_insert_snippet(body: str)`: Insert a snippet with the given body defined using our snippet body syntax (see the [snippet format docs](./experimental/snippet-format.md)). The body should be a single string, which could contain newline `\n` characters, rather than a list of strings as is expected in our snippet json representation. +- `user.cursorless_wrap_with_snippet_by_name(name: str, variable_name: str, target: dict)`: Wrap the given target with a snippet with the given name, eg `functionDeclaration`. Note that `variable_name` should be one of the variables defined in the named snippet. Eg, if the named snippet has a variable `$foo`, you can pass in `"foo"` for `variable_name`, and `target` will be inserted into the position of `$foo` in the given named snippet. - `user.cursorless_wrap_with_snippet(body, target, variable_name, scope)`: Wrap the given target with a snippet with the given body defined using our snippet body syntax (see the [snippet format docs](./experimental/snippet-format.md)). The body should be a single string, which could contain newline `\n` characters, rather than a list of strings as is expected in our snippet json representation. Note that `variable_name` should be one of the variables defined in `body`. Eg, if `body` has a variable `$foo`, you can pass in `"foo"` for `variable_name`, and `target` will be inserted into the position of `$foo` in the given named snippet. The `scope` variable can be used to automatically expand the target to the given scope type, eg `"line"`. ### Example of combining capture and action diff --git a/docs/user/experimental/keyboard/modal.md b/docs/user/experimental/keyboard/modal.md index 8eb08b1b848..d46d2c9d368 100644 --- a/docs/user/experimental/keyboard/modal.md +++ b/docs/user/experimental/keyboard/modal.md @@ -20,30 +20,29 @@ Paste the following into your [VSCode `keybindings.json`](https://code.visualstu "command": "cursorless.keyboard.modal.modeOn", "when": "editorTextFocus" }, - { - "key": "ctrl+c", - "command": "cursorless.keyboard.targeted.targetSelection", - "when": "cursorless.keyboard.modal.mode && editorTextFocus" - }, { "key": "escape", "command": "cursorless.keyboard.escape", "when": "cursorless.keyboard.listening && editorTextFocus && !suggestWidgetMultipleSuggestions && !suggestWidgetVisible" + }, + { + "key": "backspace", + "command": "cursorless.keyboard.targeted.runActionOnTarget", + "args": "remove", + "when": "cursorless.keyboard.modal.mode && editorTextFocus" } ``` Any keybindings that use modifier keys should go in `keybindings.json` as well, with a `"when": "cursorless.keyboard.modal.mode` clause. -The above allows you to press `ctrl-c` to switch to Cursorless mode and `escape` to exit Cursorless mode. - -If you're already in Cursorless mode, pressing `ctrl-c` again will target the current selection, which is useful if you have moved the cursor using your mouse while in Cursorless mode, and want to target your new cursor position. +The above allows you to press `ctrl-c` to switch to Cursorless mode, `escape` to exit Cursorless mode, and `backspace` to issue the delete action while in Cursorless mode. ### `settings.json` To bind keys that do not have modifiers (eg just pressing `a`), add entries like the following to your [VSCode `settings.json`](https://code.visualstudio.com/docs/getstarted/settings#_settingsjson) (or edit these settings in the VSCode settings gui by saying `"cursorless settings"`): ```json - "cursorless.experimental.keyboard.modal.keybindings.scope": { + "cursorless.experimental.keyboard.modal.keybindings.scopes": { "i": "line", "p": "paragraph", ";": "statement", @@ -61,7 +60,7 @@ To bind keys that do not have modifiers (eg just pressing `a`), add entries like "sa": "argumentOrParameter", "sl": "url", }, - "cursorless.experimental.keyboard.modal.keybindings.action": { + "cursorless.experimental.keyboard.modal.keybindings.actions": { "t": "setSelection", "h": "setSelectionBefore", "l": "setSelectionAfter", @@ -80,16 +79,15 @@ To bind keys that do not have modifiers (eg just pressing `a`), add entries like "ac": "copyToClipboard", "ax": "cutToClipboard", "ap": "pasteFromClipboard", - "ad": "followLink", - "aw": "remove", + "ad": "followLink" }, - "cursorless.experimental.keyboard.modal.keybindings.color": { + "cursorless.experimental.keyboard.modal.keybindings.colors": { "d": "default", "b": "blue", "g": "yellow", "r": "red" }, - "cursorless.experimental.keyboard.modal.keybindings.shape": { + "cursorless.experimental.keyboard.modal.keybindings.shapes": { "x": "ex", "f": "fox", "q": "frame", @@ -99,24 +97,6 @@ To bind keys that do not have modifiers (eg just pressing `a`), add entries like "z": "bolt", "w": "crosshairs" }, - "cursorless.experimental.keyboard.modal.keybindings.vscodeCommand": { - // For simple commands, just use the command name - // "aa": "workbench.action.editor.changeLanguageMode", - - // For commands with args, use the following format - // "am": { - // "commandId": "some.command.id", - // "args": ["foo", 0] - // } - - // If you'd like to run the command on the active target, use the following format - "am": { - "commandId": "editor.action.joinLines", - "executeAtTarget": true, - // "keepChangedSelection": true, - // "exitCursorlessMode": true, - } - } ``` Any supported scopes, actions, or colors can be added to these sections, using the same identifiers that appear in the second column of your customisation csvs. Feel free to add / tweak / remove the keyboard shortcuts above as you see fit. diff --git a/docs/user/experimental/snippets.md b/docs/user/experimental/snippets.md index ece8393dbbf..86f7c8535da 100644 --- a/docs/user/experimental/snippets.md +++ b/docs/user/experimental/snippets.md @@ -92,7 +92,7 @@ Note that each snippet can use `insertionScopeTypes` to indicate that it will au As usual, the spoken forms for these snippets can be [customized by csv](../customization.md). The csvs are in the files in `cursorless-settings/experimental` with `snippet` in their name. -In addition, you can change the term `"snippet"` (for snippet insertion) using actions.csv. Keep in mind that if you change it to `"snip"`, you may want to turn off the built-in community `"snip"` commands to avoid conflicts. +In addition, you can change the term `"snippet"` (for snippet insertion) using actions.csv. Keep in mind that if you change it to `"snip"`, you may want to turn off the built-in knausj `"snip"` commands to avoid conflicts. ## Adding your own snippets @@ -100,7 +100,7 @@ To define your own snippets, proceed as follows: ### Define snippets in vscode -1. In your VSCode Cursorless settings (say `"cursorless settings"`), set the `cursorless.experimental.snippetsDir` setting to a directory in which you'd like to create your snippets. You can use the `${userHome}` vairable to refer to your user home directory. +1. In your VSCode Cursorless settings (say `"cursorless settings"`), set the `cursorless.experimental.snippetsDir` setting to a directory in which you'd like to create your snippets. 2. Add snippets to the directory in files ending in `.cursorless-snippets`. See the [documentation](snippet-format.md) for the cursorless snippet format. ### 2. Add snippet to spoken forms csvs diff --git a/docs/user/hatAssignment.md b/docs/user/hatAssignment.md index 2c75dd0d6b7..bdf3dad50ce 100644 --- a/docs/user/hatAssignment.md +++ b/docs/user/hatAssignment.md @@ -21,7 +21,7 @@ When a token is picking its hat, it will have a pool of available hats based on - Which hats are enabled, - What characters make up the token, -- Which hats have already been taken by a higher ranked token. +- Which hats have already been taken by a higher ranked hat. One of these candidate hats might be the hat the token was already wearing before this pass started (if it had one), and some of them will be hats that lower ranked tokens were wearing before the pass started. diff --git a/docs/user/how-to.md b/docs/user/how-to.md deleted file mode 100644 index c6d01987927..00000000000 --- a/docs/user/how-to.md +++ /dev/null @@ -1,48 +0,0 @@ -# How-to guides - -This section contains some how-to guides for common tasks. - -## How do I paste to a target? - -`"paste to air"` - -To replace a target with the contents of the clipboard, say `"paste to "`. - -:::info - -`"to "` is an example of a Destination. See [Destinations](reference/destinations.md) for more information. - -::: - -## How do I run a VSCode task / bash shell command on a target? - -1. Add a [VSCode task](https://code.visualstudio.com/docs/editor/variables-reference) to your `tasks.json` (say `"please open tasks"`): - - ```json - { - "label": "Echo", - "type": "shell", - "command": "echo", - "args": ["${selectedText}"] - } - ``` - - (replace `echo` / `Echo` with your actual command name) - -2. Add a spoken form to your `vscode.talon`: - - ```talon - echo : - user.cursorless_command("setSelection", cursorless_target) - user.run_rpc_command("workbench.action.tasks.runTask", "Echo") - ``` - - (replace `echo` / `Echo` with your actual command name) - -You can now say eg `"echo air past bat"`. - -:::info - -See the [Talon-side api docs](./customization.md#cursorless-public-api) for more on creating custom Cursorless commands - -::: diff --git a/docs/user/installation.md b/docs/user/installation.md index 87ed03c0a12..88ce69c42cb 100644 --- a/docs/user/installation.md +++ b/docs/user/installation.md @@ -1,8 +1,8 @@ # Installation 1. Install [Talon](https://talonvoice.com/) -2. Install the [community Talon commands](https://github.com/talonhub/community). - _(Or see [here](https://github.com/cursorless-dev/cursorless/wiki/Talon-home-requirements) if you prefer not to use community.)_ +2. Install [knausj_talon](https://github.com/knausj85/knausj_talon). + _(Or see [here](https://github.com/cursorless-dev/cursorless/wiki/Talon-home-requirements) if you prefer not to use knausj.)_ 3. Install [VSCode](https://code.visualstudio.com/) 4. Install the [VSCode talon extension pack](https://marketplace.visualstudio.com/items?itemName=pokey.talon) 5. Install the [Cursorless VSCode extension](https://marketplace.visualstudio.com/items?itemName=pokey.cursorless) @@ -15,7 +15,7 @@ Clone repo into `~/.talon/user` -```bash +```insert code: cd ~/.talon/user git clone https://github.com/cursorless-dev/cursorless-talon.git cursorless-talon ``` @@ -24,10 +24,10 @@ Alternatively, access the directory by right clicking the Talon icon in taskbar, The folder structure should look something like the below: -``` -~/.talon/user/community -~/.talon/user/community/apps -~/.talon/user/community/code +```insert code: +~/.talon/user/knausj_talon +~/.talon/user/knausj_talon/apps +~/.talon/user/knausj_talon/code ... ~/.talon/user/cursorless-talon ~/.talon/user/cursorless-talon/src @@ -40,7 +40,7 @@ Now, restart Talon. Clone repo into `%AppData%\Talon\user` -```bash +```insert code: cd %AppData%\Talon\user git clone https://github.com/cursorless-dev/cursorless-talon.git cursorless-talon ``` @@ -49,10 +49,10 @@ Alternatively, access the directory by right clicking the Talon icon in taskbar, The folder structure should look something like the below: -``` -%AppData%\Talon\user\community -%AppData%\Talon\user\community\apps -%AppData%\Talon\user\community\code +```insert code: +%AppData%\Talon\user\knausj_talon +%AppData%\Talon\user\knausj_talon\apps +%AppData%\Talon\user\knausj_talon\code ... %AppData%\Talon\user\cursorless-talon %AppData%\Talon\user\cursorless-talon\src diff --git a/docs/user/localCommandHIstory.md b/docs/user/localCommandHIstory.md deleted file mode 100644 index 3aab613a883..00000000000 --- a/docs/user/localCommandHIstory.md +++ /dev/null @@ -1,15 +0,0 @@ -# Local command history - -By default, Cursorless doesn't capture anything about your usage. However, we do have a way to opt in to a local, sanitized command history. This history is never sent to our servers, and any commands that may contain text will be sanitized. - -The idea is that these statistics can be used in the future for doing local analyses to determine ways you can improve your Cursorless efficiency. We may also support a way for you to send your statistics to us for analysis in the future, but this will be opt-in only. - -To enable local, sanitized command logging, enable the `cursorless.commandHistory` VSCode setting. You should see a checkbox in the settings UI when you say `"cursorless settings"`. You can also set it manually in your `settings.json`: - -```json - "cursorless.commandHistory": true -``` - -The logged commands can be found in your user directory, under `.cursorless/commandHistory`. You can delete this directory at any time to clear your history. Please don't delete the parent `.cursorless` directory, as this contains other files for use by Cursorless. - -We currently offer very basic command statistics via the `"cursorless stats"` voice command. Expect more in the future! diff --git a/docs/user/reference/destinations.md b/docs/user/reference/destinations.md deleted file mode 100644 index 14bc0ffae8e..00000000000 --- a/docs/user/reference/destinations.md +++ /dev/null @@ -1,21 +0,0 @@ -# Destinations - -Some actions expect a destination, rather than a target. Destinations combine a preposition and a target, to define a place and behavior for a Cursorless action. - -## `"to "` - -Replaces the target. - -For example, `"paste to air"` replaces the token with a hat over the `a` with the contents of the clipboard. - -## `"after "` - -Inserts after the target, adding delimiters as appropriate. - -For example, `"paste after air"` inserts a space after the token with a hat over the `a`, followed by the contents of the clipboard. - -## `"before "` - -Inserts before the target, adding delimiters as appropriate. - -For example, `"paste before air"` inserts a space before the token with a hat over the `a`, then places the contents of the clipboard before the space. diff --git a/docs/user/scope-sidebar.md b/docs/user/scope-sidebar.md deleted file mode 100644 index 5d266885831..00000000000 --- a/docs/user/scope-sidebar.md +++ /dev/null @@ -1,3 +0,0 @@ -# The Cursorless sidebar - -You can say `"bar cursorless"` to show the Cursorless sidebar. Currently, the sidebar just contains a section showing a list of all scopes, organized by whether they are present and supported in the active text editor. As you type, the list of present scopes will update in real time. Clicking on a scope will visualize it using the [scope visualizer](scope-visualizer.md). Note that for legacy scopes, we can't tell whether they are present in the active text editor, so we list them under a separate Legacy section. Clicking on these scopes will not visualize them, as we also don't support visualizing legacy scopes. diff --git a/docs/user/unicode.md b/docs/user/unicode.md index a8680e88f43..16195191a11 100644 --- a/docs/user/unicode.md +++ b/docs/user/unicode.md @@ -7,11 +7,11 @@ Cursorless has first-class support for Unicode. By default, when constructing ha - Africa - África -For Unicode symbols that are not letters, and that are not speakable by default, for example emoji, Chinese characters, etc, we have a special "character" called `"special"` that can be used. So for example, if there were a blue hat over a '😄' character, you could say `"take blue special"` to select it. As always, the spoken form `"special"` can be [customized](customization.md). +For Unicode symbols that are not letters, and that are not speakable in knausj, for example emoji, Chinese characters, etc, we have a special "character" called `"special"` that can be used. So for example, if there were a blue hat over a '😄' character, you could say `"take blue special"` to select it. As always, the spoken form `"special"` can be [customized](customization.md). ## Advanced customization -The above setup will allow you to refer to any Unicode token, and is sufficient for most users. However, if you have overridden your `` capture to contain characters other than lowercase letters and the default symbols, you can tell Cursorless to be less aggressive with its normalization, so that it can allocate hats more efficiently. Note that this is not necessary in order to refer to these tokens; it just makes hat allocation slightly more efficient. +The above setup will allow you to refer to any Unicode token. However, if you have overridden your `` capture to contain characters other than lowercase letters and the default knausj symbols, you can tell Cursorless to be less aggressive with its normalization, so that it can allocate hats more efficiently. ### Preserving case diff --git a/fonts/cursorless.woff b/fonts/cursorless.woff index 928ead5901e44de0032214549a6c8b59836be2b0..83b35d87a3ced219103971d466154d2c46c6c5df 100644 GIT binary patch literal 2012 zcmb7EVQ5=b6h7zP-uLp}YhTirzGPk6^rdN&wOiB1tjTKU7CKg(QYzaVilWQ9*iPDH zv>9$7DEpxxlMNioU`!bbf^7aM2y+S(1`ZU_F%ZTaZVEEp56AG=X5+axuWn%fc*!~U zJKs6yo^$WZy{}A;j{^b?{Tf(mJ|^`_V{*sfBLEm6-)<>EN4z#QSK3e94B5|1xwR2) zPL~!WcadxvDQv z=4uCtyG`~gDK>yLTb-gft%+_6Ao{~}Qu9W7=#I2{=Z%8@ugmG_w zb)iQ4{o>y^PKfiT@fZjIc7jotaI`VwACNL8!Q9i(Mc2Q;aSW;!WG7%6_}7S#W)*HzvF3+unsuSA8Pr<_V5AjJmNY7LeF z6h>4FN-6UHbL+vXU*mW9B2{$h>|+pz1bvq@jKMB=7LLGCcn98v6L1pVhtu#8d<>t! zr?3d0!8!O6zJiNz3BG~v;0L$@Kf+bG4maRe_ziwX#3t0y#1;%;7$ew@9oR+3=H}A+ zCM;~iXdI&%Os6#6#)6wmy18LDN1*W&HtL$LMWPWIl)>Tk`GTwR(jr2s@&O>HbFgX%l zBN9%rZ|Rgcmt~=3)QDJ`B?dY>!_Cb-cA_=d6?76d8*E>bex|=aKG@k7@)A2UnZC9` zW>fxOO1(!caCFAMOZb-fK!1a6QPd}LbTPfdGy47k>o_c@i0g;2>Szbw* zQmMys*^+58l0?1wU_u++?lpLmNZEsi9?+{vW4VGdd}YH~e|-dUVGKjIs)4+`Iw2wLA$9&vG_*EYZh=Au~jri?8HfaYR z?whL4RjU=)2UAdmIg%<=c9rKB_EjrhHZw#oSsCVGfda@u>trDVLn~&jNNz7rADAu8 zQ_(UtdH`mj1oJCKj#n!+Z@OG5&zEZDz22Tf-nOag1of7IaaFrU)u(Bhit4BYHJbMl Yw+9Z9-ljG%(bxd>NFVv(Px4><57n3(EC2ui literal 3200 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 - - + \ No newline at end of file diff --git a/images/hats/crosshairs.svg b/images/hats/crosshairs.svg index f8ce9195284..98b1cd34b92 100644 --- a/images/hats/crosshairs.svg +++ b/images/hats/crosshairs.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/images/hats/curve.svg b/images/hats/curve.svg index 23c2a6130d9..80ea1035723 100644 --- a/images/hats/curve.svg +++ b/images/hats/curve.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/images/hats/default.svg b/images/hats/default.svg index 28ea924dab3..6ad5b1e7aac 100644 --- a/images/hats/default.svg +++ b/images/hats/default.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/images/hats/ex.svg b/images/hats/ex.svg index 74d936e4f90..a926865fedc 100644 --- a/images/hats/ex.svg +++ b/images/hats/ex.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/images/hats/eye.svg b/images/hats/eye.svg index dcf8ec1745c..559d25edbad 100644 --- a/images/hats/eye.svg +++ b/images/hats/eye.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/images/hats/fox.svg b/images/hats/fox.svg index 7c8c3066044..98cdf160c31 100644 --- a/images/hats/fox.svg +++ b/images/hats/fox.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/images/hats/frame.svg b/images/hats/frame.svg index 1695e8d81bb..fa84d617a1c 100644 --- a/images/hats/frame.svg +++ b/images/hats/frame.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/images/hats/hole.svg b/images/hats/hole.svg index e89f2679273..be0aff7f1d6 100644 --- a/images/hats/hole.svg +++ b/images/hats/hole.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/images/hats/play.svg b/images/hats/play.svg index 11eae27b11e..279c95364c3 100644 --- a/images/hats/play.svg +++ b/images/hats/play.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/images/hats/wing.svg b/images/hats/wing.svg index d1ea87e296d..3d3f73afbe7 100644 --- a/images/hats/wing.svg +++ b/images/hats/wing.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/images/logo-white.png b/images/logo-white.png deleted file mode 100644 index 180ad25c8a073366f8a3c1bc197df4ea7b1127ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55040 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 x - - - - - diff --git a/package.json b/package.json index bb740819138..1adef257b5e 100644 --- a/package.json +++ b/package.json @@ -6,48 +6,42 @@ "scripts": { "build": "pnpm -r build", "clean": "pnpm -r clean", - "compile": "tsc --build && pnpm -r --if-present compile:esbuild", + "compile": "tsc --build", "fix:eslint": "pnpm lint:ts --fix", "fix:meta": "pnpm run meta-updater:base && pnpm -r exec prettier --write tsconfig.json package.json", "fix:syncpack": "pnpm syncpack fix-mismatches", "init-vscode-sandbox": "pnpm --filter=@cursorless/cursorless-vscode init-launch-sandbox", "lint:meta": "pnpm run meta-updater:base --test", - "lint:ts": "eslint packages --ext ts,tsx,mts", + "lint:ts": "eslint packages --ext ts,tsx", "lint": "pnpm run lint:meta && syncpack list-mismatches && pnpm run lint:ts", "meta-updater:base": "pnpm --filter=@cursorless/meta-updater build && meta-updater", "preinstall": "npx only-allow pnpm", "test-compile": "tsc --build", "test": "pnpm compile && pnpm lint && pnpm -F '!test-harness' test && pnpm -F test-harness test", - "transform-recorded-tests": "./packages/common/scripts/my-ts-node.js packages/cursorless-engine/src/scripts/transformRecordedTests/index.ts", - "watch": "pnpm run -w --parallel '/^watch:.*/'", - "watch:esbuild": "pnpm run -r --parallel --if-present watch:esbuild", - "watch:tsc": "tsc --build --watch" + "transform-recorded-tests": "tsx --conditions=cursorless:bundler packages/cursorless-engine/src/scripts/transformRecordedTests/index.ts", + "watch": "tsc --build --watch" }, "keywords": [], "author": "", "license": "MIT", "devDependencies": { "@pnpm/meta-updater": "1.0.0", - "@types/node": "^18.18.2", - "@typescript-eslint/eslint-plugin": "^6.10.0", - "@typescript-eslint/parser": "^6.10.0", - "esbuild": "^0.17.11", - "eslint": "^8.53.0", + "@types/node": "^16.11.3", + "@typescript-eslint/eslint-plugin": "^5.58.0", + "@typescript-eslint/parser": "^5.58.0", + "eslint": "^8.38.0", "eslint-config-prettier": "^8.8.0", "eslint-import-resolver-typescript": "3.5.5", - "eslint-plugin-import": "2.28.1", - "eslint-plugin-mocha": "10.2.0", - "eslint-plugin-unicorn": "49.0.0", - "eslint-plugin-unused-imports": "^3.0.0", - "prettier": "3.0.3", + "eslint-plugin-import": "2.27.5", + "eslint-plugin-unused-imports": "^2.0.0", + "prettier": "3.0.0", "syncpack": "9.8.4", - "typescript": "^5.2.2" + "tsx": "3.12.3", + "typescript": "^5.1.6" }, "pnpm": { "patchedDependencies": { - "@docusaurus/theme-search-algolia@3.1.0": "patches/@docusaurus__theme-search-algolia@3.1.0.patch", - "@types/nearley@2.11.5": "patches/@types__nearley@2.11.5.patch", - "nearley@2.20.1": "patches/nearley@2.20.1.patch" + "@docusaurus/theme-search-algolia@3.0.0-alpha.0": "patches/@docusaurus__theme-search-algolia@2.3.1.patch" }, "peerDependencyRules": { "ignoreMissing": [ @@ -59,9 +53,5 @@ } } }, - "engines": { - "node": ">=18.18.2" - }, - "packageManager": "pnpm@8.15.3", - "type": "module" + "packageManager": "pnpm@8.6.12" } diff --git a/packages/cheatsheet-local/package.json b/packages/cheatsheet-local/package.json index 80d9dee4d58..86095ff96af 100644 --- a/packages/cheatsheet-local/package.json +++ b/packages/cheatsheet-local/package.json @@ -7,11 +7,11 @@ "scripts": { "compile": "tsc --build", "watch": "tsc --build --watch", - "webpack": "pnpm -w compile && env NODE_OPTIONS=--loader=ts-node/esm webpack --config ./src/webpack.config.ts", + "webpack": "pnpm compile && webpack --config ./src/webpack.config.ts", "build": "pnpm build:prod", "build:dev": "pnpm webpack --mode=development", "build:prod": "pnpm webpack --mode=production --node-env=production", - "clean": "rm -rf ./out tsconfig.tsbuildinfo ./dist ./build" + "clean": "rm -rf ./out tsconfig.tsbuildinfo" }, "keywords": [], "author": "", @@ -32,7 +32,7 @@ "@effortlessmotion/html-webpack-inline-source-plugin": "1.0.3", "@testing-library/react": "14.0.0", "@types/jest": "29.4.0", - "@types/node": "^18.18.2", + "@types/node": "^16.11.3", "@types/react": "18.0.28", "@types/react-dom": "18.0.11", "@types/webpack": "5.28.0", @@ -40,23 +40,16 @@ "autoprefixer": "10.4.13", "css-loader": "6.7.3", "html-webpack-plugin": "5.5.0", - "jest": "29.7.0", - "postcss": "8.4.31", + "jest": "29.5.0", + "postcss": "8.4.21", "postcss-loader": "7.0.2", "style-loader": "3.3.1", - "tailwindcss": "3.3.5", + "tailwindcss": "3.2.7", "ts-loader": "9.4.2", "ts-node": "10.9.1", - "typescript": "^5.2.2", - "webpack": "5.89.0", + "typescript": "^5.1.6", + "webpack": "5.88.2", "webpack-cli": "5.1.4", "webpack-dev-server": "4.11.1" - }, - "postcss": { - "plugins": { - "tailwindcss": {}, - "autoprefixer": {} - } - }, - "type": "module" + } } diff --git a/packages/cheatsheet-local/postcss.config.js b/packages/cheatsheet-local/postcss.config.js new file mode 100644 index 00000000000..116848f66ad --- /dev/null +++ b/packages/cheatsheet-local/postcss.config.js @@ -0,0 +1,3 @@ +module.exports = { + plugins: [require("tailwindcss"), require("autoprefixer")], +}; diff --git a/packages/cheatsheet-local/src/webpack.config.ts b/packages/cheatsheet-local/src/webpack.config.ts index b249d74abe5..9f5c8f033e0 100644 --- a/packages/cheatsheet-local/src/webpack.config.ts +++ b/packages/cheatsheet-local/src/webpack.config.ts @@ -38,12 +38,6 @@ const config: Configuration = { test: /\.(ts|tsx)$/i, loader: "ts-loader", exclude: ["/node_modules/"], - options: { - compilerOptions: { - noEmit: false, - emitDeclarationOnly: false, - }, - }, }, { test: /\.css$/i, @@ -60,4 +54,4 @@ const config: Configuration = { }, }; -export default () => config; +module.exports = () => config; diff --git a/packages/cheatsheet-local/tailwind.config.js b/packages/cheatsheet-local/tailwind.config.js index 2da99109805..ad06094dde5 100644 --- a/packages/cheatsheet-local/tailwind.config.js +++ b/packages/cheatsheet-local/tailwind.config.js @@ -1,13 +1,20 @@ -import { readFileSync } from "fs"; +/* eslint-disable @typescript-eslint/no-var-requires */ +// Generated using webpack-cli https://github.com/webpack/webpack-cli +/*eslint-env node*/ + +const { join } = require("path"); +const { readFileSync } = require("fs"); const references = JSON.parse( - readFileSync("tsconfig.json", "utf-8"), + readFileSync(join(__dirname, "tsconfig.json"), "utf-8"), ).references.map((ref) => ref.path); -export const content = [".", ...references].map( - (dir) => `${dir}/src/**/*!(*.stories|*.spec).{ts,tsx,html}`, -); -export const theme = { - extend: {}, +module.exports = { + content: [".", ...references].map( + (dir) => `${dir}/src/**/*!(*.stories|*.spec).{ts,tsx,html}`, + ), + theme: { + extend: {}, + }, + plugins: [], }; -export const plugins = []; diff --git a/packages/cheatsheet-local/tsconfig.json b/packages/cheatsheet-local/tsconfig.json index 475cd01504b..d90d32e299e 100644 --- a/packages/cheatsheet-local/tsconfig.json +++ b/packages/cheatsheet-local/tsconfig.json @@ -8,11 +8,14 @@ "allowSyntheticDefaultImports": true, "skipLibCheck": true, "esModuleInterop": true, + "module": "es6", "target": "es5", "allowJs": true }, "ts-node": { - "esm": true + "compilerOptions": { + "module": "CommonJS" + } }, "references": [ { diff --git a/packages/cheatsheet/jest.config.js b/packages/cheatsheet/jest.config.js new file mode 100644 index 00000000000..ccc0472c8c0 --- /dev/null +++ b/packages/cheatsheet/jest.config.js @@ -0,0 +1,5 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +module.exports = { + preset: "ts-jest", + testEnvironment: "jsdom", +}; diff --git a/packages/cheatsheet/jest.config.ts b/packages/cheatsheet/jest.config.ts deleted file mode 100644 index f7a6a00f401..00000000000 --- a/packages/cheatsheet/jest.config.ts +++ /dev/null @@ -1,8 +0,0 @@ -import type { Config } from "jest"; - -const config: Config = { - preset: "ts-jest", - testEnvironment: "jsdom", -}; - -export default config; diff --git a/packages/cheatsheet/package.json b/packages/cheatsheet/package.json index 4d84c13f861..e3fe4888ea6 100644 --- a/packages/cheatsheet/package.json +++ b/packages/cheatsheet/package.json @@ -5,13 +5,9 @@ "main": "./out/index.js", "scripts": { "test": "jest", - "clean": "rm -rf ./out tsconfig.tsbuildinfo ./dist ./build", - "compile:tsc": "tsc --build", - "compile:esbuild": "esbuild ./src/index.ts --sourcemap --format=esm --bundle --packages=external --outfile=./out/index.js", - "compile": "pnpm compile:tsc && pnpm compile:esbuild", - "watch:tsc": "pnpm compile:tsc --watch", - "watch:esbuild": "pnpm compile:esbuild --watch", - "watch": "pnpm run --filter @cursorless/cheatsheet --parallel '/^watch:.*/'" + "compile": "tsc --build", + "watch": "tsc --build --watch", + "clean": "rm -rf ./out tsconfig.tsbuildinfo" }, "keywords": [], "author": "", @@ -30,6 +26,7 @@ "@fortawesome/fontawesome-svg-core": "6.3.0", "@fortawesome/free-solid-svg-icons": "6.3.0", "@fortawesome/react-fontawesome": "0.2.0", + "jest": "29.5.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-string-replace": "1.1.0", @@ -41,10 +38,8 @@ "@types/react": "18.0.28", "@types/react-dom": "18.0.11", "@types/react-helmet": "6.1.6", - "jest": "29.7.0", "jest-environment-jsdom": "29.6.2", - "ts-jest": "29.1.1", - "typescript": "^5.2.2" - }, - "type": "module" + "ts-jest": "29.0.5", + "typescript": "^5.1.6" + } } diff --git a/packages/cheatsheet/src/lib/sampleSpokenFormInfos/defaults.json b/packages/cheatsheet/src/lib/sampleSpokenFormInfos/defaults.json index f70df306969..014a9acc343 100644 --- a/packages/cheatsheet/src/lib/sampleSpokenFormInfos/defaults.json +++ b/packages/cheatsheet/src/lib/sampleSpokenFormInfos/defaults.json @@ -14,16 +14,6 @@ } ] }, - { - "id": "breakLine", - "type": "action", - "variations": [ - { - "spokenForm": "break ", - "description": "Break line" - } - ] - }, { "id": "callAsFunction", "type": "action", @@ -31,10 +21,6 @@ { "spokenForm": "call ", "description": "Call on selection" - }, - { - "spokenForm": "call on ", - "description": "Call on " } ] }, @@ -238,16 +224,6 @@ } ] }, - { - "id": "joinLines", - "type": "action", - "variations": [ - { - "spokenForm": "join ", - "description": "Join lines" - } - ] - }, { "id": "moveToTarget", "type": "action", @@ -925,16 +901,6 @@ "description": "Trailing delimiter range" } ] - }, - { - "id": "visible", - "type": "modifier", - "variations": [ - { - "spokenForm": "visible", - "description": "Visible" - } - ] } ] }, @@ -1088,16 +1054,6 @@ } ] }, - { - "id": "show_scope_sidebar", - "type": "command", - "variations": [ - { - "spokenForm": "bar cursorless", - "description": "Show cursorless sidebar" - } - ] - }, { "id": "show_scope_visualizer", "type": "command", @@ -1232,16 +1188,6 @@ } ] }, - { - "id": "command", - "type": "scopeType", - "variations": [ - { - "spokenForm": "command", - "description": "Command" - } - ] - }, { "id": "comment", "type": "scopeType", @@ -1312,16 +1258,6 @@ } ] }, - { - "id": "glyph", - "type": "scopeType", - "variations": [ - { - "spokenForm": "glyph ", - "description": "Instance of single character " - } - ] - }, { "id": "identifier", "type": "scopeType", @@ -1587,7 +1523,7 @@ "type": "scopeType", "variations": [ { - "spokenForm": "sub", + "spokenForm": "word", "description": "Word" } ] diff --git a/packages/common/package.json b/packages/common/package.json index d7694b04d88..ee5da97be28 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -4,13 +4,9 @@ "description": "Common utilities for use anywhere in our codebase", "main": "./out/index.js", "scripts": { - "clean": "rm -rf ./out tsconfig.tsbuildinfo ./dist ./build", - "compile:tsc": "tsc --build", - "compile:esbuild": "esbuild ./src/index.ts --sourcemap --format=esm --bundle --packages=external --outfile=./out/index.js", - "compile": "pnpm compile:tsc && pnpm compile:esbuild", - "watch:tsc": "pnpm compile:tsc --watch", - "watch:esbuild": "pnpm compile:esbuild --watch", - "watch": "pnpm run --filter @cursorless/common --parallel '/^watch:.*/'" + "compile": "tsc --build", + "watch": "tsc --build --watch", + "clean": "rm -rf ./out tsconfig.tsbuildinfo" }, "keywords": [], "author": "", @@ -22,10 +18,8 @@ "devDependencies": { "@types/js-yaml": "^4.0.2", "@types/lodash": "4.14.181", - "@types/mocha": "^10.0.3", + "@types/mocha": "^8.0.4", "@types/sinon": "^10.0.2", - "cross-spawn": "7.0.3", - "fast-check": "3.12.0", "js-yaml": "^4.1.0", "mocha": "^10.2.0", "sinon": "^11.1.1" @@ -36,9 +30,5 @@ "cursorless:bundler": "./src/index.ts", "default": "./out/index.js" } - }, - "bin": { - "my-ts-node": "./scripts/my-ts-node.js" - }, - "type": "module" + } } diff --git a/packages/common/scripts/my-ts-node.js b/packages/common/scripts/my-ts-node.js deleted file mode 100755 index bcd8668111e..00000000000 --- a/packages/common/scripts/my-ts-node.js +++ /dev/null @@ -1,106 +0,0 @@ -#!/usr/bin/env node -// @ts-check -/*eslint-env node*/ -// This script runs a TypeScript file using Node.js by first bundling it with -// esbuild. -import { spawn } from "cross-spawn"; -import { build } from "esbuild"; -import { existsSync, mkdirSync, rmdirSync } from "node:fs"; -import { fileURLToPath } from "node:url"; -import { dirname, join } from "node:path"; -import { randomBytes } from "node:crypto"; - -/** - * Run a command with arguments and return a child process - * @param {string} command - * @param {string[]} args - * @param {Partial?} extraEnv - */ -function runCommand(command, args, extraEnv = {}) { - return spawn(command, args, { - stdio: "inherit", - env: { - ...process.env, - ...extraEnv, - }, - }); -} - -/** - * Create a temporary directory and return its path - * @param {string} baseDir - */ -function createTempDirectory(baseDir) { - const tempDir = join( - baseDir, - "out", - "my-ts-node-tmp", - randomBytes(16).toString("hex"), - ); - - mkdirSync(tempDir, { recursive: true }); - - return tempDir; -} - -/** - * Clean up the temporary directory - * @param {import("fs").PathLike} tempDir - */ -function cleanupTempDirectory(tempDir) { - if (existsSync(tempDir)) { - rmdirSync(tempDir, { recursive: true }); - } -} - -// Main function to execute the script -async function main() { - const args = process.argv.slice(2); - - // Check if the input file is specified - if (args.length === 0) { - console.error("Error: No input file specified."); - console.error("Usage: my-ts-node [script args...]"); - process.exit(1); - } - - const [fileToRun, ...childArgs] = args; - - // Note that the temporary directory must be in the workspace root, otherwise - // VSCode will ignore the source maps, and breakpoints will not work. - const tempDir = createTempDirectory(process.cwd()); - const outFile = join(tempDir, "out.cjs"); - - // Set up cleanup for when the script exits - process.on("exit", () => cleanupTempDirectory(tempDir)); - process.on("SIGINT", () => cleanupTempDirectory(tempDir)); - process.on("SIGTERM", () => cleanupTempDirectory(tempDir)); - - // Run esbuild to bundle the TypeScript file - await build({ - entryPoints: [fileToRun], - sourcemap: true, - conditions: ["cursorless:bundler"], - logLevel: "warning", - platform: "node", - bundle: true, - format: "cjs", - outfile: outFile, - }); - - const nodeProcess = runCommand( - process.execPath, - ["--enable-source-maps", outFile, ...childArgs], - { - ["CURSORLESS_REPO_ROOT"]: join( - dirname(fileURLToPath(import.meta.url)), - "..", - "..", - "..", - ), - }, - ); - nodeProcess.on("close", (code) => process.exit(code ?? undefined)); -} - -main(); diff --git a/packages/common/src/StoredTargetKey.ts b/packages/common/src/StoredTargetKey.ts deleted file mode 100644 index 582ea829aef..00000000000 --- a/packages/common/src/StoredTargetKey.ts +++ /dev/null @@ -1,7 +0,0 @@ -export const storedTargetKeys = [ - "that", - "source", - "instanceReference", - "keyboard", -] as const; -export type StoredTargetKey = (typeof storedTargetKeys)[number]; diff --git a/packages/common/src/cursorlessCommandIds.ts b/packages/common/src/cursorlessCommandIds.ts index ecbda32f31c..cf0edd10aac 100644 --- a/packages/common/src/cursorlessCommandIds.ts +++ b/packages/common/src/cursorlessCommandIds.ts @@ -25,7 +25,6 @@ class VisibleCommand extends Command implements CommandDescription { export const cursorlessCommandIds = [ "cursorless.command", "cursorless.internal.updateCheatsheetDefaults", - "cursorless.private.logQuickActions", "cursorless.keyboard.escape", "cursorless.keyboard.modal.modeOff", "cursorless.keyboard.modal.modeOn", @@ -47,7 +46,6 @@ export const cursorlessCommandIds = [ "cursorless.toggleDecorations", "cursorless.showScopeVisualizer", "cursorless.hideScopeVisualizer", - "cursorless.analyzeCommandHistory", ] as const satisfies readonly `cursorless.${string}`[]; export type CursorlessCommandId = (typeof cursorlessCommandIds)[number]; @@ -71,15 +69,6 @@ export const cursorlessCommandDescriptions: Record< "Resume test case recording", ), ["cursorless.showDocumentation"]: new VisibleCommand("Show documentation"), - ["cursorless.showScopeVisualizer"]: new VisibleCommand( - "Show the scope visualizer", - ), - ["cursorless.hideScopeVisualizer"]: new VisibleCommand( - "Hide the scope visualizer", - ), - ["cursorless.analyzeCommandHistory"]: new VisibleCommand( - "Analyze collected command history", - ), ["cursorless.command"]: new HiddenCommand("The core cursorless command"), ["cursorless.showQuickPick"]: new HiddenCommand( @@ -89,10 +78,7 @@ export const cursorlessCommandDescriptions: Record< "Display the cursorless cheatsheet", ), ["cursorless.internal.updateCheatsheetDefaults"]: new HiddenCommand( - "Update the default values of the cheatsheet payload used on the website and for local development. Be sure to run this on stock community and cursorless.", - ), - ["cursorless.private.logQuickActions"]: new HiddenCommand( - "Log the quick actions available at the current cursor position", + "Update the default values of the cheatsheet payload used on the website and for local development. Be sure to run this on stock knausj and cursorless.", ), ["cursorless.takeSnapshot"]: new HiddenCommand( "Take a snapshot of the current editor state", @@ -124,4 +110,10 @@ export const cursorlessCommandDescriptions: Record< ["cursorless.keyboard.modal.modeToggle"]: new HiddenCommand( "Toggle the cursorless modal mode", ), + ["cursorless.showScopeVisualizer"]: new HiddenCommand( + "Show the scope visualizer", + ), + ["cursorless.hideScopeVisualizer"]: new HiddenCommand( + "Hide the scope visualizer", + ), }; diff --git a/packages/common/src/cursorlessSideBarIds.ts b/packages/common/src/cursorlessSideBarIds.ts deleted file mode 100644 index c51bb171474..00000000000 --- a/packages/common/src/cursorlessSideBarIds.ts +++ /dev/null @@ -1 +0,0 @@ -export const CURSORLESS_SCOPE_TREE_VIEW_ID = "cursorless.scopes"; diff --git a/packages/common/src/ide/PassthroughIDEBase.ts b/packages/common/src/ide/PassthroughIDEBase.ts index 788a632ee55..23dc1e034ab 100644 --- a/packages/common/src/ide/PassthroughIDEBase.ts +++ b/packages/common/src/ide/PassthroughIDEBase.ts @@ -10,13 +10,7 @@ import { TextEditorVisibleRangesChangeEvent, } from "./types/events.types"; import { FlashDescriptor } from "./types/FlashDescriptor"; -import { - Disposable, - IDE, - OpenUntitledTextDocumentOptions, - RunMode, - WorkspaceFolder, -} from "./types/ide.types"; +import { Disposable, IDE, RunMode, WorkspaceFolder } from "./types/ide.types"; import { Messages } from "./types/Messages"; import { QuickPickOptions } from "./types/QuickPickOptions"; import { State } from "./types/State"; @@ -123,10 +117,6 @@ export default class PassthroughIDEBase implements IDE { return this.original.visibleTextEditors; } - public get cursorlessVersion(): string { - return this.original.cursorlessVersion; - } - public get assetsRoot(): string { return this.original.assetsRoot; } @@ -139,10 +129,6 @@ export default class PassthroughIDEBase implements IDE { return this.original.workspaceFolders; } - public findInDocument(query: string, editor?: TextEditor): Promise { - return this.original.findInDocument(query, editor); - } - public findInWorkspace(query: string): Promise { return this.original.findInWorkspace(query); } @@ -151,12 +137,6 @@ export default class PassthroughIDEBase implements IDE { return this.original.openTextDocument(path); } - public openUntitledTextDocument( - options?: OpenUntitledTextDocumentOptions, - ): Promise { - return this.original.openUntitledTextDocument(options); - } - public showQuickPick( items: readonly string[], options?: QuickPickOptions, diff --git a/packages/common/src/ide/fake/FakeIDE.ts b/packages/common/src/ide/fake/FakeIDE.ts index 0ea12b17656..7bb1069fbe5 100644 --- a/packages/common/src/ide/fake/FakeIDE.ts +++ b/packages/common/src/ide/fake/FakeIDE.ts @@ -1,22 +1,21 @@ -import { pull } from "lodash"; import type { EditableTextEditor, TextEditor } from "../.."; +import { pull } from "lodash"; import { GeneralizedRange } from "../../types/GeneralizedRange"; import { TextDocument } from "../../types/TextDocument"; import type { TextDocumentChangeEvent } from "../types/Events"; -import { FlashDescriptor } from "../types/FlashDescriptor"; -import { QuickPickOptions } from "../types/QuickPickOptions"; import { Event, TextEditorSelectionChangeEvent, TextEditorVisibleRangesChangeEvent, } from "../types/events.types"; +import { FlashDescriptor } from "../types/FlashDescriptor"; import type { Disposable, IDE, - OpenUntitledTextDocumentOptions, RunMode, WorkspaceFolder, } from "../types/ide.types"; +import { QuickPickOptions } from "../types/QuickPickOptions"; import { FakeCapabilities } from "./FakeCapabilities"; import FakeClipboard from "./FakeClipboard"; import FakeConfiguration from "./FakeConfiguration"; @@ -31,7 +30,6 @@ export default class FakeIDE implements IDE { capabilities: FakeCapabilities = new FakeCapabilities(); runMode: RunMode = "test"; - cursorlessVersion: string = "0.0.0"; workspaceFolders: readonly WorkspaceFolder[] | undefined = undefined; private disposables: Disposable[] = []; private assetsRoot_: string | undefined; @@ -86,10 +84,6 @@ export default class FakeIDE implements IDE { throw Error("Not implemented"); } - public findInDocument(_query: string, _editor: TextEditor): Promise { - throw Error("Not implemented"); - } - public findInWorkspace(_query: string): Promise { throw Error("Not implemented"); } @@ -98,12 +92,6 @@ export default class FakeIDE implements IDE { throw Error("Not implemented"); } - public openUntitledTextDocument( - _options: OpenUntitledTextDocumentOptions, - ): Promise { - throw Error("Not implemented"); - } - public setQuickPickReturnValue(value: string | undefined) { this.quickPickReturnValue = value; } diff --git a/packages/common/src/ide/types/Configuration.ts b/packages/common/src/ide/types/Configuration.ts index eb40fdfc223..6ee3a7bc87f 100644 --- a/packages/common/src/ide/types/Configuration.ts +++ b/packages/common/src/ide/types/Configuration.ts @@ -8,7 +8,6 @@ export type CursorlessConfiguration = { wordSeparators: string[]; experimental: { snippetsDir: string | undefined; hatStability: HatStability }; decorationDebounceDelayMs: number; - commandHistory: boolean; debug: boolean; }; @@ -27,7 +26,6 @@ export const CONFIGURATION_DEFAULTS: CursorlessConfiguration = { snippetsDir: undefined, hatStability: HatStability.balanced, }, - commandHistory: false, debug: false, }; diff --git a/packages/common/src/ide/types/FileSystem.types.ts b/packages/common/src/ide/types/FileSystem.types.ts index 8990f371d16..15818b36332 100644 --- a/packages/common/src/ide/types/FileSystem.types.ts +++ b/packages/common/src/ide/types/FileSystem.types.ts @@ -3,19 +3,6 @@ import { Disposable } from "./ide.types"; export type PathChangeListener = () => void; export interface FileSystem { - /** - * Reads a file that comes bundled with Cursorless, with the utf-8 encoding. - * {@link path} is expected to be relative to the root of the extension - * bundle. If the file doesn't exist, returns `undefined`. - * - * Note that in development mode, it is possible to supply an absolute path to - * a file on the local filesystem, for things like hot-reloading. - * - * @param path The path of the file to read - * @returns The contents of path, decoded as UTF-8 - */ - readBundledFile(path: string): Promise; - /** * Recursively watch a directory for changes. * @param path The path of the directory to watch @@ -23,14 +10,4 @@ export interface FileSystem { * @returns A disposable to cancel the watcher */ watchDir(path: string, onDidChange: PathChangeListener): Disposable; - - /** - * The path to the Cursorless talon state JSON file. - */ - readonly cursorlessTalonStateJsonPath: string; - - /** - * The path to the Cursorless command history directory. - */ - readonly cursorlessCommandHistoryDirPath: string; } diff --git a/packages/common/src/ide/types/ide.types.ts b/packages/common/src/ide/types/ide.types.ts index 860eaf9e08d..c99e1e711db 100644 --- a/packages/common/src/ide/types/ide.types.ts +++ b/packages/common/src/ide/types/ide.types.ts @@ -22,10 +22,6 @@ import { State } from "./State"; export type RunMode = "production" | "development" | "test"; export type HighlightId = string; -export interface OpenUntitledTextDocumentOptions { - language?: string; - content?: string; -} export interface IDE { readonly configuration: Configuration; @@ -41,11 +37,6 @@ export interface IDE { */ disposeOnExit(...disposables: Disposable[]): () => void; - /** - * The version of the cursorless extension - */ - readonly cursorlessVersion: string; - /** * The root directory of this shipped code. Can be used to access bundled * assets. @@ -99,13 +90,6 @@ export interface IDE { listener: (event: TextDocumentChangeEvent) => void, ): Disposable; - /** - * Find occurrences of query string in the active document. - * @param query The string query to search for - * @param editor The editor to search in. If not provided, uses the active editor. - */ - findInDocument(query: string, editor?: TextEditor): Promise; - /** * Find occurrences of query string in all files in the workspace * @param query The string query to search for @@ -121,17 +105,6 @@ export interface IDE { */ openTextDocument(path: string): Promise; - /** - * Opens an untitled document. - * - * @see {@link openTextDocument} - * @param options optional language and documents content - * @return An editor - */ - openUntitledTextDocument( - options?: OpenUntitledTextDocumentOptions, - ): Promise; - /** * An event that is emitted when a {@link TextDocument text document} is opened or when the language id * of a text document {@link languages.setTextDocumentLanguage has been changed}. diff --git a/packages/common/src/index.ts b/packages/common/src/index.ts index 2770a190256..f42a47ee7e5 100644 --- a/packages/common/src/index.ts +++ b/packages/common/src/index.ts @@ -1,5 +1,4 @@ export * from "./cursorlessCommandIds"; -export * from "./cursorlessSideBarIds"; export * from "./testUtil/extractTargetedMarks"; export { default as FakeIDE } from "./ide/fake/FakeIDE"; export type { Message } from "./ide/spy/SpyMessages"; @@ -12,8 +11,6 @@ export { getKey, splitKey } from "./util/splitKey"; export { hrtimeBigintToSeconds } from "./util/timeUtils"; export * from "./util/walkSync"; export * from "./util/walkAsync"; -export * from "./util/disposableFrom"; -export * from "./util/camelCaseToAllDown"; export { Notifier } from "./util/Notifier"; export type { Listener } from "./util/Notifier"; export type { TokenHatSplittingMode } from "./ide/types/Configuration"; @@ -45,19 +42,15 @@ export * from "./types/TextEditorOptions"; export * from "./types/TextLine"; export * from "./types/Token"; export * from "./types/HatTokenMap"; -export * from "./types/ScopeProvider"; -export * from "./types/SpokenForm"; -export * from "./types/commandHistory"; export * from "./util/textFormatters"; export * from "./types/snippet.types"; export * from "./testUtil/fromPlainObject"; -export * from "./testUtil/spyToPlainObject"; +export * from "./testUtil/toPlainObject"; export { default as DefaultMap } from "./util/DefaultMap"; export * from "./types/GeneralizedRange"; export * from "./types/RangeOffsets"; export * from "./util/omitByDeep"; export * from "./util/range"; -export * from "./util/uniqWithHash"; export * from "./testUtil/isTesting"; export * from "./testUtil/testConstants"; export * from "./testUtil/getFixturePaths"; @@ -94,9 +87,3 @@ export * from "./getFakeCommandServerApi"; export * from "./types/TestCaseFixture"; export * from "./util/getEnvironmentVariableStrict"; export * from "./util/CompositeKeyDefaultMap"; -export * from "./util/toPlainObject"; -export * from "./scopeSupportFacets/scopeSupportFacets.types"; -export * from "./scopeSupportFacets/scopeSupportFacetInfos"; -export * from "./scopeSupportFacets/textualScopeSupportFacetInfos"; -export * from "./scopeSupportFacets/getLanguageScopeSupport"; -export * from "./StoredTargetKey"; diff --git a/packages/common/src/scopeSupportFacets/getLanguageScopeSupport.ts b/packages/common/src/scopeSupportFacets/getLanguageScopeSupport.ts deleted file mode 100644 index 76f57d62164..00000000000 --- a/packages/common/src/scopeSupportFacets/getLanguageScopeSupport.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { htmlScopeSupport } from "./html"; -import { javaScopeSupport } from "./java"; -import { javascriptScopeSupport } from "./javascript"; -import { jsonScopeSupport } from "./json"; -import { pythonScopeSupport } from "./python"; -import { LanguageScopeSupportFacetMap } from "./scopeSupportFacets.types"; -import { talonScopeSupport } from "./talon"; -import { typescriptScopeSupport } from "./typescript"; - -export function getLanguageScopeSupport( - languageId: string, -): LanguageScopeSupportFacetMap { - switch (languageId) { - case "html": - return htmlScopeSupport; - case "java": - return javaScopeSupport; - case "javascript": - return javascriptScopeSupport; - case "json": - return jsonScopeSupport; - case "python": - return pythonScopeSupport; - case "talon": - return talonScopeSupport; - case "typescript": - return typescriptScopeSupport; - } - throw Error(`Unsupported language: '${languageId}'`); -} diff --git a/packages/common/src/scopeSupportFacets/html.ts b/packages/common/src/scopeSupportFacets/html.ts deleted file mode 100644 index d04b1509435..00000000000 --- a/packages/common/src/scopeSupportFacets/html.ts +++ /dev/null @@ -1,74 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ - -import { - LanguageScopeSupportFacetMap, - ScopeSupportFacetLevel, -} from "./scopeSupportFacets.types"; - -const { supported, notApplicable } = ScopeSupportFacetLevel; - -export const htmlScopeSupport: LanguageScopeSupportFacetMap = { - element: supported, - tags: supported, - startTag: supported, - endTag: supported, - attribute: supported, - "key.attribute": supported, - "value.attribute": supported, - "comment.block": supported, - - "argument.actual": notApplicable, - "argument.actual.iteration": notApplicable, - "argument.formal": notApplicable, - "argument.formal.iteration": notApplicable, - "branch.if": notApplicable, - "branch.switchCase": notApplicable, - "branch.try": notApplicable, - "comment.line": notApplicable, - "condition.doWhile": notApplicable, - "condition.for": notApplicable, - "condition.if": notApplicable, - "condition.switchCase": notApplicable, - "condition.ternary": notApplicable, - "condition.while": notApplicable, - "functionCall.constructor": notApplicable, - "functionCallee.constructor": notApplicable, - "key.mapPair.iteration": notApplicable, - "key.mapPair": notApplicable, - "name.assignment": notApplicable, - "name.class": notApplicable, - "name.field": notApplicable, - "name.foreach": notApplicable, - "name.function": notApplicable, - "namedFunction.method": notApplicable, - "string.multiLine": notApplicable, - "string.singleLine": notApplicable, - "type.variable": notApplicable, - "type.field": notApplicable, - "type.foreach": notApplicable, - "type.formalParameter": notApplicable, - "type.interface": notApplicable, - "type.return": notApplicable, - "value.assignment": notApplicable, - "value.field": notApplicable, - "value.foreach": notApplicable, - "value.mapPair.iteration": notApplicable, - "value.mapPair": notApplicable, - "value.return.lambda": notApplicable, - "value.return": notApplicable, - anonymousFunction: notApplicable, - class: notApplicable, - className: notApplicable, - command: notApplicable, - fieldAccess: notApplicable, - functionCall: notApplicable, - functionCallee: notApplicable, - functionName: notApplicable, - ifStatement: notApplicable, - list: notApplicable, - map: notApplicable, - namedFunction: notApplicable, - regularExpression: notApplicable, - statement: notApplicable, - switchStatementSubject: notApplicable, -}; diff --git a/packages/common/src/scopeSupportFacets/java.ts b/packages/common/src/scopeSupportFacets/java.ts deleted file mode 100644 index 1d4e56c7e84..00000000000 --- a/packages/common/src/scopeSupportFacets/java.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ - -import { - LanguageScopeSupportFacetMap, - ScopeSupportFacetLevel, -} from "./scopeSupportFacets.types"; - -const { supported, notApplicable } = ScopeSupportFacetLevel; - -export const javaScopeSupport: LanguageScopeSupportFacetMap = { - "name.foreach": supported, - "value.foreach": supported, - "type.foreach": supported, - - element: notApplicable, - tags: notApplicable, - attribute: notApplicable, - "key.attribute": notApplicable, - "value.attribute": notApplicable, -}; diff --git a/packages/common/src/scopeSupportFacets/javascript.ts b/packages/common/src/scopeSupportFacets/javascript.ts deleted file mode 100644 index 9908bd85fa2..00000000000 --- a/packages/common/src/scopeSupportFacets/javascript.ts +++ /dev/null @@ -1,96 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ - -import { - LanguageScopeSupportFacetMap, - ScopeSupportFacetLevel, -} from "./scopeSupportFacets.types"; - -const { supported, notApplicable } = ScopeSupportFacetLevel; - -export const javascriptScopeSupport: LanguageScopeSupportFacetMap = { - list: supported, - map: supported, - ifStatement: supported, - regularExpression: supported, - switchStatementSubject: supported, - fieldAccess: supported, - - statement: supported, - "statement.iteration.document": supported, - "statement.iteration.block": supported, - - class: supported, - className: supported, - - namedFunction: supported, - "namedFunction.method": supported, - anonymousFunction: supported, - functionName: supported, - - functionCall: supported, - "functionCall.constructor": supported, - functionCallee: supported, - "functionCallee.constructor": supported, - - "argument.actual": supported, - "argument.actual.iteration": supported, - "argument.formal": supported, - "argument.formal.iteration": supported, - - "comment.line": supported, - "comment.block": supported, - - "string.singleLine": supported, - "string.multiLine": supported, - - "branch.if": supported, - "branch.if.iteration": supported, - "branch.try": supported, - "branch.switchCase": supported, - "branch.switchCase.iteration": supported, - "branch.ternary": supported, - - "condition.if": supported, - "condition.while": supported, - "condition.doWhile": supported, - "condition.for": supported, - "condition.ternary": supported, - "condition.switchCase": supported, - - "name.foreach": supported, - "name.assignment": supported, - "name.assignment.pattern": supported, - "name.variable": supported, - "name.variable.pattern": supported, - "name.function": supported, - "name.class": supported, - "name.field": supported, - - "key.mapPair": supported, - "key.mapPair.iteration": supported, - - "value.mapPair": supported, - "value.mapPair.iteration": supported, - "value.assignment": supported, - "value.variable": supported, - "value.foreach": supported, - "value.return": supported, - "value.return.lambda": supported, - "value.field": supported, - - element: supported, - tags: supported, - startTag: supported, - endTag: supported, - attribute: supported, - "key.attribute": supported, - "value.attribute": supported, - - "type.variable": notApplicable, - "type.formalParameter": notApplicable, - "type.return": notApplicable, - "type.field": notApplicable, - "type.foreach": notApplicable, - "type.interface": notApplicable, - command: notApplicable, -}; diff --git a/packages/common/src/scopeSupportFacets/json.ts b/packages/common/src/scopeSupportFacets/json.ts deleted file mode 100644 index 02da16b9d28..00000000000 --- a/packages/common/src/scopeSupportFacets/json.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ - -import { - LanguageScopeSupportFacetMap, - ScopeSupportFacetLevel, -} from "./scopeSupportFacets.types"; - -const { supported } = ScopeSupportFacetLevel; - -export const jsonScopeSupport: LanguageScopeSupportFacetMap = { - "comment.line": supported, - "comment.block": supported, -}; diff --git a/packages/common/src/scopeSupportFacets/python.ts b/packages/common/src/scopeSupportFacets/python.ts deleted file mode 100644 index b9c666ffa6b..00000000000 --- a/packages/common/src/scopeSupportFacets/python.ts +++ /dev/null @@ -1,29 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ - -import { - LanguageScopeSupportFacetMap, - ScopeSupportFacetLevel, -} from "./scopeSupportFacets.types"; - -const { supported, supportedLegacy, notApplicable } = ScopeSupportFacetLevel; - -export const pythonScopeSupport: LanguageScopeSupportFacetMap = { - "name.foreach": supported, - "name.resource": supported, - "name.resource.iteration": supported, - "value.foreach": supported, - "value.yield": supported, - "value.resource": supported, - "value.resource.iteration": supported, - - "argument.actual": supportedLegacy, - "argument.actual.iteration": supportedLegacy, - "argument.formal": supportedLegacy, - "argument.formal.iteration": supportedLegacy, - - element: notApplicable, - tags: notApplicable, - attribute: notApplicable, - "key.attribute": notApplicable, - "value.attribute": notApplicable, -}; diff --git a/packages/common/src/scopeSupportFacets/scopeSupportFacetInfos.ts b/packages/common/src/scopeSupportFacets/scopeSupportFacetInfos.ts deleted file mode 100644 index 2659f64df2c..00000000000 --- a/packages/common/src/scopeSupportFacets/scopeSupportFacetInfos.ts +++ /dev/null @@ -1,358 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ - -import { - ScopeSupportFacet, - ScopeSupportFacetInfo, -} from "./scopeSupportFacets.types"; - -export const scopeSupportFacetInfos: Record< - ScopeSupportFacet, - ScopeSupportFacetInfo -> = { - command: { - description: "A command, for example Talon spoken command or bash", - scopeType: "command", - }, - - element: { - description: "An xml/html element. Also used for LaTeX environments", - scopeType: "xmlElement", - }, - startTag: { - description: "The start tag of an xml element", - scopeType: "xmlStartTag", - }, - endTag: { - description: "The end tag of an xml element", - scopeType: "xmlEndTag", - }, - tags: { - description: "Both tags in an xml element", - scopeType: "xmlBothTags", - }, - attribute: { - description: "A attribute, eg of an html element or a C++ attribute", - scopeType: "attribute", - }, - - list: { - description: "A list/array", - scopeType: "list", - }, - map: { - description: "A map/dictionary", - scopeType: "map", - }, - ifStatement: { - description: "An if statement", - scopeType: "ifStatement", - }, - regularExpression: { - description: "A regular expression", - scopeType: "regularExpression", - }, - switchStatementSubject: { - description: "The subject of a switch statement", - scopeType: "private.switchStatementSubject", - }, - fieldAccess: { - description: "A field access", - scopeType: "private.fieldAccess", - }, - - statement: { - description: "A statement, eg assignment, for loop, etc", - scopeType: "statement", - }, - "statement.iteration.document": { - description: "Iteration scope for statements. The entire document.", - scopeType: "statement", - isIteration: true, - }, - "statement.iteration.block": { - description: - "Iteration scope for statements. Statement blocks(body of functions/if statements/for loops/etc).", - scopeType: "statement", - isIteration: true, - }, - - class: { - description: "A class in an object-oriented language", - scopeType: "class", - }, - className: { - description: "The name of a class", - scopeType: "className", - }, - - namedFunction: { - description: "A named function declaration", - scopeType: "namedFunction", - }, - "namedFunction.method": { - description: "A named method declaration in a class", - scopeType: "namedFunction", - }, - anonymousFunction: { - description: - "An anonymous function, eg a lambda function, an arrow function, etc", - scopeType: "anonymousFunction", - }, - functionName: { - description: "The name of a function", - scopeType: "functionName", - }, - - functionCall: { - description: "A function call", - scopeType: "functionCall", - }, - "functionCall.constructor": { - description: "A constructor call", - scopeType: "functionCall", - }, - functionCallee: { - description: "The function being called in a function call", - scopeType: "functionCallee", - }, - "functionCallee.constructor": { - description: - "The class being constructed in a class instantiation, including the `new` keyword", - scopeType: "functionCallee", - }, - - "argument.actual": { - description: "An argument/parameter in a function call", - scopeType: "argumentOrParameter", - }, - "argument.actual.iteration": { - description: - "Iteration scope of arguments in a function call, should be inside the parens of the argument list", - scopeType: "argumentOrParameter", - isIteration: true, - }, - "argument.formal": { - description: "A parameter in a function declaration", - scopeType: "argumentOrParameter", - }, - "argument.formal.iteration": { - description: - "Iteration scope of the formal parameters of a function declaration; should be the whole parameter list", - scopeType: "argumentOrParameter", - isIteration: true, - }, - - "comment.line": { - description: "A line comment", - scopeType: "comment", - }, - "comment.block": { - description: "A block comment", - scopeType: "comment", - }, - - "string.singleLine": { - description: "A single-line string", - scopeType: "string", - }, - "string.multiLine": { - description: "A multi-line string", - scopeType: "string", - }, - - "branch.if": { - description: "An if/elif/else branch", - scopeType: "branch", - }, - - "branch.if.iteration": { - description: - "Iteration scope for if/elif/else branch; should be the entire if-else statement", - scopeType: "branch", - isIteration: true, - }, - "branch.try": { - description: "A try/catch/finally branch", - scopeType: "branch", - }, - "branch.switchCase": { - description: "A case/default branch in a switch/match statement", - scopeType: "branch", - }, - "branch.switchCase.iteration": { - description: - "Iteration scope for branches in a switch/match statement; should contain all the cases", - scopeType: "branch", - isIteration: true, - }, - "branch.ternary": { - description: "A branch in a ternary expression", - scopeType: "branch", - }, - - "condition.if": { - description: "A condition in an if statement", - scopeType: "condition", - }, - "condition.while": { - description: "A condition in a while loop", - scopeType: "condition", - }, - "condition.doWhile": { - description: "A condition in a do while loop", - scopeType: "condition", - }, - "condition.for": { - description: "A condition in a for loop", - scopeType: "condition", - }, - "condition.ternary": { - description: "A condition in a ternary expression", - scopeType: "condition", - }, - "condition.switchCase": { - description: "A condition in a switch statement", - scopeType: "condition", - }, - - "name.assignment": { - description: "Name (LHS) of an assignment", - scopeType: "name", - }, - "name.assignment.pattern": { - description: "LHS of an assignment with pattern destructuring", - scopeType: "name", - }, - "name.variable": { - description: "Name (LHS) of a variable declaration", - scopeType: "name", - }, - "name.variable.pattern": { - description: - "Name (LHS) of a variable declaration with pattern destructuring", - scopeType: "name", - }, - "name.foreach": { - description: "Iteration variable name in a for each loop", - scopeType: "name", - }, - "name.function": { - description: "Name of a function", - scopeType: "name", - }, - "name.class": { - description: "Name of a class", - scopeType: "name", - }, - "name.field": { - description: "Name (LHS) of a field in a class / interface", - scopeType: "name", - }, - "name.resource": { - description: "Name in a 'with' / 'use' / 'using' statement", - scopeType: "name", - }, - "name.resource.iteration": { - description: - "Iteration scope for names in a 'with' / 'use' / 'using' statement", - scopeType: "name", - isIteration: true, - }, - - "key.attribute": { - description: "Key (LHS) of an attribute eg in an xml element", - scopeType: "collectionKey", - }, - "key.mapPair": { - description: "Key (LHS) of a key-value pair of a map", - scopeType: "collectionKey", - }, - "key.mapPair.iteration": { - description: - "Iteration scope of key-value pairs in a map; should be between the braces", - scopeType: "collectionKey", - isIteration: true, - }, - - "value.assignment": { - description: "Value (RHS) of an assignment", - scopeType: "value", - }, - "value.variable": { - description: "Value (RHS) of a variable declaration", - scopeType: "value", - }, - "value.mapPair": { - description: "Value (RHS) of a key-value pair in a map", - scopeType: "value", - }, - "value.mapPair.iteration": { - description: - "Iteration scope of key-value pairs in a map; should be between the braces", - scopeType: "value", - isIteration: true, - }, - "value.foreach": { - description: "Iterable in a for each loop", - scopeType: "value", - }, - "value.attribute": { - description: "Value (RHS) of an attribute eg in an xml element", - scopeType: "value", - }, - "value.return": { - description: "Return value of a function", - scopeType: "value", - }, - "value.return.lambda": { - description: "Implicit return value from a lambda", - scopeType: "value", - }, - "value.field": { - description: "Value (RHS) of a field in a class / interface", - scopeType: "value", - }, - "value.yield": { - description: "Value of a yield statement", - scopeType: "value", - }, - "value.resource": { - description: "Value of a 'with' / 'use' / 'using' statement", - scopeType: "value", - }, - "value.resource.iteration": { - description: - "Iteration scope for values in a 'with' / 'use' / 'using' statement", - scopeType: "value", - isIteration: true, - }, - - "type.variable": { - description: "Type of variable in a variable declaration", - scopeType: "type", - }, - "type.formalParameter": { - description: "Type of formal parameter in a function declaration", - scopeType: "type", - }, - "type.return": { - description: "Type of return value in a function declaration", - scopeType: "type", - }, - "type.field": { - description: "Type of field in a class / interface", - scopeType: "type", - }, - "type.foreach": { - description: "Type of variable in a for each loop", - scopeType: "type", - }, - "type.interface": { - description: "An interface declaration", - scopeType: "type", - }, - "type.alias": { - description: "A type alias declaration", - scopeType: "type", - }, -}; diff --git a/packages/common/src/scopeSupportFacets/scopeSupportFacets.types.ts b/packages/common/src/scopeSupportFacets/scopeSupportFacets.types.ts deleted file mode 100644 index 7c9b75e85e0..00000000000 --- a/packages/common/src/scopeSupportFacets/scopeSupportFacets.types.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { SimpleScopeTypeType } from "../types/command/PartialTargetDescriptor.types"; - -const scopeSupportFacets = [ - "command", - - "element", - "tags", - "startTag", - "endTag", - "attribute", - - "list", - "map", - "ifStatement", - "regularExpression", - "switchStatementSubject", - "fieldAccess", - - "statement", - "statement.iteration.document", - "statement.iteration.block", - - "class", - "className", - "namedFunction", - "namedFunction.method", - "anonymousFunction", - "functionName", - - "functionCall", - "functionCall.constructor", - "functionCallee", - "functionCallee.constructor", - - "argument.actual", - "argument.actual.iteration", - "argument.formal", - "argument.formal.iteration", - - "comment.line", - "comment.block", - - "string.singleLine", - "string.multiLine", - - "branch.if", - "branch.if.iteration", - "branch.try", - "branch.switchCase", - "branch.switchCase.iteration", - "branch.ternary", - - "condition.if", - "condition.while", - "condition.doWhile", - "condition.for", - "condition.ternary", - "condition.switchCase", - - "name.assignment", - "name.assignment.pattern", - "name.variable", - "name.variable.pattern", - "name.foreach", - "name.function", - "name.class", - "name.field", - "name.resource", - "name.resource.iteration", - - "key.attribute", - "key.mapPair", - "key.mapPair.iteration", - - "value.assignment", - "value.variable", - "value.mapPair", - "value.mapPair.iteration", - "value.attribute", - "value.foreach", - "value.return", - "value.return.lambda", - "value.field", - "value.yield", - "value.resource", - "value.resource.iteration", - - "type.variable", - "type.formalParameter", - "type.return", - "type.field", - "type.foreach", - "type.interface", - "type.alias", - - // FIXME: Still in legacy - // section - // selector - // unit - // collectionItem - // textFragment -] as const; - -const textualScopeSupportFacets = [ - "character", - "word", - "token", - "identifier", - "line", - "sentence", - "paragraph", - "document", - "nonWhitespaceSequence", - // FIXME: Still in legacy - // "boundedNonWhitespaceSequence", - "url", -] as const; - -export interface ScopeSupportFacetInfo { - readonly description: string; - readonly scopeType: SimpleScopeTypeType; - readonly isIteration?: boolean; -} - -export enum ScopeSupportFacetLevel { - supported, - supportedLegacy, - unsupported, - notApplicable, -} - -export type ScopeSupportFacet = (typeof scopeSupportFacets)[number]; - -export type TextualScopeSupportFacet = - (typeof textualScopeSupportFacets)[number]; - -export type LanguageScopeSupportFacetMap = Partial< - Record ->; diff --git a/packages/common/src/scopeSupportFacets/talon.ts b/packages/common/src/scopeSupportFacets/talon.ts deleted file mode 100644 index b9cff242967..00000000000 --- a/packages/common/src/scopeSupportFacets/talon.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ - -import { - LanguageScopeSupportFacetMap, - ScopeSupportFacetLevel, -} from "./scopeSupportFacets.types"; - -const { supported } = ScopeSupportFacetLevel; - -export const talonScopeSupport: LanguageScopeSupportFacetMap = { - command: supported, -}; diff --git a/packages/common/src/scopeSupportFacets/textualScopeSupportFacetInfos.ts b/packages/common/src/scopeSupportFacets/textualScopeSupportFacetInfos.ts deleted file mode 100644 index f4b34d5a33c..00000000000 --- a/packages/common/src/scopeSupportFacets/textualScopeSupportFacetInfos.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { - ScopeSupportFacetInfo, - TextualScopeSupportFacet, -} from "./scopeSupportFacets.types"; - -export const textualScopeSupportFacetInfos: Record< - TextualScopeSupportFacet, - ScopeSupportFacetInfo -> = { - character: { - description: "A single character in the document", - scopeType: "character", - }, - word: { - description: "A single word in a token", - scopeType: "word", - }, - token: { - description: "A single token in the document", - scopeType: "token", - }, - identifier: { - description: "A single alphanumeric identifier in the document", - scopeType: "identifier", - }, - line: { - description: "A single line in the document", - scopeType: "line", - }, - sentence: { - description: "A single sentence in the document", - scopeType: "sentence", - }, - paragraph: { - description: - "A single paragraph(contiguous block of lines) in the document", - scopeType: "paragraph", - }, - document: { - description: "The entire document", - scopeType: "document", - }, - nonWhitespaceSequence: { - description: "A sequence of non-whitespace characters", - scopeType: "nonWhitespaceSequence", - }, - // FIXME: Still in legacy - // boundedNonWhitespaceSequence: { - // description: - // "A sequence of non-whitespace characters bounded by matching pair", - // scopeType: "boundedNonWhitespaceSequence", - // }, - url: { - description: "A url", - scopeType: "url", - }, -}; diff --git a/packages/common/src/scopeSupportFacets/typescript.ts b/packages/common/src/scopeSupportFacets/typescript.ts deleted file mode 100644 index 706c9d96cff..00000000000 --- a/packages/common/src/scopeSupportFacets/typescript.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ - -import { - LanguageScopeSupportFacetMap, - ScopeSupportFacetLevel, -} from "./scopeSupportFacets.types"; - -const { supported } = ScopeSupportFacetLevel; - -export const typescriptScopeSupport: LanguageScopeSupportFacetMap = { - "type.variable": supported, - "type.formalParameter": supported, - "type.return": supported, - "type.field": supported, - "type.interface": supported, - "type.alias": supported, - "name.field": supported, - "value.field": supported, -}; diff --git a/packages/common/src/testUtil/TestCaseSnapshot.ts b/packages/common/src/testUtil/TestCaseSnapshot.ts index cb8690914c8..3c7649bc6b3 100644 --- a/packages/common/src/testUtil/TestCaseSnapshot.ts +++ b/packages/common/src/testUtil/TestCaseSnapshot.ts @@ -1,30 +1,29 @@ -import { StoredTargetKey } from "../StoredTargetKey"; import { RangePlainObject, SelectionPlainObject, SerializedMarks, TargetPlainObject, -} from "../util/toPlainObject"; +} from "./toPlainObject"; -type MarkKeys = { - [K in `${StoredTargetKey}Mark`]?: TargetPlainObject[]; -}; - -export interface TestCaseSnapshot extends MarkKeys { +export type TestCaseSnapshot = { documentContents: string; selections: SelectionPlainObject[]; clipboard?: string; - // FIXME Visible ranges are not asserted during testing, see: + // TODO Visible ranges are not asserted during testing, see: // https://github.com/cursorless-dev/cursorless/issues/160 visibleRanges?: RangePlainObject[]; marks?: SerializedMarks; + thatMark?: TargetPlainObject[]; + sourceMark?: TargetPlainObject[]; + instanceReferenceMark?: TargetPlainObject[]; timeOffsetSeconds?: number; /** * Extra information about the snapshot. Must be json serializable */ metadata?: unknown; -} +}; + export type ExtraSnapshotField = keyof TestCaseSnapshot; export type ExcludableSnapshotField = keyof TestCaseSnapshot; diff --git a/packages/common/src/testUtil/fromPlainObject.ts b/packages/common/src/testUtil/fromPlainObject.ts index 892fe91a9cf..f8ae3167307 100644 --- a/packages/common/src/testUtil/fromPlainObject.ts +++ b/packages/common/src/testUtil/fromPlainObject.ts @@ -5,7 +5,7 @@ import type { PositionPlainObject, RangePlainObject, SelectionPlainObject, -} from "../util/toPlainObject"; +} from "./toPlainObject"; export function plainObjectToPosition({ line, diff --git a/packages/common/src/testUtil/getCursorlessRepoRoot.ts b/packages/common/src/testUtil/getCursorlessRepoRoot.ts index bd2402226f0..fa0ac86a41f 100644 --- a/packages/common/src/testUtil/getCursorlessRepoRoot.ts +++ b/packages/common/src/testUtil/getCursorlessRepoRoot.ts @@ -1,14 +1,13 @@ +import * as path from "path"; + /** * Gets the path to the root of the cursorless repo; used for scripts and tests, * not for production code * @returns The path to the root of the cursorless repo */ export function getCursorlessRepoRoot() { - const root = process.env["CURSORLESS_REPO_ROOT"]; - if (root == null) { - throw new Error( - "CURSORLESS_REPO_ROOT environment variable must be set to run this script", - ); - } - return root; + return ( + process.env["CURSORLESS_REPO_ROOT"] ?? + path.join(__dirname, "..", "..", "..", "..") + ); } diff --git a/packages/common/src/testUtil/getFixturePaths.ts b/packages/common/src/testUtil/getFixturePaths.ts index d1ef216ed3b..034d3ceeff8 100644 --- a/packages/common/src/testUtil/getFixturePaths.ts +++ b/packages/common/src/testUtil/getFixturePaths.ts @@ -21,10 +21,6 @@ export function getRecordedTestsDirPath() { return path.join(getFixturesPath(), "recorded"); } -export function getScopeTestsDirPath() { - return path.join(getFixturesPath(), "scopes"); -} - export function getRecordedTestPaths() { const directory = getRecordedTestsDirPath(); const relativeDir = path.dirname(directory); @@ -32,27 +28,7 @@ export function getRecordedTestPaths() { return walkFilesSync(directory) .filter((p) => p.endsWith(".yml") || p.endsWith(".yaml")) .map((p) => ({ + name: path.relative(relativeDir, p.substring(0, p.lastIndexOf("."))), path: p, - name: pathToName(relativeDir, p), - })); -} - -export function getScopeTestPaths() { - const directory = getScopeTestsDirPath(); - const relativeDir = path.dirname(directory); - - return walkFilesSync(directory) - .filter((p) => p.endsWith(".scope")) - .map((p) => ({ - path: p, - name: pathToName(relativeDir, p), - languageId: path.dirname(path.relative(directory, p)).split(path.sep)[0], - facet: path.basename(p).match(/([a-zA-Z.]+)\d*\.scope/)![1], })); } - -function pathToName(relativeDir: string, filePath: string) { - return path - .relative(relativeDir, filePath.substring(0, filePath.lastIndexOf("."))) - .replaceAll("\\", "/"); -} diff --git a/packages/common/src/testUtil/spyToPlainObject.ts b/packages/common/src/testUtil/spyToPlainObject.ts deleted file mode 100644 index 054810685bb..00000000000 --- a/packages/common/src/testUtil/spyToPlainObject.ts +++ /dev/null @@ -1,30 +0,0 @@ -import type { Message, SpyIDERecordedValues } from ".."; -import { - PlainFlashDescriptor, - PlainHighlight, - generalizedRangeToPlainObject, -} from "../util/toPlainObject"; - -export interface PlainSpyIDERecordedValues { - messages: Message[] | undefined; - flashes: PlainFlashDescriptor[] | undefined; - highlights: PlainHighlight[] | undefined; -} - -export function spyIDERecordedValuesToPlainObject( - input: SpyIDERecordedValues, -): PlainSpyIDERecordedValues { - return { - messages: input.messages, - flashes: input.flashes?.map((descriptor) => ({ - style: descriptor.style, - range: generalizedRangeToPlainObject(descriptor.range), - })), - highlights: input.highlights?.map((highlight) => ({ - highlightId: highlight.highlightId, - ranges: highlight.ranges.map((range) => - generalizedRangeToPlainObject(range), - ), - })), - }; -} diff --git a/packages/common/src/util/toPlainObject.ts b/packages/common/src/testUtil/toPlainObject.ts similarity index 79% rename from packages/common/src/util/toPlainObject.ts rename to packages/common/src/testUtil/toPlainObject.ts index 2b3b6598e68..626378603df 100644 --- a/packages/common/src/util/toPlainObject.ts +++ b/packages/common/src/testUtil/toPlainObject.ts @@ -2,9 +2,10 @@ import type { CharacterRange, GeneralizedRange, LineRange, -} from "../types/GeneralizedRange"; -import { isLineRange } from "../types/GeneralizedRange"; -import { FlashStyle } from "../ide/types/FlashDescriptor"; + Message, + SpyIDERecordedValues, +} from ".."; +import { FlashStyle, isLineRange } from ".."; import { Token } from "../types/Token"; import { Selection } from "../types/Selection"; @@ -26,16 +27,22 @@ export type CharacterRangePlainObject = { export type GeneralizedRangePlainObject = CharacterRangePlainObject | LineRange; -export interface PlainFlashDescriptor { +interface PlainFlashDescriptor { style: keyof typeof FlashStyle; range: GeneralizedRangePlainObject; } -export interface PlainHighlight { +interface PlainHighlight { highlightId: string | undefined; ranges: GeneralizedRangePlainObject[]; } +export interface PlainSpyIDERecordedValues { + messages: Message[] | undefined; + flashes: PlainFlashDescriptor[] | undefined; + highlights: PlainHighlight[] | undefined; +} + export type SelectionPlainObject = { anchor: PositionPlainObject; active: PositionPlainObject; @@ -141,3 +148,21 @@ export function characterRangeToPlainObject( end: positionToPlainObject(range.end), }; } + +export function spyIDERecordedValuesToPlainObject( + input: SpyIDERecordedValues, +): PlainSpyIDERecordedValues { + return { + messages: input.messages, + flashes: input.flashes?.map((descriptor) => ({ + style: descriptor.style, + range: generalizedRangeToPlainObject(descriptor.range), + })), + highlights: input.highlights?.map((highlight) => ({ + highlightId: highlight.highlightId, + ranges: highlight.ranges.map((range) => + generalizedRangeToPlainObject(range), + ), + })), + }; +} diff --git a/packages/common/src/types/Position.ts b/packages/common/src/types/Position.ts index 5751530929c..e4b423218bb 100644 --- a/packages/common/src/types/Position.ts +++ b/packages/common/src/types/Position.ts @@ -1,4 +1,4 @@ -import { Range, TextDocument } from ".."; +import { Range } from ".."; export class Position { /** @@ -151,19 +151,3 @@ export class Position { return this.concise(); } } - -/** - * adjustPosition returns a new position that is offset by the given amount. - * It corrects line and character positions to remain valid in doc. - * @param doc The document - * @param pos The position to adjust - * @param by The amount to adjust by - * @returns The adjusted position - */ -export function adjustPosition( - doc: TextDocument, - pos: Position, - by: number, -): Position { - return doc.positionAt(doc.offsetAt(pos) + by); -} diff --git a/packages/common/src/types/SpokenForm.ts b/packages/common/src/types/SpokenForm.ts deleted file mode 100644 index f79e5d4a7a5..00000000000 --- a/packages/common/src/types/SpokenForm.ts +++ /dev/null @@ -1,47 +0,0 @@ -/** - * The spoken form of a command, scope type, etc, that can be spoken - * using a given set of custom or default spoken forms. - */ -export interface SpokenFormSuccess { - type: "success"; - - /** - * The spoken forms for this entity. These could either be a user's custom - * spoken forms, if we have access to them, or the default spoken forms, if we - * don't, or if we're testing. There will often only be a single entry in this - * array, but there can be multiple if the user has used the `|` syntax in their - * spoken form csv's to define aliases for a single spoken form. - */ - spokenForms: string[]; -} - -/** - * An error spoken form, which indicates that the given entity (command, scope - * type, etc) cannot be spoken, and the reason why. - */ -export interface SpokenFormError { - type: "error"; - - /** - * The reason why the entity cannot be spoken. - */ - reason: string; - - /** - * If `true`, indicates that the entity wasn't found in the user's Talon spoken - * forms json, and so they need to update their cursorless-talon to get the - * given entity. - */ - requiresTalonUpdate: boolean; - - /** - * If `true`, indicates that the entity is only for internal experimentation, - * and should not be exposed to users except within a targeted working group. - */ - isPrivate: boolean; -} - -/** - * A spoken form, which can either be a success or an error. - */ -export type SpokenForm = SpokenFormSuccess | SpokenFormError; diff --git a/packages/common/src/types/TestCaseFixture.ts b/packages/common/src/types/TestCaseFixture.ts index 5424b7d0c28..7d991ae1414 100644 --- a/packages/common/src/types/TestCaseFixture.ts +++ b/packages/common/src/types/TestCaseFixture.ts @@ -1,6 +1,6 @@ import { Command, CommandLatest } from ".."; import { TestCaseSnapshot } from "../testUtil/TestCaseSnapshot"; -import { PlainSpyIDERecordedValues } from "../testUtil/spyToPlainObject"; +import { PlainSpyIDERecordedValues } from "../testUtil/toPlainObject"; export type ThrownError = { name: string; diff --git a/packages/common/src/types/command/ActionDescriptor.ts b/packages/common/src/types/command/ActionDescriptor.ts index 82d6c179ea7..b465d81e678 100644 --- a/packages/common/src/types/command/ActionDescriptor.ts +++ b/packages/common/src/types/command/ActionDescriptor.ts @@ -8,28 +8,23 @@ import { DestinationDescriptor } from "./DestinationDescriptor.types"; * A simple action takes only a single target and no other arguments. */ const simpleActionNames = [ - "breakLine", "clearAndSetSelection", "copyToClipboard", "cutToClipboard", - "decrement", "deselect", "editNewLineAfter", "editNewLineBefore", "experimental.setInstanceReference", "extractVariable", - "findInDocument", "findInWorkspace", "foldRegion", "followLink", - "increment", "indentLine", "insertCopyAfter", "insertCopyBefore", "insertEmptyLineAfter", "insertEmptyLineBefore", "insertEmptyLinesAround", - "joinLines", "outdentLine", "randomizeTargets", "remove", @@ -51,8 +46,6 @@ const simpleActionNames = [ "toggleLineBreakpoint", "toggleLineComment", "unfoldRegion", - "private.setKeyboardTarget", - "private.showParseTree", "private.getTargets", ] as const; @@ -142,7 +135,7 @@ interface NamedInsertSnippetArg { interface CustomInsertSnippetArg { type: "custom"; body: string; - scopeTypes?: ScopeType[]; + scopeType?: ScopeType; substitutions?: Record; } export type InsertSnippetArg = NamedInsertSnippetArg | CustomInsertSnippetArg; diff --git a/packages/common/src/types/command/PartialTargetDescriptor.types.ts b/packages/common/src/types/command/PartialTargetDescriptor.types.ts index 505a46d4ee9..799aa47e858 100644 --- a/packages/common/src/types/command/PartialTargetDescriptor.types.ts +++ b/packages/common/src/types/command/PartialTargetDescriptor.types.ts @@ -6,10 +6,6 @@ export interface ThatMark { type: "that"; } -export interface KeyboardMark { - type: "keyboard"; -} - export interface SourceMark { type: "source"; } @@ -73,115 +69,94 @@ export type PartialMark = | CursorMark | ThatMark | SourceMark - | KeyboardMark | DecoratedSymbolMark | NothingMark | LineNumberMark | RangeMark | ExplicitMark; -export const simpleSurroundingPairNames = [ - "angleBrackets", - "backtickQuotes", - "curlyBrackets", - "doubleQuotes", - "escapedDoubleQuotes", - "escapedParentheses", - "escapedSquareBrackets", - "escapedSingleQuotes", - "parentheses", - "singleQuotes", - "squareBrackets", -] as const; -export const complexSurroundingPairNames = [ - "string", - "any", - "collectionBoundary", -] as const; -export const surroundingPairNames = [ - ...simpleSurroundingPairNames, - ...complexSurroundingPairNames, -]; export type SimpleSurroundingPairName = - (typeof simpleSurroundingPairNames)[number]; + | "angleBrackets" + | "backtickQuotes" + | "curlyBrackets" + | "doubleQuotes" + | "escapedDoubleQuotes" + | "escapedParentheses" + | "escapedSquareBrackets" + | "escapedSingleQuotes" + | "parentheses" + | "singleQuotes" + | "squareBrackets"; export type ComplexSurroundingPairName = - (typeof complexSurroundingPairNames)[number]; + | "string" + | "any" + | "collectionBoundary"; export type SurroundingPairName = | SimpleSurroundingPairName | ComplexSurroundingPairName; -export const simpleScopeTypeTypes = [ - "argumentOrParameter", - "anonymousFunction", - "attribute", - "branch", - "class", - "className", - "collectionItem", - "collectionKey", - "comment", - "private.fieldAccess", - "functionCall", - "functionCallee", - "functionName", - "ifStatement", - "instance", - "list", - "map", - "name", - "namedFunction", - "regularExpression", - "statement", - "string", - "type", - "value", - "condition", - "section", - "sectionLevelOne", - "sectionLevelTwo", - "sectionLevelThree", - "sectionLevelFour", - "sectionLevelFive", - "sectionLevelSix", - "selector", - "private.switchStatementSubject", - "unit", - "xmlBothTags", - "xmlElement", - "xmlEndTag", - "xmlStartTag", +export type SimpleScopeTypeType = + | "argumentOrParameter" + | "anonymousFunction" + | "attribute" + | "branch" + | "class" + | "className" + | "collectionItem" + | "collectionKey" + | "comment" + | "functionCall" + | "functionCallee" + | "functionName" + | "ifStatement" + | "instance" + | "list" + | "map" + | "name" + | "namedFunction" + | "regularExpression" + | "statement" + | "string" + | "type" + | "value" + | "condition" + | "section" + | "sectionLevelOne" + | "sectionLevelTwo" + | "sectionLevelThree" + | "sectionLevelFour" + | "sectionLevelFive" + | "sectionLevelSix" + | "selector" + | "switchStatementSubject" + | "unit" + | "xmlBothTags" + | "xmlElement" + | "xmlEndTag" + | "xmlStartTag" + | "notebookCell" // Latex scope types - "part", - "chapter", - "subSection", - "subSubSection", - "namedParagraph", - "subParagraph", - "environment", + | "part" + | "chapter" + | "subSection" + | "subSubSection" + | "namedParagraph" + | "subParagraph" + | "environment" // Text based scopes - "character", - "word", - "token", - "identifier", - "line", - "sentence", - "paragraph", - "document", - "nonWhitespaceSequence", - "boundedNonWhitespaceSequence", - "url", - "notebookCell", + | "character" + | "word" + | "token" + | "identifier" + | "line" + | "sentence" + | "paragraph" + | "document" + | "nonWhitespaceSequence" + | "boundedNonWhitespaceSequence" + | "url" // Talon - "command", -] as const; - -export function isSimpleScopeType( - scopeType: ScopeType, -): scopeType is SimpleScopeType { - return (simpleScopeTypeTypes as readonly string[]).includes(scopeType.type); -} - -export type SimpleScopeTypeType = (typeof simpleScopeTypeTypes)[number]; + | "command"; export interface SimpleScopeType { type: SimpleScopeTypeType; @@ -210,17 +185,11 @@ export interface OneOfScopeType { scopeTypes: ScopeType[]; } -export interface GlyphScopeType { - type: "glyph"; - character: string; -} - export type ScopeType = | SimpleScopeType | SurroundingPairScopeType | CustomRegexScopeType - | OneOfScopeType - | GlyphScopeType; + | OneOfScopeType; export interface ContainingSurroundingPairModifier extends ContainingScopeModifier { @@ -243,10 +212,6 @@ export interface ExcludeInteriorModifier { type: "excludeInterior"; } -export interface VisibleModifier { - type: "visible"; -} - export interface ContainingScopeModifier { type: "containingScope"; scopeType: ScopeType; @@ -390,7 +355,6 @@ export type Modifier = | EndOfModifier | InteriorOnlyModifier | ExcludeInteriorModifier - | VisibleModifier | ContainingScopeModifier | EveryScopeModifier | OrdinalScopeModifier diff --git a/packages/common/src/types/commandHistory.ts b/packages/common/src/types/commandHistory.ts deleted file mode 100644 index 5c72fcc5d72..00000000000 --- a/packages/common/src/types/commandHistory.ts +++ /dev/null @@ -1,24 +0,0 @@ -import type { Command } from "./command/command.types"; - -/** - * Represents a single line in a command history jsonl file. - */ -export interface CommandHistoryEntry { - // UUID of the log entry. - id: string; - - // Date of the log entry. eg: "2023-09-05" - date: string; - - // Version of the Cursorless extension. eg: "0.28.0-c7bcf64d". - cursorlessVersion: string; - - // Name of thrown error. eg: "NoContainingScopeError". - error?: string; - - // UUID of the phrase. - phraseId: string | undefined; - - // The command that was executed. - command: Command; -} diff --git a/packages/common/src/types/generalizedRangeContains.test.ts b/packages/common/src/types/generalizedRangeContains.test.ts index d9727d890a7..470d5d819f0 100644 --- a/packages/common/src/types/generalizedRangeContains.test.ts +++ b/packages/common/src/types/generalizedRangeContains.test.ts @@ -1,4 +1,4 @@ -import assert from "assert"; +import assert = require("assert"); import { generalizedRangeContains, Position } from ".."; suite("generalizedRangeContains", () => { diff --git a/packages/common/src/types/generalizedRangeTouches.test.ts b/packages/common/src/types/generalizedRangeTouches.test.ts index f5d40591863..d5d595eab05 100644 --- a/packages/common/src/types/generalizedRangeTouches.test.ts +++ b/packages/common/src/types/generalizedRangeTouches.test.ts @@ -1,4 +1,4 @@ -import assert from "assert"; +import assert = require("assert"); import { GeneralizedRange, generalizedRangeTouches, Position } from ".."; suite("generalizedRangeTouches", () => { diff --git a/packages/common/src/types/isGeneralizedRangeEqual.test.ts b/packages/common/src/types/isGeneralizedRangeEqual.test.ts index 5a81b533db6..8efcd8de111 100644 --- a/packages/common/src/types/isGeneralizedRangeEqual.test.ts +++ b/packages/common/src/types/isGeneralizedRangeEqual.test.ts @@ -1,4 +1,4 @@ -import assert from "assert"; +import assert = require("assert"); import { isGeneralizedRangeEqual } from "./GeneralizedRange"; import { Position } from "./Position"; diff --git a/packages/common/src/util/CompositeKeyMap.ts b/packages/common/src/util/CompositeKeyMap.ts index bfb935fad4a..1cb896fd9c5 100644 --- a/packages/common/src/util/CompositeKeyMap.ts +++ b/packages/common/src/util/CompositeKeyMap.ts @@ -35,9 +35,4 @@ export class CompositeKeyMap { delete this.map[this.hash(key)]; return this; } - - clear(): this { - this.map = {}; - return this; - } } diff --git a/packages/common/src/util/camelCaseToAllDown.ts b/packages/common/src/util/camelCaseToAllDown.ts deleted file mode 100644 index 0417ff2e798..00000000000 --- a/packages/common/src/util/camelCaseToAllDown.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** - * Converts a camelCase string to a string with spaces between each word, and - * all words in lowercase. - * - * Example: `camelCaseToAllDown("fooBarBaz")` returns `"foo bar baz"`. - * - * @param input A camelCase string - * @returns The same string, but with spaces between each word, and all words - * in lowercase - */ -export function camelCaseToAllDown(input: string): string { - return input - .replace(/([A-Z])/g, " $1") - .split(" ") - .map((word) => word.toLowerCase()) - .join(" "); -} diff --git a/packages/common/src/util/disposableFrom.ts b/packages/common/src/util/disposableFrom.ts deleted file mode 100644 index a07da6bf414..00000000000 --- a/packages/common/src/util/disposableFrom.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Disposable } from "../ide/types/ide.types"; - -/** - * Construct a disposable that disposes multiple disposables at once. This is - * useful for managing the lifetime of multiple disposables that are created - * together. It ensures that if one of the disposables throws an error during - * disposal, the rest of the disposables will still be disposed. - */ -export function disposableFrom(...disposables: Disposable[]): Disposable { - return { - dispose(): void { - disposables.forEach(({ dispose }) => { - try { - dispose(); - } catch (e) { - // just log, but don't throw; some of the VSCode disposables misbehave, - // and we don't want that to prevent us from disposing the rest of the - // disposables - console.error(e); - } - }); - }, - }; -} diff --git a/packages/cursorless-engine/package.json b/packages/cursorless-engine/package.json index c348c3f08cc..27cd57db237 100644 --- a/packages/cursorless-engine/package.json +++ b/packages/cursorless-engine/package.json @@ -4,37 +4,30 @@ "description": "The core Cursorless engine, which is responsible for parsing and executing commands, allocating hats, etc", "main": "./out/index.js", "scripts": { - "clean": "rm -rf ./out tsconfig.tsbuildinfo ./dist ./build", - "compile:tsc": "tsc --build", - "compile:esbuild": "esbuild ./src/index.ts --sourcemap --format=esm --bundle --packages=external --outfile=./out/index.js", - "compile": "pnpm compile:tsc && pnpm compile:esbuild", - "watch:tsc": "pnpm compile:tsc --watch", - "watch:esbuild": "pnpm compile:esbuild --watch", - "watch": "pnpm run --filter @cursorless/cursorless-engine --parallel '/^watch:.*/'" + "compile": "tsc --build", + "watch": "tsc --build --watch", + "clean": "rm -rf ./out tsconfig.tsbuildinfo" }, "keywords": [], "author": "", "license": "MIT", "dependencies": { "@cursorless/common": "workspace:*", - "glob": "^7.1.7", "immer": "^9.0.15", "immutability-helper": "^3.1.1", "itertools": "^2.1.1", "lodash": "^4.17.21", - "node-html-parser": "^6.1.11", + "node-html-parser": "^5.3.3", "sbd": "^1.0.19", - "uuid": "^9.0.0", - "zod": "3.22.3" + "zod": "3.21.4" }, "devDependencies": { - "@types/glob": "^7.1.3", "@types/js-yaml": "^4.0.2", "@types/lodash": "4.14.181", - "@types/mocha": "^10.0.3", + "@types/mocha": "^8.0.4", "@types/sbd": "^1.0.3", "@types/sinon": "^10.0.2", - "@types/uuid": "^8.3.4", + "fast-check": "3.12.0", "js-yaml": "^4.1.0", "mocha": "^10.2.0", "sinon": "^11.1.1" @@ -45,6 +38,5 @@ "cursorless:bundler": "./src/index.ts", "default": "./out/index.js" } - }, - "type": "module" + } } diff --git a/packages/cursorless-engine/src/CommandHistory.ts b/packages/cursorless-engine/src/CommandHistory.ts deleted file mode 100644 index 8fb49d905ab..00000000000 --- a/packages/cursorless-engine/src/CommandHistory.ts +++ /dev/null @@ -1,219 +0,0 @@ -import { - ActionDescriptor, - CommandComplete, - CommandHistoryEntry, - CommandServerApi, - FileSystem, - IDE, - ReadOnlyHatMap, -} from "@cursorless/common"; -import type { - CommandRunner, - CommandRunnerDecorator, -} from "@cursorless/cursorless-engine"; -import produce from "immer"; -import * as fs from "node:fs/promises"; -import * as path from "node:path"; -import { v4 as uuid } from "uuid"; - -const filePrefix = "cursorlessCommandHistory"; - -/** - * When user opts in, this class sanitizes and appends each Cursorless command - * to a local log file in `.cursorless/commandHistory` dir. - */ -export class CommandHistory implements CommandRunnerDecorator { - private readonly dirPath: string; - private currentPhraseSignal = ""; - private currentPhraseId = ""; - - constructor( - private ide: IDE, - private commandServerApi: CommandServerApi | null, - fileSystem: FileSystem, - ) { - this.dirPath = fileSystem.cursorlessCommandHistoryDirPath; - } - - wrapCommandRunner( - _readableHatMap: ReadOnlyHatMap, - runner: CommandRunner, - ): CommandRunner { - if (!this.isActive()) { - return runner; - } - - return { - run: async (commandComplete: CommandComplete) => { - try { - const returnValue = await runner.run(commandComplete); - - await this.appendToLog(commandComplete); - - return returnValue; - } catch (e) { - await this.appendToLog(commandComplete, e as Error); - throw e; - } - }, - }; - } - - private async appendToLog( - command: CommandComplete, - thrownError?: Error, - ): Promise { - const date = new Date(); - const fileName = `${filePrefix}_${getMonthDate(date)}.jsonl`; - const file = path.join(this.dirPath, fileName); - - const historyItem: CommandHistoryEntry = { - id: uuid(), - date: getDayDate(date), - cursorlessVersion: this.ide.cursorlessVersion, - error: thrownError?.name, - phraseId: await this.getPhraseId(), - command: produce(command, sanitizeCommandInPlace), - }; - const data = JSON.stringify(historyItem) + "\n"; - - await fs.mkdir(this.dirPath, { recursive: true }); - await fs.appendFile(file, data, "utf8"); - } - - private async getPhraseId(): Promise { - const phraseStartSignal = this.commandServerApi?.signals?.prePhrase; - - if (phraseStartSignal == null) { - return undefined; - } - - const newSignal = await phraseStartSignal.getVersion(); - - if (newSignal == null) { - return undefined; - } - - if (newSignal !== this.currentPhraseSignal) { - this.currentPhraseSignal = newSignal; - this.currentPhraseId = uuid(); - } - - return this.currentPhraseId; - } - - private isActive(): boolean { - return this.ide.configuration.getOwnConfiguration("commandHistory"); - } -} - -// Remove spoken form and sanitize action -function sanitizeCommandInPlace(command: CommandComplete): void { - delete command.spokenForm; - sanitizeActionInPlace(command.action); -} - -function sanitizeActionInPlace(action: ActionDescriptor): void { - switch (action.name) { - // Remove replace with text - case "replace": - if (Array.isArray(action.replaceWith)) { - action.replaceWith = []; - } - break; - - // Remove substitutions and custom body - case "insertSnippet": - delete action.snippetDescription.substitutions; - if (action.snippetDescription.type === "custom") { - action.snippetDescription.body = ""; - } - break; - - case "wrapWithSnippet": - if (action.snippetDescription.type === "custom") { - action.snippetDescription.body = ""; - } - break; - - case "executeCommand": - delete action.options?.commandArgs; - break; - - case "breakLine": - case "clearAndSetSelection": - case "copyToClipboard": - case "cutToClipboard": - case "decrement": - case "deselect": - case "editNewLineAfter": - case "editNewLineBefore": - case "experimental.setInstanceReference": - case "extractVariable": - case "findInWorkspace": - case "foldRegion": - case "followLink": - case "increment": - case "indentLine": - case "insertCopyAfter": - case "insertCopyBefore": - case "insertEmptyLineAfter": - case "insertEmptyLineBefore": - case "insertEmptyLinesAround": - case "joinLines": - case "outdentLine": - case "randomizeTargets": - case "remove": - case "rename": - case "revealDefinition": - case "revealTypeDefinition": - case "reverseTargets": - case "scrollToBottom": - case "scrollToCenter": - case "scrollToTop": - case "setSelection": - case "setSelectionAfter": - case "setSelectionBefore": - case "showDebugHover": - case "showHover": - case "showQuickFix": - case "showReferences": - case "sortTargets": - case "toggleLineBreakpoint": - case "toggleLineComment": - case "unfoldRegion": - case "private.showParseTree": - case "private.getTargets": - case "callAsFunction": - case "editNew": - case "generateSnippet": - case "getText": - case "highlight": - case "moveToTarget": - case "pasteFromClipboard": - case "replaceWithTarget": - case "rewrapWithPairedDelimiter": - case "swapTargets": - case "wrapWithPairedDelimiter": - case "findInDocument": - case "private.setKeyboardTarget": - break; - - default: { - // Ensure we don't miss any new actions - const _exhaustiveCheck: never = action; - } - } -} - -function getMonthDate(date: Date): string { - return `${date.getFullYear()}-${pad(date.getMonth() + 1)}`; -} - -function getDayDate(date: Date): string { - return `${getMonthDate(date)}-${pad(date.getDate())}`; -} - -function pad(num: number): string { - return num.toString().padStart(2, "0"); -} diff --git a/packages/cursorless-engine/src/CommandHistoryAnalyzer.ts b/packages/cursorless-engine/src/CommandHistoryAnalyzer.ts deleted file mode 100644 index bf467cc25b0..00000000000 --- a/packages/cursorless-engine/src/CommandHistoryAnalyzer.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { - CommandHistoryEntry, - Modifier, - PartialPrimitiveTargetDescriptor, - ScopeType, - showWarning, -} from "@cursorless/common"; -import { groupBy, map, sum } from "lodash"; -import { asyncIteratorToList } from "./asyncIteratorToList"; -import { canonicalizeAndValidateCommand } from "./core/commandVersionUpgrades/canonicalizeAndValidateCommand"; -import { generateCommandHistoryEntries } from "./generateCommandHistoryEntries"; -import { ide } from "./singletons/ide.singleton"; -import { getPartialTargetDescriptors } from "./util/getPartialTargetDescriptors"; -import { getPartialPrimitiveTargets } from "./util/getPrimitiveTargets"; -import { getScopeType } from "./util/getScopeType"; - -/** - * Analyzes the command history for a given time period, and outputs a report - */ -class Period { - private readonly period: string; - private readonly actions: Record = {}; - private readonly modifiers: Record = {}; - private readonly scopeTypes: Record = {}; - private count: number = 0; - - constructor(period: string, entries: CommandHistoryEntry[]) { - this.period = period; - for (const entry of entries) { - this.append(entry); - } - } - - toString(): string { - return [ - `# ${this.period}`, - `Total command count: ${this.count}`, - this.serializeMap("Actions", this.actions), - this.serializeMap("Modifiers", this.modifiers), - this.serializeMap("Scope types", this.scopeTypes), - ].join("\n\n"); - } - - private serializeMap(name: string, map: Record) { - const total = sum(Object.values(map)); - const entries = Object.entries(map); - entries.sort((a, b) => b[1] - a[1]); - const entriesSerialized = entries - .map(([key, value]) => ` ${key}: ${value} (${toPercent(value / total)})`) - .join("\n"); - return `${name}:\n${entriesSerialized}`; - } - - private append(entry: CommandHistoryEntry) { - this.count++; - const command = canonicalizeAndValidateCommand(entry.command); - this.incrementAction(command.action.name); - - this.parsePrimitiveTargets( - getPartialPrimitiveTargets(getPartialTargetDescriptors(command.action)), - ); - } - - private parsePrimitiveTargets( - partialPrimitiveTargets: PartialPrimitiveTargetDescriptor[], - ) { - for (const target of partialPrimitiveTargets) { - if (target.modifiers == null) { - continue; - } - for (const modifier of target.modifiers) { - this.incrementModifier(modifier); - - const scopeType = getScopeType(modifier); - if (scopeType != null) { - this.incrementScope(scopeType); - } - } - } - } - - private incrementAction(actionName: string) { - this.actions[actionName] = (this.actions[actionName] ?? 0) + 1; - } - - private incrementModifier(modifier: Modifier) { - this.modifiers[modifier.type] = (this.modifiers[modifier.type] ?? 0) + 1; - } - - private incrementScope(scopeType: ScopeType) { - this.scopeTypes[scopeType.type] = - (this.scopeTypes[scopeType.type] ?? 0) + 1; - } -} - -function getMonth(entry: CommandHistoryEntry): string { - return entry.date.slice(0, 7); -} - -export async function analyzeCommandHistory(dir: string) { - const entries = await asyncIteratorToList(generateCommandHistoryEntries(dir)); - - if (entries.length === 0) { - const TAKE_ME_THERE = "Show me"; - const result = await showWarning( - ide().messages, - "noHistory", - "No command history entries found. Please enable the command history in the settings.", - TAKE_ME_THERE, - ); - - if (result === TAKE_ME_THERE) { - // FIXME: This is VSCode-specific - await ide().executeCommand( - "workbench.action.openSettings", - "cursorless.commandHistory", - ); - } - - return; - } - - const content = [ - new Period("Totals", entries).toString(), - - ...map(Object.entries(groupBy(entries, getMonth)), ([key, entries]) => - new Period(key, entries).toString(), - ), - ].join("\n\n\n"); - - await ide().openUntitledTextDocument({ content }); -} - -function toPercent(value: number) { - return Intl.NumberFormat(undefined, { - style: "percent", - minimumFractionDigits: 0, - maximumFractionDigits: 1, - }).format(value); -} diff --git a/packages/cursorless-engine/src/scopeProviders/ScopeRangeProvider.ts b/packages/cursorless-engine/src/ScopeVisualizer/ScopeRangeProvider.ts similarity index 97% rename from packages/cursorless-engine/src/scopeProviders/ScopeRangeProvider.ts rename to packages/cursorless-engine/src/ScopeVisualizer/ScopeRangeProvider.ts index 0e1ae1d0b85..62f39039f9f 100644 --- a/packages/cursorless-engine/src/scopeProviders/ScopeRangeProvider.ts +++ b/packages/cursorless-engine/src/ScopeVisualizer/ScopeRangeProvider.ts @@ -1,11 +1,10 @@ +import { TextEditor } from "@cursorless/common"; import { IterationScopeRangeConfig, IterationScopeRanges, ScopeRangeConfig, ScopeRanges, - TextEditor, -} from "@cursorless/common"; - +} from ".."; import { ModifierStageFactory } from "../processTargets/ModifierStageFactory"; import { ScopeHandlerFactory } from "../processTargets/modifiers/scopeHandlers/ScopeHandlerFactory"; import { getIterationRange } from "./getIterationRange"; diff --git a/packages/cursorless-engine/src/scopeProviders/ScopeRangeWatcher.ts b/packages/cursorless-engine/src/ScopeVisualizer/ScopeRangeWatcher.ts similarity index 96% rename from packages/cursorless-engine/src/scopeProviders/ScopeRangeWatcher.ts rename to packages/cursorless-engine/src/ScopeVisualizer/ScopeRangeWatcher.ts index fdc5790f32c..6a4a7971b5d 100644 --- a/packages/cursorless-engine/src/scopeProviders/ScopeRangeWatcher.ts +++ b/packages/cursorless-engine/src/ScopeVisualizer/ScopeRangeWatcher.ts @@ -1,14 +1,12 @@ +import { Disposable, showError } from "@cursorless/common"; +import { pull } from "lodash"; import { - Disposable, IterationScopeChangeEventCallback, IterationScopeRangeConfig, ScopeChangeEventCallback, ScopeRangeConfig, ScopeRanges, - showError, -} from "@cursorless/common"; -import { pull } from "lodash"; - +} from ".."; import { Debouncer } from "../core/Debouncer"; import { LanguageDefinitions } from "../languages/LanguageDefinitions"; import { ide } from "../singletons/ide.singleton"; @@ -27,11 +25,6 @@ export class ScopeRangeWatcher { languageDefinitions: LanguageDefinitions, private scopeRangeProvider: ScopeRangeProvider, ) { - this.onChange = this.onChange.bind(this); - this.onDidChangeScopeRanges = this.onDidChangeScopeRanges.bind(this); - this.onDidChangeIterationScopeRanges = - this.onDidChangeIterationScopeRanges.bind(this); - this.disposables.push( // An Event which fires when the array of visible editors has changed. ide().onDidChangeVisibleTextEditors(this.debouncer.run), @@ -44,9 +37,13 @@ export class ScopeRangeWatcher { // dirty-state changes. ide().onDidChangeTextDocument(this.debouncer.run), ide().onDidChangeTextEditorVisibleRanges(this.debouncer.run), - languageDefinitions.onDidChangeDefinition(this.onChange), + languageDefinitions.onDidChangeDefinition(this.debouncer.run), this.debouncer, ); + + this.onDidChangeScopeRanges = this.onDidChangeScopeRanges.bind(this); + this.onDidChangeIterationScopeRanges = + this.onDidChangeIterationScopeRanges.bind(this); } /** diff --git a/packages/cursorless-engine/src/scopeProviders/ScopeSupportChecker.ts b/packages/cursorless-engine/src/ScopeVisualizer/ScopeSupportChecker.ts similarity index 98% rename from packages/cursorless-engine/src/scopeProviders/ScopeSupportChecker.ts rename to packages/cursorless-engine/src/ScopeVisualizer/ScopeSupportChecker.ts index 894d3b5262a..d9ee8f16646 100644 --- a/packages/cursorless-engine/src/scopeProviders/ScopeSupportChecker.ts +++ b/packages/cursorless-engine/src/ScopeVisualizer/ScopeSupportChecker.ts @@ -1,6 +1,5 @@ import { Position, - ScopeSupport, ScopeType, SimpleScopeTypeType, TextEditor, @@ -10,6 +9,7 @@ import { LegacyLanguageId } from "../languages/LegacyLanguageId"; import { languageMatchers } from "../languages/getNodeMatcher"; import { ScopeHandlerFactory } from "../processTargets/modifiers/scopeHandlers/ScopeHandlerFactory"; import { ScopeHandler } from "../processTargets/modifiers/scopeHandlers/scopeHandler.types"; +import { ScopeSupport } from "../api/ScopeProvider"; /** * Determines the level of support for a given scope type in a given editor. diff --git a/packages/cursorless-engine/src/scopeProviders/getIterationRange.ts b/packages/cursorless-engine/src/ScopeVisualizer/getIterationRange.ts similarity index 100% rename from packages/cursorless-engine/src/scopeProviders/getIterationRange.ts rename to packages/cursorless-engine/src/ScopeVisualizer/getIterationRange.ts diff --git a/packages/cursorless-engine/src/scopeProviders/getIterationScopeRanges.ts b/packages/cursorless-engine/src/ScopeVisualizer/getIterationScopeRanges.ts similarity index 94% rename from packages/cursorless-engine/src/scopeProviders/getIterationScopeRanges.ts rename to packages/cursorless-engine/src/ScopeVisualizer/getIterationScopeRanges.ts index a28b6eb8b8e..feb42bffe9f 100644 --- a/packages/cursorless-engine/src/scopeProviders/getIterationScopeRanges.ts +++ b/packages/cursorless-engine/src/ScopeVisualizer/getIterationScopeRanges.ts @@ -1,5 +1,6 @@ -import { IterationScopeRanges, Range, TextEditor } from "@cursorless/common"; +import { Range, TextEditor } from "@cursorless/common"; import { map } from "itertools"; +import { IterationScopeRanges } from ".."; import { ModifierStage } from "../processTargets/PipelineStages.types"; import { ScopeHandler } from "../processTargets/modifiers/scopeHandlers/scopeHandler.types"; import { Target } from "../typings/target.types"; diff --git a/packages/cursorless-engine/src/scopeProviders/getScopeRanges.ts b/packages/cursorless-engine/src/ScopeVisualizer/getScopeRanges.ts similarity index 91% rename from packages/cursorless-engine/src/scopeProviders/getScopeRanges.ts rename to packages/cursorless-engine/src/ScopeVisualizer/getScopeRanges.ts index 3e36c4f7686..56e47dde503 100644 --- a/packages/cursorless-engine/src/scopeProviders/getScopeRanges.ts +++ b/packages/cursorless-engine/src/ScopeVisualizer/getScopeRanges.ts @@ -1,6 +1,6 @@ -import { Range, ScopeRanges, TextEditor } from "@cursorless/common"; +import { Range, TextEditor } from "@cursorless/common"; import { map } from "itertools"; - +import { ScopeRanges } from ".."; import { ScopeHandler } from "../processTargets/modifiers/scopeHandlers/scopeHandler.types"; import { getTargetRanges } from "./getTargetRanges"; diff --git a/packages/cursorless-engine/src/ScopeVisualizer/getTargetRanges.ts b/packages/cursorless-engine/src/ScopeVisualizer/getTargetRanges.ts new file mode 100644 index 00000000000..5fd843310cd --- /dev/null +++ b/packages/cursorless-engine/src/ScopeVisualizer/getTargetRanges.ts @@ -0,0 +1,12 @@ +import { toCharacterRange, toLineRange } from "@cursorless/common"; +import { Target } from "../typings/target.types"; +import { TargetRanges } from "../api/ScopeProvider"; + +export function getTargetRanges(target: Target): TargetRanges { + return { + contentRange: target.contentRange, + removalHighlightRange: target.isLine + ? toLineRange(target.getRemovalHighlightRange()) + : toCharacterRange(target.getRemovalHighlightRange()), + }; +} diff --git a/packages/cursorless-engine/src/actions/Actions.ts b/packages/cursorless-engine/src/actions/Actions.ts index c7722c4b6d8..5b70327b0e8 100644 --- a/packages/cursorless-engine/src/actions/Actions.ts +++ b/packages/cursorless-engine/src/actions/Actions.ts @@ -1,8 +1,6 @@ import { Snippets } from "../core/Snippets"; import { RangeUpdater } from "../core/updateSelections/RangeUpdater"; import { ModifierStageFactory } from "../processTargets/ModifierStageFactory"; -import { TreeSitter } from "../typings/TreeSitter"; -import { BreakLine } from "./BreakLine"; import { Bring, Move, Swap } from "./BringMoveSwap"; import Call from "./Call"; import Clear from "./Clear"; @@ -11,7 +9,7 @@ import Deselect from "./Deselect"; import { EditNew } from "./EditNew"; import { EditNewAfter, EditNewBefore } from "./EditNewLineAction"; import ExecuteCommand from "./ExecuteCommand"; -import { FindInDocument, FindInWorkspace } from "./Find"; +import { FindInWorkspace } from "./Find"; import FollowLink from "./FollowLink"; import GenerateSnippet from "./GenerateSnippet"; import GetTargets from "./GetTargets"; @@ -27,19 +25,17 @@ import { InsertEmptyLinesAround, } from "./InsertEmptyLines"; import InsertSnippet from "./InsertSnippet"; -import JoinLines from "./JoinLines"; import { PasteFromClipboard } from "./PasteFromClipboard"; import Remove from "./Remove"; import Replace from "./Replace"; import Rewrap from "./Rewrap"; import { ScrollToBottom, ScrollToCenter, ScrollToTop } from "./Scroll"; +import { SetInstanceReference } from "./SetInstanceReference"; import { SetSelection, SetSelectionAfter, SetSelectionBefore, } from "./SetSelection"; -import { SetSpecialTarget } from "./SetSpecialTarget"; -import ShowParseTree from "./ShowParseTree"; import { CopyToClipboard, ExtractVariable, @@ -61,14 +57,12 @@ import ToggleBreakpoint from "./ToggleBreakpoint"; import Wrap from "./Wrap"; import WrapWithSnippet from "./WrapWithSnippet"; import { ActionRecord } from "./actions.types"; -import { Decrement, Increment } from "./incrementDecrement"; /** * Keeps a map from action names to objects that implement the given action */ export class Actions implements ActionRecord { constructor( - private treeSitter: TreeSitter, private snippets: Snippets, private rangeUpdater: RangeUpdater, private modifierStageFactory: ModifierStageFactory, @@ -78,7 +72,6 @@ export class Actions implements ActionRecord { clearAndSetSelection = new Clear(this); copyToClipboard = new CopyToClipboard(this.rangeUpdater); cutToClipboard = new CutToClipboard(this); - decrement = new Decrement(this); deselect = new Deselect(); editNew = new EditNew(this.rangeUpdater, this); editNewLineAfter: EditNewAfter = new EditNewAfter( @@ -91,14 +84,12 @@ export class Actions implements ActionRecord { ); executeCommand = new ExecuteCommand(this.rangeUpdater); extractVariable = new ExtractVariable(this.rangeUpdater); - findInDocument = new FindInDocument(this); findInWorkspace = new FindInWorkspace(this); foldRegion = new Fold(this.rangeUpdater); followLink = new FollowLink(this); generateSnippet = new GenerateSnippet(); getText = new GetText(); highlight = new Highlight(); - increment = new Increment(this); indentLine = new IndentLine(this.rangeUpdater); insertCopyAfter = new InsertCopyAfter( this.rangeUpdater, @@ -117,8 +108,6 @@ export class Actions implements ActionRecord { this, this.modifierStageFactory, ); - joinLines = new JoinLines(this.rangeUpdater); - breakLine = new BreakLine(this.rangeUpdater); moveToTarget = new Move(this.rangeUpdater); outdentLine = new OutdentLine(this.rangeUpdater); pasteFromClipboard = new PasteFromClipboard(this.rangeUpdater, this); @@ -137,10 +126,7 @@ export class Actions implements ActionRecord { scrollToBottom = new ScrollToBottom(); scrollToCenter = new ScrollToCenter(); scrollToTop = new ScrollToTop(); - ["private.setKeyboardTarget"] = new SetSpecialTarget("keyboard"); - ["experimental.setInstanceReference"] = new SetSpecialTarget( - "instanceReference", - ); + ["experimental.setInstanceReference"] = new SetInstanceReference(); setSelection = new SetSelection(); setSelectionAfter = new SetSelectionAfter(); setSelectionBefore = new SetSelectionBefore(); @@ -159,6 +145,5 @@ export class Actions implements ActionRecord { this.snippets, this.modifierStageFactory, ); - ["private.showParseTree"] = new ShowParseTree(this.treeSitter); ["private.getTargets"] = new GetTargets(); } diff --git a/packages/cursorless-engine/src/actions/BreakLine.ts b/packages/cursorless-engine/src/actions/BreakLine.ts deleted file mode 100644 index 003b6715be3..00000000000 --- a/packages/cursorless-engine/src/actions/BreakLine.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { FlashStyle, Position, Range, TextEditor } from "@cursorless/common"; -import { flatten, zip } from "lodash"; -import type { RangeUpdater } from "../core/updateSelections/RangeUpdater"; -import { performEditsAndUpdateRanges } from "../core/updateSelections/updateSelections"; -import { ide } from "../singletons/ide.singleton"; -import { Edit } from "../typings/Types"; -import { Target } from "../typings/target.types"; -import { flashTargets, runOnTargetsForEachEditor } from "../util/targetUtils"; -import type { ActionReturnValue } from "./actions.types"; - -export class BreakLine { - constructor(private rangeUpdater: RangeUpdater) { - this.run = this.run.bind(this); - } - - async run(targets: Target[]): Promise { - await flashTargets(ide(), targets, FlashStyle.pendingModification0); - - const thatSelections = flatten( - await runOnTargetsForEachEditor(targets, async (editor, targets) => { - const contentRanges = targets.map(({ contentRange }) => contentRange); - const edits = getEdits(editor, contentRanges); - - const [updatedRanges] = await performEditsAndUpdateRanges( - this.rangeUpdater, - ide().getEditableTextEditor(editor), - edits, - [contentRanges], - ); - - return zip(targets, updatedRanges).map(([target, range]) => ({ - editor: target!.editor, - selection: range!.toSelection(target!.isReversed), - })); - }), - ); - - return { thatSelections }; - } -} - -function getEdits(editor: TextEditor, contentRanges: Range[]): Edit[] { - const { document } = editor; - const edits: Edit[] = []; - - for (const range of contentRanges) { - const position = range.start; - const line = document.lineAt(position); - const indentation = line.text.slice( - 0, - line.firstNonWhitespaceCharacterIndex, - ); - const characterTrailingWhitespace = line.text - .slice(0, position.character) - .search(/\s+$/); - const replacementRange = - characterTrailingWhitespace > -1 - ? new Range( - new Position(line.lineNumber, characterTrailingWhitespace), - position, - ) - : position.toEmptyRange(); - - edits.push({ - range: replacementRange, - text: "\n" + indentation, - isReplace: !replacementRange.isEmpty, - }); - } - - return edits; -} diff --git a/packages/cursorless-engine/src/actions/Find.ts b/packages/cursorless-engine/src/actions/Find.ts index e82c31ccf13..bca407a9038 100644 --- a/packages/cursorless-engine/src/actions/Find.ts +++ b/packages/cursorless-engine/src/actions/Find.ts @@ -3,9 +3,9 @@ import { ide } from "../singletons/ide.singleton"; import { Target } from "../typings/target.types"; import { ensureSingleTarget } from "../util/targetUtils"; import { Actions } from "./Actions"; -import { ActionReturnValue, SimpleAction } from "./actions.types"; +import { SimpleAction, ActionReturnValue } from "./actions.types"; -abstract class Find implements SimpleAction { +export class FindInWorkspace implements SimpleAction { constructor(private actions: Actions) { this.run = this.run.bind(this); } @@ -13,8 +13,9 @@ abstract class Find implements SimpleAction { async run(targets: Target[]): Promise { ensureSingleTarget(targets); - const { returnValue, thatTargets } = - await this.actions.getText.run(targets); + const { returnValue, thatTargets } = await this.actions.getText.run( + targets, + ); const [text] = returnValue as [string]; let query: string; @@ -29,22 +30,8 @@ abstract class Find implements SimpleAction { query = text; } - await this.find(query); + await ide().findInWorkspace(query); return { thatTargets }; } - - protected abstract find(query: string): Promise; -} - -export class FindInDocument extends Find { - protected find(query: string): Promise { - return ide().findInDocument(query); - } -} - -export class FindInWorkspace extends Find { - protected find(query: string): Promise { - return ide().findInWorkspace(query); - } } diff --git a/packages/cursorless-engine/src/actions/InsertSnippet.ts b/packages/cursorless-engine/src/actions/InsertSnippet.ts index 0ae8701c9cc..f0fb49dbc8c 100644 --- a/packages/cursorless-engine/src/actions/InsertSnippet.ts +++ b/packages/cursorless-engine/src/actions/InsertSnippet.ts @@ -67,7 +67,9 @@ export default class InsertSnippet { type: scopeTypeType, })); } else { - return snippetDescription.scopeTypes ?? []; + return snippetDescription.scopeType == null + ? [] + : [snippetDescription.scopeType]; } } diff --git a/packages/cursorless-engine/src/actions/JoinLines.ts b/packages/cursorless-engine/src/actions/JoinLines.ts deleted file mode 100644 index 8c6ec1b6e77..00000000000 --- a/packages/cursorless-engine/src/actions/JoinLines.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { FlashStyle, Range, TextEditor } from "@cursorless/common"; -import { flatten, zip } from "lodash"; -import type { RangeUpdater } from "../core/updateSelections/RangeUpdater"; -import { performEditsAndUpdateRanges } from "../core/updateSelections/updateSelections"; -import { ide } from "../singletons/ide.singleton"; -import { Edit } from "../typings/Types"; -import { Target } from "../typings/target.types"; -import { flashTargets, runOnTargetsForEachEditor } from "../util/targetUtils"; -import type { ActionReturnValue } from "./actions.types"; -import { range as iterRange, map, pairwise } from "itertools"; - -export default class JoinLines { - constructor(private rangeUpdater: RangeUpdater) { - this.run = this.run.bind(this); - } - - async run(targets: Target[]): Promise { - await flashTargets(ide(), targets, FlashStyle.pendingModification0); - - const thatSelections = flatten( - await runOnTargetsForEachEditor(targets, async (editor, targets) => { - const contentRanges = targets.map(({ contentRange }) => contentRange); - const edits = getEdits(editor, contentRanges); - - const [updatedRanges] = await performEditsAndUpdateRanges( - this.rangeUpdater, - ide().getEditableTextEditor(editor), - edits, - [contentRanges], - ); - - return zip(targets, updatedRanges).map(([target, range]) => ({ - editor: target!.editor, - selection: range!.toSelection(target!.isReversed), - })); - }), - ); - - return { thatSelections }; - } -} - -function getEdits(editor: TextEditor, contentRanges: Range[]): Edit[] { - const { document } = editor; - const edits: Edit[] = []; - - for (const range of contentRanges) { - const startLine = range.start.line; - const endLine = range.isSingleLine ? startLine + 1 : range.end.line; - - const lineIter = map(iterRange(startLine, endLine + 1), (i) => - document.lineAt(i), - ); - for (const [line1, line2] of pairwise(lineIter)) { - edits.push({ - range: new Range( - line1.range.end.line, - line1.lastNonWhitespaceCharacterIndex, - line2.range.start.line, - line2.firstNonWhitespaceCharacterIndex, - ), - text: line2.isEmptyOrWhitespace ? "" : " ", - isReplace: true, - }); - } - } - - return edits; -} diff --git a/packages/cursorless-engine/src/actions/SetSpecialTarget.ts b/packages/cursorless-engine/src/actions/SetInstanceReference.ts similarity index 54% rename from packages/cursorless-engine/src/actions/SetSpecialTarget.ts rename to packages/cursorless-engine/src/actions/SetInstanceReference.ts index a7c64cc71c6..da2617b2ae1 100644 --- a/packages/cursorless-engine/src/actions/SetSpecialTarget.ts +++ b/packages/cursorless-engine/src/actions/SetInstanceReference.ts @@ -1,18 +1,15 @@ -import { StoredTargetKey } from "@cursorless/common"; import { Target } from "../typings/target.types"; import { SimpleAction, ActionReturnValue } from "./actions.types"; -export class SetSpecialTarget implements SimpleAction { - noAutomaticTokenExpansion = true; - - constructor(private key: StoredTargetKey) { +export class SetInstanceReference implements SimpleAction { + constructor() { this.run = this.run.bind(this); } async run(targets: Target[]): Promise { return { thatTargets: targets, - [`${this.key}Targets`]: targets, + instanceReferenceTargets: targets, }; } } diff --git a/packages/cursorless-engine/src/actions/ShowParseTree.ts b/packages/cursorless-engine/src/actions/ShowParseTree.ts deleted file mode 100644 index f535f051214..00000000000 --- a/packages/cursorless-engine/src/actions/ShowParseTree.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { FlashStyle, Range, TextDocument } from "@cursorless/common"; -import * as path from "node:path"; -import type { Tree, TreeCursor } from "web-tree-sitter"; -import type { TreeSitter } from "../typings/TreeSitter"; -import { ide } from "../singletons/ide.singleton"; -import type { Target } from "../typings/target.types"; -import { flashTargets } from "../util/targetUtils"; -import type { ActionReturnValue } from "./actions.types"; - -export default class ShowParseTree { - constructor(private treeSitter: TreeSitter) { - this.run = this.run.bind(this); - } - - async run(targets: Target[]): Promise { - await flashTargets(ide(), targets, FlashStyle.referenced); - - const results: string[] = ["# Cursorless parse tree"]; - - for (const target of targets) { - const { editor, contentRange } = target; - const tree = this.treeSitter.getTree(editor.document); - results.push(parseTree(editor.document, tree, contentRange)); - } - - ide().openUntitledTextDocument({ - language: "markdown", - content: results.join("\n\n"), - }); - - return { thatTargets: targets }; - } -} - -function parseTree( - document: TextDocument, - tree: Tree, - contentRange: Range, -): string { - const resultPlayground: string[] = []; - const resultQuery: string[] = []; - - parseCursor(resultPlayground, resultQuery, contentRange, tree.walk(), 0); - - return [ - `## ${path.basename(document.uri.path)} [${contentRange}]\n`, - `\`\`\`${document.languageId}`, - document.getText(contentRange), - "```", - "", - "```scm", - ...resultQuery, - "```", - "", - "```js", - ...resultPlayground, - "```", - "", - ].join("\n"); -} - -function parseCursor( - resultPlayground: string[], - resultQuery: string[], - contentRange: Range, - cursor: TreeCursor, - numIndents: number, -): void { - while (true) { - const nodeRange = new Range( - cursor.startPosition.row, - cursor.startPosition.column, - cursor.endPosition.row, - cursor.endPosition.column, - ); - - if (contentRange.intersection(nodeRange) != null) { - const indentation = " ".repeat(numIndents); - const fieldName = getFieldName(cursor); - const prefix = indentation + fieldName; - - // Named node - if (cursor.nodeIsNamed) { - resultPlayground.push(`${prefix}${cursor.nodeType} [${nodeRange}]`); - resultQuery.push(`${prefix}(${cursor.nodeType}`); - - // Named node with children - if (cursor.gotoFirstChild()) { - parseCursor( - resultPlayground, - resultQuery, - contentRange, - cursor, - numIndents + 1, - ); - cursor.gotoParent(); - resultQuery.push(`${indentation})`); - } - // Named node without children - else { - resultQuery[resultQuery.length - 1] += ")"; - } - } - // Anonymous node - else { - const type = `"${cursor.nodeType}"`; - resultPlayground.push(`${prefix}${type} [${nodeRange}]`); - resultQuery.push(`${prefix}${type}`); - } - } - - if (!cursor.gotoNextSibling()) { - return; - } - } -} - -function getFieldName(cursor: TreeCursor): string { - const field = cursor.currentFieldName(); - return field != null ? `${field}: ` : ""; -} diff --git a/packages/cursorless-engine/src/actions/actions.types.ts b/packages/cursorless-engine/src/actions/actions.types.ts index 8ded7fe1e31..560c3bdb354 100644 --- a/packages/cursorless-engine/src/actions/actions.types.ts +++ b/packages/cursorless-engine/src/actions/actions.types.ts @@ -52,11 +52,6 @@ export interface ActionReturnValue { * to determine either the range for "every", or the start point for "next" */ instanceReferenceTargets?: Target[]; - - /** - * A list of targets that become the active keybaord targets - */ - keyboardTargets?: Target[]; } export interface SimpleAction { @@ -67,13 +62,6 @@ export interface SimpleAction { * @param args Extra args to command */ getFinalStages?(): ModifierStage[]; - - /** - * If `true`, don't perform automatic token expansion for " this" with - * empty cursor. Used for actions like `setImplicitTarget` that are just - * loading up the pipeline. - */ - noAutomaticTokenExpansion?: boolean; } /** diff --git a/packages/cursorless-engine/src/actions/incrementDecrement.ts b/packages/cursorless-engine/src/actions/incrementDecrement.ts deleted file mode 100644 index cbf9a656bbd..00000000000 --- a/packages/cursorless-engine/src/actions/incrementDecrement.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { Range, TextEditor } from "@cursorless/common"; -import { PlainTarget } from "../processTargets/targets"; -import { SelectionWithEditor } from "../typings/Types"; -import { Destination, Target } from "../typings/target.types"; -import { MatchedText, matchText } from "../util/regex"; -import { runForEachEditor } from "../util/targetUtils"; -import { Actions } from "./Actions"; -import { ActionReturnValue } from "./actions.types"; - -const REGEX = /-?\d+(\.\d+)?/g; - -class IncrementDecrement { - constructor( - private actions: Actions, - private isIncrement: boolean, - ) { - this.run = this.run.bind(this); - } - - async run(targets: Target[]): Promise { - const thatSelections: SelectionWithEditor[] = []; - - await runForEachEditor( - targets, - (target) => target.editor, - async (editor, targets) => { - const selections = await this.runOnEditor(editor, targets); - thatSelections.push(...selections); - }, - ); - - return { thatSelections }; - } - - private async runOnEditor( - editor: TextEditor, - targets: Target[], - ): Promise { - const { document } = editor; - const destinations: Destination[] = []; - const replaceWith: string[] = []; - - for (const target of targets) { - const offset = document.offsetAt(target.contentRange.start); - const text = target.contentText; - const matches = matchText(text, REGEX); - - for (const match of matches) { - destinations.push(createDestination(editor, offset, match)); - replaceWith.push(updateNumber(this.isIncrement, match.text)); - } - } - - const { thatSelections } = await this.actions.replace.run( - destinations, - replaceWith, - ); - - return thatSelections!; - } -} - -export class Increment extends IncrementDecrement { - constructor(actions: Actions) { - super(actions, true); - } -} - -export class Decrement extends IncrementDecrement { - constructor(actions: Actions) { - super(actions, false); - } -} - -function createDestination( - editor: TextEditor, - offset: number, - match: MatchedText, -): Destination { - const target = new PlainTarget({ - editor, - isReversed: false, - contentRange: new Range( - editor.document.positionAt(offset + match.index), - editor.document.positionAt(offset + match.index + match.text.length), - ), - }); - return target.toDestination("to"); -} - -function updateNumber(isIncrement: boolean, text: string): string { - return text.includes(".") - ? updateFloat(isIncrement, text).toString() - : updateInteger(isIncrement, text).toString(); -} - -function updateInteger(isIncrement: boolean, text: string): number { - const original = parseInt(text); - const diff = 1; - return original + (isIncrement ? diff : -diff); -} - -function updateFloat(isIncrement: boolean, text: string): number { - const original = parseFloat(text); - const isPercentage = Math.abs(original) <= 1.0; - const diff = isPercentage ? 0.1 : 1; - const updated = original + (isIncrement ? diff : -diff); - // Remove precision problems that would add a lot of extra digits - return parseFloat(updated.toPrecision(15)) / 1; -} diff --git a/packages/cursorless-engine/src/api/CursorlessEngineApi.ts b/packages/cursorless-engine/src/api/CursorlessEngineApi.ts index 331d535a759..4dd323bf279 100644 --- a/packages/cursorless-engine/src/api/CursorlessEngineApi.ts +++ b/packages/cursorless-engine/src/api/CursorlessEngineApi.ts @@ -1,32 +1,18 @@ import { Command, HatTokenMap, IDE } from "@cursorless/common"; import { Snippets } from "../core/Snippets"; import { StoredTargetMap } from "../core/StoredTargets"; -import { ScopeProvider } from "@cursorless/common"; -import { CommandRunner } from "../CommandRunner"; -import { ReadOnlyHatMap } from "@cursorless/common"; +import { TestCaseRecorder } from "../testCaseRecorder/TestCaseRecorder"; +import { ScopeProvider } from "./ScopeProvider"; export interface CursorlessEngine { commandApi: CommandApi; scopeProvider: ScopeProvider; - customSpokenFormGenerator: CustomSpokenFormGenerator; + testCaseRecorder: TestCaseRecorder; storedTargets: StoredTargetMap; hatTokenMap: HatTokenMap; snippets: Snippets; injectIde: (ide: IDE | undefined) => void; runIntegrationTests: () => Promise; - addCommandRunnerDecorator: ( - commandRunnerDecorator: CommandRunnerDecorator, - ) => void; -} - -export interface CustomSpokenFormGenerator { - /** - * If `true`, indicates they need to update their Talon files to get the - * machinery used to share spoken forms from Talon to the VSCode extension. - */ - readonly needsInitialTalonUpdate: boolean | undefined; - - onDidChangeCustomSpokenForms: (listener: () => void) => void; } export interface CommandApi { @@ -42,16 +28,3 @@ export interface CommandApi { */ runCommandSafe(...args: unknown[]): Promise; } - -export interface CommandRunnerDecorator { - /** - * @param commandRunner: A CommandRunner. - * @param readableHatMap: A ReadOnlyHatMap. - * @returns A new CommandRunner that invokes the provided CommandRunner in - * addition to performing some other work. - */ - wrapCommandRunner: ( - readableHatMap: ReadOnlyHatMap, - commandRunner: CommandRunner, - ) => CommandRunner; -} diff --git a/packages/common/src/types/ScopeProvider.ts b/packages/cursorless-engine/src/api/ScopeProvider.ts similarity index 66% rename from packages/common/src/types/ScopeProvider.ts rename to packages/cursorless-engine/src/api/ScopeProvider.ts index 0c0cd7335ae..40d4bd6916d 100644 --- a/packages/common/src/types/ScopeProvider.ts +++ b/packages/cursorless-engine/src/api/ScopeProvider.ts @@ -3,9 +3,8 @@ import { GeneralizedRange, Range, ScopeType, - SpokenForm, TextEditor, -} from ".."; +} from "@cursorless/common"; export interface ScopeProvider { /** @@ -18,7 +17,6 @@ export interface ScopeProvider { editor: TextEditor, config: ScopeRangeConfig, ) => ScopeRanges[]; - /** * Get the iteration scope ranges for the given editor. * @param editor The editor @@ -77,41 +75,6 @@ export interface ScopeProvider { editor: TextEditor, scopeType: ScopeType, ) => ScopeSupport; - - /** - * Registers a callback to be run when the scope support changes for the active - * editor. The callback will be run immediately once with the current support - * levels for the active editor. - * - * Note that this watcher could be expensive, because it runs all the scope - * handlers for the active editor every time the content of the active editor - * changes. If you only need info about the available scopes, including their - * spoken forms, you should use {@link onDidChangeScopeInfo} instead. - * @param callback The callback to run when the scope support changes - * @returns A {@link Disposable} which will stop the callback from running - */ - onDidChangeScopeSupport: (callback: ScopeSupportEventCallback) => Disposable; - - /** - * Registers a callback to be run when the scope info changes. The callback - * will be run immediately once with the current scope info. - * - * Includes information about the available scopes, including their custom - * spoken forms, if available. Note that even custom regex scopes will be - * available, as reported to the engine by Talon. - * @param callback The callback to run when the scope support changes - * @returns A {@link Disposable} which will stop the callback from running - */ - onDidChangeScopeInfo(callback: ScopeTypeInfoEventCallback): Disposable; - - /** - * Get info about {@link scopeType}, including its custom spoken form, if - * available. - * @param editor The editor to check - * @param scopeType The scope type to check - * @returns Info about {@link scopeType} - */ - getScopeInfo: (scopeType: ScopeType) => ScopeTypeInfo; } interface ScopeRangeConfigBase { @@ -145,24 +108,6 @@ export type IterationScopeChangeEventCallback = ( scopeRanges: IterationScopeRanges[], ) => void; -export interface ScopeSupportInfo extends ScopeTypeInfo { - support: ScopeSupport; - iterationScopeSupport: ScopeSupport; -} - -export type ScopeSupportEventCallback = ( - scopeSupportInfos: ScopeSupportInfo[], -) => void; - -export interface ScopeTypeInfo { - scopeType: ScopeType; - spokenForm: SpokenForm; - humanReadableName: string; - isLanguageSpecific: boolean; -} - -export type ScopeTypeInfoEventCallback = (scopeInfos: ScopeTypeInfo[]) => void; - /** * Contains the ranges that define a given scope, eg its {@link domain} and the * ranges for its {@link targets}. @@ -178,13 +123,7 @@ export interface ScopeRanges { */ export interface TargetRanges { contentRange: Range; - removalRange: Range; removalHighlightRange: GeneralizedRange; - leadingDelimiter: TargetRanges | undefined; - trailingDelimiter: TargetRanges | undefined; - interior: TargetRanges[] | undefined; - boundary: TargetRanges[] | undefined; - insertionDelimiter: string; } /** diff --git a/packages/cursorless-engine/src/asyncIteratorToList.ts b/packages/cursorless-engine/src/asyncIteratorToList.ts deleted file mode 100644 index 7e8d0a5e563..00000000000 --- a/packages/cursorless-engine/src/asyncIteratorToList.ts +++ /dev/null @@ -1,9 +0,0 @@ -export async function asyncIteratorToList( - iterator: AsyncIterable, -): Promise { - const list: T[] = []; - for await (const item of iterator) { - list.push(item); - } - return list; -} diff --git a/packages/cursorless-engine/src/core/Cheatsheet.ts b/packages/cursorless-engine/src/core/Cheatsheet.ts index 5cfd18fa484..5a015c96d49 100644 --- a/packages/cursorless-engine/src/core/Cheatsheet.ts +++ b/packages/cursorless-engine/src/core/Cheatsheet.ts @@ -1,10 +1,9 @@ import { readFile, writeFile } from "fs/promises"; -import { parse } from "node-html-parser"; +import parse from "node-html-parser"; +import path = require("path"); import produce from "immer"; import { sortBy } from "lodash"; import { ide } from "../singletons/ide.singleton"; -import path from "path"; -import { getCursorlessRepoRoot } from "@cursorless/common"; /** * The argument expected by the cheatsheet command. @@ -57,9 +56,27 @@ export async function showCheatsheet({ * @param spokenFormInfo The new value to use for default spoken forms. */ export async function updateDefaults(spokenFormInfo: CheatsheetInfo) { + const { runMode, assetsRoot, workspaceFolders } = ide(); + + const workspacePath = + runMode === "development" + ? assetsRoot + : workspaceFolders?.[0].uri.path ?? null; + + if (workspacePath == null) { + throw new Error( + "Please update defaults from Cursorless workspace or running in debug", + ); + } + const defaultsPath = path.join( - getCursorlessRepoRoot(), - "packages/cheatsheet/src/lib/sampleSpokenFormInfos/defaults.json", + workspacePath, + "packages", + "cheatsheet", + "src", + "lib", + "sampleSpokenFormInfos", + "defaults.json", ); const outputObject = produce(spokenFormInfo, (draft) => { @@ -69,7 +86,7 @@ export async function updateDefaults(spokenFormInfo: CheatsheetInfo) { }); }); - await writeFile(defaultsPath, JSON.stringify(outputObject, null, 2) + "\n"); + await writeFile(defaultsPath, JSON.stringify(outputObject, null, "\t")); } // FIXME: Stop duplicating these types once we have #945 diff --git a/packages/cursorless-engine/src/core/Debouncer.ts b/packages/cursorless-engine/src/core/Debouncer.ts index 2510ef315ca..48c498839c6 100644 --- a/packages/cursorless-engine/src/core/Debouncer.ts +++ b/packages/cursorless-engine/src/core/Debouncer.ts @@ -10,7 +10,6 @@ export class Debouncer { constructor( /** The callback to debounce */ private callback: () => void, - private debounceDelayMs?: number, ) { this.run = this.run.bind(this); } @@ -20,9 +19,9 @@ export class Debouncer { clearTimeout(this.timeoutHandle); } - const decorationDebounceDelayMs = - this.debounceDelayMs ?? - ide().configuration.getOwnConfiguration("decorationDebounceDelayMs"); + const decorationDebounceDelayMs = ide().configuration.getOwnConfiguration( + "decorationDebounceDelayMs", + ); this.timeoutHandle = setTimeout(() => { this.callback(); diff --git a/packages/cursorless-engine/src/core/StoredTargets.ts b/packages/cursorless-engine/src/core/StoredTargets.ts index 487aac1e1ca..bc6763c0ea2 100644 --- a/packages/cursorless-engine/src/core/StoredTargets.ts +++ b/packages/cursorless-engine/src/core/StoredTargets.ts @@ -1,6 +1,6 @@ -import { Notifier } from "@cursorless/common"; import { Target } from "../typings/target.types"; -import { StoredTargetKey, storedTargetKeys } from "@cursorless/common"; + +export type StoredTargetKey = "that" | "source" | "instanceReference"; /** * Used to store targets between commands. This is used by marks like `that` @@ -8,24 +8,12 @@ import { StoredTargetKey, storedTargetKeys } from "@cursorless/common"; */ export class StoredTargetMap { private targetMap: Map = new Map(); - private notifier = new Notifier<[StoredTargetKey, Target[] | undefined]>(); set(key: StoredTargetKey, targets: Target[] | undefined) { this.targetMap.set(key, targets); - this.notifier.notifyListeners(key, targets); } get(key: StoredTargetKey) { return this.targetMap.get(key); } - - onStoredTargets( - callback: (key: StoredTargetKey, targets: Target[] | undefined) => void, - ) { - for (const key of storedTargetKeys) { - callback(key, this.get(key)); - } - - return this.notifier.registerListener(callback); - } } diff --git a/packages/cursorless-engine/src/core/commandRunner/CommandRunnerImpl.ts b/packages/cursorless-engine/src/core/commandRunner/CommandRunnerImpl.ts index 277eeaff812..90a7ce9a0b9 100644 --- a/packages/cursorless-engine/src/core/commandRunner/CommandRunnerImpl.ts +++ b/packages/cursorless-engine/src/core/commandRunner/CommandRunnerImpl.ts @@ -18,7 +18,6 @@ import { selectionToStoredTarget } from "./selectionToStoredTarget"; export class CommandRunnerImpl implements CommandRunner { private inferenceContext: InferenceContext; private finalStages: ModifierStage[] = []; - private noAutomaticTokenExpansion: boolean | undefined; constructor( private debug: Debug, @@ -54,7 +53,6 @@ export class CommandRunnerImpl implements CommandRunner { sourceSelections: newSourceSelections, sourceTargets: newSourceTargets, instanceReferenceTargets: newInstanceReferenceTargets, - keyboardTargets: newKeyboardTargets, } = await this.runAction(action); this.storedTargets.set( @@ -66,7 +64,6 @@ export class CommandRunnerImpl implements CommandRunner { constructStoredTarget(newSourceTargets, newSourceSelections), ); this.storedTargets.set("instanceReference", newInstanceReferenceTargets); - this.storedTargets.set("keyboard", newKeyboardTargets); return returnValue; } @@ -182,8 +179,6 @@ export class CommandRunnerImpl implements CommandRunner { default: { const action = this.actions[actionDescriptor.name]; this.finalStages = action.getFinalStages?.() ?? []; - this.noAutomaticTokenExpansion = - action.noAutomaticTokenExpansion ?? false; return action.run(this.getTargets(actionDescriptor.target)); } } @@ -196,10 +191,7 @@ export class CommandRunnerImpl implements CommandRunner { partialTargetsDescriptor, ); - return this.pipelineRunner.run(targetDescriptor, { - actionFinalStages: this.finalStages, - noAutomaticTokenExpansion: this.noAutomaticTokenExpansion, - }); + return this.pipelineRunner.run(targetDescriptor, this.finalStages); } private getDestinations( diff --git a/packages/cursorless-engine/src/core/commandVersionUpgrades/upgradeV1ToV2/upgradeStrictHere.ts b/packages/cursorless-engine/src/core/commandVersionUpgrades/upgradeV1ToV2/upgradeStrictHere.ts index af874b49983..40a5e7c8c1b 100644 --- a/packages/cursorless-engine/src/core/commandVersionUpgrades/upgradeV1ToV2/upgradeStrictHere.ts +++ b/packages/cursorless-engine/src/core/commandVersionUpgrades/upgradeV1ToV2/upgradeStrictHere.ts @@ -1,4 +1,4 @@ -import { isEqual } from "lodash"; +import { isDeepStrictEqual } from "util"; import { PartialPrimitiveTargetDescriptorV2 } from "@cursorless/common"; const STRICT_HERE = { @@ -16,4 +16,4 @@ const IMPLICIT_TARGET: PartialPrimitiveTargetDescriptorV2 = { export const upgradeStrictHere = ( target: PartialPrimitiveTargetDescriptorV2, ): PartialPrimitiveTargetDescriptorV2 => - isEqual(target, STRICT_HERE) ? IMPLICIT_TARGET : target; + isDeepStrictEqual(target, STRICT_HERE) ? IMPLICIT_TARGET : target; diff --git a/packages/cursorless-engine/src/core/mergeSnippets.test.ts b/packages/cursorless-engine/src/core/mergeSnippets.test.ts index c384bf6c0fe..bd4e4579c77 100644 --- a/packages/cursorless-engine/src/core/mergeSnippets.test.ts +++ b/packages/cursorless-engine/src/core/mergeSnippets.test.ts @@ -1,6 +1,6 @@ import { SnippetMap } from "@cursorless/common"; import { mergeSnippets } from "./mergeSnippets"; -import assert from "assert"; +import assert = require("assert"); interface TestCase { name: string; diff --git a/packages/cursorless-engine/src/core/updateSelections/updateSelections.ts b/packages/cursorless-engine/src/core/updateSelections/updateSelections.ts index c2dded43e2c..c7f8c5246c9 100644 --- a/packages/cursorless-engine/src/core/updateSelections/updateSelections.ts +++ b/packages/cursorless-engine/src/core/updateSelections/updateSelections.ts @@ -330,7 +330,7 @@ async function performEditsAndUpdateInternal( return selectionInfosToSelections(selectionInfoMatrix); } -// FIXME: Remove this function if we don't end up using it for the next couple use cases, eg `that` mark and cursor history +// TODO: Remove this function if we don't end up using it for the next couple use cases, eg `that` mark and cursor history export async function performEditsAndUpdateSelectionInfos( rangeUpdater: RangeUpdater, editor: EditableTextEditor, diff --git a/packages/cursorless-engine/src/cursorlessEngine.ts b/packages/cursorless-engine/src/cursorlessEngine.ts index cee5a2aa85d..ab0c96b4957 100644 --- a/packages/cursorless-engine/src/cursorlessEngine.ts +++ b/packages/cursorless-engine/src/cursorlessEngine.ts @@ -4,32 +4,24 @@ import { FileSystem, Hats, IDE, - ScopeProvider, } from "@cursorless/common"; -import { StoredTargetMap } from "./core/StoredTargets"; -import { TreeSitter } from "./typings/TreeSitter"; -import { - CommandRunnerDecorator, - CursorlessEngine, -} from "./api/CursorlessEngineApi"; +import { StoredTargetMap, TestCaseRecorder, TreeSitter } from "."; +import { CursorlessEngine } from "./api/CursorlessEngineApi"; +import { ScopeProvider } from "./api/ScopeProvider"; +import { ScopeRangeProvider } from "./ScopeVisualizer/ScopeRangeProvider"; +import { ScopeSupportChecker } from "./ScopeVisualizer/ScopeSupportChecker"; import { Debug } from "./core/Debug"; import { HatTokenMapImpl } from "./core/HatTokenMapImpl"; import { Snippets } from "./core/Snippets"; import { ensureCommandShape } from "./core/commandVersionUpgrades/ensureCommandShape"; import { RangeUpdater } from "./core/updateSelections/RangeUpdater"; -import { CustomSpokenFormGeneratorImpl } from "./generateSpokenForm/CustomSpokenFormGeneratorImpl"; import { LanguageDefinitions } from "./languages/LanguageDefinitions"; import { ModifierStageFactoryImpl } from "./processTargets/ModifierStageFactoryImpl"; import { ScopeHandlerFactoryImpl } from "./processTargets/modifiers/scopeHandlers"; import { runCommand } from "./runCommand"; import { runIntegrationTests } from "./runIntegrationTests"; -import { ScopeInfoProvider } from "./scopeProviders/ScopeInfoProvider"; -import { ScopeRangeProvider } from "./scopeProviders/ScopeRangeProvider"; -import { ScopeRangeWatcher } from "./scopeProviders/ScopeRangeWatcher"; -import { ScopeSupportChecker } from "./scopeProviders/ScopeSupportChecker"; -import { ScopeSupportWatcher } from "./scopeProviders/ScopeSupportWatcher"; -import { TalonSpokenFormsJsonReader } from "./nodeCommon/TalonSpokenFormsJsonReader"; import { injectIde } from "./singletons/ide.singleton"; +import { ScopeRangeWatcher } from "./ScopeVisualizer/ScopeRangeWatcher"; export function createCursorlessEngine( treeSitter: TreeSitter, @@ -57,70 +49,54 @@ export function createCursorlessEngine( const storedTargets = new StoredTargetMap(); - const languageDefinitions = new LanguageDefinitions(fileSystem, treeSitter); - - const talonSpokenForms = new TalonSpokenFormsJsonReader(fileSystem); + const testCaseRecorder = new TestCaseRecorder(hatTokenMap, storedTargets); - const customSpokenFormGenerator = new CustomSpokenFormGeneratorImpl( - talonSpokenForms, - ); + const languageDefinitions = new LanguageDefinitions(fileSystem, treeSitter); ide.disposeOnExit(rangeUpdater, languageDefinitions, hatTokenMap, debug); - const commandRunnerDecorators: CommandRunnerDecorator[] = []; - return { commandApi: { runCommand(command: Command) { return runCommand( - treeSitter, debug, hatTokenMap, + testCaseRecorder, snippets, storedTargets, languageDefinitions, rangeUpdater, - commandRunnerDecorators, command, ); }, runCommandSafe(...args: unknown[]) { return runCommand( - treeSitter, debug, hatTokenMap, + testCaseRecorder, snippets, storedTargets, languageDefinitions, rangeUpdater, - commandRunnerDecorators, ensureCommandShape(args), ); }, }, - scopeProvider: createScopeProvider( - languageDefinitions, - storedTargets, - customSpokenFormGenerator, - ), - customSpokenFormGenerator, + scopeProvider: createScopeProvider(languageDefinitions, storedTargets), + testCaseRecorder, storedTargets, hatTokenMap, snippets, injectIde, runIntegrationTests: () => runIntegrationTests(treeSitter, languageDefinitions), - addCommandRunnerDecorator: (decorator: CommandRunnerDecorator) => { - commandRunnerDecorators.push(decorator); - }, }; } function createScopeProvider( languageDefinitions: LanguageDefinitions, storedTargets: StoredTargetMap, - customSpokenFormGenerator: CustomSpokenFormGeneratorImpl, ): ScopeProvider { const scopeHandlerFactory = new ScopeHandlerFactoryImpl(languageDefinitions); @@ -138,12 +114,6 @@ function createScopeProvider( rangeProvider, ); const supportChecker = new ScopeSupportChecker(scopeHandlerFactory); - const infoProvider = new ScopeInfoProvider(customSpokenFormGenerator); - const supportWatcher = new ScopeSupportWatcher( - languageDefinitions, - supportChecker, - infoProvider, - ); return { provideScopeRanges: rangeProvider.provideScopeRanges, @@ -153,8 +123,5 @@ function createScopeProvider( rangeWatcher.onDidChangeIterationScopeRanges, getScopeSupport: supportChecker.getScopeSupport, getIterationScopeSupport: supportChecker.getIterationScopeSupport, - onDidChangeScopeSupport: supportWatcher.onDidChangeScopeSupport, - getScopeInfo: infoProvider.getScopeTypeInfo, - onDidChangeScopeInfo: infoProvider.onDidChangeScopeInfo, }; } diff --git a/packages/cursorless-engine/src/generateCommandHistoryEntries.ts b/packages/cursorless-engine/src/generateCommandHistoryEntries.ts deleted file mode 100644 index 9794b0d2c60..00000000000 --- a/packages/cursorless-engine/src/generateCommandHistoryEntries.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { CommandHistoryEntry } from "@cursorless/common"; -import globRaw from "glob"; -import { readFile } from "node:fs/promises"; -import path from "node:path"; -import { promisify } from "node:util"; - -export async function* generateCommandHistoryEntries(dir: string) { - const files = await glob("*.jsonl", { cwd: dir }); - - for (const file of files) { - const filePath = path.join(dir, file); - const content = await readFile(filePath, "utf8"); - const lines = content.split("\n"); - - for (const line of lines) { - if (line.length === 0) { - continue; - } - - yield JSON.parse(line) as CommandHistoryEntry; - } - } -} - -const glob = promisify(globRaw); diff --git a/packages/cursorless-engine/src/generateSpokenForm/CustomSpokenFormGeneratorImpl.test.ts b/packages/cursorless-engine/src/generateSpokenForm/CustomSpokenFormGeneratorImpl.test.ts deleted file mode 100644 index bdfd6b09543..00000000000 --- a/packages/cursorless-engine/src/generateSpokenForm/CustomSpokenFormGeneratorImpl.test.ts +++ /dev/null @@ -1,35 +0,0 @@ -import assert from "node:assert"; -import { CustomSpokenFormGeneratorImpl } from "./CustomSpokenFormGeneratorImpl"; -import { asyncSafety } from "@cursorless/common"; - -suite("CustomSpokenFormGeneratorImpl", async function () { - test( - "glyph", - asyncSafety(async () => { - const generator = new CustomSpokenFormGeneratorImpl({ - async getSpokenFormEntries() { - return [ - { - type: "complexScopeTypeType", - id: "glyph", - spokenForms: ["foo"], - }, - ]; - }, - onDidChange: () => ({ dispose() {} }), - }); - - await generator.customSpokenFormsInitialized; - - const spokenForm = generator.scopeTypeToSpokenForm({ - type: "glyph", - character: "a", - }); - - assert.deepStrictEqual(spokenForm, { - type: "success", - spokenForms: ["foo air"], - }); - }), - ); -}); diff --git a/packages/cursorless-engine/src/generateSpokenForm/CustomSpokenFormGeneratorImpl.ts b/packages/cursorless-engine/src/generateSpokenForm/CustomSpokenFormGeneratorImpl.ts deleted file mode 100644 index a572d12b83d..00000000000 --- a/packages/cursorless-engine/src/generateSpokenForm/CustomSpokenFormGeneratorImpl.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { - CommandComplete, - Disposable, - Listener, - ScopeType, -} from "@cursorless/common"; -import { SpokenFormGenerator } from "./generateSpokenForm"; -import { CustomSpokenFormGenerator } from "../api/CursorlessEngineApi"; -import { CustomSpokenForms } from "../spokenForms/CustomSpokenForms"; -import { TalonSpokenForms } from "../scopeProviders/TalonSpokenForms"; - -/** - * Simple facade that combines the {@link CustomSpokenForms} and - * {@link SpokenFormGenerator} classes. Its main purpose is to reconstruct the - * {@link SpokenFormGenerator} when the {@link CustomSpokenForms} change. - */ -export class CustomSpokenFormGeneratorImpl - implements CustomSpokenFormGenerator -{ - private customSpokenForms: CustomSpokenForms; - private spokenFormGenerator: SpokenFormGenerator; - private disposable: Disposable; - - /** - * A promise that resolves when the custom spoken forms have been loaded. - */ - public readonly customSpokenFormsInitialized: Promise; - - constructor(talonSpokenForms: TalonSpokenForms) { - this.customSpokenForms = new CustomSpokenForms(talonSpokenForms); - this.customSpokenFormsInitialized = - this.customSpokenForms.customSpokenFormsInitialized; - this.spokenFormGenerator = new SpokenFormGenerator( - this.customSpokenForms.spokenFormMap, - ); - this.disposable = this.customSpokenForms.onDidChangeCustomSpokenForms( - () => { - this.spokenFormGenerator = new SpokenFormGenerator( - this.customSpokenForms.spokenFormMap, - ); - }, - ); - } - - onDidChangeCustomSpokenForms(listener: Listener<[]>) { - return this.customSpokenForms.onDidChangeCustomSpokenForms(listener); - } - - commandToSpokenForm(command: CommandComplete) { - return this.spokenFormGenerator.processCommand(command); - } - - scopeTypeToSpokenForm(scopeType: ScopeType) { - return this.spokenFormGenerator.processScopeType(scopeType); - } - - getCustomRegexScopeTypes() { - return this.customSpokenForms.getCustomRegexScopeTypes(); - } - - get needsInitialTalonUpdate() { - return this.customSpokenForms.needsInitialTalonUpdate; - } - - dispose() { - this.disposable.dispose(); - } -} diff --git a/packages/cursorless-engine/src/generateSpokenForm/NoSpokenFormError.ts b/packages/cursorless-engine/src/generateSpokenForm/NoSpokenFormError.ts index 0f2b86f3325..d7d00eaad81 100644 --- a/packages/cursorless-engine/src/generateSpokenForm/NoSpokenFormError.ts +++ b/packages/cursorless-engine/src/generateSpokenForm/NoSpokenFormError.ts @@ -1,9 +1,5 @@ export class NoSpokenFormError extends Error { - constructor( - public reason: string, - public requiresTalonUpdate: boolean = false, - public isPrivate: boolean = false, - ) { + constructor(public reason: string) { super(`No spoken form for: ${reason}`); } } diff --git a/packages/cursorless-engine/src/generateSpokenForm/SpokenFormComponent.ts b/packages/cursorless-engine/src/generateSpokenForm/SpokenFormComponent.ts deleted file mode 100644 index 526385a5fa1..00000000000 --- a/packages/cursorless-engine/src/generateSpokenForm/SpokenFormComponent.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { SpokenFormMapEntry } from "../spokenForms/SpokenFormMap"; -import { - SpokenFormMapKeyTypes, - SpokenFormType, -} from "../spokenForms/SpokenFormType"; - -/** - * A component of a spoken form used internally during spoken form generation. - * This is a recursive type, so it can contain other spoken form components. - * During the final step of spoken form generation, it is flattened. - * - * FIXME: In the future, we want to replace `string` with something like - * `LiteralSpokenFormComponent` and `SpokenFormComponent[]` with something like - * `SequenceSpokenFormComponent`. We'd also like to avoid throwing - * `NoSpokenFormError` and instead return a `SpokenFormComponent` that - * represents an error. This would allow us to localize errors and still render - * the remainder of the spoken form component. - */ -export type SpokenFormComponent = - | CustomizableSpokenFormComponent - | string - | SpokenFormComponent[]; - -export interface CustomizableSpokenFormComponentForType< - T extends SpokenFormType, -> { - type: "customizable"; - spokenForms: SpokenFormMapEntry; - spokenFormType: T; - id: SpokenFormMapKeyTypes[T]; -} - -/** - * A customizable spoken form component. This is a spoken form component that - * can be customized by the user. It is used internally during spoken form - * generation. - */ -export type CustomizableSpokenFormComponent = { - [K in SpokenFormType]: CustomizableSpokenFormComponentForType; -}[SpokenFormType]; diff --git a/packages/cursorless-engine/src/generateSpokenForm/defaultSpokenForms/actions.ts b/packages/cursorless-engine/src/generateSpokenForm/defaultSpokenForms/actions.ts index 04a72fd1d0c..e1009625d0b 100644 --- a/packages/cursorless-engine/src/generateSpokenForm/defaultSpokenForms/actions.ts +++ b/packages/cursorless-engine/src/generateSpokenForm/defaultSpokenForms/actions.ts @@ -5,7 +5,6 @@ import { ActionType } from "@cursorless/common"; * if the action has no spoken form. */ export const actions = { - breakLine: "break", scrollToBottom: "bottom", toggleLineBreakpoint: "break point", cutToClipboard: "carve", @@ -28,8 +27,6 @@ export const actions = { deselect: "give", highlight: "highlight", showHover: "hover", - increment: "increment", - decrement: "decrement", indentLine: "indent", showDebugHover: "inspect", setSelectionAfter: "post", @@ -40,7 +37,6 @@ export const actions = { showReferences: "reference", rename: "rename", reverseTargets: "reverse", - findInDocument: "scout", findInWorkspace: "scout all", randomizeTargets: "shuffle", generateSnippet: "snippet make", @@ -57,9 +53,7 @@ export const actions = { rewrapWithPairedDelimiter: "repack", insertSnippet: "snippet", pasteFromClipboard: "paste", - joinLines: "join", - ["private.showParseTree"]: "parse tree", ["experimental.setInstanceReference"]: "from", editNew: null, @@ -67,10 +61,10 @@ export const actions = { getText: null, replace: null, ["private.getTargets"]: null, - ["private.setKeyboardTarget"]: null, // These actions are implemented talon-side, usually using `getText` followed // by some other action. // applyFormatter: "format", + // findInDocument: "scout", // nextHomophone: "phones", } as const satisfies Record; diff --git a/packages/cursorless-engine/src/generateSpokenForm/defaultSpokenForms/marks.ts b/packages/cursorless-engine/src/generateSpokenForm/defaultSpokenForms/marks.ts index bebec623305..386933e7eb2 100644 --- a/packages/cursorless-engine/src/generateSpokenForm/defaultSpokenForms/marks.ts +++ b/packages/cursorless-engine/src/generateSpokenForm/defaultSpokenForms/marks.ts @@ -35,7 +35,6 @@ export const marks = { source: "source", nothing: "nothing", - keyboard: null, explicit: null, decoratedSymbol: null, lineNumber: null, diff --git a/packages/cursorless-engine/src/generateSpokenForm/defaultSpokenForms/modifiers.ts b/packages/cursorless-engine/src/generateSpokenForm/defaultSpokenForms/modifiers.ts index d2ea3f9f316..88852cc14cf 100644 --- a/packages/cursorless-engine/src/generateSpokenForm/defaultSpokenForms/modifiers.ts +++ b/packages/cursorless-engine/src/generateSpokenForm/defaultSpokenForms/modifiers.ts @@ -1,21 +1,184 @@ -import { CompositeKeyMap } from "@cursorless/common"; -import { SpeakableSurroundingPairName } from "../../spokenForms/SpokenFormType"; -import { SpokenFormComponentMap } from "../getSpokenFormComponentMap"; -import { CustomizableSpokenFormComponentForType } from "../SpokenFormComponent"; -import { surroundingPairsDelimiters } from "./surroundingPairsDelimiters"; +import { + ModifierType, + SimpleScopeTypeType, + SurroundingPairName, + CompositeKeyMap, +} from "@cursorless/common"; +export const modifiers = { + excludeInterior: "bounds", + toRawSelection: "just", + leading: "leading", + trailing: "trailing", + keepContentFilter: "content", + keepEmptyFilter: "empty", + inferPreviousMark: "its", + startOf: "start of", + endOf: "end of", + interiorOnly: "inside", + extendThroughStartOf: "head", + extendThroughEndOf: "tail", + everyScope: "every", + + containingScope: null, + ordinalScope: null, + relativeScope: null, + modifyIfUntyped: null, + cascading: null, + range: null, +} as const satisfies Record; + +export const modifiersExtra = { + first: "first", + last: "last", + previous: "previous", + next: "next", + forward: "forward", + backward: "backward", +}; + +export const scopeSpokenForms = { + argumentOrParameter: "arg", + attribute: "attribute", + functionCall: "call", + functionCallee: "callee", + className: "class name", + class: "class", + comment: "comment", + functionName: "funk name", + namedFunction: "funk", + ifStatement: "if state", + instance: "instance", + collectionItem: "item", + collectionKey: "key", + anonymousFunction: "lambda", + list: "list", + map: "map", + name: "name", + regularExpression: "regex", + section: "section", + sectionLevelOne: "one section", + sectionLevelTwo: "two section", + sectionLevelThree: "three section", + sectionLevelFour: "four section", + sectionLevelFive: "five section", + sectionLevelSix: "six section", + selector: "selector", + statement: "state", + string: "string", + branch: "branch", + type: "type", + value: "value", + condition: "condition", + unit: "unit", + // XML, JSX + xmlElement: "element", + xmlBothTags: "tags", + xmlStartTag: "start tag", + xmlEndTag: "end tag", + // LaTeX + part: "part", + chapter: "chapter", + subSection: "subsection", + subSubSection: "subsubsection", + namedParagraph: "paragraph", + subParagraph: "subparagraph", + environment: "environment", + // Talon + command: "command", + // Text-based scope types + character: "char", + word: "word", + token: "token", + identifier: "identifier", + line: "line", + sentence: "sentence", + paragraph: "block", + document: "file", + nonWhitespaceSequence: "paint", + boundedNonWhitespaceSequence: "short paint", + url: "link", + notebookCell: "cell", + + switchStatementSubject: null, +} as const satisfies Record; + +type ExtendedSurroundingPairName = SurroundingPairName | "whitespace"; + +const surroundingPairsSpoken: Record< + ExtendedSurroundingPairName, + string | null +> = { + curlyBrackets: "curly", + angleBrackets: "diamond", + escapedDoubleQuotes: "escaped quad", + escapedSingleQuotes: "escaped twin", + escapedParentheses: "escaped round", + escapedSquareBrackets: "escaped box", + doubleQuotes: "quad", + parentheses: "round", + backtickQuotes: "skis", + squareBrackets: "box", + singleQuotes: "twin", + any: "pair", + string: "string", + whitespace: "void", + + // Used internally by the "item" scope type + collectionBoundary: null, +}; + +const surroundingPairsDelimiters: Record< + ExtendedSurroundingPairName, + [string, string] | null +> = { + curlyBrackets: ["{", "}"], + angleBrackets: ["<", ">"], + escapedDoubleQuotes: ['\\"', '\\"'], + escapedSingleQuotes: ["\\'", "\\'"], + escapedParentheses: ["\\(", "\\)"], + escapedSquareBrackets: ["\\[", "\\]"], + doubleQuotes: ['"', '"'], + parentheses: ["(", ")"], + backtickQuotes: ["`", "`"], + squareBrackets: ["[", "]"], + singleQuotes: ["'", "'"], + whitespace: [" ", " "], + + any: null, + string: null, + collectionBoundary: null, +}; const surroundingPairDelimiterToName = new CompositeKeyMap< [string, string], - SpeakableSurroundingPairName + SurroundingPairName >((pair) => pair); for (const [name, pair] of Object.entries(surroundingPairsDelimiters)) { if (pair != null) { - surroundingPairDelimiterToName.set( - pair, - name as SpeakableSurroundingPairName, - ); + surroundingPairDelimiterToName.set(pair, name as SurroundingPairName); + } +} + +export const surroundingPairForceDirections = { + left: "left", + right: "right", +}; + +/** + * Given a pair name (eg `parentheses`), returns the spoken form of the + * surrounding pair. + * @param surroundingPair The name of the surrounding pair + * @returns The spoken form of the surrounding pair + */ +export function surroundingPairNameToSpokenForm( + surroundingPair: SurroundingPairName, +): string { + const result = surroundingPairsSpoken[surroundingPair]; + if (result == null) { + throw Error(`Unknown surrounding pair '${surroundingPair}'`); } + return result; } /** @@ -27,13 +190,12 @@ for (const [name, pair] of Object.entries(surroundingPairsDelimiters)) { * @returns The spoken form of the surrounding pair */ export function surroundingPairDelimitersToSpokenForm( - spokenFormMap: SpokenFormComponentMap, left: string, right: string, -): CustomizableSpokenFormComponentForType<"pairedDelimiter"> { +): string { const pairName = surroundingPairDelimiterToName.get([left, right]); if (pairName == null) { throw Error(`Unknown surrounding pair delimiters '${left} ${right}'`); } - return spokenFormMap.pairedDelimiter[pairName]; + return surroundingPairNameToSpokenForm(pairName); } diff --git a/packages/cursorless-engine/src/generateSpokenForm/defaultSpokenForms/surroundingPairsDelimiters.ts b/packages/cursorless-engine/src/generateSpokenForm/defaultSpokenForms/surroundingPairsDelimiters.ts deleted file mode 100644 index ff3a19bbe11..00000000000 --- a/packages/cursorless-engine/src/generateSpokenForm/defaultSpokenForms/surroundingPairsDelimiters.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { SpeakableSurroundingPairName } from "../../spokenForms/SpokenFormType"; - -export const surroundingPairsDelimiters: Record< - SpeakableSurroundingPairName, - [string, string] | null -> = { - curlyBrackets: ["{", "}"], - angleBrackets: ["<", ">"], - escapedDoubleQuotes: ['\\"', '\\"'], - escapedSingleQuotes: ["\\'", "\\'"], - escapedParentheses: ["\\(", "\\)"], - escapedSquareBrackets: ["\\[", "\\]"], - doubleQuotes: ['"', '"'], - parentheses: ["(", ")"], - backtickQuotes: ["`", "`"], - squareBrackets: ["[", "]"], - singleQuotes: ["'", "'"], - whitespace: [" ", " "], - - any: null, - string: null, - collectionBoundary: null, -}; diff --git a/packages/cursorless-engine/src/generateSpokenForm/generateSpokenForm.test.ts b/packages/cursorless-engine/src/generateSpokenForm/generateSpokenForm.test.ts index 07ba62bc203..6e8e2d31f42 100644 --- a/packages/cursorless-engine/src/generateSpokenForm/generateSpokenForm.test.ts +++ b/packages/cursorless-engine/src/generateSpokenForm/generateSpokenForm.test.ts @@ -5,86 +5,39 @@ import { shouldUpdateFixtures, } from "@cursorless/common"; import * as yaml from "js-yaml"; -import assert from "node:assert"; +import * as assert from "node:assert"; import { promises as fsp } from "node:fs"; import { canonicalizeAndValidateCommand } from "../core/commandVersionUpgrades/canonicalizeAndValidateCommand"; +import { generateSpokenForm } from "./generateSpokenForm"; import { getHatMapCommand } from "./getHatMapCommand"; -import { SpokenFormGenerator } from "."; -import { defaultSpokenFormInfoMap } from "../spokenForms/defaultSpokenFormMap"; -import { SpokenFormMap, mapSpokenForms } from "../spokenForms/SpokenFormMap"; - -/** - * A spoken form map to use for testing. Just uses default spoken forms, but - * enables spoken forms that are disabled by default. - */ -const spokenFormMap: SpokenFormMap = mapSpokenForms( - defaultSpokenFormInfoMap, - ({ defaultSpokenForms, isPrivate }) => ({ - spokenForms: isPrivate ? [] : defaultSpokenForms, - isCustom: false, - defaultSpokenForms, - requiresTalonUpdate: false, - isPrivate, - }), -); suite("Generate spoken forms", () => { getRecordedTestPaths().forEach(({ name, path }) => test(name, () => runTest(path)), ); - - test("generate spoken form for custom regex", () => { - const generator = new SpokenFormGenerator({ - ...spokenFormMap, - customRegex: { - foo: { - spokenForms: ["bar"], - isCustom: true, - defaultSpokenForms: [], - requiresTalonUpdate: false, - isPrivate: false, - }, - }, - }); - - const spokenForm = generator.processScopeType({ - type: "customRegex", - regex: "foo", - }); - - assert(spokenForm.type === "success"); - assert.equal(spokenForm.spokenForms, "bar"); - }); }); async function runTest(file: string) { const buffer = await fsp.readFile(file); const fixture = yaml.load(buffer.toString()) as TestCaseFixtureLegacy; - const generator = new SpokenFormGenerator(spokenFormMap); - - const generatedSpokenForm = generator.processCommand( + const generatedSpokenForm = generateSpokenForm( canonicalizeAndValidateCommand(fixture.command), ); - if (generatedSpokenForm.type === "success") { - assert(generatedSpokenForm.spokenForms.length === 1); - } - if (fixture.marksToCheck != null && generatedSpokenForm.type === "success") { // If the test has marks to check (eg a hat token map test), it will end in // "take " as a way to indicate which mark to check - const hatMapSpokenForm = generator.processCommand( + const hatMapSpokenForm = generateSpokenForm( getHatMapCommand(fixture.marksToCheck), ); assert(hatMapSpokenForm.type === "success"); - assert(hatMapSpokenForm.spokenForms.length === 1); - generatedSpokenForm.spokenForms[0] += " " + hatMapSpokenForm.spokenForms[0]; + generatedSpokenForm.value += " " + hatMapSpokenForm.value; } if (shouldUpdateFixtures()) { if (generatedSpokenForm.type === "success") { - fixture.command.spokenForm = generatedSpokenForm.spokenForms[0]; + fixture.command.spokenForm = generatedSpokenForm.value; fixture.spokenFormError = undefined; } else { fixture.spokenFormError = generatedSpokenForm.reason; @@ -94,10 +47,7 @@ async function runTest(file: string) { await fsp.writeFile(file, serializeTestFixture(fixture)); } else { if (generatedSpokenForm.type === "success") { - assert.equal( - fixture.command.spokenForm, - generatedSpokenForm.spokenForms[0], - ); + assert.equal(fixture.command.spokenForm, generatedSpokenForm.value); assert.equal(fixture.spokenFormError, undefined); } else { assert.equal(fixture.spokenFormError, generatedSpokenForm.reason); diff --git a/packages/cursorless-engine/src/generateSpokenForm/generateSpokenForm.ts b/packages/cursorless-engine/src/generateSpokenForm/generateSpokenForm.ts index 51a2dac5669..532485981ef 100644 --- a/packages/cursorless-engine/src/generateSpokenForm/generateSpokenForm.ts +++ b/packages/cursorless-engine/src/generateSpokenForm/generateSpokenForm.ts @@ -4,9 +4,8 @@ import { DestinationDescriptor, InsertionMode, PartialTargetDescriptor, - ScopeType, - camelCaseToAllDown, } from "@cursorless/common"; +import { RecursiveArray, flattenDeep } from "lodash"; import { NoSpokenFormError } from "./NoSpokenFormError"; import { actions } from "./defaultSpokenForms/actions"; import { connectives } from "./defaultSpokenForms/connectives"; @@ -16,307 +15,190 @@ import { wrapperSnippetToSpokenForm, } from "./defaultSpokenForms/snippets"; import { getRangeConnective } from "./getRangeConnective"; -import { SpokenFormMap } from "../spokenForms/SpokenFormMap"; -import { PrimitiveTargetSpokenFormGenerator } from "./primitiveTargetToSpokenForm"; -import { - SpokenFormComponentMap, - getSpokenFormComponentMap, -} from "./getSpokenFormComponentMap"; -import { SpokenFormComponent } from "./SpokenFormComponent"; -import { SpokenForm } from "@cursorless/common"; - -export class SpokenFormGenerator { - private primitiveGenerator: PrimitiveTargetSpokenFormGenerator; - private spokenFormMap: SpokenFormComponentMap; +import { primitiveTargetToSpokenForm } from "./primitiveTargetToSpokenForm"; - constructor(spokenFormMap: SpokenFormMap) { - this.spokenFormMap = getSpokenFormComponentMap(spokenFormMap); - - this.primitiveGenerator = new PrimitiveTargetSpokenFormGenerator( - this.spokenFormMap, - ); - } - - /** - * Given a command, generates its spoken form. - * @param command The command to generate a spoken form for - * @returns The spoken form of the command - */ - processCommand(command: CommandComplete): SpokenForm { - return this.componentsToSpokenForm(() => this.handleAction(command.action)); - } +export interface SpokenFormSuccess { + type: "success"; + value: string; +} - /** - * Given a scope type, generates its spoken form. - * @param scopeType The scope type to generate a spoken form for - * @returns The spoken form of the scope type - */ - processScopeType(scopeType: ScopeType): SpokenForm { - return this.componentsToSpokenForm(() => [ - this.primitiveGenerator.handleScopeType(scopeType), - ]); - } +export interface SpokenFormError { + type: "error"; + reason: string; +} - /** - * Given a function that returns a spoken form component, generates a spoken - * form for that component by flattening the component and performing a - * cartesian product over any elements that have multiple ways to be spoken. - * Note that this spoken form object can correspond to multiple actual spoken - * forms, consisting of a preferred spoken form and a list of alternative - * spoken forms. - * - * Note that today, we arbitrarily choose the first spoken form as the - * preferred spoken form, and the rest as alternative spoken forms. - * - * If the function throws a {@link NoSpokenFormError}, returns an error spoken - * form object instead. - * - * @param getComponents A function that returns the components to generate a - * spoken form for - * @returns A spoken form for the given components - */ - private componentsToSpokenForm( - getComponents: () => SpokenFormComponent, - ): SpokenForm { - try { - return { - type: "success", - spokenForms: constructSpokenForms(getComponents()), - }; - } catch (e) { - if (e instanceof NoSpokenFormError) { - return { - type: "error", - reason: e.reason, - requiresTalonUpdate: e.requiresTalonUpdate, - isPrivate: e.isPrivate, - }; - } +export type SpokenForm = SpokenFormSuccess | SpokenFormError; - throw e; +/** + * Given a command, generates its spoken form. + * @param command The command to generate a spoken form for + * @returns The spoken form of the command, or null if the command has no spoken + * form + */ +export function generateSpokenForm(command: CommandComplete): SpokenForm { + try { + const components = generateSpokenFormComponents(command.action); + return { type: "success", value: flattenDeep(components).join(" ") }; + } catch (e) { + if (e instanceof NoSpokenFormError) { + return { type: "error", reason: e.reason }; } - } - private handleAction(action: ActionDescriptor): SpokenFormComponent { - switch (action.name) { - case "editNew": - case "getText": - case "replace": - case "executeCommand": - case "private.getTargets": - case "private.setKeyboardTarget": - throw new NoSpokenFormError(`Action '${action.name}'`); - - case "replaceWithTarget": - case "moveToTarget": - return [ - actions[action.name], - this.handleTarget(action.source), - this.handleDestination(action.destination), - ]; - - case "swapTargets": - return [ - actions[action.name], - this.handleTarget(action.target1), - connectives.swapConnective, - this.handleTarget(action.target2), - ]; - - case "callAsFunction": - if (action.argument.type === "implicit") { - return [actions[action.name], this.handleTarget(action.callee)]; - } - return [ - actions[action.name], - this.handleTarget(action.callee), - "on", - this.handleTarget(action.argument), - ]; - - case "wrapWithPairedDelimiter": - case "rewrapWithPairedDelimiter": - return [ - surroundingPairDelimitersToSpokenForm( - this.spokenFormMap, - action.left, - action.right, - ), - actions[action.name], - this.handleTarget(action.target), - ]; - - case "pasteFromClipboard": - return [ - actions[action.name], - this.handleDestination(action.destination), - ]; - - case "insertSnippet": - return [ - actions[action.name], - insertionSnippetToSpokenForm(action.snippetDescription), - this.handleDestination(action.destination), - ]; - - case "generateSnippet": - if (action.snippetName != null) { - throw new NoSpokenFormError(`${action.name}.snippetName`); - } - return [actions[action.name], this.handleTarget(action.target)]; - - case "wrapWithSnippet": - return [ - wrapperSnippetToSpokenForm(action.snippetDescription), - actions[action.name], - this.handleTarget(action.target), - ]; + throw e; + } +} - case "highlight": { - if (action.highlightId != null) { - throw new NoSpokenFormError(`${action.name}.highlightId`); - } - return [actions[action.name], this.handleTarget(action.target)]; +function generateSpokenFormComponents( + action: ActionDescriptor, +): RecursiveArray { + switch (action.name) { + case "editNew": + case "getText": + case "replace": + case "executeCommand": + case "private.getTargets": + throw new NoSpokenFormError(`Action '${action.name}'`); + + case "replaceWithTarget": + case "moveToTarget": + return [ + actions[action.name], + targetToSpokenForm(action.source), + destinationToSpokenForm(action.destination), + ]; + + case "swapTargets": + return [ + actions[action.name], + targetToSpokenForm(action.target1), + connectives.swapConnective, + targetToSpokenForm(action.target2), + ]; + + case "callAsFunction": + if (action.argument != null) { + throw new NoSpokenFormError(`Action '${action.name}' with argument`); } - - default: { - return [actions[action.name], this.handleTarget(action.target)]; + return [ + actions[action.name], + targetToSpokenForm(action.callee), + // targetToSpokenForm(action.argument), + ]; + + case "wrapWithPairedDelimiter": + case "rewrapWithPairedDelimiter": + return [ + surroundingPairDelimitersToSpokenForm(action.left, action.right), + actions[action.name], + targetToSpokenForm(action.target), + ]; + + case "pasteFromClipboard": + return [ + actions[action.name], + destinationToSpokenForm(action.destination), + ]; + + case "insertSnippet": + return [ + actions[action.name], + insertionSnippetToSpokenForm(action.snippetDescription), + destinationToSpokenForm(action.destination), + ]; + + case "generateSnippet": + if (action.snippetName != null) { + throw new NoSpokenFormError(`${action.name}.snippetName`); } - } - } - - private handleTarget(target: PartialTargetDescriptor): SpokenFormComponent { - switch (target.type) { - case "list": - if (target.elements.length < 2) { - throw new NoSpokenFormError("List target with < 2 elements"); - } - - return target.elements.map((element, i) => - i === 0 - ? this.handleTarget(element) - : [connectives.listConnective, this.handleTarget(element)], - ); - - case "range": { - const anchor = this.handleTarget(target.anchor); - const active = this.handleTarget(target.active); - const connective = getRangeConnective( - target.excludeAnchor, - target.excludeActive, - target.rangeType, - ); - return [anchor, connective, active]; + return [actions[action.name], targetToSpokenForm(action.target)]; + + case "wrapWithSnippet": + return [ + wrapperSnippetToSpokenForm(action.snippetDescription), + actions[action.name], + targetToSpokenForm(action.target), + ]; + + case "highlight": { + if (action.highlightId != null) { + throw new NoSpokenFormError(`${action.name}.highlightId`); } - - case "primitive": - return this.primitiveGenerator.handlePrimitiveTarget(target); - - case "implicit": - return []; + return [actions[action.name], targetToSpokenForm(action.target)]; } - } - - private handleDestination( - destination: DestinationDescriptor, - ): SpokenFormComponent { - switch (destination.type) { - case "list": - if (destination.destinations.length < 2) { - throw new NoSpokenFormError("List destination with < 2 elements"); - } - - return destination.destinations.map((destination, i) => - i === 0 - ? this.handleDestination(destination) - : [connectives.listConnective, this.handleDestination(destination)], - ); - - case "primitive": - return [ - this.handleInsertionMode(destination.insertionMode), - this.handleTarget(destination.target), - ]; - - case "implicit": - return []; - } - } - private handleInsertionMode(insertionMode: InsertionMode): string { - switch (insertionMode) { - case "to": - return connectives.sourceDestinationConnective; - case "before": - return connectives.before; - case "after": - return connectives.after; + default: { + return [actions[action.name], targetToSpokenForm(action.target)]; } } } -function constructSpokenForms(component: SpokenFormComponent): string[] { - if (typeof component === "string") { - return [component]; - } +function targetToSpokenForm( + target: PartialTargetDescriptor, +): RecursiveArray { + switch (target.type) { + case "list": + if (target.elements.length < 2) { + throw new NoSpokenFormError("List target with < 2 elements"); + } - if (Array.isArray(component)) { - if (component.length === 0) { - return [""]; + return target.elements.map((element, i) => + i === 0 + ? targetToSpokenForm(element) + : [connectives.listConnective, targetToSpokenForm(element)], + ); + + case "range": { + const anchor = targetToSpokenForm(target.anchor); + const active = targetToSpokenForm(target.active); + const connective = getRangeConnective( + target.excludeAnchor, + target.excludeActive, + target.rangeType, + ); + return [anchor, connective, active]; } - return cartesianProduct(component.map(constructSpokenForms)).map((words) => - words.filter((word) => word.length !== 0).join(" "), - ); + case "primitive": + return primitiveTargetToSpokenForm(target); + + case "implicit": + return []; } +} - if (component.spokenForms.spokenForms.length === 0) { - const componentInfo = `${camelCaseToAllDown( - component.spokenFormType, - )} with id ${component.id}`; +function destinationToSpokenForm( + destination: DestinationDescriptor, +): RecursiveArray { + switch (destination.type) { + case "list": + if (destination.destinations.length < 2) { + throw new NoSpokenFormError("List destination with < 2 elements"); + } - let helpInfo: string; + return destination.destinations.map((destination, i) => + i === 0 + ? destinationToSpokenForm(destination) + : [connectives.listConnective, destinationToSpokenForm(destination)], + ); - if (component.spokenForms.isPrivate) { - helpInfo = - "this is a private spoken form currently only for internal experimentation"; - } else if (component.spokenForms.requiresTalonUpdate) { - helpInfo = - "please update talon to the latest version (see https://www.cursorless.org/docs/user/updating/)"; - } else { - helpInfo = - "please see https://www.cursorless.org/docs/user/customization/ for more information"; - } + case "primitive": + return [ + insertionModeToSpokenForm(destination.insertionMode), + targetToSpokenForm(destination.target), + ]; - throw new NoSpokenFormError( - `${componentInfo}; ${helpInfo}`, - component.spokenForms.requiresTalonUpdate, - component.spokenForms.isPrivate, - ); + case "implicit": + return []; } - - return component.spokenForms.spokenForms; } -/** - * Given an array of arrays, constructs all possible combinations of the - * elements of the arrays. For example, given [[1, 2], [3, 4]], returns [[1, 3], - * [1, 4], [2, 3], [2, 4]]. If any of the arrays are empty, returns an empty - * array. - * @param arrays The arrays to take the cartesian product of - */ -function cartesianProduct(arrays: T[][]): T[][] { - if (arrays.length === 0) { - return []; - } - - if (arrays.length === 1) { - return arrays[0].map((element) => [element]); +function insertionModeToSpokenForm(insertionMode: InsertionMode): string { + switch (insertionMode) { + case "to": + return connectives.sourceDestinationConnective; + case "before": + return connectives.before; + case "after": + return connectives.after; } - - const [first, ...rest] = arrays; - const restCartesianProduct = cartesianProduct(rest); - return first.flatMap((element) => - restCartesianProduct.map((restElement) => [element, ...restElement]), - ); } diff --git a/packages/cursorless-engine/src/generateSpokenForm/getSpokenFormComponentMap.ts b/packages/cursorless-engine/src/generateSpokenForm/getSpokenFormComponentMap.ts deleted file mode 100644 index 7fd6e7b4f95..00000000000 --- a/packages/cursorless-engine/src/generateSpokenForm/getSpokenFormComponentMap.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { SpokenFormMap } from "../spokenForms/SpokenFormMap"; -import { - PartialSpokenFormTypes, - SpokenFormMapKeyTypes, - SpokenFormType, -} from "../spokenForms/SpokenFormType"; -import { CustomizableSpokenFormComponentForType } from "./SpokenFormComponent"; - -/** - * A spoken form component map is a map of spoken form types to a map of IDs to - * spoken form components. It is used to generate spoken forms. It mirrors the - * structure of a {@link SpokenFormMap}, but instead of containing spoken form - * map entries, it contains spoken form components for use in spoken form - * generation. - */ -export type SpokenFormComponentMap = { - readonly [K in SpokenFormType]: K extends PartialSpokenFormTypes - ? Readonly< - Partial< - Record< - SpokenFormMapKeyTypes[K], - CustomizableSpokenFormComponentForType - > - > - > - : Readonly< - Record< - SpokenFormMapKeyTypes[K], - CustomizableSpokenFormComponentForType - > - >; -}; - -/** - * Converts a spoken form map to a spoken form component map for use in spoken - * form generation. - * @param spokenFormMap The spoken form map to convert to a spoken form - * component map - * @returns A spoken form component map that can be used to generate spoken - * forms - */ -export function getSpokenFormComponentMap( - spokenFormMap: SpokenFormMap, -): SpokenFormComponentMap { - return Object.fromEntries( - Object.entries(spokenFormMap).map(([spokenFormType, map]) => [ - spokenFormType, - Object.fromEntries( - Object.entries(map).map(([id, spokenForms]) => [ - id, - { - type: "customizable", - spokenForms, - spokenFormType, - id, - }, - ]), - ), - ]), - // FIXME: Don't cast here; need to make our own mapValues with stronger typing - // using tricks from our object.d.ts - ) as SpokenFormComponentMap; -} diff --git a/packages/cursorless-engine/src/generateSpokenForm/primitiveTargetToSpokenForm.ts b/packages/cursorless-engine/src/generateSpokenForm/primitiveTargetToSpokenForm.ts index c42e5452f6a..59452aa7759 100644 --- a/packages/cursorless-engine/src/generateSpokenForm/primitiveTargetToSpokenForm.ts +++ b/packages/cursorless-engine/src/generateSpokenForm/primitiveTargetToSpokenForm.ts @@ -6,7 +6,9 @@ import { RelativeScopeModifier, ScopeType, } from "@cursorless/common"; +import { RecursiveArray } from "lodash"; import { NoSpokenFormError } from "./NoSpokenFormError"; +import { characterToSpokenForm } from "./defaultSpokenForms/characters"; import { connectives } from "./defaultSpokenForms/connectives"; import { hatColorToSpokenForm, @@ -14,351 +16,275 @@ import { lineDirections, marks, } from "./defaultSpokenForms/marks"; - -import { getRangeConnective } from "./getRangeConnective"; +import { + modifiers, + modifiersExtra, + scopeSpokenForms, + surroundingPairForceDirections, + surroundingPairNameToSpokenForm, +} from "./defaultSpokenForms/modifiers"; import { numberToSpokenForm, ordinalToSpokenForm, } from "./defaultSpokenForms/numbers"; -import { characterToSpokenForm } from "./defaultSpokenForms/characters"; -import { SpokenFormComponentMap } from "./getSpokenFormComponentMap"; -import { SpokenFormComponent } from "./SpokenFormComponent"; +import { getRangeConnective } from "./getRangeConnective"; -export class PrimitiveTargetSpokenFormGenerator { - constructor(private spokenFormMap: SpokenFormComponentMap) { - this.handleModifier = this.handleModifier.bind(this); +export function primitiveTargetToSpokenForm( + target: PartialPrimitiveTargetDescriptor, +): RecursiveArray { + const components: RecursiveArray = []; + if (target.modifiers != null) { + components.push(target.modifiers.map(modifierToSpokenForm)); } - - handlePrimitiveTarget( - target: PartialPrimitiveTargetDescriptor, - ): SpokenFormComponent { - const components: SpokenFormComponent[] = []; - if (target.modifiers != null) { - components.push(target.modifiers.map(this.handleModifier)); - } - if (target.mark != null) { - components.push(this.handleMark(target.mark)); - } - return components; + if (target.mark != null) { + components.push(markToSpokenForm(target.mark)); } + return components; +} - private handleModifier(modifier: Modifier): SpokenFormComponent { - switch (modifier.type) { - case "cascading": - case "modifyIfUntyped": - throw new NoSpokenFormError(`Modifier '${modifier.type}'`); +function modifierToSpokenForm(modifier: Modifier): RecursiveArray { + switch (modifier.type) { + case "cascading": + case "modifyIfUntyped": + throw new NoSpokenFormError(`Modifier '${modifier.type}'`); - case "containingScope": - if (modifier.ancestorIndex == null || modifier.ancestorIndex === 0) { - return this.handleScopeType(modifier.scopeType); - } - if (modifier.ancestorIndex === 1) { - return [ - this.spokenFormMap.modifierExtra.ancestor, - this.handleScopeType(modifier.scopeType), - ]; - } - throw new NoSpokenFormError( - `Modifier '${modifier.type}' with ancestor index ${modifier.ancestorIndex}`, - ); + case "containingScope": + return [scopeTypeToSpokenForm(modifier.scopeType)]; - case "everyScope": - return [ - this.spokenFormMap.simpleModifier.everyScope, - this.handleScopeType(modifier.scopeType), - ]; - - case "extendThroughStartOf": - case "extendThroughEndOf": { - const type = this.spokenFormMap.simpleModifier[modifier.type]; - return modifier.modifiers != null - ? [type, modifier.modifiers.map(this.handleModifier)] - : [type]; - } + case "everyScope": + return [modifiers.everyScope, scopeTypeToSpokenForm(modifier.scopeType)]; - case "relativeScope": - return modifier.offset === 0 - ? this.handleRelativeScopeInclusive(modifier) - : this.handleRelativeScopeExclusive(modifier); - - case "ordinalScope": { - const scope = this.handleScopeType(modifier.scopeType); - - if (modifier.length === 1) { - if (modifier.start === -1) { - return [this.spokenFormMap.modifierExtra.last, scope]; - } - if (modifier.start === 0) { - return [this.spokenFormMap.modifierExtra.first, scope]; - } - if (modifier.start < 0) { - return [ - ordinalToSpokenForm(Math.abs(modifier.start)), - this.spokenFormMap.modifierExtra.last, - scope, - ]; - } - return [ordinalToSpokenForm(modifier.start + 1), scope]; - } + case "extendThroughStartOf": + case "extendThroughEndOf": { + const type = modifiers[modifier.type]; + return modifier.modifiers != null + ? [type, modifier.modifiers.map(modifierToSpokenForm)] + : [type]; + } + + case "relativeScope": + return modifier.offset === 0 + ? relativeScopeInclusiveToSpokenForm(modifier) + : relativeScopeExclusiveToSpokenForm(modifier); - const number = numberToSpokenForm(modifier.length); + case "ordinalScope": { + const scope = scopeTypeToSpokenForm(modifier.scopeType); + if (modifier.length === 1) { + if (modifier.start === -1) { + return [modifiersExtra.last, scope]; + } if (modifier.start === 0) { - return [ - this.spokenFormMap.modifierExtra.first, - number, - pluralize(scope), - ]; + return [modifiersExtra.first, scope]; } - if (modifier.start === -modifier.length) { + if (modifier.start < 0) { return [ - this.spokenFormMap.modifierExtra.last, - number, - pluralize(scope), + ordinalToSpokenForm(Math.abs(modifier.start)), + modifiersExtra.last, + scope, ]; } - - throw new NoSpokenFormError( - `'${modifier.type}' with count > 1 and offset away from start / end`, - ); + return [ordinalToSpokenForm(modifier.start + 1), scope]; } - case "range": { - if ( - modifier.anchor.type === "ordinalScope" && - modifier.active.type === "ordinalScope" && - modifier.anchor.length === 1 && - modifier.active.length === 1 && - modifier.anchor.scopeType.type === modifier.active.scopeType.type - ) { - const anchor = - modifier.anchor.start === -1 - ? this.spokenFormMap.modifierExtra.last - : ordinalToSpokenForm(modifier.anchor.start + 1); - const active = this.handleModifier(modifier.active); - const connective = getRangeConnective( - modifier.excludeAnchor, - modifier.excludeActive, - ); - return [anchor, connective, active]; - } + const number = numberToSpokenForm(modifier.length); - // Throw actual Error here because we're not sure we ever want to support - // a spoken form for these; we may deprecate this construct entirely - throw Error(`Modifier '${modifier.type}' is not fully implemented`); + if (modifier.start === 0) { + return [modifiersExtra.first, number, pluralize(scope)]; + } + if (modifier.start === -modifier.length) { + return [modifiersExtra.last, number, pluralize(scope)]; } - default: - return [this.spokenFormMap.simpleModifier[modifier.type]]; - } - } - - private handleRelativeScopeInclusive( - modifier: RelativeScopeModifier, - ): SpokenFormComponent { - const scope = this.handleScopeType(modifier.scopeType); - - if (modifier.length === 1) { - const direction = - modifier.direction === "forward" - ? connectives.forward - : connectives.backward; - - // token forward/backward - return [scope, direction]; + throw new NoSpokenFormError( + `'${modifier.type}' with count > 1 and offset away from start / end`, + ); } - const length = numberToSpokenForm(modifier.length); - const scopePlural = pluralize(scope); + case "range": { + if ( + modifier.anchor.type === "ordinalScope" && + modifier.active.type === "ordinalScope" && + modifier.anchor.length === 1 && + modifier.active.length === 1 && + modifier.anchor.scopeType.type === modifier.active.scopeType.type + ) { + const anchor = + modifier.anchor.start === -1 + ? modifiersExtra.last + : ordinalToSpokenForm(modifier.anchor.start + 1); + const active = modifierToSpokenForm(modifier.active); + const connective = getRangeConnective( + modifier.excludeAnchor, + modifier.excludeActive, + ); + return [anchor, connective, active]; + } - // two tokens - // This could also have been "two tokens forward"; there is no way to disambiguate. - if (modifier.direction === "forward") { - return [length, scopePlural]; + // Throw actual Error here because we're not sure we ever want to support + // a spoken form for these; we may deprecate this construct entirely + throw Error(`Modifier '${modifier.type}' is not fully implemented`); } - // two tokens backward - return [length, scopePlural, connectives.backward]; + default: + return [modifiers[modifier.type]]; } +} + +function relativeScopeInclusiveToSpokenForm( + modifier: RelativeScopeModifier, +): RecursiveArray { + const scope = scopeTypeToSpokenForm(modifier.scopeType); - private handleRelativeScopeExclusive( - modifier: RelativeScopeModifier, - ): SpokenFormComponent { - const scope = this.handleScopeType(modifier.scopeType); + if (modifier.length === 1) { const direction = modifier.direction === "forward" - ? connectives.next - : connectives.previous; + ? connectives.forward + : connectives.backward; - if (modifier.offset === 1) { - const number = numberToSpokenForm(modifier.length); + // token forward/backward + return [scope, direction]; + } - if (modifier.length === 1) { - // next/previous token - return [direction, scope]; - } + const length = numberToSpokenForm(modifier.length); + const scopePlural = pluralize(scope); + + // two tokens + // This could also have been "two tokens forward"; there is no way to disambiguate. + if (modifier.direction === "forward") { + return [length, scopePlural]; + } - const scopePlural = pluralize(scope); + // two tokens backward + return [length, scopePlural, connectives.backward]; +} - // next/previous two tokens - return [direction, number, scopePlural]; - } +function relativeScopeExclusiveToSpokenForm( + modifier: RelativeScopeModifier, +): RecursiveArray { + const scope = scopeTypeToSpokenForm(modifier.scopeType); + const direction = + modifier.direction === "forward" ? connectives.next : connectives.previous; + + if (modifier.offset === 1) { + const number = numberToSpokenForm(modifier.length); if (modifier.length === 1) { - const ordinal = ordinalToSpokenForm(modifier.offset); - // second next/previous token - return [ordinal, direction, scope]; + // next/previous token + return [direction, scope]; } - throw new NoSpokenFormError( - `${modifier.type} modifier with offset > 1 and length > 1`, - ); + const scopePlural = pluralize(scope); + + // next/previous two tokens + return [direction, number, scopePlural]; } - handleScopeType(scopeType: ScopeType): SpokenFormComponent { - switch (scopeType.type) { - case "oneOf": - throw new NoSpokenFormError(`Scope type '${scopeType.type}'`); - case "glyph": - return [ - this.spokenFormMap.complexScopeTypeType.glyph, - characterToSpokenForm(scopeType.character), - ]; - case "surroundingPair": { - const pair = this.spokenFormMap.pairedDelimiter[scopeType.delimiter]; - if (scopeType.forceDirection != null) { - return [ - this.spokenFormMap.surroundingPairForceDirection[ - scopeType.forceDirection - ], - pair, - ]; - } - return pair; - } + if (modifier.length === 1) { + const ordinal = ordinalToSpokenForm(modifier.offset); + // second next/previous token + return [ordinal, direction, scope]; + } - case "customRegex": - return ( - this.spokenFormMap.customRegex[scopeType.regex] ?? { - type: "customizable", - spokenForms: { - spokenForms: [], - isCustom: true, - defaultSpokenForms: [], - requiresTalonUpdate: false, - isPrivate: false, - }, - spokenFormType: "customRegex", - id: scopeType.regex, - } - ); + throw new NoSpokenFormError( + `${modifier.type} modifier with offset > 1 and length > 1`, + ); +} - default: - return this.spokenFormMap.simpleScopeTypeType[scopeType.type]; +function scopeTypeToSpokenForm(scopeType: ScopeType): string { + switch (scopeType.type) { + case "oneOf": + case "customRegex": + case "switchStatementSubject": + case "string": + throw new NoSpokenFormError(`Scope type '${scopeType.type}'`); + case "surroundingPair": { + const pair = surroundingPairNameToSpokenForm(scopeType.delimiter); + if (scopeType.forceDirection != null) { + const direction = + scopeType.forceDirection === "left" + ? surroundingPairForceDirections.left + : surroundingPairForceDirections.right; + return `${direction} ${pair}`; + } + return pair; } + + default: + return scopeSpokenForms[scopeType.type]; } +} - private handleMark(mark: PartialMark): SpokenFormComponent { - switch (mark.type) { - case "decoratedSymbol": { - const [color, shape] = mark.symbolColor.split("-"); - const components: string[] = []; - if (color !== "default") { - components.push(hatColorToSpokenForm(color)); - } - if (shape != null) { - components.push(hatShapeToSpokenForm(shape)); - } - components.push(characterToSpokenForm(mark.character)); - return components; +function markToSpokenForm(mark: PartialMark): RecursiveArray { + switch (mark.type) { + case "decoratedSymbol": { + const [color, shape] = mark.symbolColor.split("-"); + const components: string[] = []; + if (color !== "default") { + components.push(hatColorToSpokenForm(color)); } - - case "lineNumber": { - return this.handleLineNumberMark(mark); + if (shape != null) { + components.push(hatShapeToSpokenForm(shape)); } + components.push(characterToSpokenForm(mark.character)); + return components; + } - case "range": { - if ( - mark.anchor.type === "lineNumber" && - mark.active.type === "lineNumber" - ) { - const [typeAnchor, numberAnchor] = this.handleLineNumberMark( - mark.anchor, - ); - const [typeActive, numberActive] = this.handleLineNumberMark( - mark.active, + case "lineNumber": { + return lineNumberToParts(mark); + } + + case "range": { + if ( + mark.anchor.type === "lineNumber" && + mark.active.type === "lineNumber" + ) { + const [typeAnchor, numberAnchor] = lineNumberToParts(mark.anchor); + const [typeActive, numberActive] = lineNumberToParts(mark.active); + if (typeAnchor === typeActive) { + const connective = getRangeConnective( + mark.excludeAnchor, + mark.excludeActive, ); - if (typeAnchor === typeActive) { - const connective = getRangeConnective( - mark.excludeAnchor, - mark.excludeActive, - ); - // Row five past seven - return [typeAnchor, numberAnchor, connective, numberActive]; - } + // Row five past seven + return [typeAnchor, numberAnchor, connective, numberActive]; } - // Throw actual Error here because we're not sure we ever want to support - // a spoken form for these; we may deprecate this construct entirely - throw Error(`Mark '${mark.type}' is not fully implemented`); } - case "explicit": - case "keyboard": - throw new NoSpokenFormError(`Mark '${mark.type}'`); - - default: - return [marks[mark.type]]; + // Throw actual Error here because we're not sure we ever want to support + // a spoken form for these; we may deprecate this construct entirely + throw Error(`Mark '${mark.type}' is not fully implemented`); } - } + case "explicit": + throw new NoSpokenFormError(`Mark '${mark.type}'`); - private handleLineNumberMark(mark: LineNumberMark): [string, string] { - switch (mark.lineNumberType) { - case "absolute": - throw new NoSpokenFormError("Absolute line numbers"); - case "modulo100": { - // row/ five - return [ - lineDirections.modulo100, - numberToSpokenForm(mark.lineNumber + 1), - ]; - } - case "relative": { - // up/down five - return [ - mark.lineNumber < 0 - ? lineDirections.relativeUp - : lineDirections.relativeDown, - numberToSpokenForm(Math.abs(mark.lineNumber)), - ]; - } - } + default: + return [marks[mark.type]]; } } -function pluralize(name: SpokenFormComponent): SpokenFormComponent { - if (typeof name === "string") { - return pluralizeString(name); - } - - if (Array.isArray(name)) { - if (name.length === 0) { - return name; +function lineNumberToParts(mark: LineNumberMark): [string, string] { + switch (mark.lineNumberType) { + case "absolute": + throw new NoSpokenFormError("Absolute line numbers"); + case "modulo100": { + // row/ five + return [ + lineDirections.modulo100, + numberToSpokenForm(mark.lineNumber + 1), + ]; + } + case "relative": { + // up/down five + return [ + mark.lineNumber < 0 + ? lineDirections.relativeUp + : lineDirections.relativeDown, + numberToSpokenForm(Math.abs(mark.lineNumber)), + ]; } - - const last = name[name.length - 1]; - - return [...name.slice(0, -1), pluralize(last)]; } - - return { - ...name, - spokenForms: { - ...name.spokenForms, - spokenForms: name.spokenForms.spokenForms.map(pluralizeString), - }, - }; } -// FIXME: Properly pluralize -function pluralizeString(name: string): string { +function pluralize(name: string): string { return `${name}s`; } diff --git a/packages/cursorless-engine/src/index.ts b/packages/cursorless-engine/src/index.ts index 9087d6a60cc..45b58818242 100644 --- a/packages/cursorless-engine/src/index.ts +++ b/packages/cursorless-engine/src/index.ts @@ -5,8 +5,5 @@ export * from "./testCaseRecorder/TestCaseRecorder"; export * from "./core/StoredTargets"; export * from "./typings/TreeSitter"; export * from "./cursorlessEngine"; -export * from "./generateSpokenForm/defaultSpokenForms/surroundingPairsDelimiters"; export * from "./api/CursorlessEngineApi"; -export * from "./CommandRunner"; -export * from "./CommandHistory"; -export * from "./CommandHistoryAnalyzer"; +export * from "./api/ScopeProvider"; diff --git a/packages/cursorless-engine/src/languages/LanguageDefinition.ts b/packages/cursorless-engine/src/languages/LanguageDefinition.ts index f6eeeff61a7..3576b941240 100644 --- a/packages/cursorless-engine/src/languages/LanguageDefinition.ts +++ b/packages/cursorless-engine/src/languages/LanguageDefinition.ts @@ -1,10 +1,6 @@ -import { - FileSystem, - ScopeType, - SimpleScopeType, - showError, -} from "@cursorless/common"; -import { basename, dirname, join } from "path"; +import { ScopeType, SimpleScopeType, showError } from "@cursorless/common"; +import { existsSync, readFileSync } from "fs"; +import { dirname, join } from "path"; import { TreeSitterScopeHandler } from "../processTargets/modifiers/scopeHandlers"; import { TreeSitterTextFragmentScopeHandler } from "../processTargets/modifiers/scopeHandlers/TreeSitterScopeHandler/TreeSitterTextFragmentScopeHandler"; import { ScopeHandler } from "../processTargets/modifiers/scopeHandlers/scopeHandler.types"; @@ -12,7 +8,6 @@ import { ide } from "../singletons/ide.singleton"; import { TreeSitter } from "../typings/TreeSitter"; import { matchAll } from "../util/regex"; import { TreeSitterQuery } from "./TreeSitterQuery"; -import { validateQueryCaptures } from "./TreeSitterQuery/validateQueryCaptures"; import { TEXT_FRAGMENT_CAPTURE_NAME } from "./captureNames"; /** @@ -38,23 +33,19 @@ export class LanguageDefinition { * @returns A language definition for the given language id, or undefined if the given language * id doesn't have a new-style query definition */ - static async create( + static create( treeSitter: TreeSitter, - fileSystem: FileSystem, queryDir: string, languageId: string, - ): Promise { + ): LanguageDefinition | undefined { const languageQueryPath = join(queryDir, `${languageId}.scm`); - const rawLanguageQueryString = await readQueryFileAndImports( - fileSystem, - languageQueryPath, - ); - - if (rawLanguageQueryString == null) { + if (!existsSync(languageQueryPath)) { return undefined; } + const rawLanguageQueryString = readQueryFileAndImports(languageQueryPath); + const rawQuery = treeSitter .getLanguage(languageId)! .query(rawLanguageQueryString); @@ -97,17 +88,12 @@ export class LanguageDefinition { * @param languageQueryPath The path to the query file to read * @returns The text of the query file, with all imports inlined */ -async function readQueryFileAndImports( - fileSystem: FileSystem, - languageQueryPath: string, -) { +function readQueryFileAndImports(languageQueryPath: string) { // Seed the map with the query file itself const rawQueryStrings: Record = { [languageQueryPath]: null, }; - const doValidation = ide().runMode !== "production"; - // Keep reading imports until we've read all the imports. Every time we // encounter an import in a query file, we add it to the map with a value // of null, so that it will be read on the next iteration @@ -117,35 +103,7 @@ async function readQueryFileAndImports( continue; } - const fileName = basename(queryPath); - - let rawQuery = await fileSystem.readBundledFile(queryPath); - - if (rawQuery == null) { - if (queryPath === languageQueryPath) { - // If this is the main query file, then we know that this language - // just isn't defined using new-style queries - return undefined; - } - - showError( - ide().messages, - "LanguageDefinition.readQueryFileAndImports.queryNotFound", - `Could not find imported query file ${queryPath}`, - ); - - if (ide().runMode === "test") { - throw new Error("Invalid import statement"); - } - - // If we're not in test mode, we just ignore the import and continue - rawQuery = ""; - } - - if (doValidation) { - validateQueryCaptures(fileName, rawQuery); - } - + const rawQuery = readFileSync(queryPath, "utf8"); rawQueryStrings[queryPath] = rawQuery; matchAll( rawQuery, @@ -159,9 +117,18 @@ async function readQueryFileAndImports( /^[^\S\r\n]*;;?[^\S\r\n]*(?:import|include)[^\S\r\n]+['"]?([\w|/.]+)['"]?[^\S\r\n]*$/gm, (match) => { const relativeImportPath = match[1]; - - if (doValidation) { - validateImportSyntax(fileName, relativeImportPath, match[0]); + const canonicalSyntax = `;; import ${relativeImportPath}`; + + if (match[0] !== canonicalSyntax) { + showError( + ide().messages, + "LanguageDefinition.readQueryFileAndImports.malformedImport", + `Malformed import statement in ${queryPath}: "${match[0]}". Import statements must be of the form "${canonicalSyntax}"`, + ); + + if (ide().runMode === "test") { + throw new Error("Invalid import statement"); + } } const importQueryPath = join(dirname(queryPath), relativeImportPath); @@ -174,23 +141,3 @@ async function readQueryFileAndImports( return Object.values(rawQueryStrings).join("\n"); } - -function validateImportSyntax( - file: string, - relativeImportPath: string, - actual: string, -) { - const canonicalSyntax = `;; import ${relativeImportPath}`; - - if (actual !== canonicalSyntax) { - showError( - ide().messages, - "LanguageDefinition.readQueryFileAndImports.malformedImport", - `Malformed import statement in ${file}: "${actual}". Import statements must be of the form "${canonicalSyntax}"`, - ); - - if (ide().runMode === "test") { - throw new Error("Invalid import statement"); - } - } -} diff --git a/packages/cursorless-engine/src/languages/LanguageDefinitions.ts b/packages/cursorless-engine/src/languages/LanguageDefinitions.ts index a38f0a20a89..4632f3473c4 100644 --- a/packages/cursorless-engine/src/languages/LanguageDefinitions.ts +++ b/packages/cursorless-engine/src/languages/LanguageDefinitions.ts @@ -8,7 +8,7 @@ import { } from "@cursorless/common"; import { join } from "path"; import { SyntaxNode } from "web-tree-sitter"; -import { TreeSitter } from "../typings/TreeSitter"; +import { TreeSitter } from ".."; import { ide } from "../singletons/ide.singleton"; import { LanguageDefinition } from "./LanguageDefinition"; @@ -43,61 +43,28 @@ export class LanguageDefinitions { private disposables: Disposable[] = []; constructor( - private fileSystem: FileSystem, + fileSystem: FileSystem, private treeSitter: TreeSitter, ) { - ide().onDidOpenTextDocument((document) => { - this.loadLanguage(document.languageId); - }); - ide().onDidChangeVisibleTextEditors((editors) => { - editors.forEach(({ document }) => this.loadLanguage(document.languageId)); - }); - // Use the repo root as the root for development mode, so that we can // we can make hot-reloading work for the queries - this.queryDir = + this.queryDir = join( ide().runMode === "development" - ? join(getCursorlessRepoRoot(), "queries") - : "queries"; - - ide().visibleTextEditors.forEach(({ document }) => - this.loadLanguage(document.languageId), + ? getCursorlessRepoRoot() + : ide().assetsRoot, + "queries", ); if (ide().runMode === "development") { this.disposables.push( fileSystem.watchDir(this.queryDir, () => { - this.reloadLanguageDefinitions(); + this.languageDefinitions.clear(); + this.notifier.notifyListeners(); }), ); } } - public async loadLanguage(languageId: string): Promise { - if (this.languageDefinitions.has(languageId)) { - return; - } - - const definition = - (await LanguageDefinition.create( - this.treeSitter, - this.fileSystem, - this.queryDir, - languageId, - )) ?? LANGUAGE_UNDEFINED; - - this.languageDefinitions.set(languageId, definition); - } - - private async reloadLanguageDefinitions(): Promise { - const languageIds = Array.from(this.languageDefinitions.keys()); - this.languageDefinitions.clear(); - await Promise.all( - languageIds.map((languageId) => this.loadLanguage(languageId)), - ); - this.notifier.notifyListeners(); - } - /** * Get a language definition for the given language id, if the language * has a new-style query definition, or return undefined if the language doesn't @@ -107,13 +74,14 @@ export class LanguageDefinitions { * the given language id doesn't have a new-style query definition */ get(languageId: string): LanguageDefinition | undefined { - const definition = this.languageDefinitions.get(languageId); + let definition = this.languageDefinitions.get(languageId); if (definition == null) { - throw new Error( - "Expected language definition entry missing for languageId " + - languageId, - ); + definition = + LanguageDefinition.create(this.treeSitter, this.queryDir, languageId) ?? + LANGUAGE_UNDEFINED; + + this.languageDefinitions.set(languageId, definition); } return definition === LANGUAGE_UNDEFINED ? undefined : definition; diff --git a/packages/cursorless-engine/src/languages/TreeSitterQuery/PredicateOperatorSchemaTypes.ts b/packages/cursorless-engine/src/languages/TreeSitterQuery/PredicateOperatorSchemaTypes.ts index 98053671214..5d76b6bea7d 100644 --- a/packages/cursorless-engine/src/languages/TreeSitterQuery/PredicateOperatorSchemaTypes.ts +++ b/packages/cursorless-engine/src/languages/TreeSitterQuery/PredicateOperatorSchemaTypes.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import z from "zod"; import { SchemaInputType, SchemaOutputType, diff --git a/packages/cursorless-engine/src/languages/TreeSitterQuery/QueryPredicateOperator.ts b/packages/cursorless-engine/src/languages/TreeSitterQuery/QueryPredicateOperator.ts index aa2436a170d..c7601ad2592 100644 --- a/packages/cursorless-engine/src/languages/TreeSitterQuery/QueryPredicateOperator.ts +++ b/packages/cursorless-engine/src/languages/TreeSitterQuery/QueryPredicateOperator.ts @@ -1,5 +1,5 @@ import { PredicateOperand } from "web-tree-sitter"; -import { z } from "zod"; +import z from "zod"; import { AcceptFunctionArgs, HasSchema, @@ -47,21 +47,6 @@ export abstract class QueryPredicateOperator { ...args: AcceptFunctionArgs>> ): boolean; - /** - * Whether it is ok for a node argument to be missing. If true, then the - * operator will just accept the pattern if the given node is missing. If - * false, then the operator will throw an error if the node is missing. - * - * This is useful if we want to set some flag on a node, but only if it's - * present. - * - * @returns A boolean indicating whether it is ok for a node argument to be - * missing. - */ - protected allowMissingNode(): boolean { - return false; - } - /** * Given a list of operands, return a predicate function that can be used to * test whether a given match satisfies the predicate. @@ -77,21 +62,8 @@ export abstract class QueryPredicateOperator { return result.success ? { success: true, - predicate: (match: MutableQueryMatch) => { - try { - const acceptArgs = this.constructAcceptArgs(result.data, match); - return this.run(...acceptArgs); - } catch (err) { - if ( - err instanceof CaptureNotFoundError && - this.allowMissingNode() - ) { - return true; - } - - throw err; - } - }, + predicate: (match: MutableQueryMatch) => + this.run(...this.constructAcceptArgs(result.data, match)), } : { success: false, @@ -117,7 +89,13 @@ export abstract class QueryPredicateOperator { ); if (capture == null) { - throw new CaptureNotFoundError(operand.name); + // FIXME: We could allow some predicates to be forgiving, + // because it's possible to have a capture on an optional nodeInfo. + // In that case we'd prob just return `true` if any capture was + // `null`, but we should check that the given capture name + // appears statically in the given pattern. But we don't yet + // have a use case so let's leave it for now. + throw new Error(`Could not find capture ${operand.name}`); } return capture; @@ -139,9 +117,3 @@ interface FailedPredicateResult { } type PredicateResult = SuccessfulPredicateResult | FailedPredicateResult; - -class CaptureNotFoundError extends Error { - constructor(operandName: string) { - super(`Could not find capture ${operandName}`); - } -} diff --git a/packages/cursorless-engine/src/languages/TreeSitterQuery/checkCaptureStartEnd.test.ts b/packages/cursorless-engine/src/languages/TreeSitterQuery/checkCaptureStartEnd.test.ts index 3d4afa5729a..8e273cb8ff9 100644 --- a/packages/cursorless-engine/src/languages/TreeSitterQuery/checkCaptureStartEnd.test.ts +++ b/packages/cursorless-engine/src/languages/TreeSitterQuery/checkCaptureStartEnd.test.ts @@ -1,7 +1,7 @@ import { Messages, Range } from "@cursorless/common"; import { QueryCapture } from "./QueryCapture"; import { checkCaptureStartEnd } from "./checkCaptureStartEnd"; -import assert from "assert"; +import assert = require("assert"); interface TestCase { name: string; diff --git a/packages/cursorless-engine/src/languages/TreeSitterQuery/constructZodErrorMessages.ts b/packages/cursorless-engine/src/languages/TreeSitterQuery/constructZodErrorMessages.ts index f2889b3d13c..41768b74cea 100644 --- a/packages/cursorless-engine/src/languages/TreeSitterQuery/constructZodErrorMessages.ts +++ b/packages/cursorless-engine/src/languages/TreeSitterQuery/constructZodErrorMessages.ts @@ -1,5 +1,5 @@ import { PredicateOperand } from "web-tree-sitter"; -import { z } from "zod"; +import z from "zod"; import { operandToString } from "./predicateToString"; export function constructZodErrorMessages( diff --git a/packages/cursorless-engine/src/languages/TreeSitterQuery/operatorArgumentSchemaTypes.ts b/packages/cursorless-engine/src/languages/TreeSitterQuery/operatorArgumentSchemaTypes.ts index bd068d453e2..db6a6eadd4a 100644 --- a/packages/cursorless-engine/src/languages/TreeSitterQuery/operatorArgumentSchemaTypes.ts +++ b/packages/cursorless-engine/src/languages/TreeSitterQuery/operatorArgumentSchemaTypes.ts @@ -1,4 +1,4 @@ -import { z } from "zod"; +import z from "zod"; import { assertTypesEqual } from "./assertTypesEqual"; import { PredicateOperand } from "web-tree-sitter"; diff --git a/packages/cursorless-engine/src/languages/TreeSitterQuery/parsePredicates.test.ts b/packages/cursorless-engine/src/languages/TreeSitterQuery/parsePredicates.test.ts index 0032a827335..31de8e33e5a 100644 --- a/packages/cursorless-engine/src/languages/TreeSitterQuery/parsePredicates.test.ts +++ b/packages/cursorless-engine/src/languages/TreeSitterQuery/parsePredicates.test.ts @@ -1,4 +1,4 @@ -import assert from "assert"; +import assert = require("assert"); import { parsePredicates } from "./parsePredicates"; import { PredicateResult } from "web-tree-sitter"; diff --git a/packages/cursorless-engine/src/languages/TreeSitterQuery/queryPredicateOperators.ts b/packages/cursorless-engine/src/languages/TreeSitterQuery/queryPredicateOperators.ts index 92177ace8ff..c812fbd09d6 100644 --- a/packages/cursorless-engine/src/languages/TreeSitterQuery/queryPredicateOperators.ts +++ b/packages/cursorless-engine/src/languages/TreeSitterQuery/queryPredicateOperators.ts @@ -1,5 +1,5 @@ -import { Range, adjustPosition } from "@cursorless/common"; -import { z } from "zod"; +import { Range } from "@cursorless/common"; +import z from "zod"; import { makeRangeFromPositions } from "../../util/nodeSelectors"; import { MutableQueryCapture } from "./QueryCapture"; import { QueryPredicateOperator } from "./QueryPredicateOperator"; @@ -19,6 +19,17 @@ class NotType extends QueryPredicateOperator { } } +/** + * A predicate operator that returns true if the nodes range is not empty. + */ +class NotEmpty extends QueryPredicateOperator { + name = "not-empty?" as const; + schema = z.tuple([q.node]); + run({ range }: MutableQueryCapture) { + return !range.isEmpty; + } +} + /** * A predicate operator that returns true if the node's parent is not of the * given type. For example, `(not-parent-type? @foo string)` will reject the @@ -139,45 +150,10 @@ class ShrinkToMatch extends QueryPredicateOperator { } } -/** - * A predicate operator that modifies the range of the match by trimming trailing whitespace, - * similar to the javascript trimEnd function. - */ -class TrimEnd extends QueryPredicateOperator { - name = "trim-end!" as const; - schema = z.tuple([q.node]); - - run(nodeInfo: MutableQueryCapture) { - const { document, range } = nodeInfo; - const text = document.getText(range); - const whitespaceLength = text.length - text.trimEnd().length; - nodeInfo.range = new Range( - range.start, - adjustPosition(document, range.end, -whitespaceLength), - ); - return true; - } -} - -/** - * Indicates that it is ok for multiple captures to have the same domain but - * different targets. For example, if we have the query `(#allow-multiple! - * @foo)`, then if we define the query so that `@foo` appears multiple times - * with the same domain but different targets, then the given domain will end up - * with multiple targets. The canonical example is `tags` in HTML / jsx. - * - * This operator is allowed to be applied to a capture that doesn't actually - * appear; ie we can make it so that we allow multiple if the capture appears in - * the pattern. - */ class AllowMultiple extends QueryPredicateOperator { name = "allow-multiple!" as const; schema = z.tuple([q.node]); - protected allowMissingNode(): boolean { - return true; - } - run(nodeInfo: MutableQueryCapture) { nodeInfo.allowMultiple = true; @@ -214,47 +190,15 @@ class InsertionDelimiter extends QueryPredicateOperator { } } -/** - * A predicate operator that sets the insertion delimiter of {@link nodeInfo} to - * either {@link insertionDelimiterConsequence} or - * {@link insertionDelimiterAlternative} depending on whether - * {@link conditionNodeInfo} is single or multiline, respectively. For example, - * - * ```scm - * (#single-or-multi-line-delimiter! @foo @bar ", " ",\n") - * ``` - * - * will set the insertion delimiter of the `@foo` capture to `", "` if the - * `@bar` capture is a single line and `",\n"` otherwise. - */ -class SingleOrMultilineDelimiter extends QueryPredicateOperator { - name = "single-or-multi-line-delimiter!" as const; - schema = z.tuple([q.node, q.node, q.string, q.string]); - - run( - nodeInfo: MutableQueryCapture, - conditionNodeInfo: MutableQueryCapture, - insertionDelimiterConsequence: string, - insertionDelimiterAlternative: string, - ) { - nodeInfo.insertionDelimiter = conditionNodeInfo.range.isSingleLine - ? insertionDelimiterConsequence - : insertionDelimiterAlternative; - - return true; - } -} - export const queryPredicateOperators = [ new Log(), new NotType(), - new TrimEnd(), + new NotEmpty(), new NotParentType(), new IsNthChild(), new ChildRange(), new ShrinkToMatch(), new AllowMultiple(), new InsertionDelimiter(), - new SingleOrMultilineDelimiter(), new HasMultipleChildrenOfType(), ]; diff --git a/packages/cursorless-engine/src/languages/TreeSitterQuery/rewriteStartOfEndOf.test.ts b/packages/cursorless-engine/src/languages/TreeSitterQuery/rewriteStartOfEndOf.test.ts index cc8e99c789e..57911d796ce 100644 --- a/packages/cursorless-engine/src/languages/TreeSitterQuery/rewriteStartOfEndOf.test.ts +++ b/packages/cursorless-engine/src/languages/TreeSitterQuery/rewriteStartOfEndOf.test.ts @@ -2,7 +2,7 @@ import { Range, TextDocument } from "@cursorless/common"; import { SyntaxNode } from "web-tree-sitter"; import { MutableQueryCapture } from "./QueryCapture"; import { rewriteStartOfEndOf } from "./rewriteStartOfEndOf"; -import assert from "assert"; +import assert = require("assert"); type NameRange = Pick; diff --git a/packages/cursorless-engine/src/languages/TreeSitterQuery/validateQueryCaptures.test.ts b/packages/cursorless-engine/src/languages/TreeSitterQuery/validateQueryCaptures.test.ts deleted file mode 100644 index b3a803e95a2..00000000000 --- a/packages/cursorless-engine/src/languages/TreeSitterQuery/validateQueryCaptures.test.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { FakeIDE } from "@cursorless/common"; -import assert from "assert"; -import { injectIde } from "../../singletons/ide.singleton"; -import { validateQueryCaptures } from "./validateQueryCaptures"; - -const testCases: { name: string; isOk: boolean; content: string }[] = [ - { - name: "Scope captures", - isOk: true, - content: "(if_statement) @statement @ifStatement @comment", - }, - { - name: "Relationships", - isOk: true, - content: "(if_statement) @statement.domain @statement.interior @_.removal", - }, - { - name: "Position captures", - isOk: true, - content: - "(if_statement) @statement.startOf @statement.leading.startOf @statement.trailing.endOf", - }, - { - name: "Range captures", - isOk: true, - content: - "(if_statement) @statement.start @statement.start.endOf @statement.removal.start @statement.interior.start.endOf", - }, - { - name: "Dummy capture", - isOk: true, - content: "(if_statement) @_foo", - }, - { - name: "No range dummy relationships", - isOk: false, - content: "(if_statement) @_foo.start @_foo.startOf", - }, - { - name: "Text fragment", - isOk: true, - content: "(comment) @textFragment", - }, - { - name: "Iteration", - isOk: true, - content: "(document) @statement.iteration @statement.iteration.domain", - }, - { - name: "Unknown capture in comment", - isOk: true, - content: ";; (if_statement) @unknown", - }, - { - name: "Unknown capture", - isOk: false, - content: "(if_statement) @unknown", - }, - { - name: "Unknown relationship", - isOk: false, - content: "(if_statement) @statement.unknown", - }, - { - name: "Single @", - isOk: false, - content: "(if_statement) @", - }, - { - name: "Single wildcard", - isOk: false, - content: "(if_statement) @_", - }, - { - name: "Wildcard start", - isOk: false, - content: "(if_statement) @_.start", - }, - { - name: "Leading start", - isOk: false, - content: "(if_statement) @statement.leading.start", - }, - { - name: "Text fragment removal", - isOk: false, - content: "(comment) @textFragment.removal", - }, -]; - -suite("validateQueryCaptures", function () { - suiteSetup(() => { - injectIde(new FakeIDE()); - }); - - for (const testCase of testCases) { - const name = [testCase.isOk ? "OK" : "Error", testCase.name].join(": "); - - test(name, () => { - const runTest = () => - validateQueryCaptures(testCase.name, testCase.content); - - if (testCase.isOk) { - assert.doesNotThrow(runTest); - } else { - assert.throws(runTest); - } - }); - } -}); diff --git a/packages/cursorless-engine/src/languages/TreeSitterQuery/validateQueryCaptures.ts b/packages/cursorless-engine/src/languages/TreeSitterQuery/validateQueryCaptures.ts deleted file mode 100644 index ce3e91b58a8..00000000000 --- a/packages/cursorless-engine/src/languages/TreeSitterQuery/validateQueryCaptures.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { showError, simpleScopeTypeTypes } from "@cursorless/common"; -import { ide } from "../../singletons/ide.singleton"; - -const wildcard = "_"; -const textFragment = "textFragment"; -const captureNames = [wildcard, ...simpleScopeTypeTypes]; - -const positionRelationships = ["prefix", "leading", "trailing"]; -const positionSuffixes = ["startOf", "endOf"]; - -const rangeRelationships = [ - "domain", - "removal", - "interior", - "iteration", - "iteration.domain", -]; -const rangeSuffixes = [ - "start", - "end", - "start.startOf", - "start.endOf", - "end.startOf", - "end.endOf", -]; - -const allowedCaptures = new Set(); - -allowedCaptures.add(textFragment); - -for (const suffix of rangeSuffixes) { - allowedCaptures.add(`${textFragment}.${suffix}`); -} - -for (const captureName of captureNames) { - // Wildcard is not allowed by itself without a relationship - if (captureName !== wildcard) { - // eg: statement - allowedCaptures.add(captureName); - - // eg: statement.start | statement.start.endOf - for (const suffix of rangeSuffixes) { - allowedCaptures.add(`${captureName}.${suffix}`); - } - } - - for (const relationship of positionRelationships) { - // eg: statement.leading - allowedCaptures.add(`${captureName}.${relationship}`); - - for (const suffix of positionSuffixes) { - // eg: statement.leading.endOf - allowedCaptures.add(`${captureName}.${relationship}.${suffix}`); - } - } - - for (const relationship of rangeRelationships) { - // eg: statement.domain - allowedCaptures.add(`${captureName}.${relationship}`); - - for (const suffix of rangeSuffixes) { - // eg: statement.domain.start | statement.domain.start.endOf - allowedCaptures.add(`${captureName}.${relationship}.${suffix}`); - } - } -} - -// Not a comment. ie line is not starting with `;;` -// Capture starts with `@` and is followed by words and/or dots -const capturePattern = new RegExp(`^(?!;;).*@([\\w.]*)`, "gm"); - -export function validateQueryCaptures(file: string, rawQuery: string): void { - const matches = rawQuery.matchAll(capturePattern); - - const errors: string[] = []; - - for (const match of matches) { - const captureName = match[1]; - - if ( - captureName.length > 1 && - !captureName.includes(".") && - captureName.startsWith("_") - ) { - // Allow @_foo dummy captures to use for referring to in query predicates - continue; - } - - if (!allowedCaptures.has(captureName)) { - const lineNumber = match.input!.slice(0, match.index!).split("\n").length; - errors.push(`${file}(${lineNumber}) invalid capture '@${captureName}'.`); - } - } - - if (errors.length === 0) { - return; - } - - const message = errors.join("\n"); - - showError( - ide().messages, - "validateQueryCaptures.invalidCaptureName", - message, - ); - - if (ide().runMode === "test") { - throw new Error(message); - } -} diff --git a/packages/cursorless-engine/src/languages/clojure.ts b/packages/cursorless-engine/src/languages/clojure.ts index 9f1cb7338bd..bd00fb1d3b3 100644 --- a/packages/cursorless-engine/src/languages/clojure.ts +++ b/packages/cursorless-engine/src/languages/clojure.ts @@ -58,7 +58,7 @@ function indexNodeFinder( const nodeIndex = valueNodes.findIndex(({ id }) => id === node.id); if (nodeIndex === -1) { - // FIXME: In the future we might conceivably try to handle saying "take + // TODO: In the future we might conceivably try to handle saying "take // item" when the selection is inside a comment between the key and value return null; } @@ -154,7 +154,7 @@ const nodeMatchers: Partial< ), value: matcher(mapParityNodeFinder(1)), - // FIXME: Handle formal parameters + // TODO: Handle formal parameters argumentOrParameter: matcher( indexNodeFinder(patternFinder(functionCallPattern), (nodeIndex: number) => nodeIndex !== 0 ? nodeIndex : -1, @@ -176,7 +176,7 @@ const nodeMatchers: Partial< functionName: functionNameMatcher, - // FIXME: Handle `let` declarations, defs, etc + // TODO: Handle `let` declarations, defs, etc name: functionNameMatcher, anonymousFunction: cascadingMatcher( diff --git a/packages/cursorless-engine/src/languages/cpp.ts b/packages/cursorless-engine/src/languages/cpp.ts index d3ef711144e..21266bb82c3 100644 --- a/packages/cursorless-engine/src/languages/cpp.ts +++ b/packages/cursorless-engine/src/languages/cpp.ts @@ -80,7 +80,7 @@ const nodeMatchers: Partial< "function_definition[declarator][declarator][namespace]", // void ClassName::method() {} ], ifStatement: "if_statement", - ["private.switchStatementSubject"]: "switch_statement[condition][value]", + switchStatementSubject: "switch_statement[condition][value]", string: "string_literal", comment: "comment", anonymousFunction: "lambda_expression", diff --git a/packages/cursorless-engine/src/languages/csharp.ts b/packages/cursorless-engine/src/languages/csharp.ts index e453e8ee4c2..ade8dc043b3 100644 --- a/packages/cursorless-engine/src/languages/csharp.ts +++ b/packages/cursorless-engine/src/languages/csharp.ts @@ -148,7 +148,7 @@ const nodeMatchers: Partial< conditionMatcher("*[condition]"), patternMatcher("while_statement[0]"), ), - ["private.switchStatementSubject"]: [ + switchStatementSubject: [ "switch_statement.tuple_expression!", "switch_statement[value]", ], diff --git a/packages/cursorless-engine/src/languages/elseIfExtractor.ts b/packages/cursorless-engine/src/languages/elseIfExtractor.ts index 1cf9db0f86b..be80cf7f21d 100644 --- a/packages/cursorless-engine/src/languages/elseIfExtractor.ts +++ b/packages/cursorless-engine/src/languages/elseIfExtractor.ts @@ -57,14 +57,16 @@ export function elseIfExtractor(): SelectionExtractor { } // If we get here, we are part of a bigger `if` statement; extend our - // content range past our leading `else` keyword. + // removal range past our leading `else` keyword. const { selection } = contentRange; return { - selection: new Selection( - positionFromPoint(parent.child(0)!.startPosition), - selection.end, - ), - context: {}, + selection, + context: { + removalRange: new Selection( + positionFromPoint(parent.child(0)!.startPosition), + selection.end, + ), + }, }; }; } diff --git a/packages/cursorless-engine/src/languages/getNodeMatcher.ts b/packages/cursorless-engine/src/languages/getNodeMatcher.ts index 39aee32b25c..39e0b1b22d0 100644 --- a/packages/cursorless-engine/src/languages/getNodeMatcher.ts +++ b/packages/cursorless-engine/src/languages/getNodeMatcher.ts @@ -13,7 +13,9 @@ import { LegacyLanguageId } from "./LegacyLanguageId"; import cpp from "./cpp"; import csharp from "./csharp"; import go from "./go"; +import { patternMatchers as html } from "./html"; import java from "./java"; +import { patternMatchers as json } from "./json"; import latex from "./latex"; import markdown from "./markdown"; import php from "./php"; @@ -22,6 +24,7 @@ import { patternMatchers as ruby } from "./ruby"; import rust from "./rust"; import scala from "./scala"; import { patternMatchers as scss } from "./scss"; +import { patternMatchers as typescript } from "./typescript"; export function getNodeMatcher( languageId: string, @@ -49,7 +52,7 @@ export function getNodeMatcher( export const languageMatchers: Record< LegacyLanguageId, - Partial> + Record > = { c: cpp, cpp, @@ -57,7 +60,12 @@ export const languageMatchers: Record< csharp, clojure, go, + html, java, + javascript: typescript, + javascriptreact: typescript, + json, + jsonc: json, latex, markdown, php, @@ -66,6 +74,9 @@ export const languageMatchers: Record< scala, scss, rust, + typescript, + typescriptreact: typescript, + xml: html, }; function matcherIncludeSiblings(matcher: NodeMatcher): NodeMatcher { diff --git a/packages/cursorless-engine/src/languages/getTextFragmentExtractor.ts b/packages/cursorless-engine/src/languages/getTextFragmentExtractor.ts index cc7eda0baeb..07d9035a1b2 100644 --- a/packages/cursorless-engine/src/languages/getTextFragmentExtractor.ts +++ b/packages/cursorless-engine/src/languages/getTextFragmentExtractor.ts @@ -5,8 +5,12 @@ import { notSupported } from "../util/nodeMatchers"; import { getNodeInternalRange, getNodeRange } from "../util/nodeSelectors"; import { LegacyLanguageId } from "./LegacyLanguageId"; import { getNodeMatcher } from "./getNodeMatcher"; +import { stringTextFragmentExtractor as htmlStringTextFragmentExtractor } from "./html"; +import { stringTextFragmentExtractor as jsonStringTextFragmentExtractor } from "./json"; +import { stringTextFragmentExtractor as phpStringTextFragmentExtractor } from "./php"; import { stringTextFragmentExtractor as rubyStringTextFragmentExtractor } from "./ruby"; import { stringTextFragmentExtractor as scssStringTextFragmentExtractor } from "./scss"; +import { stringTextFragmentExtractor as typescriptStringTextFragmentExtractor } from "./typescript"; export type TextFragmentExtractor = ( node: SyntaxNode, @@ -125,7 +129,36 @@ const textFragmentExtractors: Record< "css", scssStringTextFragmentExtractor, ), + html: constructDefaultTextFragmentExtractor( + "html", + htmlStringTextFragmentExtractor, + ), + java: constructDefaultTextFragmentExtractor( + "java", + constructHackedStringTextFragmentExtractor("java"), + ), + javascript: constructDefaultTextFragmentExtractor( + "javascript", + typescriptStringTextFragmentExtractor, + ), + javascriptreact: constructDefaultTextFragmentExtractor( + "javascriptreact", + typescriptStringTextFragmentExtractor, + ), + jsonc: constructDefaultTextFragmentExtractor( + "jsonc", + jsonStringTextFragmentExtractor, + ), + json: constructDefaultTextFragmentExtractor( + "json", + jsonStringTextFragmentExtractor, + ), latex: fullDocumentTextFragmentExtractor, + markdown: fullDocumentTextFragmentExtractor, + php: constructDefaultTextFragmentExtractor( + "php", + phpStringTextFragmentExtractor, + ), ruby: constructDefaultTextFragmentExtractor( "ruby", rubyStringTextFragmentExtractor, @@ -139,4 +172,16 @@ const textFragmentExtractors: Record< scssStringTextFragmentExtractor, ), rust: constructDefaultTextFragmentExtractor("rust"), + typescript: constructDefaultTextFragmentExtractor( + "typescript", + typescriptStringTextFragmentExtractor, + ), + typescriptreact: constructDefaultTextFragmentExtractor( + "typescriptreact", + typescriptStringTextFragmentExtractor, + ), + xml: constructDefaultTextFragmentExtractor( + "xml", + htmlStringTextFragmentExtractor, + ), }; diff --git a/packages/cursorless-engine/src/languages/html.ts b/packages/cursorless-engine/src/languages/html.ts new file mode 100644 index 00000000000..2ca3de39d6e --- /dev/null +++ b/packages/cursorless-engine/src/languages/html.ts @@ -0,0 +1,59 @@ +import type { SyntaxNode } from "web-tree-sitter"; +import { SimpleScopeTypeType } from "@cursorless/common"; +import { NodeMatcherAlternative, SelectionWithEditor } from "../typings/Types"; +import { typedNodeFinder } from "../util/nodeFinders"; +import { + createPatternMatchers, + leadingMatcher, + matcher, + patternMatcher, +} from "../util/nodeMatchers"; +import { xmlElementExtractor, getNodeRange } from "../util/nodeSelectors"; + +const attribute = "*?.attribute!"; + +const getStartTag = patternMatcher(`*?.start_tag!`); +const getEndTag = patternMatcher(`*?.end_tag!`); + +const getTags = (selection: SelectionWithEditor, node: SyntaxNode) => { + const startTag = getStartTag(selection, node); + const endTag = getEndTag(selection, node); + return startTag != null && endTag != null ? startTag.concat(endTag) : null; +}; + +const nodeMatchers: Partial< + Record +> = { + xmlElement: matcher( + typedNodeFinder("element", "script_element", "style_element"), + xmlElementExtractor, + ), + xmlBothTags: getTags, + xmlStartTag: getStartTag, + xmlEndTag: getEndTag, + attribute: attribute, + collectionItem: attribute, + name: "*?.tag_name!", + collectionKey: ["*?.attribute_name!"], + value: leadingMatcher( + ["*?.quoted_attribute_value!.attribute_value", "*?.attribute_value!"], + ["="], + ), + string: "quoted_attribute_value", + comment: "comment", +}; + +export const patternMatchers = createPatternMatchers(nodeMatchers); + +const textFragmentTypes = ["attribute_value", "raw_text", "text"]; + +export function stringTextFragmentExtractor( + node: SyntaxNode, + _selection: SelectionWithEditor, +) { + if (textFragmentTypes.includes(node.type)) { + return getNodeRange(node); + } + + return null; +} diff --git a/packages/cursorless-engine/src/languages/java.ts b/packages/cursorless-engine/src/languages/java.ts index 990ce65bba3..1be9e7909ef 100644 --- a/packages/cursorless-engine/src/languages/java.ts +++ b/packages/cursorless-engine/src/languages/java.ts @@ -1,12 +1,122 @@ -import { argumentMatcher, createPatternMatchers } from "../util/nodeMatchers"; +import { + createPatternMatchers, + argumentMatcher, + leadingMatcher, + conditionMatcher, + trailingMatcher, + matcher, + cascadingMatcher, +} from "../util/nodeMatchers"; +import { childRangeSelector } from "../util/nodeSelectors"; +import { patternFinder } from "../util/nodeFinders"; -import { SimpleScopeTypeType } from "@cursorless/common"; import { NodeMatcherAlternative } from "../typings/Types"; +import { SimpleScopeTypeType } from "@cursorless/common"; + +// Generated by the following command: +// > curl https://raw.githubusercontent.com/tree-sitter/tree-sitter-java/master/src/node-types.json | jq '[.[] | select(.type == "statement" or .type == "declaration") | .subtypes[].type]' +const STATEMENT_TYPES = [ + "annotation_type_declaration", + "class_declaration", + "enum_declaration", + "import_declaration", + "interface_declaration", + "module_declaration", + "package_declaration", + "assert_statement", + "break_statement", + "continue_statement", + "declaration", + "do_statement", + "enhanced_for_statement", + "expression_statement", + "for_statement", + "if_statement", + "labeled_statement", + "local_variable_declaration", + "return_statement", + "switch_expression", + "synchronized_statement", + "throw_statement", + "try_statement", + "try_with_resources_statement", + "while_statement", + "yield_statement", + + // exceptions + // ";", + // "block", + "switch_statement", + "method_declaration", + "constructor_declaration", + "field_declaration", +]; const nodeMatchers: Partial< Record > = { + statement: STATEMENT_TYPES, + class: "class_declaration", + className: "class_declaration[name]", + ifStatement: "if_statement", + string: "string_literal", + comment: ["line_comment", "block_comment", "comment"], + anonymousFunction: "lambda_expression", + list: "array_initializer", + functionCall: [ + "method_invocation", + "object_creation_expression", + "explicit_constructor_invocation", + ], + functionCallee: cascadingMatcher( + matcher( + patternFinder("method_invocation"), + childRangeSelector(["argument_list"], []), + ), + matcher( + patternFinder("object_creation_expression"), + childRangeSelector(["argument_list"], []), + ), + matcher( + patternFinder("explicit_constructor_invocation"), + childRangeSelector(["argument_list", ";"], []), + ), + ), + map: "block", + name: [ + "*[declarator][name]", + "assignment_expression[left]", + "*[name]", + "formal_parameter.identifier!", + ], + namedFunction: ["method_declaration", "constructor_declaration"], + type: trailingMatcher([ + "generic_type.type_arguments.type_identifier", + "generic_type.type_identifier", + "generic_type.scoped_type_identifier.type_identifier", + "type_identifier", + "local_variable_declaration[type]", + "array_creation_expression[type]", + "formal_parameter[type]", + "method_declaration[type]", + ]), + functionName: [ + "method_declaration.identifier!", + "constructor_declaration.identifier!", + ], + value: leadingMatcher( + [ + "*[declarator][value]", + "assignment_expression[right]", + "return_statement[0]", + "*[value]", + ], + ["=", "+=", "-=", "*=", "/=", "%=", "&=", "|=", "^=", "<<=", ">>="], + ), + condition: conditionMatcher("*[condition]"), argumentOrParameter: argumentMatcher("formal_parameters", "argument_list"), + branch: ["switch_block_statement_group", "switch_rule"], + switchStatementSubject: "switch_expression[condition][0]", }; export default createPatternMatchers(nodeMatchers); diff --git a/packages/cursorless-engine/src/languages/json.ts b/packages/cursorless-engine/src/languages/json.ts new file mode 100644 index 00000000000..3436b8c708a --- /dev/null +++ b/packages/cursorless-engine/src/languages/json.ts @@ -0,0 +1,32 @@ +import type { SyntaxNode } from "web-tree-sitter"; +import { SimpleScopeTypeType } from "@cursorless/common"; +import { NodeMatcherAlternative, SelectionWithEditor } from "../typings/Types"; +import { + createPatternMatchers, + leadingMatcher, + trailingMatcher, +} from "../util/nodeMatchers"; +import { getNodeRange } from "../util/nodeSelectors"; + +const nodeMatchers: Partial< + Record +> = { + map: "object", + list: "array", + string: "string", + collectionKey: trailingMatcher(["pair[key]"], [":"]), + value: leadingMatcher(["*[value]"], [":"]), +}; + +export const patternMatchers = createPatternMatchers(nodeMatchers); + +export function stringTextFragmentExtractor( + node: SyntaxNode, + _selection: SelectionWithEditor, +) { + if (node.type === "string_content") { + return getNodeRange(node); + } + + return null; +} diff --git a/packages/cursorless-engine/src/languages/markdown.ts b/packages/cursorless-engine/src/languages/markdown.ts index 9ccd16ddc15..3b4ffa56f1a 100644 --- a/packages/cursorless-engine/src/languages/markdown.ts +++ b/packages/cursorless-engine/src/languages/markdown.ts @@ -1,11 +1,48 @@ -import { SimpleScopeTypeType, TextEditor } from "@cursorless/common"; +import { Range, Selection, TextEditor } from "@cursorless/common"; import type { SyntaxNode } from "web-tree-sitter"; -import { NodeFinder, NodeMatcherAlternative } from "../typings/Types"; +import { getMatchesInRange } from "../util/getMatchesInRange"; +import { SimpleScopeTypeType } from "@cursorless/common"; +import { + NodeFinder, + NodeMatcherAlternative, + SelectionWithContext, +} from "../typings/Types"; import { leadingSiblingNodeFinder, patternFinder } from "../util/nodeFinders"; import { createPatternMatchers, matcher } from "../util/nodeMatchers"; -import { extendUntilNextMatchingSiblingOrLast } from "../util/nodeSelectors"; +import { + extendUntilNextMatchingSiblingOrLast, + getNodeRange, + selectWithLeadingDelimiter, +} from "../util/nodeSelectors"; import { shrinkRangeToFitContent } from "../util/selectionUtils"; +/** + * Given a node representing the text of a section heading (without leading + * marker), will return the content range as the text without the leading + * whitespace, and the outside range includes the leading marker, so that + * "chuck name" deletes the heading + * @param editor The editor containing the node + * @param node The node to extract from; will be the content of the heading without the leading marker + * @returns The selection with context + */ +function nameExtractor( + editor: TextEditor, + node: SyntaxNode, +): SelectionWithContext { + const range = getNodeRange(node); + const contentRange = range.isEmpty + ? range + : range.with(range.start.translate(0, 1)); + const removalRange = getNodeRange(node.parent!); + + return { + selection: new Selection(contentRange.start, contentRange.end), + context: { + removalRange, + }, + }; +} + const HEADING_MARKER_TYPES = [ "atx_h1_marker", "atx_h2_marker", @@ -61,9 +98,54 @@ function sectionMatcher(...patterns: string[]) { return matcher(leadingSiblingNodeFinder(finder), sectionExtractor); } +const itemLeadingDelimiterExtractor = selectWithLeadingDelimiter( + "list_marker_parenthesis", + "list_marker_dot", + "list_marker_star", + "list_marker_minus", + "list_marker_plus", +); + +function excludeTrailingNewline(editor: TextEditor, range: Range) { + const matches = getMatchesInRange(/\r?\n\s*$/g, editor, range); + + if (matches.length > 0) { + return new Range(range.start, matches[0].start); + } + + return range; +} + +function itemExtractor( + editor: TextEditor, + node: SyntaxNode, +): SelectionWithContext { + const { selection } = itemLeadingDelimiterExtractor(editor, node); + const line = editor.document.lineAt(selection.start); + const leadingRange = new Range(line.range.start, selection.start); + const indent = editor.document.getText(leadingRange); + + return { + context: { + containingListDelimiter: `\n${indent}`, + leadingDelimiterRange: leadingRange, + }, + selection: excludeTrailingNewline(editor, selection).toSelection( + selection.isReversed, + ), + }; +} + const nodeMatchers: Partial< Record > = { + list: ["list"], + comment: "html_block", + name: matcher( + leadingSiblingNodeFinder(patternFinder("atx_heading[heading_content]")), + nameExtractor, + ), + collectionItem: matcher(patternFinder("list_item.paragraph!"), itemExtractor), section: sectionMatcher("atx_heading"), sectionLevelOne: sectionMatcher("atx_heading.atx_h1_marker"), sectionLevelTwo: sectionMatcher("atx_heading.atx_h2_marker"), diff --git a/packages/cursorless-engine/src/languages/php.ts b/packages/cursorless-engine/src/languages/php.ts index 9a195381081..c710a9b50c3 100644 --- a/packages/cursorless-engine/src/languages/php.ts +++ b/packages/cursorless-engine/src/languages/php.ts @@ -1,7 +1,11 @@ import { Selection, TextEditor } from "@cursorless/common"; import type { SyntaxNode } from "web-tree-sitter"; import { SimpleScopeTypeType } from "@cursorless/common"; -import { NodeMatcherAlternative, SelectionWithContext } from "../typings/Types"; +import { + NodeMatcherAlternative, + SelectionWithContext, + SelectionWithEditor, +} from "../typings/Types"; import { patternFinder } from "../util/nodeFinders"; import { argumentMatcher, @@ -13,6 +17,40 @@ import { } from "../util/nodeMatchers"; import { getNodeRange } from "../util/nodeSelectors"; +// Generated by the following command: +// > curl https://raw.githubusercontent.com/tree-sitter/tree-sitter-php/0ce134234214427b6aeb2735e93a307881c6cd6f/src/node-types.json \ +// | jq '[.[] | select(.type == "_statement") | .subtypes[].type]' +const STATEMENT_TYPES = [ + "break_statement", + "class_declaration", + "compound_statement", + "const_declaration", + "continue_statement", + "declare_statement", + "do_statement", + "echo_statement", + "empty_statement", + "enum_declaration", + "expression_statement", + "for_statement", + "foreach_statement", + "function_definition", + "function_static_declaration", + "global_declaration", + "goto_statement", + "if_statement", + "interface_declaration", + "named_label_statement", + "namespace_definition", + "namespace_use_declaration", + "return_statement", + "switch_statement", + "trait_declaration", + "try_statement", + "unset_statement", + "while_statement", +]; + // Taken from https://www.php.net/manual/en/language.operators.assignment.php const assignmentOperators = [ "=", @@ -63,17 +101,38 @@ function castTypeExtractor( const nodeMatchers: Partial< Record > = { + statement: STATEMENT_TYPES, + ifStatement: "if_statement", + class: "class_declaration", + className: "class_declaration[name]", name: [ "assignment_expression[left]", "class_declaration[name]", "function_definition[name]", "method_declaration[name]", ], + comment: "comment", + string: "string", type: cascadingMatcher( trailingMatcher(["~cast_expression[type]"]), matcher(patternFinder("cast_expression[type]"), castTypeExtractor), ), + namedFunction: trailingMatcher( + [ + "function_definition", + "assignment_expression.anonymous_function_creation_expression", + "assignment_expression.arrow_function", + ], + [";"], + ), + anonymousFunction: [ + "anonymous_function_creation_expression", + "arrow_function", + ], + functionCall: ["function_call_expression", "object_creation_expression"], + functionName: ["function_definition[name]", "method_declaration[name]"], + value: leadingMatcher( [ "array_element_initializer[1]", @@ -90,3 +149,14 @@ const nodeMatchers: Partial< argumentOrParameter: argumentMatcher("arguments", "formal_parameters"), }; export default createPatternMatchers(nodeMatchers); + +export function stringTextFragmentExtractor( + node: SyntaxNode, + _selection: SelectionWithEditor, +) { + if (node.type === "string") { + return getNodeRange(node); + } + + return null; +} diff --git a/packages/cursorless-engine/src/languages/python.ts b/packages/cursorless-engine/src/languages/python.ts index 041d2651709..4ee79dd2cb0 100644 --- a/packages/cursorless-engine/src/languages/python.ts +++ b/packages/cursorless-engine/src/languages/python.ts @@ -1,17 +1,24 @@ -import { Selection, SimpleScopeTypeType } from "@cursorless/common"; +import { Selection } from "@cursorless/common"; import type { SyntaxNode } from "web-tree-sitter"; +import { SimpleScopeTypeType } from "@cursorless/common"; import { NodeFinder, NodeMatcherAlternative } from "../typings/Types"; import { argumentNodeFinder, patternFinder } from "../util/nodeFinders"; import { argumentMatcher, cascadingMatcher, + conditionMatcher, createPatternMatchers, + leadingMatcher, matcher, + patternMatcher, + trailingMatcher, } from "../util/nodeMatchers"; import { argumentSelectionExtractor, childRangeSelector, } from "../util/nodeSelectors"; +import { branchMatcher } from "./branchMatcher"; +import { ternaryBranchMatcher } from "./ternaryBranchMatcher"; export const getTypeNode = (node: SyntaxNode) => node.children.find((child) => child.type === "type") ?? null; @@ -43,19 +50,54 @@ const nodeMatchers: Partial< itemNodeFinder("import_from_statement", "dotted_name", true), argumentSelectionExtractor(), ), - matcher( - itemNodeFinder("import_statement", "dotted_name", false), - argumentSelectionExtractor(), - ), matcher( itemNodeFinder("global_statement", "identifier"), argumentSelectionExtractor(), ), ), + collectionKey: trailingMatcher(["pair[key]"], [":"]), + ifStatement: "if_statement", + anonymousFunction: "lambda?.lambda", + functionCall: "call", + functionCallee: "call[function]", + condition: cascadingMatcher( + conditionMatcher("*[condition]"), + + // Comprehensions and match statements + leadingMatcher(["*.if_clause![0]"], ["if"]), + + // Ternaries + patternMatcher("conditional_expression[1]"), + ), + type: leadingMatcher( + ["function_definition[return_type]", "*[type]"], + [":", "->"], + ), + name: [ + "assignment[left]", + "augmented_assignment[left]", + "typed_parameter.identifier!", + "parameters.identifier!", + "*[name]", + ], argumentOrParameter: cascadingMatcher( argumentMatcher("parameters", "argument_list"), matcher(patternFinder("call.generator_expression!"), childRangeSelector()), ), + branch: cascadingMatcher( + patternMatcher("case_clause"), + branchMatcher("if_statement", ["else_clause", "elif_clause"]), + branchMatcher("while_statement", ["else_clause"]), + branchMatcher("for_statement", ["else_clause"]), + branchMatcher("try_statement", [ + "except_clause", + "finally_clause", + "else_clause", + "except_group_clause", + ]), + ternaryBranchMatcher("conditional_expression", [0, 2]), + ), + switchStatementSubject: "match_statement[subject]", }; export default createPatternMatchers(nodeMatchers); diff --git a/packages/cursorless-engine/src/languages/rust.ts b/packages/cursorless-engine/src/languages/rust.ts index 0efd87ec131..8d2140434df 100644 --- a/packages/cursorless-engine/src/languages/rust.ts +++ b/packages/cursorless-engine/src/languages/rust.ts @@ -241,7 +241,7 @@ const nodeMatchers: Partial< matcher(patternFinder("else_clause"), elseExtractor("if_expression")), matcher(patternFinder("if_expression"), elseIfExtractor()), ), - ["private.switchStatementSubject"]: "match_expression[value]", + switchStatementSubject: "match_expression[value]", }; export default createPatternMatchers(nodeMatchers); diff --git a/packages/cursorless-engine/src/languages/scala.ts b/packages/cursorless-engine/src/languages/scala.ts index bc7ef6a452b..81ac8efca1e 100644 --- a/packages/cursorless-engine/src/languages/scala.ts +++ b/packages/cursorless-engine/src/languages/scala.ts @@ -44,7 +44,7 @@ const nodeMatchers: Partial< }), ), - ["private.switchStatementSubject"]: "match_expression[value]", + switchStatementSubject: "match_expression[value]", name: ["*[name]", "*[pattern]"], functionName: "function_definition[name]", diff --git a/packages/cursorless-engine/src/languages/typescript.ts b/packages/cursorless-engine/src/languages/typescript.ts new file mode 100644 index 00000000000..8498028e4d4 --- /dev/null +++ b/packages/cursorless-engine/src/languages/typescript.ts @@ -0,0 +1,274 @@ +import { SimpleScopeTypeType } from "@cursorless/common"; +import type { SyntaxNode } from "web-tree-sitter"; +import { + NodeMatcher, + NodeMatcherAlternative, + SelectionWithEditor, +} from "../typings/Types"; +import { patternFinder } from "../util/nodeFinders"; +import { + argumentMatcher, + cascadingMatcher, + conditionMatcher, + createPatternMatchers, + matcher, + patternMatcher, + trailingMatcher, +} from "../util/nodeMatchers"; +import { + childRangeSelector, + extendForwardPastOptional, + getNodeInternalRange, + getNodeRange, + pairSelectionExtractor, + selectWithLeadingDelimiter, + simpleSelectionExtractor, + unwrapSelectionExtractor, +} from "../util/nodeSelectors"; +import { branchMatcher } from "./branchMatcher"; +import { elseExtractor, elseIfExtractor } from "./elseIfExtractor"; +import { ternaryBranchMatcher } from "./ternaryBranchMatcher"; + +// Generated by the following command: +// > curl https://raw.githubusercontent.com/tree-sitter/tree-sitter-typescript/4c20b54771e4b390ee058af2930feb2cd55f2bf8/typescript/src/node-types.json \ +// | jq '[.[] | select(.type == "statement" or .type == "declaration") | .subtypes[].type]' +const STATEMENT_TYPES = [ + "abstract_class_declaration", + "ambient_declaration", + "break_statement", + "class_declaration", + "continue_statement", + "debugger_statement", + "declaration", + "do_statement", + "empty_statement", + "enum_declaration", + "export_statement", + "expression_statement", + "for_in_statement", + "for_statement", + "function_declaration", + "function_signature", + "generator_function_declaration", + "if_statement", + "import_alias", + "import_statement", + "interface_declaration", + "internal_module", + "labeled_statement", + "lexical_declaration", + "module", + "return_statement", + // "statement_block", This is disabled since we want the whole statement and not just the block + "switch_statement", + "throw_statement", + "try_statement", + "type_alias_declaration", + "variable_declaration", + "while_statement", + "with_statement", +]; + +function typeMatcher(): NodeMatcher { + const delimiterSelector = selectWithLeadingDelimiter(":"); + return function (selection: SelectionWithEditor, node: SyntaxNode) { + if ( + node.parent?.type === "new_expression" && + node.type !== "new" && + node.type !== "arguments" + ) { + const identifierNode = node.parent.children.find( + (n) => n.type === "identifier", + ); + const argsNode = node.parent.children.find( + (n) => n.type === "type_arguments", + ); + if (identifierNode && argsNode) { + return [ + { + node, + selection: pairSelectionExtractor( + selection.editor, + identifierNode, + argsNode, + ), + }, + ]; + } else if (identifierNode) { + return [ + { + node: identifierNode, + selection: simpleSelectionExtractor( + selection.editor, + identifierNode, + ), + }, + ]; + } + } + + const typeAnnotationNode = node.children.find((child) => + ["type_annotation", "opting_type_annotation"].includes(child.type), + ); + const targetNode = typeAnnotationNode?.lastChild; + + if (targetNode) { + return [ + { + node: targetNode, + selection: delimiterSelector(selection.editor, targetNode), + }, + ]; + } + return null; + }; +} + +function valueMatcher() { + const pFinder = patternFinder( + "assignment_expression[right]", + "augmented_assignment_expression[right]", + "*[value]", + "shorthand_property_identifier", + ); + return matcher( + (node: SyntaxNode) => + node.type === "jsx_attribute" ? node.lastChild : pFinder(node), + selectWithLeadingDelimiter( + ":", + "=", + "+=", + "-=", + "*=", + "/=", + "%=", + "**=", + "&=", + "|=", + "^=", + "<<=", + ">>=", + ), + ); +} + +const mapTypes = ["object", "object_pattern"]; +const listTypes = ["array", "array_pattern"]; + +const nodeMatchers: Partial< + Record +> = { + map: mapTypes, + list: listTypes, + string: ["string", "template_string"], + collectionItem: "jsx_attribute", + collectionKey: trailingMatcher( + [ + "pair[key]", + "jsx_attribute.property_identifier!", + "object_type.property_signature[name]!", + "shorthand_property_identifier", + ], + [":"], + ), + value: cascadingMatcher( + valueMatcher(), + patternMatcher("return_statement.~return!"), + patternMatcher("yield_expression.~yield!"), + ), + ifStatement: "if_statement", + comment: "comment", + regularExpression: "regex", + className: ["class_declaration[name]", "class[name]"], + functionCall: ["call_expression", "new_expression"], + functionCallee: cascadingMatcher( + patternMatcher("call_expression[function]"), + matcher( + patternFinder("new_expression"), + childRangeSelector(["arguments"], []), + ), + ), + statement: cascadingMatcher( + matcher( + patternFinder( + "property_signature", + "public_field_definition", + "abstract_method_signature", + ), + extendForwardPastOptional(";"), + ), + patternMatcher( + ...STATEMENT_TYPES.map((type) => `export_statement?.${type}`), + "method_definition", + ), + ), + condition: cascadingMatcher( + patternMatcher("ternary_expression[condition]"), + conditionMatcher( + "if_statement[condition]", + "for_statement[condition]", + "while_statement[condition]", + "do_statement[condition]", + ), + ), + switchStatementSubject: matcher( + patternFinder("switch_statement[value]"), + unwrapSelectionExtractor, + ), + branch: cascadingMatcher( + patternMatcher("switch_case"), + matcher(patternFinder("else_clause"), elseExtractor("if_statement")), + matcher(patternFinder("if_statement"), elseIfExtractor()), + branchMatcher("try_statement", ["catch_clause", "finally_clause"]), + ternaryBranchMatcher("ternary_expression", [1, 2]), + ), + class: [ + "export_statement?.class_declaration", // export class | class + "export_statement?.abstract_class_declaration", // export abstract class | abstract class + "export_statement.class", // export default class + ], + type: cascadingMatcher( + // Typed parameters, properties, and functions + typeMatcher(), + // matcher(findTypeNode, selectWithLeadingDelimiter(":")), + patternMatcher( + // Type alias/interface declarations + "export_statement?.type_alias_declaration", + "export_statement?.interface_declaration", + // as type declarations + "as_expression.generic_type!", + "as_expression.predefined_type!", + // satisfies type declaration + "satisfies_expression.generic_type!", + "satisfies_expression.predefined_type!", + // declaration + "type_assertion.type_arguments.generic_type!", + "type_assertion.type_arguments.predefined_type!", + ), + ), + argumentOrParameter: argumentMatcher("formal_parameters", "arguments"), + // XML, JSX + attribute: ["jsx_attribute"], +}; + +export const patternMatchers = createPatternMatchers(nodeMatchers); + +export function stringTextFragmentExtractor( + node: SyntaxNode, + _selection: SelectionWithEditor, +) { + if ( + node.type === "string_fragment" || + node.type === "regex_pattern" || + node.type === "jsx_text" + ) { + return getNodeRange(node); + } + + if (node.type === "template_string") { + // Exclude starting and ending quotation marks + return getNodeInternalRange(node); + } + + return null; +} diff --git a/packages/cursorless-engine/src/nodeCommon/README.md b/packages/cursorless-engine/src/nodeCommon/README.md deleted file mode 100644 index 7e20bf48c37..00000000000 --- a/packages/cursorless-engine/src/nodeCommon/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Node common - -This directory contains utilities that are available in a node.js context. diff --git a/packages/cursorless-engine/src/nodeCommon/TalonSpokenFormsJsonReader.ts b/packages/cursorless-engine/src/nodeCommon/TalonSpokenFormsJsonReader.ts deleted file mode 100644 index 26c6db93bbd..00000000000 --- a/packages/cursorless-engine/src/nodeCommon/TalonSpokenFormsJsonReader.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { Disposable, FileSystem, Notifier } from "@cursorless/common"; -import { readFile } from "fs/promises"; - -import * as path from "path"; -import { - NeedsInitialTalonUpdateError, - SpokenFormEntry, - TalonSpokenForms, -} from "../scopeProviders/TalonSpokenForms"; - -interface TalonSpokenFormsPayload { - version: number; - spokenForms: SpokenFormEntry[]; -} - -const LATEST_SPOKEN_FORMS_JSON_VERSION = 0; - -export class TalonSpokenFormsJsonReader implements TalonSpokenForms { - private disposable: Disposable; - private notifier = new Notifier(); - - constructor(private fileSystem: FileSystem) { - this.disposable = this.fileSystem.watchDir( - path.dirname(this.fileSystem.cursorlessTalonStateJsonPath), - () => this.notifier.notifyListeners(), - ); - } - - /** - * Registers a callback to be run when the spoken forms change. - * @param callback The callback to run when the scope ranges change - * @returns A {@link Disposable} which will stop the callback from running - */ - onDidChange = this.notifier.registerListener; - - async getSpokenFormEntries(): Promise { - let payload: TalonSpokenFormsPayload; - try { - payload = JSON.parse( - await readFile(this.fileSystem.cursorlessTalonStateJsonPath, "utf-8"), - ); - } catch (err) { - if (isErrnoException(err) && err.code === "ENOENT") { - throw new NeedsInitialTalonUpdateError( - `Custom spoken forms file not found at ${this.fileSystem.cursorlessTalonStateJsonPath}. Using default spoken forms.`, - ); - } - - throw err; - } - - if (payload.version !== LATEST_SPOKEN_FORMS_JSON_VERSION) { - // In the future, we'll need to handle migrations. Not sure exactly how yet. - throw new Error( - `Invalid spoken forms version. Expected ${LATEST_SPOKEN_FORMS_JSON_VERSION} but got ${payload.version}`, - ); - } - - return payload.spokenForms; - } - - dispose() { - this.disposable.dispose(); - } -} - -/** - * A user-defined type guard function that checks if a given error is a - * `NodeJS.ErrnoException`. - * - * @param {any} error - The error to check. - * @returns {error is NodeJS.ErrnoException} - Returns `true` if the error is a - * {@link NodeJS.ErrnoException}, otherwise `false`. - */ -function isErrnoException(error: any): error is NodeJS.ErrnoException { - return error instanceof Error && "code" in error; -} diff --git a/packages/cursorless-engine/src/processTargets/.eslintrc.json b/packages/cursorless-engine/src/processTargets/.eslintrc.json deleted file mode 100644 index e160f358ed0..00000000000 --- a/packages/cursorless-engine/src/processTargets/.eslintrc.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "rules": { - "import/no-default-export": ["error"] - } -} diff --git a/packages/cursorless-engine/src/processTargets/MarkStageFactoryImpl.ts b/packages/cursorless-engine/src/processTargets/MarkStageFactoryImpl.ts index beb4ab04d00..b93999cdfb6 100644 --- a/packages/cursorless-engine/src/processTargets/MarkStageFactoryImpl.ts +++ b/packages/cursorless-engine/src/processTargets/MarkStageFactoryImpl.ts @@ -4,12 +4,12 @@ import { StoredTargetMap } from ".."; import { Mark } from "../typings/TargetDescriptor"; import { MarkStageFactory } from "./MarkStageFactory"; import { MarkStage } from "./PipelineStages.types"; -import { CursorStage } from "./marks/CursorStage"; -import { DecoratedSymbolStage } from "./marks/DecoratedSymbolStage"; -import { ExplicitMarkStage } from "./marks/ExplicitMarkStage"; -import { LineNumberStage } from "./marks/LineNumberStage"; -import { NothingStage } from "./marks/NothingStage"; -import { RangeMarkStage } from "./marks/RangeMarkStage"; +import CursorStage from "./marks/CursorStage"; +import DecoratedSymbolStage from "./marks/DecoratedSymbolStage"; +import ExplicitMarkStage from "./marks/ExplicitMarkStage"; +import LineNumberStage from "./marks/LineNumberStage"; +import NothingStage from "./marks/NothingStage"; +import RangeMarkStage from "./marks/RangeMarkStage"; import { StoredTargetStage } from "./marks/StoredTargetStage"; import { TargetMarkStage } from "./marks/TargetMarkStage"; @@ -33,7 +33,6 @@ export class MarkStageFactoryImpl implements MarkStageFactory { return new CursorStage(mark); case "that": case "source": - case "keyboard": return new StoredTargetStage(this.storedTargets, mark.type); case "decoratedSymbol": return new DecoratedSymbolStage(this.readableHatMap, mark); diff --git a/packages/cursorless-engine/src/processTargets/ModifierStageFactoryImpl.ts b/packages/cursorless-engine/src/processTargets/ModifierStageFactoryImpl.ts index 24e0bd3a70c..d3f9d73ef33 100644 --- a/packages/cursorless-engine/src/processTargets/ModifierStageFactoryImpl.ts +++ b/packages/cursorless-engine/src/processTargets/ModifierStageFactoryImpl.ts @@ -4,11 +4,11 @@ import { Modifier, SurroundingPairModifier, } from "@cursorless/common"; -import { StoredTargetMap } from "../core/StoredTargets"; +import { StoredTargetMap } from ".."; import { LanguageDefinitions } from "../languages/LanguageDefinitions"; import { ModifierStageFactory } from "./ModifierStageFactory"; import { ModifierStage } from "./PipelineStages.types"; -import { CascadingStage } from "./modifiers/CascadingStage"; +import CascadingStage from "./modifiers/CascadingStage"; import { ModifyIfUntypedStage } from "./modifiers/ConditionalModifierStages"; import { ContainingScopeStage } from "./modifiers/ContainingScopeStage"; import { EveryScopeStage } from "./modifiers/EveryScopeStage"; @@ -17,28 +17,27 @@ import { KeepEmptyFilterStage, } from "./modifiers/FilterStages"; import { HeadStage, TailStage } from "./modifiers/HeadTailStage"; -import { InstanceStage } from "./modifiers/InstanceStage"; +import InstanceStage from "./modifiers/InstanceStage"; import { ExcludeInteriorStage, InteriorOnlyStage, } from "./modifiers/InteriorStage"; -import { ItemStage } from "./modifiers/ItemStage"; +import ItemStage from "./modifiers/ItemStage"; import { LeadingStage, TrailingStage } from "./modifiers/LeadingTrailingStages"; import { OrdinalScopeStage } from "./modifiers/OrdinalScopeStage"; import { EndOfStage, StartOfStage } from "./modifiers/PositionStage"; -import { RangeModifierStage } from "./modifiers/RangeModifierStage"; -import { RawSelectionStage } from "./modifiers/RawSelectionStage"; -import { RelativeScopeStage } from "./modifiers/RelativeScopeStage"; -import { SurroundingPairStage } from "./modifiers/SurroundingPairStage"; -import { VisibleStage } from "./modifiers/VisibleStage"; +import RangeModifierStage from "./modifiers/RangeModifierStage"; +import RawSelectionStage from "./modifiers/RawSelectionStage"; +import RelativeScopeStage from "./modifiers/RelativeScopeStage"; +import SurroundingPairStage from "./modifiers/SurroundingPairStage"; import { ScopeHandlerFactory } from "./modifiers/scopeHandlers/ScopeHandlerFactory"; -import { BoundedNonWhitespaceSequenceStage } from "./modifiers/scopeTypeStages/BoundedNonWhitespaceStage"; +import BoundedNonWhitespaceSequenceStage from "./modifiers/scopeTypeStages/BoundedNonWhitespaceStage"; import { LegacyContainingSyntaxScopeStage, SimpleContainingScopeModifier, SimpleEveryScopeModifier, } from "./modifiers/scopeTypeStages/LegacyContainingSyntaxScopeStage"; -import { NotebookCellStage } from "./modifiers/scopeTypeStages/NotebookCellStage"; +import NotebookCellStage from "./modifiers/scopeTypeStages/NotebookCellStage"; export class ModifierStageFactoryImpl implements ModifierStageFactory { constructor( @@ -69,8 +68,6 @@ export class ModifierStageFactoryImpl implements ModifierStageFactory { return new LeadingStage(this, modifier); case "trailing": return new TrailingStage(this, modifier); - case "visible": - return new VisibleStage(modifier); case "containingScope": return new ContainingScopeStage( this, diff --git a/packages/cursorless-engine/src/processTargets/TargetPipelineRunner.ts b/packages/cursorless-engine/src/processTargets/TargetPipelineRunner.ts index a55788e7b23..407d6b93a0e 100644 --- a/packages/cursorless-engine/src/processTargets/TargetPipelineRunner.ts +++ b/packages/cursorless-engine/src/processTargets/TargetPipelineRunner.ts @@ -4,7 +4,6 @@ import { Modifier, Range, ScopeType, - uniqWithHash, } from "@cursorless/common"; import { zip } from "lodash"; import { @@ -16,15 +15,10 @@ import { Target } from "../typings/target.types"; import { MarkStageFactory } from "./MarkStageFactory"; import { ModifierStageFactory } from "./ModifierStageFactory"; import { MarkStage, ModifierStage } from "./PipelineStages.types"; -import { createContinuousRangeTarget } from "./createContinuousRangeTarget"; -import { ImplicitStage } from "./marks/ImplicitStage"; +import ImplicitStage from "./marks/ImplicitStage"; import { ContainingTokenIfUntypedEmptyStage } from "./modifiers/ConditionalModifierStages"; import { PlainTarget } from "./targets"; - -interface TargetPipelineRunnerOpts { - actionFinalStages?: ModifierStage[]; - noAutomaticTokenExpansion?: boolean; -} +import { uniqWithHash } from "../util/uniqWithHash"; export class TargetPipelineRunner { constructor( @@ -45,18 +39,12 @@ export class TargetPipelineRunner { * document containing it, and potentially rich context information such as * how to remove the target */ - run( - target: TargetDescriptor, - { - actionFinalStages = [], - noAutomaticTokenExpansion = false, - }: TargetPipelineRunnerOpts = {}, - ): Target[] { + run(target: TargetDescriptor, actionFinalStages?: ModifierStage[]): Target[] { return new TargetPipeline( this.modifierStageFactory, this.markStageFactory, target, - { actionFinalStages, noAutomaticTokenExpansion }, + actionFinalStages ?? [], ).run(); } } @@ -66,7 +54,7 @@ class TargetPipeline { private modifierStageFactory: ModifierStageFactory, private markStageFactory: MarkStageFactory, private target: TargetDescriptor, - private opts: Required, + private actionFinalStages: ModifierStage[], ) {} /** @@ -229,13 +217,11 @@ class TargetPipeline { */ const modifierStages = [ ...targetModifierStages, - ...this.opts.actionFinalStages, + ...this.actionFinalStages, // This performs auto-expansion to token when you say eg "take this" with an // empty selection - ...(this.opts.noAutomaticTokenExpansion - ? [] - : [new ContainingTokenIfUntypedEmptyStage(this.modifierStageFactory)]), + new ContainingTokenIfUntypedEmptyStage(this.modifierStageFactory), ]; // Run all targets through the modifier stages @@ -329,9 +315,8 @@ export function targetsToContinuousTarget( const excludeStart = isReversed ? excludeActive : excludeAnchor; const excludeEnd = isReversed ? excludeAnchor : excludeActive; - return createContinuousRangeTarget( + return startTarget.createContinuousRangeTarget( isReversed, - startTarget, endTarget, !excludeStart, !excludeEnd, diff --git a/packages/cursorless-engine/src/processTargets/createContinuousRangeTarget.ts b/packages/cursorless-engine/src/processTargets/createContinuousRangeTarget.ts deleted file mode 100644 index 70dd63bbf74..00000000000 --- a/packages/cursorless-engine/src/processTargets/createContinuousRangeTarget.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { Target } from "../typings/target.types"; -import { isSameType } from "../util/typeUtils"; -import { - createContinuousLineRange, - createContinuousRange, -} from "./targets/util/createContinuousRange"; -import { LineTarget, UntypedTarget } from "./targets"; - -/** - * Creates a target consisting of a range between two targets. If the targets - * are of the same type, and {@link includeStart} and {@link includeEnd} are - * `true`, then we call {@link Target.maybeCreateRichRangeTarget} on - * {@link startTarget} to give it the opportunity to determine what the new - * target looks like, ie whether it is a token target, its scope type, its - * delimiters, etc - * - * If the targets are not of the same type, or {@link includeStart} and - * {@link includeEnd} are `false`, then the target will be a line target if both - * targets are line targets, otherwise it will be an untyped target. - * - * @param isReversed If `true`, active is before anchor - * @param startTarget The start of the range - * @param endTarget The end of the range - * @param includeStart Whether to include the start of the range - * @param includeEnd Whether to include the end of the range - * @returns A target consisting of a range between {@link startTarget} and - * {@link endTarget} - */ -export function createContinuousRangeTarget( - isReversed: boolean, - startTarget: Target, - endTarget: Target, - includeStart: boolean, - includeEnd: boolean, -): Target { - if (includeStart && includeEnd && isSameType(startTarget, endTarget)) { - const richTarget = startTarget.maybeCreateRichRangeTarget( - isReversed, - endTarget, - ); - - if (richTarget != null) { - return richTarget; - } - } - - if (startTarget.isLine && endTarget.isLine) { - return new LineTarget({ - editor: startTarget.editor, - isReversed, - contentRange: createContinuousLineRange( - startTarget, - endTarget, - includeStart, - includeEnd, - ), - }); - } - - return new UntypedTarget({ - editor: startTarget.editor, - isReversed, - hasExplicitRange: true, - contentRange: createContinuousRange( - startTarget, - endTarget, - includeStart, - includeEnd, - ), - isToken: - includeStart && includeEnd && startTarget.isToken && endTarget.isToken, - }); -} diff --git a/packages/cursorless-engine/src/processTargets/marks/CursorStage.ts b/packages/cursorless-engine/src/processTargets/marks/CursorStage.ts index 62faa2d22a2..35f72b5bb90 100644 --- a/packages/cursorless-engine/src/processTargets/marks/CursorStage.ts +++ b/packages/cursorless-engine/src/processTargets/marks/CursorStage.ts @@ -5,7 +5,7 @@ import type { MarkStage } from "../PipelineStages.types"; import { UntypedTarget } from "../targets"; import { getActiveSelections } from "./getActiveSelections"; -export class CursorStage implements MarkStage { +export default class CursorStage implements MarkStage { constructor(private mark: CursorMark) {} run(): Target[] { diff --git a/packages/cursorless-engine/src/processTargets/marks/DecoratedSymbolStage.ts b/packages/cursorless-engine/src/processTargets/marks/DecoratedSymbolStage.ts index 6a4c81cbe80..426cb0c622b 100644 --- a/packages/cursorless-engine/src/processTargets/marks/DecoratedSymbolStage.ts +++ b/packages/cursorless-engine/src/processTargets/marks/DecoratedSymbolStage.ts @@ -3,7 +3,7 @@ import { Target } from "../../typings/target.types"; import { MarkStage } from "../PipelineStages.types"; import { UntypedTarget } from "../targets"; -export class DecoratedSymbolStage implements MarkStage { +export default class implements MarkStage { constructor( private readableHatMap: ReadOnlyHatMap, private mark: DecoratedSymbolMark, diff --git a/packages/cursorless-engine/src/processTargets/marks/ExplicitMarkStage.ts b/packages/cursorless-engine/src/processTargets/marks/ExplicitMarkStage.ts index eb030305e28..81f6b9f9188 100644 --- a/packages/cursorless-engine/src/processTargets/marks/ExplicitMarkStage.ts +++ b/packages/cursorless-engine/src/processTargets/marks/ExplicitMarkStage.ts @@ -4,7 +4,7 @@ import { MarkStage } from "../PipelineStages.types"; import { UntypedTarget } from "../targets"; import { ide } from "../../singletons/ide.singleton"; -export class ExplicitMarkStage implements MarkStage { +export default class implements MarkStage { constructor(private mark: ExplicitMark) {} run(): Target[] { diff --git a/packages/cursorless-engine/src/processTargets/marks/ImplicitStage.ts b/packages/cursorless-engine/src/processTargets/marks/ImplicitStage.ts index 232b8c506c3..2330a1adcb3 100644 --- a/packages/cursorless-engine/src/processTargets/marks/ImplicitStage.ts +++ b/packages/cursorless-engine/src/processTargets/marks/ImplicitStage.ts @@ -4,7 +4,7 @@ import type { MarkStage } from "../PipelineStages.types"; import { ImplicitTarget } from "../targets"; import { getActiveSelections } from "./getActiveSelections"; -export class ImplicitStage implements MarkStage { +export default class ImplicitStage implements MarkStage { run(): Target[] { return getActiveSelections(ide()).map( (selection) => diff --git a/packages/cursorless-engine/src/processTargets/marks/LineNumberStage.ts b/packages/cursorless-engine/src/processTargets/marks/LineNumberStage.ts index a9e94de446a..9d3fc971c56 100644 --- a/packages/cursorless-engine/src/processTargets/marks/LineNumberStage.ts +++ b/packages/cursorless-engine/src/processTargets/marks/LineNumberStage.ts @@ -5,7 +5,7 @@ import type { MarkStage } from "../PipelineStages.types"; import { createLineTarget } from "../modifiers/scopeHandlers"; import { LineTarget } from "../targets"; -export class LineNumberStage implements MarkStage { +export default class implements MarkStage { constructor(private mark: LineNumberMark) {} run(): LineTarget[] { diff --git a/packages/cursorless-engine/src/processTargets/marks/NothingStage.ts b/packages/cursorless-engine/src/processTargets/marks/NothingStage.ts index a8f79792357..fa43106fbce 100644 --- a/packages/cursorless-engine/src/processTargets/marks/NothingStage.ts +++ b/packages/cursorless-engine/src/processTargets/marks/NothingStage.ts @@ -2,7 +2,7 @@ import { Target } from "../../typings/target.types"; import { NothingMark } from "@cursorless/common"; import { MarkStage } from "../PipelineStages.types"; -export class NothingStage implements MarkStage { +export default class implements MarkStage { constructor(private mark: NothingMark) {} run(): Target[] { diff --git a/packages/cursorless-engine/src/processTargets/marks/RangeMarkStage.ts b/packages/cursorless-engine/src/processTargets/marks/RangeMarkStage.ts index 4758b045ccf..1685863f15c 100644 --- a/packages/cursorless-engine/src/processTargets/marks/RangeMarkStage.ts +++ b/packages/cursorless-engine/src/processTargets/marks/RangeMarkStage.ts @@ -4,7 +4,7 @@ import { MarkStageFactory } from "../MarkStageFactory"; import { MarkStage } from "../PipelineStages.types"; import { targetsToContinuousTarget } from "../TargetPipelineRunner"; -export class RangeMarkStage implements MarkStage { +export default class RangeMarkStage implements MarkStage { constructor( private markStageFactory: MarkStageFactory, private mark: RangeMark, diff --git a/packages/cursorless-engine/src/processTargets/marks/StoredTargetStage.ts b/packages/cursorless-engine/src/processTargets/marks/StoredTargetStage.ts index 17de2f2392f..7929e97edbc 100644 --- a/packages/cursorless-engine/src/processTargets/marks/StoredTargetStage.ts +++ b/packages/cursorless-engine/src/processTargets/marks/StoredTargetStage.ts @@ -1,5 +1,4 @@ -import { StoredTargetKey } from "@cursorless/common"; -import { StoredTargetMap } from "../../core/StoredTargets"; +import { StoredTargetKey, StoredTargetMap } from "../../core/StoredTargets"; import { Target } from "../../typings/target.types"; import { MarkStage } from "../PipelineStages.types"; diff --git a/packages/cursorless-engine/src/processTargets/marks/TargetMarkStage.ts b/packages/cursorless-engine/src/processTargets/marks/TargetMarkStage.ts index 7a96b647469..f9190b518d0 100644 --- a/packages/cursorless-engine/src/processTargets/marks/TargetMarkStage.ts +++ b/packages/cursorless-engine/src/processTargets/marks/TargetMarkStage.ts @@ -1,4 +1,4 @@ -import { TargetPipelineRunner } from "../TargetPipelineRunner"; +import { TargetPipelineRunner } from ".."; import { TargetMark } from "../../typings/TargetDescriptor"; import { Target } from "../../typings/target.types"; import { MarkStage } from "../PipelineStages.types"; diff --git a/packages/cursorless-engine/src/processTargets/modifiers/CascadingStage.ts b/packages/cursorless-engine/src/processTargets/modifiers/CascadingStage.ts index 8da5def32f4..dcb36111ffb 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/CascadingStage.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/CascadingStage.ts @@ -7,7 +7,7 @@ import { ModifierStage } from "../PipelineStages.types"; * Tries each of the given modifiers in turn until one of them doesn't throw an * error, returning the output from the first modifier not throwing an error. */ -export class CascadingStage implements ModifierStage { +export default class CascadingStage implements ModifierStage { private nestedStages_?: ModifierStage[]; constructor( diff --git a/packages/cursorless-engine/src/processTargets/modifiers/EveryScopeStage.ts b/packages/cursorless-engine/src/processTargets/modifiers/EveryScopeStage.ts index b94bf21e500..74785bb3720 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/EveryScopeStage.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/EveryScopeStage.ts @@ -73,20 +73,13 @@ export class EveryScopeStage implements ModifierStage { if (scopes == null) { // If target had no explicit range, or was contained by a single target // instance, expand to iteration scope before overlapping - try { - scopes = this.getDefaultIterationRange( - scopeHandler, - this.scopeHandlerFactory, - target, - ).flatMap((iterationRange) => - getScopesOverlappingRange(scopeHandler, editor, iterationRange), - ); - } catch (error) { - if (!(error instanceof NoContainingScopeError)) { - throw error; - } - scopes = []; - } + scopes = this.getDefaultIterationRange( + scopeHandler, + this.scopeHandlerFactory, + target, + ).flatMap((iterationRange) => + getScopesOverlappingRange(scopeHandler, editor, iterationRange), + ); } if (scopes.length === 0) { diff --git a/packages/cursorless-engine/src/processTargets/modifiers/InstanceStage.ts b/packages/cursorless-engine/src/processTargets/modifiers/InstanceStage.ts index 156819c7c8c..279645e2bee 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/InstanceStage.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/InstanceStage.ts @@ -18,7 +18,7 @@ import { ContainingTokenIfUntypedEmptyStage } from "./ConditionalModifierStages" import { OutOfRangeError } from "./targetSequenceUtils"; import { StoredTargetMap } from "../.."; -export class InstanceStage implements ModifierStage { +export default class InstanceStage implements ModifierStage { constructor( private modifierStageFactory: ModifierStageFactory, private storedTargets: StoredTargetMap, @@ -46,8 +46,10 @@ export class InstanceStage implements ModifierStage { } private handleEveryScope(target: Target): Target[] { + const { editor } = target; + return Array.from( - flatmap(this.getEveryRanges(target), ([editor, searchRange]) => + flatmap(this.getEveryRanges(editor), (searchRange) => this.getTargetIterable(target, editor, searchRange, "forward"), ), ); @@ -57,7 +59,9 @@ export class InstanceStage implements ModifierStage { target: Target, { start, length }: OrdinalScopeModifier, ): Target[] { - return this.getEveryRanges(target).flatMap(([editor, searchRange]) => + const { editor } = target; + + return this.getEveryRanges(editor).flatMap((searchRange) => takeFromOffset( this.getTargetIterable( target, @@ -75,12 +79,13 @@ export class InstanceStage implements ModifierStage { target: Target, { direction, offset, length }: RelativeScopeModifier, ): Target[] { + const { editor } = target; + const referenceTargets = this.storedTargets.get("instanceReference") ?? [ target, ]; return referenceTargets.flatMap((referenceTarget) => { - const { editor } = referenceTarget; const iterationRange = direction === "forward" ? new Range( @@ -104,14 +109,11 @@ export class InstanceStage implements ModifierStage { }); } - private getEveryRanges({ - editor: targetEditor, - }: Target): readonly (readonly [TextEditor, Range])[] { + private getEveryRanges(editor: TextEditor): Range[] { return ( this.storedTargets .get("instanceReference") - ?.map(({ editor, contentRange }) => [editor, contentRange] as const) ?? - ([[targetEditor, targetEditor.document.range]] as const) + ?.map(({ contentRange }) => contentRange) ?? [editor.document.range] ); } diff --git a/packages/cursorless-engine/src/processTargets/modifiers/ItemStage/ItemStage.ts b/packages/cursorless-engine/src/processTargets/modifiers/ItemStage/ItemStage.ts index 7f595356e1b..0efb3d45381 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/ItemStage/ItemStage.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/ItemStage/ItemStage.ts @@ -8,6 +8,7 @@ import { } from "@cursorless/common"; import { LanguageDefinitions } from "../../../languages/LanguageDefinitions"; import { Target } from "../../../typings/target.types"; +import { getInsertionDelimiter } from "../../../util/nodeSelectors"; import { getRangeLength } from "../../../util/rangeUtils"; import { ModifierStage } from "../../PipelineStages.types"; import { ScopeTypeTarget } from "../../targets"; @@ -18,7 +19,7 @@ import { import { getIterationScope } from "./getIterationScope"; import { tokenizeRange } from "./tokenizeRange"; -export class ItemStage implements ModifierStage { +export default class ItemStage implements ModifierStage { constructor( private languageDefinitions: LanguageDefinitions, private modifier: ContainingScopeModifier | EveryScopeModifier, @@ -108,16 +109,18 @@ export class ItemStage implements ModifierStage { itemInfo: ItemInfo, removalRange?: Range, ) { - const insertionDelimiter = getInsertionDelimiter( + const delimiter = getInsertionDelimiter( + target.editor, itemInfo.leadingDelimiterRange, itemInfo.trailingDelimiterRange, + ", ", ); return new ScopeTypeTarget({ scopeTypeType: this.modifier.scopeType.type as SimpleScopeTypeType, editor: target.editor, isReversed: target.isReversed, contentRange: itemInfo.contentRange, - insertionDelimiter, + delimiter, leadingDelimiterRange: itemInfo.leadingDelimiterRange, trailingDelimiterRange: itemInfo.trailingDelimiterRange, removalRange, @@ -125,17 +128,6 @@ export class ItemStage implements ModifierStage { } } -function getInsertionDelimiter( - leadingDelimiterRange?: Range, - trailingDelimiterRange?: Range, -): string { - return (leadingDelimiterRange != null && - !leadingDelimiterRange.isSingleLine) || - (trailingDelimiterRange != null && !trailingDelimiterRange.isSingleLine) - ? ",\n" - : ", "; -} - /** Filter item infos by content range and domain intersection */ function filterItemInfos(target: Target, itemInfos: ItemInfo[]): ItemInfo[] { return itemInfos.filter( diff --git a/packages/cursorless-engine/src/processTargets/modifiers/ItemStage/index.ts b/packages/cursorless-engine/src/processTargets/modifiers/ItemStage/index.ts index 492aa91ffbf..246be4d0d7d 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/ItemStage/index.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/ItemStage/index.ts @@ -1 +1,2 @@ -export * from "./ItemStage"; +import ItemStage from "./ItemStage"; +export default ItemStage; diff --git a/packages/cursorless-engine/src/processTargets/modifiers/RangeModifierStage.ts b/packages/cursorless-engine/src/processTargets/modifiers/RangeModifierStage.ts index e51b06366c0..721b8103997 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/RangeModifierStage.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/RangeModifierStage.ts @@ -4,7 +4,7 @@ import { ModifierStageFactory } from "../ModifierStageFactory"; import { ModifierStage } from "../PipelineStages.types"; import { targetsToContinuousTarget } from "../TargetPipelineRunner"; -export class RangeModifierStage implements ModifierStage { +export default class RangeModifierStage implements ModifierStage { constructor( private modifierStageFactory: ModifierStageFactory, private modifier: RangeModifier, diff --git a/packages/cursorless-engine/src/processTargets/modifiers/RawSelectionStage.ts b/packages/cursorless-engine/src/processTargets/modifiers/RawSelectionStage.ts index 8e81a3ca880..9f1dffa3f44 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/RawSelectionStage.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/RawSelectionStage.ts @@ -3,7 +3,7 @@ import type { RawSelectionModifier } from "@cursorless/common"; import type { ModifierStage } from "../PipelineStages.types"; import { RawSelectionTarget } from "../targets"; -export class RawSelectionStage implements ModifierStage { +export default class RawSelectionStage implements ModifierStage { constructor(private modifier: RawSelectionModifier) {} run(target: Target): Target[] { diff --git a/packages/cursorless-engine/src/processTargets/modifiers/RelativeExclusiveScopeStage.ts b/packages/cursorless-engine/src/processTargets/modifiers/RelativeExclusiveScopeStage.ts index 9dc97beee34..ab2c7573bff 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/RelativeExclusiveScopeStage.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/RelativeExclusiveScopeStage.ts @@ -15,7 +15,7 @@ import { OutOfRangeError } from "./targetSequenceUtils"; * {@link ScopeHandler.generateScopes} to get the desired scopes, skipping the * first scope if input range is empty and is at start of that scope. */ -export class RelativeExclusiveScopeStage implements ModifierStage { +export default class RelativeExclusiveScopeStage implements ModifierStage { constructor( private modifierStageFactory: ModifierStageFactory, private scopeHandlerFactory: ScopeHandlerFactory, diff --git a/packages/cursorless-engine/src/processTargets/modifiers/RelativeScopeStage.ts b/packages/cursorless-engine/src/processTargets/modifiers/RelativeScopeStage.ts index abe3fb00956..8068af5e352 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/RelativeScopeStage.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/RelativeScopeStage.ts @@ -2,7 +2,7 @@ import type { RelativeScopeModifier } from "@cursorless/common"; import type { Target } from "../../typings/target.types"; import { ModifierStageFactory } from "../ModifierStageFactory"; import type { ModifierStage } from "../PipelineStages.types"; -import { RelativeExclusiveScopeStage } from "./RelativeExclusiveScopeStage"; +import RelativeExclusiveScopeStage from "./RelativeExclusiveScopeStage"; import { RelativeInclusiveScopeStage } from "./RelativeInclusiveScopeStage"; import { ScopeHandlerFactory } from "./scopeHandlers/ScopeHandlerFactory"; @@ -13,7 +13,7 @@ import { ScopeHandlerFactory } from "./scopeHandlers/ScopeHandlerFactory"; * delegating to {@link RelativeInclusiveScopeStage} if so, or * {@link RelativeExclusiveScopeStage} if not. */ -export class RelativeScopeStage implements ModifierStage { +export default class RelativeScopeStage implements ModifierStage { private modiferStage: ModifierStage; constructor( modifierStageFactory: ModifierStageFactory, diff --git a/packages/cursorless-engine/src/processTargets/modifiers/SurroundingPairStage.ts b/packages/cursorless-engine/src/processTargets/modifiers/SurroundingPairStage.ts index acf6e4cef82..153ca5d448c 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/SurroundingPairStage.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/SurroundingPairStage.ts @@ -21,7 +21,7 @@ import { processSurroundingPair } from "./surroundingPair"; * @returns The new selection expanded to the containing surrounding pair or * `null` if none was found */ -export class SurroundingPairStage implements ModifierStage { +export default class SurroundingPairStage implements ModifierStage { constructor( private languageDefinitions: LanguageDefinitions, private modifier: SurroundingPairModifier, diff --git a/packages/cursorless-engine/src/processTargets/modifiers/VisibleStage.ts b/packages/cursorless-engine/src/processTargets/modifiers/VisibleStage.ts deleted file mode 100644 index f5cd56fdc1b..00000000000 --- a/packages/cursorless-engine/src/processTargets/modifiers/VisibleStage.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { VisibleModifier } from "@cursorless/common"; -import { Target } from "../../typings/target.types"; -import { ModifierStage } from "../PipelineStages.types"; -import { PlainTarget } from "../targets"; - -export class VisibleStage implements ModifierStage { - constructor(private modifier: VisibleModifier) {} - - run(target: Target): Target[] { - return target.editor.visibleRanges.map( - (range) => - new PlainTarget({ - editor: target.editor, - isReversed: target.isReversed, - contentRange: range, - }), - ); - } -} diff --git a/packages/cursorless-engine/src/processTargets/modifiers/constructScopeRangeTarget.ts b/packages/cursorless-engine/src/processTargets/modifiers/constructScopeRangeTarget.ts index b3fc409ea57..170b8c157d5 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/constructScopeRangeTarget.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/constructScopeRangeTarget.ts @@ -1,5 +1,4 @@ import { Target } from "../../typings/target.types"; -import { createContinuousRangeTarget } from "../createContinuousRangeTarget"; import { TargetScope } from "./scopeHandlers/scope.types"; /** @@ -42,6 +41,6 @@ export function constructScopeRangeTarget( : [target2, target1]; return [ - createContinuousRangeTarget(isReversed, startTarget, endTarget, true, true), + startTarget.createContinuousRangeTarget(isReversed, endTarget, true, true), ]; } diff --git a/packages/cursorless-engine/src/processTargets/modifiers/getContainingScopeTarget.ts b/packages/cursorless-engine/src/processTargets/modifiers/getContainingScopeTarget.ts index c1b38b610d1..24aa3f6c6ad 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/getContainingScopeTarget.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/getContainingScopeTarget.ts @@ -38,8 +38,7 @@ export function getContainingScopeTarget( editor, scope.domain.end, "forward", - ancestorIndex, - true, + ancestorIndex - 1, ); } @@ -87,12 +86,10 @@ function expandFromPosition( position: Position, direction: Direction, ancestorIndex: number, - allowAdjacentScopes: boolean = false, ): TargetScope | undefined { let nextAncestorIndex = 0; for (const scope of scopeHandler.generateScopes(editor, position, direction, { containment: "required", - allowAdjacentScopes, })) { if (nextAncestorIndex === ancestorIndex) { return scope; diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/BaseScopeHandler.test.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/BaseScopeHandler.test.ts index 3e5d89e3df3..28d9fb46369 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/BaseScopeHandler.test.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/BaseScopeHandler.test.ts @@ -1,12 +1,12 @@ import { TextEditor, Position, Direction, Range } from "@cursorless/common"; -import { BaseScopeHandler } from "./BaseScopeHandler"; +import BaseScopeHandler from "./BaseScopeHandler"; import { TargetScope } from "./scope.types"; import { CustomScopeType, ScopeIteratorRequirements, } from "./scopeHandler.types"; +import assert = require("assert"); import { compareTargetScopes } from "./compareTargetScopes"; -import assert from "assert"; class TestScopeHandler extends BaseScopeHandler { public scopeType = undefined; diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/BaseScopeHandler.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/BaseScopeHandler.ts index aedfd826e9e..a8d71ff9ecb 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/BaseScopeHandler.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/BaseScopeHandler.ts @@ -20,7 +20,7 @@ const DEFAULT_REQUIREMENTS: Omit = /** * All scope handlers should derive from this base class */ -export abstract class BaseScopeHandler implements ScopeHandler { +export default abstract class BaseScopeHandler implements ScopeHandler { public abstract readonly scopeType: ScopeType | undefined; public abstract readonly iterationScopeType: ScopeType | CustomScopeType; diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/CharacterScopeHandler.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/CharacterScopeHandler.ts index 96d2b526273..c6deb9a3e5b 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/CharacterScopeHandler.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/CharacterScopeHandler.ts @@ -1,10 +1,10 @@ -import { Direction, ScopeType } from "@cursorless/common"; import { imap } from "itertools"; -import { NestedScopeHandler } from "./NestedScopeHandler"; -import { getMatcher } from "../../../tokenizer"; +import { NestedScopeHandler } from "."; import { generateMatchesInRange } from "../../../util/getMatchesInRange"; +import { Direction, ScopeType } from "@cursorless/common"; +import { getMatcher } from "../../../tokenizer"; +import { testRegex } from "../../../util/regex"; import { PlainTarget } from "../../targets"; -import { isPreferredOverHelper } from "./isPreferredOverHelper"; import type { TargetScope } from "./scope.types"; /** @@ -14,10 +14,9 @@ import type { TargetScope } from "./scope.types"; */ const SPLIT_REGEX = /\p{L}\p{M}*|[\p{N}\p{P}\p{S}\p{Z}\p{C}]/gu; -const PREFERRED_SYMBOLS_REGEX = /[$]/g; const NONWHITESPACE_REGEX = /\p{L}\p{M}*|[\p{N}\p{P}\p{S}]/gu; -export class CharacterScopeHandler extends NestedScopeHandler { +export default class CharacterScopeHandler extends NestedScopeHandler { public readonly scopeType = { type: "character" } as const; public readonly iterationScopeType = { type: "token" } as const; @@ -50,13 +49,33 @@ export class CharacterScopeHandler extends NestedScopeHandler { scopeA: TargetScope, scopeB: TargetScope, ): boolean | undefined { + const { + editor: { document }, + } = scopeA; const { identifierMatcher } = getMatcher(this.languageId); - // Regexes indicating preferences. We prefer identifiers, preferred - // symbols, then nonwhitespace. - return isPreferredOverHelper(scopeA, scopeB, [ - identifierMatcher, - PREFERRED_SYMBOLS_REGEX, - NONWHITESPACE_REGEX, - ]); + + const aText = document.getText(scopeA.domain); + const bText = document.getText(scopeB.domain); + + // Regexes indicating preferences. We prefer identifiers, then + // nonwhitespace. + const matchers = [identifierMatcher, NONWHITESPACE_REGEX]; + + for (const matcher of matchers) { + // NB: Don't directly use `test` here because global regexes are stateful + // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec#finding_successive_matches + const aMatchesRegex = testRegex(matcher, aText); + const bMatchesRegex = testRegex(matcher, bText); + + if (aMatchesRegex && !bMatchesRegex) { + return true; + } + + if (bMatchesRegex && !aMatchesRegex) { + return false; + } + } + + return undefined; } } diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/DocumentScopeHandler.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/DocumentScopeHandler.ts index f9391f354b7..6df7da3907e 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/DocumentScopeHandler.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/DocumentScopeHandler.ts @@ -1,10 +1,10 @@ import { TextEditor, Position } from "@cursorless/common"; import { Direction, ScopeType } from "@cursorless/common"; import { DocumentTarget } from "../../targets"; -import { BaseScopeHandler } from "./BaseScopeHandler"; +import BaseScopeHandler from "./BaseScopeHandler"; import { TargetScope } from "./scope.types"; -export class DocumentScopeHandler extends BaseScopeHandler { +export default class DocumentScopeHandler extends BaseScopeHandler { public readonly scopeType = { type: "document" } as const; public readonly iterationScopeType = { type: "document" } as const; protected readonly isHierarchical = false; diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/IdentifierScopeHandler.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/IdentifierScopeHandler.ts index 08c8967bb61..feebab75514 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/IdentifierScopeHandler.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/IdentifierScopeHandler.ts @@ -1,12 +1,12 @@ import { imap } from "itertools"; -import { NestedScopeHandler } from "./NestedScopeHandler"; +import { NestedScopeHandler } from "."; import { getMatcher } from "../../../tokenizer"; import { Direction } from "@cursorless/common"; import { generateMatchesInRange } from "../../../util/getMatchesInRange"; import { TokenTarget } from "../../targets"; import type { TargetScope } from "./scope.types"; -export class IdentifierScopeHandler extends NestedScopeHandler { +export default class IdentifierScopeHandler extends NestedScopeHandler { public readonly scopeType = { type: "identifier" } as const; public readonly iterationScopeType = { type: "line" } as const; diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/LineScopeHandler.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/LineScopeHandler.ts index e57b1094c5e..23241713971 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/LineScopeHandler.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/LineScopeHandler.ts @@ -1,19 +1,12 @@ -import { - Direction, - Position, - Range, - ScopeType, - TextEditor, -} from "@cursorless/common"; +import { Position, Range, TextEditor } from "@cursorless/common"; +import { Direction, ScopeType } from "@cursorless/common"; import { LineTarget } from "../../targets"; -import { BaseScopeHandler } from "./BaseScopeHandler"; +import BaseScopeHandler from "./BaseScopeHandler"; import type { TargetScope } from "./scope.types"; -export class LineScopeHandler extends BaseScopeHandler { +export default class LineScopeHandler extends BaseScopeHandler { public readonly scopeType = { type: "line" } as const; - public readonly iterationScopeType: ScopeType = { - type: "paragraph", - } as const; + public readonly iterationScopeType = { type: "document" } as const; protected readonly isHierarchical = false; public readonly includeAdjacentInEvery: boolean = true; diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/NestedScopeHandler.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/NestedScopeHandler.ts index 6e4d396354e..d6a718c34b0 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/NestedScopeHandler.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/NestedScopeHandler.ts @@ -1,7 +1,7 @@ import type { Direction, ScopeType } from "@cursorless/common"; import { Position, TextEditor } from "@cursorless/common"; import { flatmap } from "itertools"; -import { BaseScopeHandler } from "./BaseScopeHandler"; +import BaseScopeHandler from "./BaseScopeHandler"; import { ScopeHandlerFactory } from "./ScopeHandlerFactory"; import type { TargetScope } from "./scope.types"; import type { @@ -21,7 +21,7 @@ import type { * the future we may define a nested scope handler that supports hierarchical * scope types. */ -export abstract class NestedScopeHandler extends BaseScopeHandler { +export default abstract class NestedScopeHandler extends BaseScopeHandler { public abstract readonly iterationScopeType: ScopeType; protected readonly isHierarchical = false; diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/NotHierarchicalScopeError.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/NotHierarchicalScopeError.ts index f446feb5ca5..a32d1922454 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/NotHierarchicalScopeError.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/NotHierarchicalScopeError.ts @@ -5,7 +5,7 @@ import { scopeTypeToString } from "./scopeTypeUtil"; * Throw this error when the user requests a hierarchical feature of a scope * that is not hierarchical, eg `"grand line"`. */ -export class NotHierarchicalScopeError extends Error { +export default class NotHierarchicalScopeError extends Error { /** * * @param scopeType The scopeType for the failed match to show to the user diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/OneOfScopeHandler.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/OneOfScopeHandler.ts index ea2d82bb2b0..75be46d094c 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/OneOfScopeHandler.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/OneOfScopeHandler.ts @@ -4,7 +4,7 @@ import { Position, TextEditor, } from "@cursorless/common"; -import { BaseScopeHandler } from "./BaseScopeHandler"; +import BaseScopeHandler from "./BaseScopeHandler"; import { advanceIteratorsUntil, getInitialIteratorInfos } from "./IteratorInfo"; import { ScopeHandlerFactory } from "./ScopeHandlerFactory"; import { compareTargetScopes } from "./compareTargetScopes"; @@ -15,7 +15,7 @@ import { ScopeIteratorRequirements, } from "./scopeHandler.types"; -export class OneOfScopeHandler extends BaseScopeHandler { +export default class OneOfScopeHandler extends BaseScopeHandler { protected isHierarchical = true; static create( diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/ParagraphScopeHandler.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/ParagraphScopeHandler.ts index d61cdd1f527..cfb62dcc48f 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/ParagraphScopeHandler.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/ParagraphScopeHandler.ts @@ -7,11 +7,11 @@ import { } from "@cursorless/common"; import { Direction, ScopeType } from "@cursorless/common"; import { ParagraphTarget } from "../../targets"; -import { BaseScopeHandler } from "./BaseScopeHandler"; +import BaseScopeHandler from "./BaseScopeHandler"; import { fitRangeToLineContent } from "./LineScopeHandler"; import { TargetScope } from "./scope.types"; -export class ParagraphScopeHandler extends BaseScopeHandler { +export default class TokenScopeHandler extends BaseScopeHandler { public readonly scopeType: ScopeType = { type: "paragraph" }; public readonly iterationScopeType: ScopeType = { type: "document" }; protected readonly isHierarchical = false; diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/RegexScopeHandler.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/RegexScopeHandler.ts index a8bb1305400..209ede051c2 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/RegexScopeHandler.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/RegexScopeHandler.ts @@ -1,13 +1,6 @@ -import { - CustomRegexScopeType, - Direction, - GlyphScopeType, - ScopeType, -} from "@cursorless/common"; +import { CustomRegexScopeType, Direction, ScopeType } from "@cursorless/common"; import { imap } from "itertools"; -import { escapeRegExp } from "lodash"; -import { NestedScopeHandler } from "./NestedScopeHandler"; -import { ScopeHandlerFactory } from "./ScopeHandlerFactory"; +import { NestedScopeHandler, ScopeHandlerFactory } from "."; import { generateMatchesInRange } from "../../../util/getMatchesInRange"; import { TokenTarget } from "../../targets"; import { TargetScope } from "./scope.types"; @@ -68,17 +61,3 @@ export class CustomRegexScopeHandler extends RegexStageBase { super(scopeHandlerFactory, scopeType, languageId); } } - -export class GlyphScopeHandler extends RegexStageBase { - get regex() { - return new RegExp(escapeRegExp(this.scopeType.character), "gui"); - } - - constructor( - scopeHandlerFactory: ScopeHandlerFactory, - readonly scopeType: GlyphScopeType, - languageId: string, - ) { - super(scopeHandlerFactory, scopeType, languageId); - } -} diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/ScopeHandlerFactoryImpl.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/ScopeHandlerFactoryImpl.ts index 25c3575553d..3efd7f8770e 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/ScopeHandlerFactoryImpl.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/ScopeHandlerFactoryImpl.ts @@ -1,21 +1,20 @@ import type { ScopeType } from "@cursorless/common"; -import { LanguageDefinitions } from "../../../languages/LanguageDefinitions"; -import { CharacterScopeHandler } from "./CharacterScopeHandler"; -import { DocumentScopeHandler } from "./DocumentScopeHandler"; -import { IdentifierScopeHandler } from "./IdentifierScopeHandler"; -import { LineScopeHandler } from "./LineScopeHandler"; -import { OneOfScopeHandler } from "./OneOfScopeHandler"; -import { ParagraphScopeHandler } from "./ParagraphScopeHandler"; import { + CharacterScopeHandler, CustomRegexScopeHandler, - GlyphScopeHandler, + DocumentScopeHandler, + IdentifierScopeHandler, + LineScopeHandler, NonWhitespaceSequenceScopeHandler, + OneOfScopeHandler, + ParagraphScopeHandler, + ScopeHandlerFactory, + SentenceScopeHandler, + TokenScopeHandler, UrlScopeHandler, -} from "./RegexScopeHandler"; -import { ScopeHandlerFactory } from "./ScopeHandlerFactory"; -import { SentenceScopeHandler } from "./SentenceScopeHandler/SentenceScopeHandler"; -import { TokenScopeHandler } from "./TokenScopeHandler"; -import { WordScopeHandler } from "./WordScopeHandler/WordScopeHandler"; + WordScopeHandler, +} from "."; +import { LanguageDefinitions } from "../../../languages/LanguageDefinitions"; import type { CustomScopeType, ScopeHandler } from "./scopeHandler.types"; /** @@ -73,8 +72,6 @@ export class ScopeHandlerFactoryImpl implements ScopeHandlerFactory { return new UrlScopeHandler(this, scopeType, languageId); case "customRegex": return new CustomRegexScopeHandler(this, scopeType, languageId); - case "glyph": - return new GlyphScopeHandler(this, scopeType, languageId); case "custom": return scopeType.scopeHandler; case "instance": diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/SentenceScopeHandler/SentenceScopeHandler.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/SentenceScopeHandler/SentenceScopeHandler.ts index e4ba5ae2b8d..d07f0270b48 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/SentenceScopeHandler/SentenceScopeHandler.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/SentenceScopeHandler/SentenceScopeHandler.ts @@ -1,12 +1,12 @@ import { Direction, Range } from "@cursorless/common"; import { imap } from "itertools"; -import { NestedScopeHandler } from "../NestedScopeHandler"; +import { NestedScopeHandler } from ".."; import { TokenTarget } from "../../../targets"; import type { TargetScope } from "../scope.types"; -import { SentenceSegmenter } from "./SentenceSegmenter"; +import SentenceSegmenter from "./SentenceSegmenter"; import { MatchedText } from "../../../../util/regex"; -export class SentenceScopeHandler extends NestedScopeHandler { +export default class SentenceScopeHandler extends NestedScopeHandler { public readonly scopeType = { type: "sentence" } as const; public readonly iterationScopeType = { type: "paragraph" } as const; private segmenter = new SentenceSegmenter(); diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/SentenceScopeHandler/SentenceSegmenter.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/SentenceScopeHandler/SentenceSegmenter.ts index e7a5c94da9b..db5982b8bd5 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/SentenceScopeHandler/SentenceSegmenter.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/SentenceScopeHandler/SentenceSegmenter.ts @@ -20,7 +20,7 @@ const options: sbd.Options = { ["preserve_whitespace"]: true, }; -export class SentenceSegmenter { +export default class SentenceSegmenter { *segment(text: string): Iterable { const sentences = sbd.sentences(text, options); let index = 0; diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/SurroundingPairScopeHandler.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/SurroundingPairScopeHandler.ts index b51a6389a17..cfa2e5d594a 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/SurroundingPairScopeHandler.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/SurroundingPairScopeHandler.ts @@ -1,10 +1,10 @@ import { Position, TextEditor } from "@cursorless/common"; import { Direction, SurroundingPairScopeType } from "@cursorless/common"; -import { BaseScopeHandler } from "./BaseScopeHandler"; +import BaseScopeHandler from "./BaseScopeHandler"; import { TargetScope } from "./scope.types"; import { ScopeIteratorRequirements } from "./scopeHandler.types"; -export class SurroundingPairScopeHandler extends BaseScopeHandler { +export default class SurroundingPairScopeHandler extends BaseScopeHandler { public readonly iterationScopeType; protected isHierarchical = true; diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/TokenScopeHandler.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/TokenScopeHandler.ts index 12b48938161..eb7f8d54116 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/TokenScopeHandler.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/TokenScopeHandler.ts @@ -1,15 +1,13 @@ -import { Direction } from "@cursorless/common"; import { imap } from "itertools"; -import { NestedScopeHandler } from "./NestedScopeHandler"; -import { getMatcher } from "../../../tokenizer"; +import { NestedScopeHandler } from "."; import { generateMatchesInRange } from "../../../util/getMatchesInRange"; +import { Direction } from "@cursorless/common"; +import { getMatcher } from "../../../tokenizer"; +import { testRegex } from "../../../util/regex"; import { TokenTarget } from "../../targets"; -import { isPreferredOverHelper } from "./isPreferredOverHelper"; import type { TargetScope } from "./scope.types"; -const PREFERRED_SYMBOLS_REGEX = /[$]/g; - -export class TokenScopeHandler extends NestedScopeHandler { +export default class TokenScopeHandler extends NestedScopeHandler { public readonly scopeType = { type: "token" } as const; public readonly iterationScopeType = { type: "line" } as const; @@ -39,12 +37,17 @@ export class TokenScopeHandler extends NestedScopeHandler { scopeA: TargetScope, scopeB: TargetScope, ): boolean | undefined { - const { identifierMatcher } = getMatcher(this.languageId); - // Regexes indicating preferences. We prefer identifiers then preferred - // symbols. - return isPreferredOverHelper(scopeA, scopeB, [ - identifierMatcher, - PREFERRED_SYMBOLS_REGEX, - ]); + const { + editor: { document }, + } = scopeA; + const { identifierMatcher } = getMatcher(document.languageId); + + // NB: Don't directly use `test` here because global regexes are stateful + // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec#finding_successive_matches + return testRegex(identifierMatcher, document.getText(scopeA.domain)) + ? true + : testRegex(identifierMatcher, document.getText(scopeB.domain)) + ? false + : undefined; } } diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/TreeSitterScopeHandler/BaseTreeSitterScopeHandler.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/TreeSitterScopeHandler/BaseTreeSitterScopeHandler.ts index 373f8112cdc..d59a06d501e 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/TreeSitterScopeHandler/BaseTreeSitterScopeHandler.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/TreeSitterScopeHandler/BaseTreeSitterScopeHandler.ts @@ -2,7 +2,7 @@ import { Direction, Position, TextEditor, showError } from "@cursorless/common"; import { uniqWith } from "lodash"; import { TreeSitterQuery } from "../../../../languages/TreeSitterQuery"; import { QueryMatch } from "../../../../languages/TreeSitterQuery/QueryCapture"; -import { BaseScopeHandler } from "../BaseScopeHandler"; +import BaseScopeHandler from "../BaseScopeHandler"; import { compareTargetScopes } from "../compareTargetScopes"; import { TargetScope } from "../scope.types"; import { ScopeIteratorRequirements } from "../scopeHandler.types"; diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/TreeSitterScopeHandler/TreeSitterScopeHandler.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/TreeSitterScopeHandler/TreeSitterScopeHandler.ts index e5d054ee635..e78a8c32c52 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/TreeSitterScopeHandler/TreeSitterScopeHandler.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/TreeSitterScopeHandler/TreeSitterScopeHandler.ts @@ -1,7 +1,7 @@ -import { SimpleScopeType, TextEditor } from "@cursorless/common"; +import { Range, SimpleScopeType, TextEditor } from "@cursorless/common"; import { TreeSitterQuery } from "../../../../languages/TreeSitterQuery"; import { QueryMatch } from "../../../../languages/TreeSitterQuery/QueryCapture"; -import { ScopeTypeTarget } from "../../../targets/ScopeTypeTarget"; +import ScopeTypeTarget from "../../../targets/ScopeTypeTarget"; import { CustomScopeType } from "../scopeHandler.types"; import { BaseTreeSitterScopeHandler, @@ -55,33 +55,20 @@ export class TreeSitterScopeHandler extends BaseTreeSitterScopeHandler { const removalRange = getRelatedRange(match, scopeTypeType, "removal", true); - const interiorRange = getRelatedRange( - match, - scopeTypeType, - "interior", - true, + const leadingDelimiterRange = dropEmptyRange( + getRelatedRange(match, scopeTypeType, "leading", true), ); - const prefixRange = getRelatedRange( - match, - scopeTypeType, - "prefix", - true, - )?.with(undefined, contentRange.start); - - const leadingDelimiterRange = getRelatedRange( - match, - scopeTypeType, - "leading", - true, - )?.with(undefined, prefixRange?.start ?? contentRange.start); + const trailingDelimiterRange = dropEmptyRange( + getRelatedRange(match, scopeTypeType, "trailing", true), + ); - const trailingDelimiterRange = getRelatedRange( + const interiorRange = getRelatedRange( match, scopeTypeType, - "trailing", + "interior", true, - )?.with(contentRange.end); + ); return { editor, @@ -93,14 +80,17 @@ export class TreeSitterScopeHandler extends BaseTreeSitterScopeHandler { editor, isReversed, contentRange, - prefixRange, removalRange, leadingDelimiterRange, trailingDelimiterRange, interiorRange, - insertionDelimiter, + delimiter: insertionDelimiter, }), ], }; } } + +function dropEmptyRange(range?: Range) { + return range != null && !range.isEmpty ? range : undefined; +} diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/WordScopeHandler/WordScopeHandler.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/WordScopeHandler/WordScopeHandler.ts index 9e4c25b946e..085a9e87efb 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/WordScopeHandler/WordScopeHandler.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/WordScopeHandler/WordScopeHandler.ts @@ -1,11 +1,11 @@ import { Range, TextEditor } from "@cursorless/common"; -import { NestedScopeHandler } from "../NestedScopeHandler"; -import { WordTokenizer } from "./WordTokenizer"; +import { NestedScopeHandler } from ".."; +import WordTokenizer from "./WordTokenizer"; import { Direction } from "@cursorless/common"; import { SubTokenWordTarget } from "../../../targets"; import type { TargetScope } from "../scope.types"; -export class WordScopeHandler extends NestedScopeHandler { +export default class WordScopeHandler extends NestedScopeHandler { public readonly scopeType = { type: "word" } as const; public readonly iterationScopeType = { type: "identifier" } as const; diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/WordScopeHandler/WordTokenizer.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/WordScopeHandler/WordTokenizer.ts index e2b886f5520..1f5efb3fad8 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/WordScopeHandler/WordTokenizer.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/WordScopeHandler/WordTokenizer.ts @@ -9,7 +9,7 @@ const CAMEL_REGEX = /\p{Lu}?\p{Ll}+|\p{Lu}+(?!\p{Ll})|\p{N}+/gu; * but for now we need it here because we can't yet properly mock away vscode * for the unit tests in subtoken.test.ts. */ -export class WordTokenizer { +export default class WordTokenizer { private wordRegex: RegExp; constructor(languageId: string) { diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/index.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/index.ts index e5bf84d6a9e..e1591500134 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/index.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/index.ts @@ -1,14 +1,24 @@ export * from "./NestedScopeHandler"; +export { default as NestedScopeHandler } from "./NestedScopeHandler"; export * from "./LineScopeHandler"; +export { default as LineScopeHandler } from "./LineScopeHandler"; export * from "./IdentifierScopeHandler"; +export { default as IdentifierScopeHandler } from "./IdentifierScopeHandler"; export * from "./CharacterScopeHandler"; +export { default as CharacterScopeHandler } from "./CharacterScopeHandler"; export * from "./WordScopeHandler/WordScopeHandler"; +export { default as WordScopeHandler } from "./WordScopeHandler/WordScopeHandler"; export * from "./TokenScopeHandler"; +export { default as TokenScopeHandler } from "./TokenScopeHandler"; export * from "./DocumentScopeHandler"; +export { default as DocumentScopeHandler } from "./DocumentScopeHandler"; export * from "./TreeSitterScopeHandler"; export * from "./OneOfScopeHandler"; +export { default as OneOfScopeHandler } from "./OneOfScopeHandler"; export * from "./ParagraphScopeHandler"; +export { default as ParagraphScopeHandler } from "./ParagraphScopeHandler"; export * from "./SentenceScopeHandler/SentenceScopeHandler"; +export { default as SentenceScopeHandler } from "./SentenceScopeHandler/SentenceScopeHandler"; export * from "./RegexScopeHandler"; export * from "./ScopeHandlerFactory"; export * from "./ScopeHandlerFactoryImpl"; diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/isPreferredOverHelper.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/isPreferredOverHelper.ts deleted file mode 100644 index 3920e8e18d8..00000000000 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeHandlers/isPreferredOverHelper.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { testRegex } from "../../../util/regex"; -import type { TargetScope } from "./scope.types"; - -export function isPreferredOverHelper( - scopeA: TargetScope, - scopeB: TargetScope, - matchers: RegExp[], -): boolean | undefined { - const textA = scopeA.editor.document.getText(scopeA.domain); - const textB = scopeB.editor.document.getText(scopeB.domain); - - for (const matcher of matchers) { - // NB: Don't directly use `test` here because global regexes are stateful - // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec#finding_successive_matches - const aMatchesRegex = testRegex(matcher, textA); - const bMatchesRegex = testRegex(matcher, textB); - - if (aMatchesRegex && !bMatchesRegex) { - return true; - } - - if (bMatchesRegex && !aMatchesRegex) { - return false; - } - } - - return undefined; -} diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeTypeStages/BoundedNonWhitespaceStage.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeTypeStages/BoundedNonWhitespaceStage.ts index 8a4806f4800..2cd9d3947db 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeTypeStages/BoundedNonWhitespaceStage.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeTypeStages/BoundedNonWhitespaceStage.ts @@ -15,7 +15,9 @@ import { processSurroundingPair } from "../surroundingPair"; * Expand the target until reaching a white space or surrounding pair. * If there is no surrounding pair defaults to the non white space sequence */ -export class BoundedNonWhitespaceSequenceStage implements ModifierStage { +export default class BoundedNonWhitespaceSequenceStage + implements ModifierStage +{ constructor( private languageDefinitions: LanguageDefinitions, private modifierStageFactory: ModifierStageFactory, diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeTypeStages/LegacyContainingSyntaxScopeStage.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeTypeStages/LegacyContainingSyntaxScopeStage.ts index b099e10dcaf..baed206ed3d 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeTypeStages/LegacyContainingSyntaxScopeStage.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeTypeStages/LegacyContainingSyntaxScopeStage.ts @@ -82,7 +82,7 @@ export class LegacyContainingSyntaxScopeStage implements ModifierStage { contentRange: contentSelection, removalRange: removalRange, interiorRange: interiorRange, - insertionDelimiter: containingListDelimiter, + delimiter: containingListDelimiter, leadingDelimiterRange, trailingDelimiterRange, }); diff --git a/packages/cursorless-engine/src/processTargets/modifiers/scopeTypeStages/NotebookCellStage.ts b/packages/cursorless-engine/src/processTargets/modifiers/scopeTypeStages/NotebookCellStage.ts index 07d0966ba5e..433a645536e 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/scopeTypeStages/NotebookCellStage.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/scopeTypeStages/NotebookCellStage.ts @@ -6,7 +6,7 @@ import type { import type { ModifierStage } from "../../PipelineStages.types"; import { NotebookCellTarget } from "../../targets"; -export class NotebookCellStage implements ModifierStage { +export default class implements ModifierStage { constructor(private modifier: ContainingScopeModifier | EveryScopeModifier) {} run(target: Target): NotebookCellTarget[] { diff --git a/packages/cursorless-engine/src/processTargets/modifiers/surroundingPair/delimiterMaps.ts b/packages/cursorless-engine/src/processTargets/modifiers/surroundingPair/delimiterMaps.ts index e5d42f8d0a9..b8e54be1fec 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/surroundingPair/delimiterMaps.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/surroundingPair/delimiterMaps.ts @@ -2,14 +2,13 @@ import { ComplexSurroundingPairName, SimpleSurroundingPairName, } from "@cursorless/common"; -import { unsafeKeys } from "../../../util/object"; type IndividualDelimiterText = string | string[]; export const delimiterToText: Record< SimpleSurroundingPairName, [IndividualDelimiterText, IndividualDelimiterText] -> = Object.freeze({ +> = { angleBrackets: [ ["", "/>"], @@ -24,7 +23,7 @@ export const delimiterToText: Record< parentheses: [["(", "$("], ")"], singleQuotes: ["'", "'"], squareBrackets: ["[", "]"], -}); +}; export const leftToRightMap: Record = Object.fromEntries( Object.values(delimiterToText), @@ -38,7 +37,7 @@ export const complexDelimiterMap: Record< ComplexSurroundingPairName, SimpleSurroundingPairName[] > = { - any: unsafeKeys(delimiterToText), + any: Object.keys(delimiterToText), string: ["singleQuotes", "doubleQuotes", "backtickQuotes"], collectionBoundary: [ "parentheses", diff --git a/packages/cursorless-engine/src/processTargets/modifiers/targetSequenceUtils.ts b/packages/cursorless-engine/src/processTargets/modifiers/targetSequenceUtils.ts index c3439a88cdc..547029eb023 100644 --- a/packages/cursorless-engine/src/processTargets/modifiers/targetSequenceUtils.ts +++ b/packages/cursorless-engine/src/processTargets/modifiers/targetSequenceUtils.ts @@ -1,7 +1,6 @@ import { ScopeType } from "@cursorless/common"; import { Target } from "../../typings/target.types"; import { ModifierStageFactory } from "../ModifierStageFactory"; -import { createContinuousRangeTarget } from "../createContinuousRangeTarget"; export class OutOfRangeError extends Error { constructor() { @@ -33,9 +32,8 @@ export function createRangeTargetFromIndices( return targets[startIndex]; } - return createContinuousRangeTarget( + return targets[startIndex].createContinuousRangeTarget( isReversed, - targets[startIndex], targets[endIndex], true, true, diff --git a/packages/cursorless-engine/src/processTargets/targets/util/createContinuousRange.ts b/packages/cursorless-engine/src/processTargets/targetUtil/createContinuousRange.ts similarity index 64% rename from packages/cursorless-engine/src/processTargets/targets/util/createContinuousRange.ts rename to packages/cursorless-engine/src/processTargets/targetUtil/createContinuousRange.ts index 02a2777f345..7b612fa4ae2 100644 --- a/packages/cursorless-engine/src/processTargets/targets/util/createContinuousRange.ts +++ b/packages/cursorless-engine/src/processTargets/targetUtil/createContinuousRange.ts @@ -1,5 +1,6 @@ import { Position, Range } from "@cursorless/common"; -import type { Target } from "../../../typings/target.types"; +import type { Target } from "../../typings/target.types"; +import { UntypedTarget } from "../targets"; export function createContinuousRange( startTarget: Target, @@ -44,3 +45,24 @@ export function createContinuousLineRange( return new Range(start, end); } + +export function createContinuousRangeUntypedTarget( + isReversed: boolean, + startTarget: Target, + endTarget: Target, + includeStart: boolean, + includeEnd: boolean, +): UntypedTarget { + return new UntypedTarget({ + editor: startTarget.editor, + isReversed, + hasExplicitRange: true, + contentRange: createContinuousRange( + startTarget, + endTarget, + includeStart, + includeEnd, + ), + isToken: startTarget.isToken && endTarget.isToken, + }); +} diff --git a/packages/cursorless-engine/src/processTargets/targets/util/insertionRemovalBehaviors/DelimitedSequenceInsertionRemovalBehavior.ts b/packages/cursorless-engine/src/processTargets/targetUtil/insertionRemovalBehaviors/DelimitedSequenceInsertionRemovalBehavior.ts similarity index 75% rename from packages/cursorless-engine/src/processTargets/targets/util/insertionRemovalBehaviors/DelimitedSequenceInsertionRemovalBehavior.ts rename to packages/cursorless-engine/src/processTargets/targetUtil/insertionRemovalBehaviors/DelimitedSequenceInsertionRemovalBehavior.ts index 94626a50daf..a6f3cb7b40b 100644 --- a/packages/cursorless-engine/src/processTargets/targets/util/insertionRemovalBehaviors/DelimitedSequenceInsertionRemovalBehavior.ts +++ b/packages/cursorless-engine/src/processTargets/targetUtil/insertionRemovalBehaviors/DelimitedSequenceInsertionRemovalBehavior.ts @@ -1,6 +1,5 @@ import { Range } from "@cursorless/common"; -import { Target } from "../../../../typings/target.types"; -import { union } from "../../../../util/rangeUtils"; +import { Target } from "../../../typings/target.types"; /** * Constructs a removal range for the given target that includes either the @@ -9,7 +8,7 @@ import { union } from "../../../../util/rangeUtils"; * @returns The removal range for the given target */ export function getDelimitedSequenceRemovalRange(target: Target): Range { - const contentRange = union(target.contentRange, target.prefixRange); + const { contentRange } = target; const delimiterTarget = target.getTrailingDelimiterTarget() ?? target.getLeadingDelimiterTarget(); diff --git a/packages/cursorless-engine/src/processTargets/targets/util/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts b/packages/cursorless-engine/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts similarity index 92% rename from packages/cursorless-engine/src/processTargets/targets/util/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts rename to packages/cursorless-engine/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts index ee758980545..004f8fe1da9 100644 --- a/packages/cursorless-engine/src/processTargets/targets/util/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts +++ b/packages/cursorless-engine/src/processTargets/targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior.ts @@ -1,7 +1,7 @@ import { Range, TextEditor } from "@cursorless/common"; -import type { Target } from "../../../../typings/target.types"; -import { expandToFullLine, union } from "../../../../util/rangeUtils"; -import { PlainTarget } from "../../PlainTarget"; +import type { Target } from "../../../typings/target.types"; +import { expandToFullLine } from "../../../util/rangeUtils"; +import { PlainTarget } from "../../targets"; const leadingDelimiters = ['"', "'", "(", "[", "{", "<"]; const trailingDelimiters = ['"', "'", ")", "]", "}", ">", ",", ";", ":"]; @@ -10,7 +10,7 @@ export function getTokenLeadingDelimiterTarget( target: Target, ): Target | undefined { const { editor } = target; - const { start } = union(target.contentRange, target.prefixRange); + const { start } = target.contentRange; const startLine = editor.document.lineAt(start); const leadingText = startLine.text.slice(0, start.character); @@ -80,8 +80,7 @@ export function getTokenTrailingDelimiterTarget( * @returns The removal range for the given target */ export function getTokenRemovalRange(target: Target): Range { - const { editor } = target; - const contentRange = union(target.contentRange, target.prefixRange); + const { editor, contentRange } = target; const { start, end } = contentRange; const leadingWhitespaceRange = diff --git a/packages/cursorless-engine/src/processTargets/targets/util/insertionRemovalBehaviors/insertionRemovalBehavior.types.ts b/packages/cursorless-engine/src/processTargets/targetUtil/insertionRemovalBehaviors/insertionRemovalBehavior.types.ts similarity index 66% rename from packages/cursorless-engine/src/processTargets/targets/util/insertionRemovalBehaviors/insertionRemovalBehavior.types.ts rename to packages/cursorless-engine/src/processTargets/targetUtil/insertionRemovalBehaviors/insertionRemovalBehavior.types.ts index 4690c3235a2..b81905401d9 100644 --- a/packages/cursorless-engine/src/processTargets/targets/util/insertionRemovalBehaviors/insertionRemovalBehavior.types.ts +++ b/packages/cursorless-engine/src/processTargets/targetUtil/insertionRemovalBehaviors/insertionRemovalBehavior.types.ts @@ -1,7 +1,7 @@ import type { Range } from "@cursorless/common"; -import type { Target } from "../../../../typings/target.types"; +import type { Target } from "../../../typings/target.types"; -export interface InsertionRemovalBehavior { +export default interface InsertionRemovalBehavior { getLeadingDelimiterTarget(): Target | undefined; getTrailingDelimiterTarget(): Target | undefined; getRemovalRange(): Range; diff --git a/packages/cursorless-engine/src/processTargets/targets/BaseTarget.ts b/packages/cursorless-engine/src/processTargets/targets/BaseTarget.ts index 53cb2c8cd6a..da49eb96b24 100644 --- a/packages/cursorless-engine/src/processTargets/targets/BaseTarget.ts +++ b/packages/cursorless-engine/src/processTargets/targets/BaseTarget.ts @@ -1,8 +1,4 @@ -import type { - EnforceUndefined, - InsertionMode, - TargetPlainObject, -} from "@cursorless/common"; +import type { InsertionMode, TargetPlainObject } from "@cursorless/common"; import { NoContainingScopeError, Range, @@ -13,8 +9,12 @@ import { import { isEqual } from "lodash"; import type { EditWithRangeUpdater } from "../../typings/Types"; import type { Destination, Target } from "../../typings/target.types"; +import { isSameType } from "../../util/typeUtils"; +import { + createContinuousRange, + createContinuousRangeUntypedTarget, +} from "../targetUtil/createContinuousRange"; import { DestinationImpl } from "./DestinationImpl"; -import { createContinuousRange } from "./util/createContinuousRange"; /** Parameters supported by all target classes */ export interface MinimumTargetParameters { @@ -38,12 +38,12 @@ export interface CloneWithParameters { * * @template TParameters The constructor parameters. */ -export abstract class BaseTarget< +export default abstract class BaseTarget< in out TParameters extends MinimumTargetParameters, > implements Target { protected abstract readonly type: string; - protected readonly state: EnforceUndefined; + protected readonly state: CommonTargetParameters; isLine = false; isToken = true; hasExplicitScopeType = true; @@ -123,19 +123,36 @@ export abstract class BaseTarget< }); } - protected abstract getCloneParameters(): EnforceUndefined; + protected abstract getCloneParameters(): TParameters; - maybeCreateRichRangeTarget( + createContinuousRangeTarget( isReversed: boolean, - endTarget: ThisType & Target, - ): (ThisType & Target) | null { - const { constructor } = Object.getPrototypeOf(this); - - return new constructor({ - ...this.getCloneParameters(), + endTarget: Target, + includeStart: boolean, + includeEnd: boolean, + ): Target { + if (isSameType(this, endTarget)) { + const constructor = Object.getPrototypeOf(this).constructor; + + return new constructor({ + ...this.getCloneParameters(), + isReversed, + contentRange: createContinuousRange( + this, + endTarget, + includeStart, + includeEnd, + ), + }); + } + + return createContinuousRangeUntypedTarget( isReversed, - contentRange: createContinuousRange(this, endTarget, true, true), - }); + this, + endTarget, + includeStart, + includeEnd, + ); } isEqual(otherTarget: Target): boolean { @@ -155,10 +172,7 @@ export abstract class BaseTarget< * * @returns The object to be used for determining equality */ - protected getEqualityParameters(): Omit< - EnforceUndefined, - "thatTarget" - > { + protected getEqualityParameters(): Omit { const { thatTarget, ...otherCloneParameters } = this.getCloneParameters(); return { diff --git a/packages/cursorless-engine/src/processTargets/targets/DestinationImpl.ts b/packages/cursorless-engine/src/processTargets/targets/DestinationImpl.ts index a7087d4e467..1b5d787f03b 100644 --- a/packages/cursorless-engine/src/processTargets/targets/DestinationImpl.ts +++ b/packages/cursorless-engine/src/processTargets/targets/DestinationImpl.ts @@ -10,14 +10,12 @@ import { EditNewActionType, Target, } from "../../typings/target.types"; -import { union } from "../../util/rangeUtils"; export class DestinationImpl implements Destination { public readonly contentRange: Range; private readonly isLineDelimiter: boolean; private readonly isBefore: boolean; private readonly indentationString: string; - private readonly insertionPrefix?: string; constructor( public readonly target: Target, @@ -26,15 +24,12 @@ export class DestinationImpl implements Destination { ) { this.contentRange = getContentRange(target.contentRange, insertionMode); this.isBefore = insertionMode === "before"; - this.isLineDelimiter = target.insertionDelimiter.includes("\n"); + // It's only considered a line if the delimiter is only new line symbols + this.isLineDelimiter = /^(\n)+$/.test(target.insertionDelimiter); this.indentationString = indentationString ?? this.isLineDelimiter ? getIndentationString(target.editor, target.contentRange) : ""; - this.insertionPrefix = - target.prefixRange != null - ? target.editor.document.getText(target.prefixRange) - : undefined; } get contentSelection(): Selection { @@ -70,10 +65,9 @@ export class DestinationImpl implements Destination { getEditNewActionType(): EditNewActionType { if ( - this.insertionMode === "after" && - this.target.contentRange.isSingleLine && this.insertionDelimiter === "\n" && - this.insertionPrefix == null + this.insertionMode === "after" && + this.target.contentRange.isSingleLine ) { // If the target that we're wrapping is not a single line, then we // want to compute indentation based on the entire target. Otherwise, @@ -116,31 +110,20 @@ export class DestinationImpl implements Destination { private getEditRange() { const position = (() => { - const insertionPosition = this.isBefore - ? union(this.target.contentRange, this.target.prefixRange).start - : this.target.contentRange.end; - if (this.isLineDelimiter) { - const line = this.editor.document.lineAt(insertionPosition); - const nonWhitespaceCharacterIndex = this.isBefore - ? line.firstNonWhitespaceCharacterIndex - : line.lastNonWhitespaceCharacterIndex; - - // Use the full line with included indentation and trailing whitespaces - if (insertionPosition.character === nonWhitespaceCharacterIndex) { - return this.isBefore ? line.range.start : line.range.end; - } + const line = this.editor.document.lineAt( + this.isBefore ? this.contentRange.start : this.contentRange.end, + ); + return this.isBefore ? line.range.start : line.range.end; + } else { + return this.isBefore ? this.contentRange.start : this.contentRange.end; } - - return insertionPosition; })(); - return new Range(position, position); } private getEditText(text: string) { - const insertionText = - this.indentationString + (this.insertionPrefix ?? "") + text; + const insertionText = this.indentationString + text; return this.isBefore ? insertionText + this.insertionDelimiter @@ -148,14 +131,12 @@ export class DestinationImpl implements Destination { } private updateRange(range: Range, text: string) { - const baseStartOffset = - this.editor.document.offsetAt(range.start) + - this.indentationString.length + - (this.insertionPrefix?.length ?? 0); - + const baseStartOffset = this.editor.document.offsetAt(range.start); const startIndex = this.isBefore - ? baseStartOffset - : baseStartOffset + this.getLengthOfInsertionDelimiter(); + ? baseStartOffset + this.indentationString.length + : baseStartOffset + + this.getLengthOfInsertionDelimiter() + + this.indentationString.length; const endIndex = startIndex + text.length; @@ -169,10 +150,11 @@ export class DestinationImpl implements Destination { // Went inserting a new line with eol `CRLF` each `\n` will be converted to // `\r\n` and therefore the length is doubled. if (this.editor.document.eol === "CRLF") { - const matches = this.insertionDelimiter.match(/\n/g); - if (matches != null) { - return this.insertionDelimiter.length + matches.length; - } + // This function is only called when inserting after a range. Therefore we + // only care about leading new lines in the insertion delimiter. + const match = this.insertionDelimiter.match(/^\n+/); + const nlCount = match?.[0].length ?? 0; + return this.insertionDelimiter.length + nlCount; } return this.insertionDelimiter.length; } diff --git a/packages/cursorless-engine/src/processTargets/targets/DocumentTarget.ts b/packages/cursorless-engine/src/processTargets/targets/DocumentTarget.ts index ae933bbea28..3f81b571fcb 100644 --- a/packages/cursorless-engine/src/processTargets/targets/DocumentTarget.ts +++ b/packages/cursorless-engine/src/processTargets/targets/DocumentTarget.ts @@ -1,9 +1,8 @@ import { Range } from "@cursorless/common"; import { shrinkRangeToFitContent } from "../../util/selectionUtils"; -import { BaseTarget, CommonTargetParameters } from "./BaseTarget"; -import { PlainTarget } from "./PlainTarget"; +import { BaseTarget, CommonTargetParameters, PlainTarget } from "./"; -export class DocumentTarget extends BaseTarget { +export default class DocumentTarget extends BaseTarget { type = "DocumentTarget"; insertionDelimiter = "\n"; isLine = true; diff --git a/packages/cursorless-engine/src/processTargets/targets/ImplicitTarget.ts b/packages/cursorless-engine/src/processTargets/targets/ImplicitTarget.ts index 103fa29e23d..25f0033852d 100644 --- a/packages/cursorless-engine/src/processTargets/targets/ImplicitTarget.ts +++ b/packages/cursorless-engine/src/processTargets/targets/ImplicitTarget.ts @@ -1,4 +1,4 @@ -import { BaseTarget, CommonTargetParameters } from "./BaseTarget"; +import { BaseTarget, CommonTargetParameters } from "."; /** * A target that was not explicitly spoken by the user. For example: @@ -6,7 +6,7 @@ import { BaseTarget, CommonTargetParameters } from "./BaseTarget"; * - The implicit destination in the command `"bring air"` * - The implicit anchor in the range `"take past air"` */ -export class ImplicitTarget extends BaseTarget { +export default class ImplicitTarget extends BaseTarget { type = "ImplicitTarget"; insertionDelimiter = ""; isRaw = true; diff --git a/packages/cursorless-engine/src/processTargets/targets/InteriorTarget.ts b/packages/cursorless-engine/src/processTargets/targets/InteriorTarget.ts index 68d27559219..df6d46068fb 100644 --- a/packages/cursorless-engine/src/processTargets/targets/InteriorTarget.ts +++ b/packages/cursorless-engine/src/processTargets/targets/InteriorTarget.ts @@ -1,13 +1,18 @@ import { Range } from "@cursorless/common"; -import { BaseTarget, MinimumTargetParameters } from "./BaseTarget"; +import { BaseTarget, MinimumTargetParameters } from "."; +import { Target } from "../../typings/target.types"; import { shrinkRangeToFitContent } from "../../util/selectionUtils"; -import { createContinuousRangeFromRanges } from "./util/createContinuousRange"; +import { isSameType } from "../../util/typeUtils"; +import { + createContinuousRangeFromRanges, + createContinuousRangeUntypedTarget, +} from "../targetUtil/createContinuousRange"; export interface InteriorTargetParameters extends MinimumTargetParameters { readonly fullInteriorRange: Range; } -export class InteriorTarget extends BaseTarget { +export default class InteriorTarget extends BaseTarget { type = "InteriorTarget"; insertionDelimiter = " "; private readonly fullInteriorRange: Range; @@ -34,19 +39,33 @@ export class InteriorTarget extends BaseTarget { }; } - maybeCreateRichRangeTarget( + createContinuousRangeTarget( isReversed: boolean, - endTarget: InteriorTarget, - ): InteriorTarget { - return new InteriorTarget({ - ...this.getCloneParameters(), + endTarget: Target, + includeStart: boolean, + includeEnd: boolean, + ): Target { + if (isSameType(this, endTarget)) { + const constructor = Object.getPrototypeOf(this).constructor; + + return new constructor({ + ...this.getCloneParameters(), + isReversed, + fullInteriorRange: createContinuousRangeFromRanges( + this.fullInteriorRange, + endTarget.fullInteriorRange, + includeStart, + includeEnd, + ), + }); + } + + return createContinuousRangeUntypedTarget( isReversed, - fullInteriorRange: createContinuousRangeFromRanges( - this.fullInteriorRange, - endTarget.fullInteriorRange, - true, - true, - ), - }); + this, + endTarget, + includeStart, + includeEnd, + ); } } diff --git a/packages/cursorless-engine/src/processTargets/targets/LineTarget.ts b/packages/cursorless-engine/src/processTargets/targets/LineTarget.ts index ab5c798a729..52d2159ba8f 100644 --- a/packages/cursorless-engine/src/processTargets/targets/LineTarget.ts +++ b/packages/cursorless-engine/src/processTargets/targets/LineTarget.ts @@ -1,11 +1,11 @@ import { Position, Range, TextEditor } from "@cursorless/common"; -import { BaseTarget, CommonTargetParameters } from "./BaseTarget"; +import { BaseTarget, CommonTargetParameters } from "."; +import { Target } from "../../typings/target.types"; import { expandToFullLine } from "../../util/rangeUtils"; -import { tryConstructPlainTarget } from "./PlainTarget"; -import { createContinuousLineRange } from "./util/createContinuousRange"; -import { tryConstructTarget } from "../../util/tryConstructTarget"; +import { tryConstructPlainTarget } from "../../util/tryConstructTarget"; +import { createContinuousLineRange } from "../targetUtil/createContinuousRange"; -export class LineTarget extends BaseTarget { +export default class LineTarget extends BaseTarget { type = "LineTarget"; insertionDelimiter = "\n"; isLine = true; @@ -42,15 +42,31 @@ export class LineTarget extends BaseTarget { getRemovalHighlightRange = () => this.fullLineContentRange; - maybeCreateRichRangeTarget( + createContinuousRangeTarget( isReversed: boolean, - endTarget: LineTarget, - ): LineTarget { - return new LineTarget({ - editor: this.editor, + endTarget: Target, + includeStart: boolean, + includeEnd: boolean, + ): Target { + if (endTarget.isLine) { + return new LineTarget({ + editor: this.editor, + isReversed, + contentRange: createContinuousLineRange( + this, + endTarget, + includeStart, + includeEnd, + ), + }); + } + + return super.createContinuousRangeTarget( isReversed, - contentRange: createContinuousLineRange(this, endTarget, true, true), - }); + endTarget, + includeStart, + includeEnd, + ); } protected getCloneParameters() { @@ -71,21 +87,3 @@ function getTrailingDelimiterRange(editor: TextEditor, range: Range) { ? new Range(range.end, new Position(end.line + 1, 0)) : undefined; } - -/** - * Constructs a {@link LineTarget} from the given range, or returns undefined - * if the range is undefined - * @param editor The editor containing the range - * @param range The range to convert into a target - * @param isReversed Whether the rain should be backward - * @returns A new {@link LineTarget} constructed from the given range, or null - * if the range is undefined - */ - -export function constructLineTarget( - editor: TextEditor, - range: Range | undefined, - isReversed: boolean, -): LineTarget | undefined { - return tryConstructTarget(LineTarget, editor, range, isReversed); -} diff --git a/packages/cursorless-engine/src/processTargets/targets/NotebookCellDestination.ts b/packages/cursorless-engine/src/processTargets/targets/NotebookCellDestination.ts index 38dec092542..9f28d148bb0 100644 --- a/packages/cursorless-engine/src/processTargets/targets/NotebookCellDestination.ts +++ b/packages/cursorless-engine/src/processTargets/targets/NotebookCellDestination.ts @@ -6,7 +6,7 @@ import { } from "@cursorless/common"; import { EditWithRangeUpdater } from "../../typings/Types"; import { Destination, EditNewActionType } from "../../typings/target.types"; -import { NotebookCellTarget } from "./NotebookCellTarget"; +import NotebookCellTarget from "./NotebookCellTarget"; export class NotebookCellDestination implements Destination { constructor( diff --git a/packages/cursorless-engine/src/processTargets/targets/NotebookCellTarget.ts b/packages/cursorless-engine/src/processTargets/targets/NotebookCellTarget.ts index ffdae50712f..cd71744ee81 100644 --- a/packages/cursorless-engine/src/processTargets/targets/NotebookCellTarget.ts +++ b/packages/cursorless-engine/src/processTargets/targets/NotebookCellTarget.ts @@ -1,9 +1,9 @@ import { InsertionMode } from "@cursorless/common"; -import { BaseTarget, CommonTargetParameters } from "./BaseTarget"; +import { BaseTarget, CommonTargetParameters } from "."; import { Destination } from "../../typings/target.types"; import { NotebookCellDestination } from "./NotebookCellDestination"; -export class NotebookCellTarget extends BaseTarget { +export default class NotebookCellTarget extends BaseTarget { type = "NotebookCellTarget"; insertionDelimiter = "\n"; isNotebookCell = true; diff --git a/packages/cursorless-engine/src/processTargets/targets/ParagraphTarget.ts b/packages/cursorless-engine/src/processTargets/targets/ParagraphTarget.ts index 09e02adda72..9d7f59da496 100644 --- a/packages/cursorless-engine/src/processTargets/targets/ParagraphTarget.ts +++ b/packages/cursorless-engine/src/processTargets/targets/ParagraphTarget.ts @@ -5,13 +5,14 @@ import { TextEditor, TextLine, } from "@cursorless/common"; -import { BaseTarget, CommonTargetParameters } from "./BaseTarget"; -import { LineTarget } from "./LineTarget"; +import { BaseTarget, CommonTargetParameters, LineTarget } from "."; +import { Target } from "../../typings/target.types"; import { expandToFullLine } from "../../util/rangeUtils"; -import { constructLineTarget } from "./LineTarget"; -import { createContinuousLineRange } from "./util/createContinuousRange"; +import { constructLineTarget } from "../../util/tryConstructTarget"; +import { isSameType } from "../../util/typeUtils"; +import { createContinuousLineRange } from "../targetUtil/createContinuousRange"; -export class ParagraphTarget extends BaseTarget { +export default class ParagraphTarget extends BaseTarget { type = "ParagraphTarget"; insertionDelimiter = "\n\n"; isLine = true; @@ -33,7 +34,7 @@ export class ParagraphTarget extends BaseTarget { } getRemovalRange(): Range { - // FIXME: In the future we could get rid of this function if {@link + // TODO: In the future we could get rid of this function if {@link // getDelimitedSequenceRemovalRange} made a continuous range from the target // past its delimiter target and then used the removal range of that. const delimiterTarget = @@ -72,15 +73,44 @@ export class ParagraphTarget extends BaseTarget { : this.fullLineContentRange; } - maybeCreateRichRangeTarget( + createContinuousRangeTarget( isReversed: boolean, - endTarget: ParagraphTarget, - ): ParagraphTarget { - return new ParagraphTarget({ - ...this.getCloneParameters(), + endTarget: Target, + includeStart: boolean, + includeEnd: boolean, + ): Target { + if (isSameType(this, endTarget)) { + return new ParagraphTarget({ + ...this.getCloneParameters(), + isReversed, + contentRange: createContinuousLineRange( + this, + endTarget, + includeStart, + includeEnd, + ), + }); + } + + if (endTarget.isLine) { + return new LineTarget({ + editor: this.editor, + isReversed, + contentRange: createContinuousLineRange( + this, + endTarget, + includeStart, + includeEnd, + ), + }); + } + + return super.createContinuousRangeTarget( isReversed, - contentRange: createContinuousLineRange(this, endTarget, true, true), - }); + endTarget, + includeStart, + includeEnd, + ); } protected getCloneParameters() { diff --git a/packages/cursorless-engine/src/processTargets/targets/PlainTarget.ts b/packages/cursorless-engine/src/processTargets/targets/PlainTarget.ts index 65bd31fe592..06d993270b3 100644 --- a/packages/cursorless-engine/src/processTargets/targets/PlainTarget.ts +++ b/packages/cursorless-engine/src/processTargets/targets/PlainTarget.ts @@ -1,6 +1,4 @@ -import { tryConstructTarget } from "../../util/tryConstructTarget"; -import { TextEditor, Range } from "@cursorless/common"; -import { BaseTarget, CommonTargetParameters } from "./BaseTarget"; +import { BaseTarget, CommonTargetParameters } from "."; interface PlainTargetParameters extends CommonTargetParameters { readonly isToken?: boolean; @@ -12,7 +10,7 @@ interface PlainTargetParameters extends CommonTargetParameters { * just consists of the content itself. Its insertion delimiter is empty string, * unless specified. */ -export class PlainTarget extends BaseTarget { +export default class PlainTarget extends BaseTarget { type = "PlainTarget"; insertionDelimiter: string; @@ -34,20 +32,3 @@ export class PlainTarget extends BaseTarget { }; } } - -/** - * Constructs a {@link PlainTarget} from the given range, or returns undefined - * if the range is undefined - * @param editor The editor containing the range - * @param range The range to convert into a target - * @param isReversed Whether the rain should be backward - * @returns A new {@link PlainTarget} constructed from the given range, or null - * if the range is undefined - */ -export function tryConstructPlainTarget( - editor: TextEditor, - range: Range | undefined, - isReversed: boolean, -): PlainTarget | undefined { - return tryConstructTarget(PlainTarget, editor, range, isReversed); -} diff --git a/packages/cursorless-engine/src/processTargets/targets/RawSelectionTarget.ts b/packages/cursorless-engine/src/processTargets/targets/RawSelectionTarget.ts index cfd7c495ae4..678f5d8b102 100644 --- a/packages/cursorless-engine/src/processTargets/targets/RawSelectionTarget.ts +++ b/packages/cursorless-engine/src/processTargets/targets/RawSelectionTarget.ts @@ -1,11 +1,11 @@ -import { BaseTarget, CommonTargetParameters } from "./BaseTarget"; +import { BaseTarget, CommonTargetParameters } from "."; /** * A target that has no leading or trailing delimiters so it's removal range * just consists of the content itself. Its insertion delimiter will be * inherited from the source in the case of a bring after a bring before */ -export class RawSelectionTarget extends BaseTarget { +export default class RawSelectionTarget extends BaseTarget { type = "RawSelectionTarget"; insertionDelimiter = ""; isRaw = true; diff --git a/packages/cursorless-engine/src/processTargets/targets/ScopeTypeTarget.ts b/packages/cursorless-engine/src/processTargets/targets/ScopeTypeTarget.ts index 4e31218c043..7950fca1ce9 100644 --- a/packages/cursorless-engine/src/processTargets/targets/ScopeTypeTarget.ts +++ b/packages/cursorless-engine/src/processTargets/targets/ScopeTypeTarget.ts @@ -1,30 +1,33 @@ import { Range, SimpleScopeTypeType } from "@cursorless/common"; -import { BaseTarget, CommonTargetParameters } from "./BaseTarget"; -import { InteriorTarget } from "./InteriorTarget"; -import { PlainTarget } from "./PlainTarget"; +import { + BaseTarget, + CommonTargetParameters, + InteriorTarget, + PlainTarget, +} from "."; import { Target } from "../../typings/target.types"; +import { isSameType } from "../../util/typeUtils"; import { createContinuousRange, createContinuousRangeFromRanges, -} from "./util/createContinuousRange"; -import { getDelimitedSequenceRemovalRange } from "./util/insertionRemovalBehaviors/DelimitedSequenceInsertionRemovalBehavior"; +} from "../targetUtil/createContinuousRange"; +import { getDelimitedSequenceRemovalRange } from "../targetUtil/insertionRemovalBehaviors/DelimitedSequenceInsertionRemovalBehavior"; import { getTokenLeadingDelimiterTarget, getTokenRemovalRange, getTokenTrailingDelimiterTarget, -} from "./util/insertionRemovalBehaviors/TokenInsertionRemovalBehavior"; +} from "../targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior"; export interface ScopeTypeTargetParameters extends CommonTargetParameters { readonly scopeTypeType: SimpleScopeTypeType; - readonly insertionDelimiter?: string; - readonly prefixRange?: Range; + readonly delimiter?: string; readonly removalRange?: Range; readonly interiorRange?: Range; readonly leadingDelimiterRange?: Range; readonly trailingDelimiterRange?: Range; } -export class ScopeTypeTarget extends BaseTarget { +export default class ScopeTypeTarget extends BaseTarget { type = "ScopeTypeTarget"; private scopeTypeType_: SimpleScopeTypeType; private removalRange_?: Range; @@ -32,8 +35,7 @@ export class ScopeTypeTarget extends BaseTarget { private leadingDelimiterRange_?: Range; private trailingDelimiterRange_?: Range; private hasDelimiterRange_: boolean; - public readonly prefixRange?: Range; - readonly insertionDelimiter: string; + insertionDelimiter: string; constructor(parameters: ScopeTypeTargetParameters) { super(parameters); @@ -42,10 +44,8 @@ export class ScopeTypeTarget extends BaseTarget { this.interiorRange_ = parameters.interiorRange; this.leadingDelimiterRange_ = parameters.leadingDelimiterRange; this.trailingDelimiterRange_ = parameters.trailingDelimiterRange; - this.prefixRange = parameters.prefixRange; this.insertionDelimiter = - parameters.insertionDelimiter ?? - getInsertionDelimiter(parameters.scopeTypeType); + parameters.delimiter ?? getDelimiter(parameters.scopeTypeType); this.hasDelimiterRange_ = !!this.leadingDelimiterRange_ || !!this.trailingDelimiterRange_; } @@ -99,49 +99,61 @@ export class ScopeTypeTarget extends BaseTarget { : getTokenRemovalRange(this); } - maybeCreateRichRangeTarget( + createContinuousRangeTarget( isReversed: boolean, - endTarget: ScopeTypeTarget, - ): ScopeTypeTarget | null { - if (this.scopeTypeType_ !== endTarget.scopeTypeType_) { - return null; - } + endTarget: Target, + includeStart: boolean, + includeEnd: boolean, + ): Target { + if (isSameType(this, endTarget)) { + const scopeTarget = endTarget; + if (this.scopeTypeType_ === scopeTarget.scopeTypeType_) { + const contentRemovalRange = + this.removalRange_ != null || scopeTarget.removalRange_ != null + ? createContinuousRangeFromRanges( + this.removalRange_ ?? this.contentRange, + scopeTarget.removalRange_ ?? scopeTarget.contentRange, + includeStart, + includeEnd, + ) + : undefined; - const contentRemovalRange = - this.removalRange_ != null || endTarget.removalRange_ != null - ? createContinuousRangeFromRanges( - this.removalRange_ ?? this.contentRange, - endTarget.removalRange_ ?? endTarget.contentRange, - true, - true, - ) - : undefined; + return new ScopeTypeTarget({ + ...this.getCloneParameters(), + isReversed, + leadingDelimiterRange: this.leadingDelimiterRange_, + trailingDelimiterRange: scopeTarget.trailingDelimiterRange_, + removalRange: contentRemovalRange, + contentRange: createContinuousRange( + this, + endTarget, + includeStart, + includeEnd, + ), + }); + } + } - return new ScopeTypeTarget({ - ...this.getCloneParameters(), + return super.createContinuousRangeTarget( isReversed, - leadingDelimiterRange: this.leadingDelimiterRange_, - trailingDelimiterRange: endTarget.trailingDelimiterRange_, - removalRange: contentRemovalRange, - contentRange: createContinuousRange(this, endTarget, true, true), - }); + endTarget, + includeStart, + includeEnd, + ); } protected getCloneParameters() { return { ...this.state, - insertionDelimiter: this.insertionDelimiter, - prefixRange: this.prefixRange, - removalRange: undefined, - interiorRange: undefined, scopeTypeType: this.scopeTypeType_, + contentRemovalRange: this.removalRange_, leadingDelimiterRange: this.leadingDelimiterRange_, trailingDelimiterRange: this.trailingDelimiterRange_, }; } } -function getInsertionDelimiter(scopeType: SimpleScopeTypeType): string { +function getDelimiter(scopeType: SimpleScopeTypeType): string { switch (scopeType) { case "class": case "namedFunction": diff --git a/packages/cursorless-engine/src/processTargets/targets/SubTokenWordTarget.ts b/packages/cursorless-engine/src/processTargets/targets/SubTokenWordTarget.ts index 5931758f2db..0b3e6b0ccb3 100644 --- a/packages/cursorless-engine/src/processTargets/targets/SubTokenWordTarget.ts +++ b/packages/cursorless-engine/src/processTargets/targets/SubTokenWordTarget.ts @@ -1,8 +1,10 @@ import { Range } from "@cursorless/common"; -import { BaseTarget, CommonTargetParameters } from "./BaseTarget"; -import { tryConstructPlainTarget } from "./PlainTarget"; -import { createContinuousRange } from "./util/createContinuousRange"; -import { getDelimitedSequenceRemovalRange } from "./util/insertionRemovalBehaviors/DelimitedSequenceInsertionRemovalBehavior"; +import { BaseTarget, CommonTargetParameters } from "."; +import { Target } from "../../typings/target.types"; +import { tryConstructPlainTarget } from "../../util/tryConstructTarget"; +import { isSameType } from "../../util/typeUtils"; +import { createContinuousRange } from "../targetUtil/createContinuousRange"; +import { getDelimitedSequenceRemovalRange } from "../targetUtil/insertionRemovalBehaviors/DelimitedSequenceInsertionRemovalBehavior"; export interface SubTokenTargetParameters extends CommonTargetParameters { readonly insertionDelimiter: string; @@ -10,7 +12,7 @@ export interface SubTokenTargetParameters extends CommonTargetParameters { readonly trailingDelimiterRange?: Range; } -export class SubTokenWordTarget extends BaseTarget { +export default class SubTokenWordTarget extends BaseTarget { type = "SubTokenWordTarget"; private leadingDelimiterRange_?: Range; private trailingDelimiterRange_?: Range; @@ -45,19 +47,35 @@ export class SubTokenWordTarget extends BaseTarget { return getDelimitedSequenceRemovalRange(this); } - maybeCreateRichRangeTarget( + createContinuousRangeTarget( isReversed: boolean, - endTarget: SubTokenWordTarget, - ): SubTokenWordTarget { - return new SubTokenWordTarget({ - ...this.getCloneParameters(), + endTarget: Target, + includeStart: boolean, + includeEnd: boolean, + ): Target { + if (isSameType(this, endTarget)) { + return new SubTokenWordTarget({ + ...this.getCloneParameters(), + isReversed, + contentRange: createContinuousRange( + this, + endTarget, + includeStart, + includeEnd, + ), + trailingDelimiterRange: endTarget.trailingDelimiterRange_, + }); + } + + return super.createContinuousRangeTarget( isReversed, - contentRange: createContinuousRange(this, endTarget, true, true), - trailingDelimiterRange: endTarget.trailingDelimiterRange_, - }); + endTarget, + includeStart, + includeEnd, + ); } - protected getCloneParameters() { + protected getCloneParameters(): SubTokenTargetParameters { return { ...this.state, leadingDelimiterRange: this.leadingDelimiterRange_, diff --git a/packages/cursorless-engine/src/processTargets/targets/SurroundingPairTarget.ts b/packages/cursorless-engine/src/processTargets/targets/SurroundingPairTarget.ts index ea587499191..9a6459ab3c0 100644 --- a/packages/cursorless-engine/src/processTargets/targets/SurroundingPairTarget.ts +++ b/packages/cursorless-engine/src/processTargets/targets/SurroundingPairTarget.ts @@ -1,13 +1,16 @@ import { Range } from "@cursorless/common"; -import { BaseTarget, CommonTargetParameters } from "./BaseTarget"; -import { InteriorTarget } from "./InteriorTarget"; -import { TokenTarget } from "./TokenTarget"; +import { + BaseTarget, + CommonTargetParameters, + InteriorTarget, + TokenTarget, +} from "."; import { Target } from "../../typings/target.types"; import { getTokenLeadingDelimiterTarget, getTokenRemovalRange, getTokenTrailingDelimiterTarget, -} from "./util/insertionRemovalBehaviors/TokenInsertionRemovalBehavior"; +} from "../targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior"; interface SurroundingPairTargetParameters extends CommonTargetParameters { /** @@ -25,7 +28,7 @@ interface SurroundingPairTargetParameters extends CommonTargetParameters { readonly boundary: [Range, Range]; } -export class SurroundingPairTarget extends BaseTarget { +export default class SurroundingPairTarget extends BaseTarget { type = "SurroundingPairTarget"; insertionDelimiter = " "; private interiorRange_: Range; diff --git a/packages/cursorless-engine/src/processTargets/targets/TokenTarget.ts b/packages/cursorless-engine/src/processTargets/targets/TokenTarget.ts index 0d4d64e7203..bf37f0d743e 100644 --- a/packages/cursorless-engine/src/processTargets/targets/TokenTarget.ts +++ b/packages/cursorless-engine/src/processTargets/targets/TokenTarget.ts @@ -1,13 +1,13 @@ import { Range } from "@cursorless/common"; -import { BaseTarget, CommonTargetParameters } from "./BaseTarget"; +import { BaseTarget, CommonTargetParameters } from "."; import { Target } from "../../typings/target.types"; import { getTokenLeadingDelimiterTarget, getTokenRemovalRange, getTokenTrailingDelimiterTarget, -} from "./util/insertionRemovalBehaviors/TokenInsertionRemovalBehavior"; +} from "../targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior"; -export class TokenTarget extends BaseTarget { +export default class TokenTarget extends BaseTarget { type = "TokenTarget"; insertionDelimiter = " "; diff --git a/packages/cursorless-engine/src/processTargets/targets/UntypedTarget.ts b/packages/cursorless-engine/src/processTargets/targets/UntypedTarget.ts index 06aab159971..48db3ba5045 100644 --- a/packages/cursorless-engine/src/processTargets/targets/UntypedTarget.ts +++ b/packages/cursorless-engine/src/processTargets/targets/UntypedTarget.ts @@ -1,11 +1,12 @@ import { Range } from "@cursorless/common"; -import { BaseTarget, CommonTargetParameters } from "./BaseTarget"; +import { BaseTarget, CommonTargetParameters } from "."; import type { Target } from "../../typings/target.types"; +import { createContinuousRangeUntypedTarget } from "../targetUtil/createContinuousRange"; import { getTokenLeadingDelimiterTarget, getTokenRemovalRange, getTokenTrailingDelimiterTarget, -} from "./util/insertionRemovalBehaviors/TokenInsertionRemovalBehavior"; +} from "../targetUtil/insertionRemovalBehaviors/TokenInsertionRemovalBehavior"; interface UntypedTargetParameters extends CommonTargetParameters { readonly hasExplicitRange: boolean; @@ -17,7 +18,7 @@ interface UntypedTargetParameters extends CommonTargetParameters { * - Use token delimiters (space) for removal and insertion * - Expand to nearest containing pair when asked for boundary or interior */ -export class UntypedTarget extends BaseTarget { +export default class UntypedTarget extends BaseTarget { type = "UntypedTarget"; insertionDelimiter = " "; hasExplicitScopeType = false; @@ -41,17 +42,24 @@ export class UntypedTarget extends BaseTarget { : getTokenRemovalRange(this); } - maybeCreateRichRangeTarget(): null { - // It never makes sense to create a rich range target from an untyped - // target. We let {@link createContinuousRangeTarget} handle constructing an - // untyped range. - return null; + createContinuousRangeTarget( + isReversed: boolean, + endTarget: Target, + includeStart: boolean, + includeEnd: boolean, + ): Target { + return createContinuousRangeUntypedTarget( + isReversed, + this, + endTarget, + includeStart, + includeEnd, + ); } protected getCloneParameters() { return { ...this.state, - isToken: this.isToken, hasExplicitRange: this.hasExplicitRange, }; } diff --git a/packages/cursorless-engine/src/processTargets/targets/index.ts b/packages/cursorless-engine/src/processTargets/targets/index.ts index 47a63fe8d2f..0154f82e78f 100644 --- a/packages/cursorless-engine/src/processTargets/targets/index.ts +++ b/packages/cursorless-engine/src/processTargets/targets/index.ts @@ -1,16 +1,30 @@ export * from "./BaseTarget"; +export { default as BaseTarget } from "./BaseTarget"; export * from "./DocumentTarget"; +export { default as DocumentTarget } from "./DocumentTarget"; export * from "./LineTarget"; +export { default as LineTarget } from "./LineTarget"; export * from "./NotebookCellTarget"; +export { default as NotebookCellTarget } from "./NotebookCellTarget"; export * from "./NotebookCellDestination"; export * from "./ParagraphTarget"; +export { default as ParagraphTarget } from "./ParagraphTarget"; export * from "./PlainTarget"; +export { default as PlainTarget } from "./PlainTarget"; export * from "./DestinationImpl"; export * from "./RawSelectionTarget"; +export { default as RawSelectionTarget } from "./RawSelectionTarget"; export * from "./ScopeTypeTarget"; +export { default as ScopeTypeTarget } from "./ScopeTypeTarget"; export * from "./SubTokenWordTarget"; +export { default as SubTokenWordTarget } from "./SubTokenWordTarget"; export * from "./SurroundingPairTarget"; +export { default as SurroundingPairTarget } from "./SurroundingPairTarget"; export * from "./TokenTarget"; +export { default as TokenTarget } from "./TokenTarget"; export * from "./UntypedTarget"; +export { default as UntypedTarget } from "./UntypedTarget"; export * from "./ImplicitTarget"; +export { default as ImplicitTarget } from "./ImplicitTarget"; export * from "./InteriorTarget"; +export { default as InteriorTarget } from "./InteriorTarget"; diff --git a/packages/cursorless-engine/src/runCommand.ts b/packages/cursorless-engine/src/runCommand.ts index 331200b0303..d6d0a02a149 100644 --- a/packages/cursorless-engine/src/runCommand.ts +++ b/packages/cursorless-engine/src/runCommand.ts @@ -6,13 +6,12 @@ import { Snippets } from "./core/Snippets"; import { CommandRunnerImpl } from "./core/commandRunner/CommandRunnerImpl"; import { canonicalizeAndValidateCommand } from "./core/commandVersionUpgrades/canonicalizeAndValidateCommand"; import { RangeUpdater } from "./core/updateSelections/RangeUpdater"; -import { StoredTargetMap, TreeSitter } from "./index"; +import { StoredTargetMap, TestCaseRecorder } from "./index"; import { LanguageDefinitions } from "./languages/LanguageDefinitions"; import { TargetPipelineRunner } from "./processTargets"; import { MarkStageFactoryImpl } from "./processTargets/MarkStageFactoryImpl"; import { ModifierStageFactoryImpl } from "./processTargets/ModifierStageFactoryImpl"; import { ScopeHandlerFactoryImpl } from "./processTargets/modifiers/scopeHandlers"; -import { CommandRunnerDecorator } from "./api/CursorlessEngineApi"; /** * Entry point for Cursorless commands. We proceed as follows: @@ -27,14 +26,13 @@ import { CommandRunnerDecorator } from "./api/CursorlessEngineApi"; * 5. Call {@link CommandRunnerImpl.run} to run the actual command. */ export async function runCommand( - treeSitter: TreeSitter, debug: Debug, hatTokenMap: HatTokenMap, + testCaseRecorder: TestCaseRecorder, snippets: Snippets, storedTargets: StoredTargetMap, languageDefinitions: LanguageDefinitions, rangeUpdater: RangeUpdater, - commandRunnerDecorators: CommandRunnerDecorator[], command: Command, ): Promise { if (debug.active) { @@ -49,7 +47,6 @@ export async function runCommand( ); let commandRunner = createCommandRunner( - treeSitter, languageDefinitions, debug, storedTargets, @@ -58,15 +55,17 @@ export async function runCommand( rangeUpdater, ); - for (const decorator of commandRunnerDecorators) { - commandRunner = decorator.wrapCommandRunner(readableHatMap, commandRunner); + if (testCaseRecorder.isActive()) { + commandRunner = testCaseRecorder.wrapCommandRunner( + readableHatMap, + commandRunner, + ); } return await commandRunner.run(commandComplete); } function createCommandRunner( - treeSitter: TreeSitter, languageDefinitions: LanguageDefinitions, debug: Debug, storedTargets: StoredTargetMap, @@ -93,6 +92,6 @@ function createCommandRunner( debug, storedTargets, targetPipelineRunner, - new Actions(treeSitter, snippets, rangeUpdater, modifierStageFactory), + new Actions(snippets, rangeUpdater, modifierStageFactory), ); } diff --git a/packages/cursorless-engine/src/runIntegrationTests.ts b/packages/cursorless-engine/src/runIntegrationTests.ts index 03aa06a2f07..5b5c541a858 100644 --- a/packages/cursorless-engine/src/runIntegrationTests.ts +++ b/packages/cursorless-engine/src/runIntegrationTests.ts @@ -1,9 +1,8 @@ +import assert = require("assert"); import { languageMatchers } from "./languages/getNodeMatcher"; import { TreeSitter } from "./typings/TreeSitter"; import { legacyLanguageIds } from "./languages/LegacyLanguageId"; import { LanguageDefinitions } from "./languages/LanguageDefinitions"; -import assert from "assert"; -import { unsafeKeys } from "./util/object"; /** * Run tests that require multiple components to be instantiated, as well as a @@ -27,9 +26,8 @@ async function assertNoScopesBothLegacyAndNew( const errors: string[] = []; for (const languageId of legacyLanguageIds) { await treeSitter.loadLanguage(languageId); - await languageDefinitions.loadLanguage(languageId); - unsafeKeys(languageMatchers[languageId] ?? {}).map((scopeTypeType) => { + Object.keys(languageMatchers[languageId]).map((scopeTypeType) => { if ( languageDefinitions.get(languageId)?.getScopeHandler({ type: scopeTypeType, diff --git a/packages/cursorless-engine/src/scopeProviders/ScopeInfoProvider.ts b/packages/cursorless-engine/src/scopeProviders/ScopeInfoProvider.ts deleted file mode 100644 index f183ee1f3d7..00000000000 --- a/packages/cursorless-engine/src/scopeProviders/ScopeInfoProvider.ts +++ /dev/null @@ -1,188 +0,0 @@ -import { - Disposable, - ScopeType, - ScopeTypeInfo, - ScopeTypeInfoEventCallback, - SurroundingPairScopeType, - simpleScopeTypeTypes, - surroundingPairNames, -} from "@cursorless/common"; -import { pull } from "lodash"; - -import { CustomSpokenFormGeneratorImpl } from "../generateSpokenForm/CustomSpokenFormGeneratorImpl"; -import { scopeTypeToString } from "./scopeTypeToString"; - -/** - * Maintains a list of all scope types and notifies listeners when it changes. - */ -export class ScopeInfoProvider { - private disposable: Disposable; - private listeners: ScopeTypeInfoEventCallback[] = []; - private scopeInfos!: ScopeTypeInfo[]; - - constructor( - private customSpokenFormGenerator: CustomSpokenFormGeneratorImpl, - ) { - this.disposable = customSpokenFormGenerator.onDidChangeCustomSpokenForms( - () => this.onChange(), - ); - - this.onDidChangeScopeInfo = this.onDidChangeScopeInfo.bind(this); - this.getScopeTypeInfo = this.getScopeTypeInfo.bind(this); - this.updateScopeTypeInfos(); - } - - /** - * Registers a callback to be run when the scope info changes. The callback - * will be run immediately once with the current scope info. - * - * Includes information about the available scopes, including their custom - * spoken forms, if available. Note that even custom regex scopes will be - * available, as reported to the engine by Talon. - * @param callback The callback to run when the scope support changes - * @returns A {@link Disposable} which will stop the callback from running - */ - onDidChangeScopeInfo(callback: ScopeTypeInfoEventCallback): Disposable { - callback(this.getScopeTypeInfos()); - - this.listeners.push(callback); - - return { - dispose: () => { - pull(this.listeners, callback); - }, - }; - } - - private async onChange() { - this.updateScopeTypeInfos(); - - this.listeners.forEach((listener) => listener(this.scopeInfos)); - } - - private updateScopeTypeInfos(): void { - const scopeTypes: ScopeType[] = [ - ...simpleScopeTypeTypes - // Ignore instance pseudo-scope because it's not really a scope - .filter((scopeTypeType) => scopeTypeType !== "instance") - .map((scopeTypeType) => ({ - type: scopeTypeType, - })), - - ...surroundingPairNames.map( - (surroundingPairName): SurroundingPairScopeType => ({ - type: "surroundingPair", - delimiter: surroundingPairName, - }), - ), - - ...this.customSpokenFormGenerator.getCustomRegexScopeTypes(), - ]; - - this.scopeInfos = scopeTypes.map((scopeType) => - this.getScopeTypeInfo(scopeType), - ); - } - - getScopeTypeInfos(): ScopeTypeInfo[] { - return this.scopeInfos; - } - - getScopeTypeInfo(scopeType: ScopeType): ScopeTypeInfo { - return { - scopeType, - spokenForm: - this.customSpokenFormGenerator.scopeTypeToSpokenForm(scopeType), - humanReadableName: scopeTypeToString(scopeType), - isLanguageSpecific: isLanguageSpecific(scopeType), - }; - } - - dispose() { - this.disposable.dispose(); - } -} - -/** - * @param scopeType The scope type to check - * @returns A boolean indicating whether the given scope type is defined on a - * per-language basis. - */ -function isLanguageSpecific(scopeType: ScopeType): boolean { - switch (scopeType.type) { - case "string": - case "argumentOrParameter": - case "anonymousFunction": - case "attribute": - case "branch": - case "class": - case "className": - case "collectionItem": - case "collectionKey": - case "command": - case "comment": - case "private.fieldAccess": - case "functionCall": - case "functionCallee": - case "functionName": - case "ifStatement": - case "instance": - case "list": - case "map": - case "name": - case "namedFunction": - case "regularExpression": - case "statement": - case "type": - case "value": - case "condition": - case "section": - case "sectionLevelOne": - case "sectionLevelTwo": - case "sectionLevelThree": - case "sectionLevelFour": - case "sectionLevelFive": - case "sectionLevelSix": - case "selector": - case "private.switchStatementSubject": - case "unit": - case "xmlBothTags": - case "xmlElement": - case "xmlEndTag": - case "xmlStartTag": - case "part": - case "chapter": - case "subSection": - case "subSubSection": - case "namedParagraph": - case "subParagraph": - case "environment": - return true; - - case "character": - case "word": - case "token": - case "identifier": - case "line": - case "sentence": - case "paragraph": - case "document": - case "nonWhitespaceSequence": - case "boundedNonWhitespaceSequence": - case "url": - case "notebookCell": - case "surroundingPair": - case "customRegex": - case "glyph": - return false; - - case "oneOf": - throw Error( - `Can't decide whether scope type ${JSON.stringify( - scopeType, - undefined, - 3, - )} is language-specific`, - ); - } -} diff --git a/packages/cursorless-engine/src/scopeProviders/ScopeSupportWatcher.ts b/packages/cursorless-engine/src/scopeProviders/ScopeSupportWatcher.ts deleted file mode 100644 index 04c236ac9c3..00000000000 --- a/packages/cursorless-engine/src/scopeProviders/ScopeSupportWatcher.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { - Disposable, - ScopeSupport, - ScopeSupportEventCallback, - ScopeSupportInfo, - ScopeType, - disposableFrom, -} from "@cursorless/common"; -import { pull } from "lodash"; - -import { Debouncer } from "../core/Debouncer"; -import { LanguageDefinitions } from "../languages/LanguageDefinitions"; -import { ide } from "../singletons/ide.singleton"; -import { ScopeInfoProvider } from "./ScopeInfoProvider"; -import { ScopeSupportChecker } from "./ScopeSupportChecker"; - -/** - * Watches for changes to the scope support of the active editor and notifies - * listeners when it changes. Watches support for all scopes at the same time. - */ -export class ScopeSupportWatcher { - private disposable: Disposable; - private debouncer = new Debouncer(() => this.onChange()); - private listeners: ScopeSupportEventCallback[] = []; - - constructor( - languageDefinitions: LanguageDefinitions, - private scopeSupportChecker: ScopeSupportChecker, - private scopeInfoProvider: ScopeInfoProvider, - ) { - this.onChange = this.onChange.bind(this); - this.onDidChangeScopeSupport = this.onDidChangeScopeSupport.bind(this); - - this.disposable = disposableFrom( - // An event that fires when a text document opens - ide().onDidOpenTextDocument(this.debouncer.run), - // An Event that fires when a text document closes - ide().onDidCloseTextDocument(this.debouncer.run), - // An Event which fires when the active editor has changed. Note that the event also fires when the active editor changes to undefined. - ide().onDidChangeActiveTextEditor(this.debouncer.run), - // An event that is emitted when a text document is changed. This usually - // happens when the contents changes but also when other things like the - // dirty-state changes. - ide().onDidChangeTextDocument(this.debouncer.run), - languageDefinitions.onDidChangeDefinition(this.debouncer.run), - this.scopeInfoProvider.onDidChangeScopeInfo(this.onChange), - this.debouncer, - ); - } - - /** - * Registers a callback to be run when the scope support changes for the active - * editor. The callback will be run immediately once with the current support - * levels for the active editor. - * - * Note that this watcher could be expensive, because it runs all the scope - * handlers for the active editor every time the content of the active editor - * changes. If you only need info about the available scopes, including their - * spoken forms, you should use {@link onDidChangeScopeInfo} instead. - * @param callback The callback to run when the scope support changes - * @returns A {@link Disposable} which will stop the callback from running - */ - onDidChangeScopeSupport(callback: ScopeSupportEventCallback): Disposable { - callback(this.getSupportLevels()); - - this.listeners.push(callback); - - return { - dispose: () => { - pull(this.listeners, callback); - }, - }; - } - - private onChange() { - if (this.listeners.length === 0) { - // Don't bother if no one is listening - return; - } - - const supportLevels = this.getSupportLevels(); - - this.listeners.forEach((listener) => listener(supportLevels)); - } - - private getSupportLevels(): ScopeSupportInfo[] { - const activeTextEditor = ide().activeTextEditor; - - const getScopeTypeSupport = - activeTextEditor == null - ? () => ScopeSupport.unsupported - : (scopeType: ScopeType) => - this.scopeSupportChecker.getScopeSupport( - activeTextEditor, - scopeType, - ); - - const getIterationScopeTypeSupport = - activeTextEditor == null - ? () => ScopeSupport.unsupported - : (scopeType: ScopeType) => - this.scopeSupportChecker.getIterationScopeSupport( - activeTextEditor, - scopeType, - ); - - const scopeTypeInfos = this.scopeInfoProvider.getScopeTypeInfos(); - - return scopeTypeInfos.map((scopeTypeInfo) => ({ - ...scopeTypeInfo, - support: getScopeTypeSupport(scopeTypeInfo.scopeType), - iterationScopeSupport: getIterationScopeTypeSupport( - scopeTypeInfo.scopeType, - ), - })); - } - - dispose() { - this.disposable.dispose(); - } -} diff --git a/packages/cursorless-engine/src/scopeProviders/TalonSpokenForms.ts b/packages/cursorless-engine/src/scopeProviders/TalonSpokenForms.ts deleted file mode 100644 index c3c10dfd4aa..00000000000 --- a/packages/cursorless-engine/src/scopeProviders/TalonSpokenForms.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { Notifier } from "@cursorless/common"; -import { - SpokenFormMapKeyTypes, - SpokenFormType, -} from "../spokenForms/SpokenFormType"; - -/** - * Interface representing a communication mechanism whereby Talon can provide - * the user's custom spoken forms to the Cursorless engine. - */ -export interface TalonSpokenForms { - getSpokenFormEntries(): Promise; - onDidChange: Notifier["registerListener"]; -} - -/** - * The types of entries for which we currently support getting custom spoken - * forms from Talon. - */ -export const SUPPORTED_ENTRY_TYPES = [ - "simpleScopeTypeType", - "complexScopeTypeType", - "customRegex", - "pairedDelimiter", -] as const; - -type SupportedEntryType = (typeof SUPPORTED_ENTRY_TYPES)[number]; - -export interface SpokenFormEntryForType { - type: T; - id: SpokenFormMapKeyTypes[T]; - spokenForms: string[]; -} - -export type SpokenFormEntry = { - [K in SpokenFormType]: SpokenFormEntryForType; -}[SupportedEntryType]; - -export class NeedsInitialTalonUpdateError extends Error { - constructor(message: string) { - super(message); - this.name = "NeedsInitialTalonUpdateError"; - } -} diff --git a/packages/cursorless-engine/src/scopeProviders/getTargetRanges.ts b/packages/cursorless-engine/src/scopeProviders/getTargetRanges.ts deleted file mode 100644 index 2abc30136e6..00000000000 --- a/packages/cursorless-engine/src/scopeProviders/getTargetRanges.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { - NoContainingScopeError, - TargetRanges, - toCharacterRange, - toLineRange, -} from "@cursorless/common"; -import { Target } from "../typings/target.types"; - -export function getTargetRanges(target: Target): TargetRanges { - const interior = (() => { - try { - return target.getInteriorStrict().map(getTargetRanges); - } catch (error) { - if (error instanceof NoContainingScopeError) { - return undefined; - } - throw error; - } - })(); - - const boundary = (() => { - try { - return target.getBoundaryStrict().map(getTargetRanges); - } catch (error) { - if (error instanceof NoContainingScopeError) { - return undefined; - } - throw error; - } - })(); - - return { - contentRange: target.contentRange, - removalRange: target.getRemovalRange(), - removalHighlightRange: target.isLine - ? toLineRange(target.getRemovalHighlightRange()) - : toCharacterRange(target.getRemovalHighlightRange()), - leadingDelimiter: getOptionalTarget(target.getLeadingDelimiterTarget()), - trailingDelimiter: getOptionalTarget(target.getTrailingDelimiterTarget()), - interior, - boundary, - insertionDelimiter: target.insertionDelimiter, - }; -} - -function getOptionalTarget(target: Target | undefined) { - return target != null ? getTargetRanges(target) : undefined; -} diff --git a/packages/cursorless-engine/src/scopeProviders/scopeTypeToString.ts b/packages/cursorless-engine/src/scopeProviders/scopeTypeToString.ts deleted file mode 100644 index 755ca90eca6..00000000000 --- a/packages/cursorless-engine/src/scopeProviders/scopeTypeToString.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { - ScopeType, - camelCaseToAllDown, - isSimpleScopeType, -} from "@cursorless/common"; - -export function scopeTypeToString(scopeType: ScopeType): string { - if (isSimpleScopeType(scopeType)) { - return camelCaseToAllDown(scopeType.type).replace(".", " "); - } - - if (scopeType.type === "surroundingPair") { - return `Matching pair of ${camelCaseToAllDown(scopeType.delimiter)}`; - } - - if (scopeType.type === "customRegex") { - return `Regex \`${scopeType.regex}\``; - } - - return "Unknown scope type"; -} diff --git a/packages/cursorless-engine/src/scripts/transformRecordedTests/checkMarks.ts b/packages/cursorless-engine/src/scripts/transformRecordedTests/checkMarks.ts index 94f8b9b8413..e0e5dc01967 100644 --- a/packages/cursorless-engine/src/scripts/transformRecordedTests/checkMarks.ts +++ b/packages/cursorless-engine/src/scripts/transformRecordedTests/checkMarks.ts @@ -5,7 +5,7 @@ import tokenGraphemeSplitter from "../../singletons/tokenGraphemeSplitter.single import { extractTargetKeys } from "../../testUtil/extractTargetKeys"; import { getPartialTargetDescriptors } from "../../util/getPartialTargetDescriptors"; import { upgrade } from "./transformations/upgrade"; -import assert from "assert"; +import assert = require("assert"); export function checkMarks(originalFixture: TestCaseFixtureLegacy): undefined { const command = upgrade(originalFixture).command; @@ -27,7 +27,9 @@ export function checkMarks(originalFixture: TestCaseFixtureLegacy): undefined { ...(originalFixture.marksToCheck ?? []), ]; - const actualMarks = Object.keys(originalFixture.initialState.marks ?? {}); + const actualMarks = Object.keys( + originalFixture.initialState.marks ?? {}, + ) as string[]; assert.deepStrictEqual( uniq(actualMarks.map(normalizeGraphemes)).sort(), diff --git a/packages/cursorless-engine/src/snippets/snippet.ts b/packages/cursorless-engine/src/snippets/snippet.ts index e492eed3fc8..9f2480b2642 100644 --- a/packages/cursorless-engine/src/snippets/snippet.ts +++ b/packages/cursorless-engine/src/snippets/snippet.ts @@ -53,10 +53,6 @@ export function transformSnippetVariables( candidate.children.forEach((child) => placeholder.appendChild(child)); candidate.parent.replace(candidate, [placeholder]); } - } else if (candidate instanceof Placeholder) { - if (candidate.index.toString() === placeholderName) { - candidate.parent.replace(candidate, [new Variable("TM_SELECTED_TEXT")]); - } } return true; }); diff --git a/packages/cursorless-engine/src/spokenForms/CustomSpokenForms.ts b/packages/cursorless-engine/src/spokenForms/CustomSpokenForms.ts deleted file mode 100644 index 4e650bdee2f..00000000000 --- a/packages/cursorless-engine/src/spokenForms/CustomSpokenForms.ts +++ /dev/null @@ -1,177 +0,0 @@ -import { - CustomRegexScopeType, - Disposable, - Notifier, - showError, -} from "@cursorless/common"; -import { isEqual } from "lodash"; -import { - NeedsInitialTalonUpdateError, - SUPPORTED_ENTRY_TYPES, - SpokenFormEntry, - TalonSpokenForms, -} from "../scopeProviders/TalonSpokenForms"; -import { ide } from "../singletons/ide.singleton"; -import { SpokenFormMap, SpokenFormMapEntry } from "./SpokenFormMap"; -import { SpokenFormMapKeyTypes, SpokenFormType } from "./SpokenFormType"; -import { - defaultSpokenFormInfoMap, - defaultSpokenFormMap, -} from "./defaultSpokenFormMap"; -import { DefaultSpokenFormMapEntry } from "./defaultSpokenFormMap.types"; - -type Writable = { - -readonly [K in keyof T]: T[K]; -}; - -/** - * Maintains a {@link SpokenFormMap} containing the users's custom spoken forms. If - * for some reason, the custom spoken forms cannot be loaded, the default spoken - * forms will be used instead. We currently only support getting custom spoken - * forms for a subset of all customizable spoken forms. - */ -export class CustomSpokenForms { - private disposable: Disposable; - private notifier = new Notifier(); - - /** - * A promise that resolves when the custom spoken forms have been loaded. - */ - public readonly customSpokenFormsInitialized: Promise; - - private spokenFormMap_: Writable = { ...defaultSpokenFormMap }; - - get spokenFormMap(): SpokenFormMap { - return this.spokenFormMap_; - } - - private needsInitialTalonUpdate_: boolean | undefined; - - /** - * If `true`, indicates they need to update their Talon files to get the - * machinery used to share spoken forms from Talon to the VSCode extension. - */ - get needsInitialTalonUpdate() { - return this.needsInitialTalonUpdate_; - } - - constructor(private talonSpokenForms: TalonSpokenForms) { - this.disposable = talonSpokenForms.onDidChange(() => - this.updateSpokenFormMaps(), - ); - - this.customSpokenFormsInitialized = this.updateSpokenFormMaps(); - } - - /** - * Registers a callback to be run when the custom spoken forms change. - * @param callback The callback to run when the scope ranges change - * @returns A {@link Disposable} which will stop the callback from running - */ - onDidChangeCustomSpokenForms = this.notifier.registerListener; - - private async updateSpokenFormMaps(): Promise { - let allCustomEntries: SpokenFormEntry[]; - try { - allCustomEntries = await this.talonSpokenForms.getSpokenFormEntries(); - if (allCustomEntries.length === 0) { - throw new Error("Custom spoken forms list empty"); - } - } catch (err) { - if (err instanceof NeedsInitialTalonUpdateError) { - // Handle case where spokenForms.json doesn't exist yet - this.needsInitialTalonUpdate_ = true; - } else { - console.error("Error loading custom spoken forms", err); - showError( - ide().messages, - "CustomSpokenForms.updateSpokenFormMaps", - `Error loading custom spoken forms: ${ - (err as Error).message - }}}. Falling back to default spoken forms.`, - ); - } - - this.spokenFormMap_ = { ...defaultSpokenFormMap }; - this.notifier.notifyListeners(); - - throw err; - } - - for (const entryType of SUPPORTED_ENTRY_TYPES) { - updateEntriesForType( - this.spokenFormMap_, - entryType, - defaultSpokenFormInfoMap[entryType], - Object.fromEntries( - allCustomEntries - .filter((entry) => entry.type === entryType) - .map(({ id, spokenForms }) => [id, spokenForms]), - ), - ); - } - - this.notifier.notifyListeners(); - } - - getCustomRegexScopeTypes(): CustomRegexScopeType[] { - return Object.keys(this.spokenFormMap_.customRegex).map((regex) => ({ - type: "customRegex", - regex, - })); - } - - dispose() { - this.disposable.dispose(); - } -} - -function updateEntriesForType( - spokenFormMapToUpdate: Writable, - key: T, - defaultEntries: Partial< - Record - >, - customEntries: Partial>, -) { - /** - * The ids of the entries to include in the spoken form map. We need a - * union of the ids from the default entry and the custom entry. The custom - * entry could be missing private entries, or it could be missing entries - * because the Talon side is old. The default entry could be missing entries - * like custom regexes, where the user can create arbitrary ids. - */ - const ids = Array.from( - new Set([...Object.keys(defaultEntries), ...Object.keys(customEntries)]), - ) as SpokenFormMapKeyTypes[T][]; - - const obj: Partial> = {}; - for (const id of ids) { - const { defaultSpokenForms = [], isPrivate = false } = - defaultEntries[id] ?? {}; - const customSpokenForms = customEntries[id]; - - obj[id] = - customSpokenForms == null - ? // No entry for the given id. This either means that the user needs to - // update Talon, or it's a private spoken form. - { - defaultSpokenForms, - spokenForms: [], - // If it's not a private spoken form, then it's a new scope type - requiresTalonUpdate: !isPrivate, - isCustom: false, - isPrivate, - } - : // We have an entry for the given id - { - defaultSpokenForms, - spokenForms: customSpokenForms, - requiresTalonUpdate: false, - isCustom: !isEqual(defaultSpokenForms, customSpokenForms), - isPrivate, - }; - } - - spokenFormMapToUpdate[key] = obj as SpokenFormMap[T]; -} diff --git a/packages/cursorless-engine/src/spokenForms/SpokenFormMap.ts b/packages/cursorless-engine/src/spokenForms/SpokenFormMap.ts deleted file mode 100644 index 37002e14db6..00000000000 --- a/packages/cursorless-engine/src/spokenForms/SpokenFormMap.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { - SpokenFormType, - PartialSpokenFormTypes, - SpokenFormMapKeyTypes, -} from "./SpokenFormType"; - -export interface SpokenFormMapEntry { - /** - * The spoken forms for this entry. These could either be a user's custom - * spoken forms, if we have access to them, or the default spoken forms, if we - * don't, or if we're testing. - */ - spokenForms: string[]; - - /** - * If `true`, indicates that the user is not using the default spoken forms - * for this entry. - */ - isCustom: boolean; - - /** - * The default spoken forms for this entry. - */ - defaultSpokenForms: string[]; - - /** - * If `true`, indicates that the entry wasn't found in the user's Talon spoken - * forms json, and so they need to update their cursorless-talon to get the - * given entity. - */ - requiresTalonUpdate: boolean; - - /** - * If `true`, indicates that the entry is only for internal experimentation, - * and should not be exposed to users except within a targeted working group. - */ - isPrivate: boolean; -} - -/** - * A type that contains all the keys of {@link SpokenFormMapKeyTypes}, each of - * whose values are a map from the allowed identifiers for that key to a particular - * value type {@link T}. - */ -export type SpokenFormMappingType = { - readonly [K in SpokenFormType]: K extends PartialSpokenFormTypes - ? Readonly>> - : Readonly>; -}; - -/** - * A spoken form map contains information about the spoken forms for all our - * speakable entities, including scope types, paired delimiters, etc. It can - * either contain the user's custom spoken forms, or the default spoken forms, - * if we don't have access to the user's custom spoken forms, or if we're - * testing. - * - * Each key of this map is a type of spoken form, eg `simpleScopeTypeType`, and - * the value is a map of identifiers to {@link SpokenFormMapEntry}s. - */ -export type SpokenFormMap = SpokenFormMappingType; - -/** - * Converts a spoken form map to a spoken form component map for use in spoken - * form generation. - * @param spokenFormMap The spoken form map to convert to a spoken form - * component map - * @returns A spoken form component map that can be used to generate spoken - * forms - */ -export function mapSpokenForms( - input: SpokenFormMappingType, - mapper: ( - input: I, - spokenFormType: T, - id: SpokenFormMapKeyTypes[T], - ) => O, -): SpokenFormMappingType { - return Object.fromEntries( - Object.entries(input).map(([spokenFormType, map]) => [ - spokenFormType, - Object.fromEntries( - Object.entries(map).map(([id, inputValue]) => [ - id, - mapper(inputValue!, spokenFormType as SpokenFormType, id), - ]), - ), - ]), - // FIXME: Don't cast here; need to make our own mapValues with stronger typing - // using tricks from our object.d.ts - ) as SpokenFormMappingType; -} diff --git a/packages/cursorless-engine/src/spokenForms/SpokenFormType.ts b/packages/cursorless-engine/src/spokenForms/SpokenFormType.ts deleted file mode 100644 index 3665eb5cd91..00000000000 --- a/packages/cursorless-engine/src/spokenForms/SpokenFormType.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { - ModifierType, - SimpleScopeTypeType, - SurroundingPairName, -} from "@cursorless/common"; - -/** - * This interface is the source of truth for the types used in our spoken form - * map. The keys of this interface are the types of spoken forms that we - * support, eg `simpleScopeTypeType`, `simpleModifier`, etc. The type of each - * key is a disjunction of all identifiers that are allowed for the given type of - * spoken form. - */ -export interface SpokenFormMapKeyTypes { - pairedDelimiter: SpeakableSurroundingPairName; - simpleScopeTypeType: SimpleScopeTypeType; - complexScopeTypeType: "glyph"; - surroundingPairForceDirection: "left" | "right"; - - /** - * These modifier types are spoken by directly saying the spoken form for the - * modifier type, unlike the more complex spoken forms such as - * `relativeScope`, which can use various different custom spoken forms such - * as `next`, `previous`, etc. - */ - simpleModifier: SimpleModifierType; - - /** - * These are customizable spoken forms used in speaking modifiers, but that - * don't directly correspond to a modifier type. For example, `next` is a - * customizable spoken form that can be used when speaking `relativeScope` - * modifiers, but `next` itself isn't a modifier type. - */ - modifierExtra: ModifierExtra; - customRegex: string; -} - -/** - * These are the types of spoken forms that are not total mappings, eg if you - * look up a string in `spokenFormMap.customRegex`, you might get `undefined`, - * even though technically the identifier type is `string`. - */ -export type PartialSpokenFormTypes = "customRegex"; - -export type SpeakableSurroundingPairName = SurroundingPairName | "whitespace"; - -type SimpleModifierType = Exclude< - ModifierType, - | "containingScope" - | "ordinalScope" - | "relativeScope" - | "modifyIfUntyped" - | "cascading" - | "range" ->; - -type ModifierExtra = - | "first" - | "last" - | "previous" - | "next" - | "forward" - | "backward" - | "ancestor"; - -export type SpokenFormType = keyof SpokenFormMapKeyTypes; diff --git a/packages/cursorless-engine/src/spokenForms/defaultSpokenFormMap.ts b/packages/cursorless-engine/src/spokenForms/defaultSpokenFormMap.ts deleted file mode 100644 index 446d6610827..00000000000 --- a/packages/cursorless-engine/src/spokenForms/defaultSpokenFormMap.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { mapSpokenForms } from "./SpokenFormMap"; -import { defaultSpokenFormMapCore } from "./defaultSpokenFormMapCore"; -import { DefaultSpokenFormInfoMap } from "./defaultSpokenFormMap.types"; - -/** - * This map contains information about the default spoken forms for all our - * speakable entities, including scope types, paired delimiters, etc. Note that - * this map can't be used as a spoken form map. If you want something that can - * be used as a spoken form map, see {@link defaultSpokenFormMap}. - */ -export const defaultSpokenFormInfoMap: DefaultSpokenFormInfoMap = - mapSpokenForms(defaultSpokenFormMapCore, (value) => - typeof value === "string" - ? { - defaultSpokenForms: [value], - isDisabledByDefault: false, - isPrivate: false, - } - : value, - ); - -/** - * A spoken form map constructed from the default spoken forms. It is designed to - * be used as a fallback when the Talon spoken form map is not available. - */ -export const defaultSpokenFormMap = mapSpokenForms( - defaultSpokenFormInfoMap, - ({ defaultSpokenForms, isDisabledByDefault, isPrivate }) => ({ - spokenForms: isDisabledByDefault ? [] : defaultSpokenForms, - isCustom: false, - defaultSpokenForms, - requiresTalonUpdate: false, - isPrivate, - }), -); diff --git a/packages/cursorless-engine/src/spokenForms/defaultSpokenFormMap.types.ts b/packages/cursorless-engine/src/spokenForms/defaultSpokenFormMap.types.ts deleted file mode 100644 index 5b7fa567c50..00000000000 --- a/packages/cursorless-engine/src/spokenForms/defaultSpokenFormMap.types.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { SpokenFormMappingType } from "./SpokenFormMap"; -import { SpokenFormMapKeyTypes } from "./SpokenFormType"; - -export type DefaultSpokenFormMapDefinition = { - readonly [K in keyof SpokenFormMapKeyTypes]: Readonly< - Record - >; -}; - -export interface DefaultSpokenFormMapEntry { - defaultSpokenForms: string[]; - - /** - * If `true`, indicates that the entry may have a default spoken form, but - * it should not be enabled by default. These will show up in user csv's with - * a `-` at the beginning. - */ - isDisabledByDefault: boolean; - - /** - * If `true`, indicates that the entry is only for internal experimentation, - * and should not be exposed to users except within a targeted working group. - */ - isPrivate: boolean; -} - -export type DefaultSpokenFormInfoMap = - SpokenFormMappingType; diff --git a/packages/cursorless-engine/src/spokenForms/defaultSpokenFormMapCore.ts b/packages/cursorless-engine/src/spokenForms/defaultSpokenFormMapCore.ts deleted file mode 100644 index 300c2cacaba..00000000000 --- a/packages/cursorless-engine/src/spokenForms/defaultSpokenFormMapCore.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { DefaultSpokenFormMapDefinition } from "./defaultSpokenFormMap.types"; -import { isDisabledByDefault, isPrivate } from "./spokenFormMapUtil"; - -/** - * This map contains the default spoken forms for all our speakable entities, - * including scope types, paired delimiters, etc. We would like this map to - * become the sole source of truth for our default spoken forms, including the - * Talon side. Today it is only used on the extension side for testing, and as a - * fallback when we can't get the custom spoken forms from Talon. - * - * In this map, for regular entities, ie ones that are speakable by default, not - * private, and have only one spoken form, we allow a shorthand of just providing - * the spoken form as a string. For more complex cases, we can use the - * {@link isPrivate} or {@link isDisabledByDefault} helper functions to construct - * {@link DefaultSpokenFormMapEntry} objects, or just construct them manually. - */ -export const defaultSpokenFormMapCore: DefaultSpokenFormMapDefinition = { - pairedDelimiter: { - curlyBrackets: "curly", - angleBrackets: "diamond", - escapedDoubleQuotes: "escaped quad", - escapedSingleQuotes: "escaped twin", - escapedParentheses: "escaped round", - escapedSquareBrackets: "escaped box", - doubleQuotes: "quad", - parentheses: "round", - backtickQuotes: "skis", - squareBrackets: "box", - singleQuotes: "twin", - any: "pair", - string: "string", - whitespace: "void", - - collectionBoundary: isPrivate("collection boundary"), - }, - - simpleScopeTypeType: { - argumentOrParameter: "arg", - attribute: "attribute", - functionCall: "call", - functionCallee: "callee", - className: "class name", - class: "class", - comment: "comment", - functionName: "funk name", - namedFunction: "funk", - ifStatement: "if state", - instance: "instance", - collectionItem: "item", - collectionKey: "key", - anonymousFunction: "lambda", - list: "list", - map: "map", - name: "name", - regularExpression: "regex", - section: "section", - sectionLevelOne: isDisabledByDefault("one section"), - sectionLevelTwo: isDisabledByDefault("two section"), - sectionLevelThree: isDisabledByDefault("three section"), - sectionLevelFour: isDisabledByDefault("four section"), - sectionLevelFive: isDisabledByDefault("five section"), - sectionLevelSix: isDisabledByDefault("six section"), - selector: "selector", - statement: "state", - branch: "branch", - type: "type", - value: "value", - condition: "condition", - unit: "unit", - // XML, JSX - xmlElement: "element", - xmlBothTags: "tags", - xmlStartTag: "start tag", - xmlEndTag: "end tag", - // LaTeX - part: "part", - chapter: "chapter", - subSection: "subsection", - subSubSection: "subsubsection", - namedParagraph: "paragraph", - subParagraph: "subparagraph", - environment: "environment", - // Talon - command: "command", - // Text-based scope types - character: "char", - word: "sub", - token: "token", - identifier: "identifier", - line: "line", - sentence: "sentence", - paragraph: "block", - document: "file", - nonWhitespaceSequence: "paint", - boundedNonWhitespaceSequence: "short paint", - url: "link", - notebookCell: "cell", - - ["private.fieldAccess"]: isPrivate("access"), - string: isPrivate("parse tree string"), - ["private.switchStatementSubject"]: isPrivate("subject"), - }, - complexScopeTypeType: { - glyph: "glyph", - }, - - surroundingPairForceDirection: { - left: "left", - right: "right", - }, - - simpleModifier: { - excludeInterior: "bounds", - toRawSelection: "just", - leading: "leading", - trailing: "trailing", - keepContentFilter: "content", - keepEmptyFilter: "empty", - inferPreviousMark: "its", - startOf: "start of", - endOf: "end of", - interiorOnly: "inside", - visible: "visible", - extendThroughStartOf: "head", - extendThroughEndOf: "tail", - everyScope: "every", - }, - - modifierExtra: { - first: "first", - last: "last", - previous: "previous", - next: "next", - forward: "forward", - backward: "backward", - ancestor: "grand", - }, - - customRegex: {}, -}; diff --git a/packages/cursorless-engine/src/spokenForms/spokenFormMapUtil.ts b/packages/cursorless-engine/src/spokenForms/spokenFormMapUtil.ts deleted file mode 100644 index 602f8df49a4..00000000000 --- a/packages/cursorless-engine/src/spokenForms/spokenFormMapUtil.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { DefaultSpokenFormMapEntry } from "./defaultSpokenFormMap.types"; - -/** - * Used to construct entities that should not be speakable by default. - * - * @param spokenForms The default spoken forms for this entity - * @returns A DefaultSpokenFormMapEntry with the given spoken forms, and - * {@link DefaultSpokenFormMapEntry.isDisabledByDefault|isDisabledByDefault} set - * to true - */ -export function isDisabledByDefault( - ...spokenForms: string[] -): DefaultSpokenFormMapEntry { - return { - defaultSpokenForms: spokenForms, - isDisabledByDefault: true, - isPrivate: false, - }; -} - -/** - * Used to construct entities that are only for internal experimentation. - * - * @param spokenForms The default spoken forms for this entity - * @returns A DefaultSpokenFormMapEntry with the given spoken forms, and - * {@link DefaultSpokenFormMapEntry.isDisabledByDefault|isDisabledByDefault} and - * {@link DefaultSpokenFormMapEntry.isPrivate|isPrivate} set to true - */ -export function isPrivate(...spokenForms: string[]): DefaultSpokenFormMapEntry { - return { - defaultSpokenForms: spokenForms, - isDisabledByDefault: true, - isPrivate: true, - }; -} diff --git a/packages/cursorless-engine/src/test/fixtures/spokenFormTest.ts b/packages/cursorless-engine/src/test/fixtures/spokenFormTest.ts index 8251ddf13bd..ac048ed91e9 100644 --- a/packages/cursorless-engine/src/test/fixtures/spokenFormTest.ts +++ b/packages/cursorless-engine/src/test/fixtures/spokenFormTest.ts @@ -24,11 +24,10 @@ export interface SpokenFormTest { export function spokenFormTest( spokenForm: string, action: ActionDescriptor, - mockedGetValue?: unknown, ): SpokenFormTest { return { spokenForm, - mockedGetValue, + mockedGetValue: undefined, commands: [command(spokenForm, action)], }; } diff --git a/packages/cursorless-engine/src/test/fixtures/talonApi.fixture.ts b/packages/cursorless-engine/src/test/fixtures/talonApi.fixture.ts index 05e2c5cfaf8..1ca8b892fdf 100644 --- a/packages/cursorless-engine/src/test/fixtures/talonApi.fixture.ts +++ b/packages/cursorless-engine/src/test/fixtures/talonApi.fixture.ts @@ -1,6 +1,5 @@ import { ActionDescriptor, - GetTextActionOptions, PartialPrimitiveTargetDescriptor, } from "@cursorless/common"; import { spokenFormTest } from "./spokenFormTest"; @@ -47,19 +46,6 @@ const insertSnippetAction: ActionDescriptor = { body: "Hello, $foo! My name is $bar!", }, }; -const insertSnippetWithScopeAction: ActionDescriptor = { - name: "insertSnippet", - destination: { - type: "primitive", - insertionMode: "after", - target: decoratedPrimitiveTarget("a"), - }, - snippetDescription: { - type: "custom", - body: "Hello, $foo! My name is $bar!", - scopeTypes: [{ type: "statement" }], - }, -}; const insertSnippetByNameAction: ActionDescriptor = { name: "insertSnippet", destination: { type: "implicit" }, @@ -93,52 +79,6 @@ const wrapWithSnippetByNameAction: ActionDescriptor = { variableName: "body", }, }; -const alternateHighlightAirAndBatAction: ActionDescriptor = { - name: "highlight", - target: { - type: "list", - elements: [ - { - type: "primitive", - mark: { - type: "decoratedSymbol", - symbolColor: "default", - character: "a", - }, - modifiers: [], - }, - { - type: "primitive", - mark: { - type: "decoratedSymbol", - symbolColor: "default", - character: "b", - }, - modifiers: [], - }, - ], - }, - highlightId: "highlight1", -}; -const alternateHighlightNothingAction: ActionDescriptor = { - name: "highlight", - target: { - type: "primitive", - mark: { - type: "nothing", - }, - modifiers: [], - }, - highlightId: "highlight1", -}; - -function getTextAction(options: GetTextActionOptions): ActionDescriptor { - return { - name: "getText", - options, - target: decoratedPrimitiveTarget("a"), - }; -} /** * These test our Talon api using dummy spoken forms defined in @@ -153,44 +93,12 @@ export const talonApiFixture = [ insertMultipleWordsTargetAction, ), spokenFormTest("test api insert snippet", insertSnippetAction), - spokenFormTest( - "test api insert snippet after air", - insertSnippetWithScopeAction, - ), spokenFormTest("test api insert snippet by name", insertSnippetByNameAction), spokenFormTest("test api wrap with snippet this", wrapWithSnippetAction), spokenFormTest( "test api wrap with snippet by name this", wrapWithSnippetByNameAction, ), - spokenFormTest( - "test api get text air", - getTextAction({ showDecorations: true, ensureSingleTarget: true }), - ["apple"], - ), - spokenFormTest( - "test api get text list on air", - getTextAction({ showDecorations: true, ensureSingleTarget: false }), - ["apple"], - ), - spokenFormTest( - "test api get text hide decorations air", - getTextAction({ showDecorations: false, ensureSingleTarget: true }), - ["apple"], - ), - spokenFormTest( - "test api get text hide decorations list on air", - getTextAction({ showDecorations: false, ensureSingleTarget: false }), - ["apple"], - ), - spokenFormTest( - "test api extract decorated marks air past bat", - alternateHighlightAirAndBatAction, - ), - spokenFormTest( - "test api alternate highlight nothing", - alternateHighlightNothingAction, - ), ]; function decoratedPrimitiveTarget( diff --git a/packages/cursorless-engine/src/test/sentenceSegmenter.test.ts b/packages/cursorless-engine/src/test/sentenceSegmenter.test.ts index 5032036e897..30f690a1df1 100644 --- a/packages/cursorless-engine/src/test/sentenceSegmenter.test.ts +++ b/packages/cursorless-engine/src/test/sentenceSegmenter.test.ts @@ -1,5 +1,5 @@ import * as assert from "assert"; -import { SentenceSegmenter } from "../processTargets/modifiers/scopeHandlers/SentenceScopeHandler/SentenceSegmenter"; +import SentenceSegmenter from "../processTargets/modifiers/scopeHandlers/SentenceScopeHandler/SentenceSegmenter"; import { sentenceSegmenterFixture } from "./fixtures/sentenceSegmeter.fixture"; import { unitTestSetup } from "./unitTestSetup"; diff --git a/packages/cursorless-engine/src/test/spokenForms.talon.test.ts b/packages/cursorless-engine/src/test/spokenForms.talon.test.ts index 81226188b4c..206b02694cf 100644 --- a/packages/cursorless-engine/src/test/spokenForms.talon.test.ts +++ b/packages/cursorless-engine/src/test/spokenForms.talon.test.ts @@ -5,7 +5,7 @@ import { asyncSafety, getRecordedTestPaths, } from "@cursorless/common"; -import assert from "assert"; +import * as assert from "assert"; import * as yaml from "js-yaml"; import { promises as fsp } from "node:fs"; import { canonicalizeAndValidateCommand } from "../core/commandVersionUpgrades/canonicalizeAndValidateCommand"; diff --git a/packages/cursorless-engine/src/test/subtoken.test.ts b/packages/cursorless-engine/src/test/subtoken.test.ts index 727c7ac2dd5..51b73889180 100644 --- a/packages/cursorless-engine/src/test/subtoken.test.ts +++ b/packages/cursorless-engine/src/test/subtoken.test.ts @@ -1,5 +1,5 @@ import * as assert from "assert"; -import { WordTokenizer } from "../processTargets/modifiers/scopeHandlers/WordScopeHandler/WordTokenizer"; +import WordTokenizer from "../processTargets/modifiers/scopeHandlers/WordScopeHandler/WordTokenizer"; import { subtokenFixture } from "./fixtures/subtoken.fixture"; import { unitTestSetup } from "./unitTestSetup"; diff --git a/packages/cursorless-engine/src/testCaseRecorder/TestCase.ts b/packages/cursorless-engine/src/testCaseRecorder/TestCase.ts index 04b85fa684a..d1802db55ee 100644 --- a/packages/cursorless-engine/src/testCaseRecorder/TestCase.ts +++ b/packages/cursorless-engine/src/testCaseRecorder/TestCase.ts @@ -23,7 +23,6 @@ import { ide } from "../singletons/ide.singleton"; import { extractTargetKeys } from "../testUtil/extractTargetKeys"; import { takeSnapshot } from "../testUtil/takeSnapshot"; import { getPartialTargetDescriptors } from "../util/getPartialTargetDescriptors"; -import { unsafeKeys } from "../util/object"; export class TestCase { private languageId: string; @@ -123,7 +122,7 @@ export class TestCase { visibleRanges: !visibleRangeActions.includes(this.command.action.name), }; - return unsafeKeys(excludedFields).filter((field) => excludedFields[field]); + return Object.keys(excludedFields).filter((field) => excludedFields[field]); } toYaml() { diff --git a/packages/cursorless-engine/src/testCaseRecorder/TestCaseRecorder.ts b/packages/cursorless-engine/src/testCaseRecorder/TestCaseRecorder.ts index c6d4e5375ab..6cf7d22ecc4 100644 --- a/packages/cursorless-engine/src/testCaseRecorder/TestCaseRecorder.ts +++ b/packages/cursorless-engine/src/testCaseRecorder/TestCaseRecorder.ts @@ -31,9 +31,8 @@ import { takeSnapshot } from "../testUtil/takeSnapshot"; import { TestCase } from "./TestCase"; import { StoredTargetMap } from "../core/StoredTargets"; import { CommandRunner } from "../CommandRunner"; +import { generateSpokenForm } from "../generateSpokenForm"; import { RecordTestCaseCommandOptions } from "./RecordTestCaseCommandOptions"; -import { SpokenFormGenerator } from "../generateSpokenForm"; -import { defaultSpokenFormMap } from "../spokenForms/defaultSpokenFormMap"; const CALIBRATION_DISPLAY_DURATION_MS = 50; @@ -60,7 +59,6 @@ export class TestCaseRecorder { private captureFinalThatMark: boolean = false; private spyIde: SpyIDE | undefined; private originalIde: IDE | undefined; - private spokenFormGenerator = new SpokenFormGenerator(defaultSpokenFormMap); constructor( private hatTokenMap: HatTokenMap, @@ -124,8 +122,9 @@ export class TestCaseRecorder { const keys = targetedMarks.map(({ character, symbolColor }) => getKey(symbolColor, character), ); - const readableHatMap = - await this.hatTokenMap.getReadableMap(usePrePhraseSnapshot); + const readableHatMap = await this.hatTokenMap.getReadableMap( + usePrePhraseSnapshot, + ); marks = marksToPlainObject(extractTargetedMarks(keys, readableHatMap)); } else { marks = undefined; @@ -276,20 +275,14 @@ export class TestCaseRecorder { this.spyIde = new SpyIDE(this.originalIde); injectIde(this.spyIde!); - const spokenForm = this.spokenFormGenerator.processCommand(command); + const spokenForm = generateSpokenForm(command); this.testCase = new TestCase( { ...command, - - // If spoken form is an error, we just use the spoken form that they - // actually used. If it is a success, we use the first spoken form - // that from our generator, which will almost always be the only spoken - // form. If there are multiple, there will be a test failure so we can - // cross that bridge if it happens. spokenForm: spokenForm.type === "success" - ? spokenForm.spokenForms[0] + ? spokenForm.value : command.spokenForm, }, hatTokenMap, @@ -459,9 +452,6 @@ export class TestCaseRecorder { readableHatMap: ReadOnlyHatMap, runner: CommandRunner, ): CommandRunner { - if (!this.isActive()) { - return runner; - } return { run: async (commandComplete: CommandComplete) => { try { diff --git a/packages/cursorless-engine/src/testUtil/takeSnapshot.ts b/packages/cursorless-engine/src/testUtil/takeSnapshot.ts index f55c7e9aece..d4b6286cebe 100644 --- a/packages/cursorless-engine/src/testUtil/takeSnapshot.ts +++ b/packages/cursorless-engine/src/testUtil/takeSnapshot.ts @@ -11,8 +11,7 @@ import { TestCaseSnapshot, TextEditor, } from "@cursorless/common"; -import { type StoredTargetMap } from "../core/StoredTargets"; -import { storedTargetKeys } from "@cursorless/common"; +import type { StoredTargetMap } from "../core/StoredTargets"; export async function takeSnapshot( storedTargets: StoredTargetMap | undefined, @@ -46,12 +45,26 @@ export async function takeSnapshot( snapshot.visibleRanges = editor.visibleRanges.map(rangeToPlainObject); } - for (const storedTargetKey of storedTargetKeys) { - const targets = storedTargets?.get(storedTargetKey); - const key = `${storedTargetKey}Mark` as const; - if (targets != null && !excludeFields.includes(key)) { - snapshot[key] = targets.map((target) => target.toPlainObject()); - } + const thatMarkTargets = storedTargets?.get("that"); + if (thatMarkTargets != null && !excludeFields.includes("thatMark")) { + snapshot.thatMark = thatMarkTargets.map((target) => target.toPlainObject()); + } + + const sourceMarkTargets = storedTargets?.get("source"); + if (sourceMarkTargets != null && !excludeFields.includes("sourceMark")) { + snapshot.sourceMark = sourceMarkTargets.map((target) => + target.toPlainObject(), + ); + } + + const instanceReferenceMarkTargets = storedTargets?.get("instanceReference"); + if ( + instanceReferenceMarkTargets != null && + !excludeFields.includes("instanceReferenceMark") + ) { + snapshot.instanceReferenceMark = instanceReferenceMarkTargets.map( + (target) => target.toPlainObject(), + ); } if (extraFields.includes("timeOffsetSeconds")) { diff --git a/packages/cursorless-engine/src/tokenGraphemeSplitter/tokenGraphemeSplitter.ts b/packages/cursorless-engine/src/tokenGraphemeSplitter/tokenGraphemeSplitter.ts index 456f6f968a9..116bcd75e5f 100644 --- a/packages/cursorless-engine/src/tokenGraphemeSplitter/tokenGraphemeSplitter.ts +++ b/packages/cursorless-engine/src/tokenGraphemeSplitter/tokenGraphemeSplitter.ts @@ -8,7 +8,7 @@ import { import { matchAll } from "../util/regex"; /** - * A list of all symbols that are speakable by default in community. + * A list of all symbols that are speakable by default in knausj. */ const KNOWN_SYMBOLS = [ "!", diff --git a/packages/cursorless-engine/src/typings/target.types.ts b/packages/cursorless-engine/src/typings/target.types.ts index e817ea45dba..c0a34f06061 100644 --- a/packages/cursorless-engine/src/typings/target.types.ts +++ b/packages/cursorless-engine/src/typings/target.types.ts @@ -42,9 +42,6 @@ export interface Target { /** If this selection has a delimiter use it for inserting before or after the target. For example, new line for a line or paragraph and comma for a list or argument */ readonly insertionDelimiter: string; - /** Optional prefix. For example, dash or asterisk for a markdown item */ - readonly prefixRange?: Range; - /** If true this target should be treated as a line */ readonly isLine: boolean; @@ -155,33 +152,12 @@ export interface Target { getRemovalHighlightRange(): Range; withThatTarget(thatTarget: Target): Target; withContentRange(contentRange: Range): Target; - - /** - * Targets use this function to determine what happens when a range target is - * created from two targets of the same type. This function is called by - * {@link createContinuousRangeTarget} to create the range target if both - * sides of the range are included and are of the same type. - * - * The newly created range target can inherit some of the args from the two - * targets. Trailing delimiter should come from end target, leading from start - * target, etc. - * - * If for whatever reason it doesn't make sense to create a rich range target - * from the two targets, this function should return null. For example, - * {@link ScopeTypeTarget} returns null if the two targets have different - * scope types, and {@link UntypedTarget} returns null because it never makes - * sense to create a rich range target from two untyped targets. - * - * @param isReversed Indicates whether the range is reversed. - * @param endTarget The end target of the range. - * @returns The new target of the same type as the two targets, corresponding - * to an inclusive range between the two targets. - */ - maybeCreateRichRangeTarget( + createContinuousRangeTarget( isReversed: boolean, - endTarget: ThisType & Target, - ): (ThisType & Target) | null; - + endTarget: Target, + includeStart: boolean, + includeEnd: boolean, + ): Target; /** Constructs removal edit */ constructRemovalEdit(): EditWithRangeUpdater; isEqual(target: Target): boolean; diff --git a/packages/cursorless-engine/src/util/getScopeType.ts b/packages/cursorless-engine/src/util/getScopeType.ts deleted file mode 100644 index 5a4bfeaa163..00000000000 --- a/packages/cursorless-engine/src/util/getScopeType.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { Modifier, ScopeType } from "@cursorless/common"; - -export function getScopeType(modifier: Modifier): ScopeType | undefined { - switch (modifier.type) { - case "containingScope": - case "everyScope": - case "ordinalScope": - case "relativeScope": - return modifier.scopeType; - - case "interiorOnly": - case "excludeInterior": - case "visible": - case "toRawSelection": - case "inferPreviousMark": - case "keepContentFilter": - case "keepEmptyFilter": - case "leading": - case "trailing": - case "startOf": - case "endOf": - case "extendThroughStartOf": - case "extendThroughEndOf": - case "cascading": - case "range": - case "modifyIfUntyped": - return undefined; - - default: { - const _exhaustiveCheck: never = modifier; - } - } -} diff --git a/packages/cursorless-engine/src/util/nodeMatchers.ts b/packages/cursorless-engine/src/util/nodeMatchers.ts index 5caf4cdf1b0..550fd9b01c5 100644 --- a/packages/cursorless-engine/src/util/nodeMatchers.ts +++ b/packages/cursorless-engine/src/util/nodeMatchers.ts @@ -21,7 +21,6 @@ import { simpleSelectionExtractor, unwrapSelectionExtractor, } from "./nodeSelectors"; -import { unsafeKeys } from "./object"; export function matcher( finder: NodeFinder, @@ -178,19 +177,14 @@ export const notSupported: NodeMatcher = ( export function createPatternMatchers( nodeMatchers: Partial>, -): Partial> { - return Object.freeze( - Object.fromEntries( - unsafeKeys(nodeMatchers).map((scopeType: SimpleScopeTypeType) => { - const matcher = nodeMatchers[scopeType]; - if (Array.isArray(matcher)) { - return [scopeType, patternMatcher(...matcher)]; - } else if (typeof matcher === "string") { - return [scopeType, patternMatcher(matcher)]; - } else { - return [scopeType, matcher]; - } - }), - ), - ); +): Record { + Object.keys(nodeMatchers).forEach((scopeType: SimpleScopeTypeType) => { + const matcher = nodeMatchers[scopeType]; + if (Array.isArray(matcher)) { + nodeMatchers[scopeType] = patternMatcher(...matcher); + } else if (typeof matcher === "string") { + nodeMatchers[scopeType] = patternMatcher(matcher); + } + }); + return nodeMatchers as Record; } diff --git a/packages/cursorless-engine/src/util/object.ts b/packages/cursorless-engine/src/util/object.ts index c63808be915..edc5bfe2c37 100644 --- a/packages/cursorless-engine/src/util/object.ts +++ b/packages/cursorless-engine/src/util/object.ts @@ -20,27 +20,3 @@ export function mergeStrict( return returnValue; } - -/** - * `Object.keys` but returns an array of the keys TypeScript knows about. - * - * Note that this is technically unsound, as TypeScript is a structural type system. - * Consider the following example (from ts-reset's docs): - * ``` - * type Func = () => { id: string }; - * - * const func: Func = () => { - * return { - * id: "123", - * // No error on an excess property! - * name: "Hello!", - * } - * }; - * ``` - * - * Consider only using this on objects frozen at construction time - * or locals that don't escape the calling scope. - */ -export function unsafeKeys(o: T): (keyof T)[] { - return Object.keys(o) as (keyof T)[]; -} diff --git a/packages/cursorless-engine/src/util/rangeUtils.ts b/packages/cursorless-engine/src/util/rangeUtils.ts index 79dddd435d0..33d5def915e 100644 --- a/packages/cursorless-engine/src/util/rangeUtils.ts +++ b/packages/cursorless-engine/src/util/rangeUtils.ts @@ -1,4 +1,5 @@ import { Position, Range, TextEditor } from "@cursorless/common"; +import { getLeadingWhitespace, getTrailingWhitespace } from "./regex"; export function isAtEndOfLine(editor: TextEditor, position: Position) { const endLine = editor.document.lineAt(position); @@ -55,13 +56,28 @@ export function strictlyContains( } /** - * Make union between range and additional optional ranges + * Trim the given range of whitespaces + * @param editor The editor to get the text from + * @param range The range to trim */ -export function union(range: Range, ...unionWith: (Range | undefined)[]) { - for (const r of unionWith) { - if (r != null) { - range = range.union(r); - } +export function trimRange(editor: TextEditor, range: Range): Range { + const text = editor.document.getText(range); + const leadingWhitespace = getLeadingWhitespace(text); + const trailingWhitespace = getTrailingWhitespace(text); + + if (leadingWhitespace === "" && trailingWhitespace === "") { + return range; } - return range; + + const startOffset = + editor.document.offsetAt(range.start) + leadingWhitespace.length; + return new Range( + editor.document.positionAt(startOffset), + editor.document.positionAt( + startOffset + + text.length - + leadingWhitespace.length - + trailingWhitespace.length, + ), + ); } diff --git a/packages/cursorless-engine/src/util/setSelectionsAndFocusEditor.ts b/packages/cursorless-engine/src/util/setSelectionsAndFocusEditor.ts index 2f7f845261d..404daefc54f 100644 --- a/packages/cursorless-engine/src/util/setSelectionsAndFocusEditor.ts +++ b/packages/cursorless-engine/src/util/setSelectionsAndFocusEditor.ts @@ -1,8 +1,6 @@ -import { - EditableTextEditor, - Selection, - uniqWithHash, -} from "@cursorless/common"; +import { EditableTextEditor, Selection } from "@cursorless/common"; + +import { uniqWithHash } from "./uniqWithHash"; export async function setSelectionsAndFocusEditor( editor: EditableTextEditor, diff --git a/packages/cursorless-engine/src/util/tryConstructTarget.ts b/packages/cursorless-engine/src/util/tryConstructTarget.ts index a0670b7deb0..c9ca286450e 100644 --- a/packages/cursorless-engine/src/util/tryConstructTarget.ts +++ b/packages/cursorless-engine/src/util/tryConstructTarget.ts @@ -1,5 +1,9 @@ import { Range, TextEditor } from "@cursorless/common"; -import { CommonTargetParameters } from "../processTargets/targets"; +import { + CommonTargetParameters, + LineTarget, + PlainTarget, +} from "../processTargets/targets"; import { Target } from "../typings/target.types"; type TargetConstructor = new ( @@ -30,3 +34,37 @@ export function tryConstructTarget( contentRange: range, }); } + +/** + * Constructs a {@link PlainTarget} from the given range, or returns undefined + * if the range is undefined + * @param editor The editor containing the range + * @param range The range to convert into a target + * @param isReversed Whether the rain should be backward + * @returns A new {@link PlainTarget} constructed from the given range, or null + * if the range is undefined + */ +export function tryConstructPlainTarget( + editor: TextEditor, + range: Range | undefined, + isReversed: boolean, +): PlainTarget | undefined { + return tryConstructTarget(PlainTarget, editor, range, isReversed); +} + +/** + * Constructs a {@link LineTarget} from the given range, or returns undefined + * if the range is undefined + * @param editor The editor containing the range + * @param range The range to convert into a target + * @param isReversed Whether the rain should be backward + * @returns A new {@link LineTarget} constructed from the given range, or null + * if the range is undefined + */ +export function constructLineTarget( + editor: TextEditor, + range: Range | undefined, + isReversed: boolean, +): LineTarget | undefined { + return tryConstructTarget(LineTarget, editor, range, isReversed); +} diff --git a/packages/common/src/util/uniqWithHash.test.ts b/packages/cursorless-engine/src/util/uniqWithHash.test.ts similarity index 100% rename from packages/common/src/util/uniqWithHash.test.ts rename to packages/cursorless-engine/src/util/uniqWithHash.test.ts diff --git a/packages/common/src/util/uniqWithHash.ts b/packages/cursorless-engine/src/util/uniqWithHash.ts similarity index 100% rename from packages/common/src/util/uniqWithHash.ts rename to packages/cursorless-engine/src/util/uniqWithHash.ts diff --git a/packages/cursorless-org-docs/babel.config.js b/packages/cursorless-org-docs/babel.config.js new file mode 100644 index 00000000000..bfd75dbdfc7 --- /dev/null +++ b/packages/cursorless-org-docs/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve("@docusaurus/core/lib/babel/preset")], +}; diff --git a/packages/cursorless-org-docs/babel.config.mjs b/packages/cursorless-org-docs/babel.config.mjs deleted file mode 100644 index 8aed6f3881c..00000000000 --- a/packages/cursorless-org-docs/babel.config.mjs +++ /dev/null @@ -1,3 +0,0 @@ -export default { - presets: ["@docusaurus/core/lib/babel/preset"], -}; diff --git a/packages/cursorless-org-docs/docusaurus.config.js b/packages/cursorless-org-docs/docusaurus.config.js new file mode 100644 index 00000000000..533ca981d4b --- /dev/null +++ b/packages/cursorless-org-docs/docusaurus.config.js @@ -0,0 +1,147 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +// @ts-check +// Note: type annotations allow type checking and IDEs autocompletion +/*eslint-env node*/ + +const lightCodeTheme = require("prism-react-renderer/themes/github"); +const darkCodeTheme = require("prism-react-renderer/themes/dracula"); +const path = require("path"); + +/** + * Files within /docs reference repository directories + * and files outside of that folder. They are not served + * in documentation hub. + * + * This plugin rewrites these links to point to GitHub. + * The algorithm roughly is: + * - For each link: + * - If absolute or already relative to index - do nothing. + * - Try resolving it relative to repo root. + * - If anywhere but /docs - link to GitHub. + */ +function remarkPluginFixLinksToRepositoryArtifacts() { + /** @type {import('unified').Transformer} */ + const transformer = async (ast, file) => { + // Package does not support require es modules. + // Easiest workaround I found. + let { visit } = await import("unist-util-visit"); + visit(ast, "link", (node) => { + /** @type string */ + let link = node.url; + if (link.startsWith("http://") || link.startsWith("https://")) { + return; + } + + // Docusaurus runs this plugin on its intermediate + // markdown representaiton as well as on our original files. + // These are relative links that docusaurus already figured out + // based on realative links to .md files + if (link.startsWith("/docs/")) { + return; + } + + let repoRoot = path.resolve(__dirname, "../.."); + let artifact = path.resolve(file.dirname, link); + let artifactRelative = path.relative(repoRoot, artifact); + + // We host all files under docs, will resolve as a relative link + if (artifactRelative.startsWith("docs/")) { + return; + } + + const repoLink = + "https://github.com/cursorless-dev/cursorless/tree/main/"; + const linkToRepositoryArtifact = repoLink.concat(artifactRelative); + + node.url = linkToRepositoryArtifact; + }); + }; + return transformer; +} + +/** @type {import('@docusaurus/types').Config} */ +const config = { + title: "Cursorless", + tagline: "Structural voice coding at the speed of thought", + url: "https://www.cursorless.org", + baseUrl: "/docs/", + favicon: "/docs/favicon.ico", + onBrokenLinks: "throw", + onBrokenMarkdownLinks: "throw", + trailingSlash: true, + + presets: [ + [ + "classic", + /** @type {import('@docusaurus/preset-classic').Options} */ + ({ + docs: { + path: "../../docs", + // Followed https://ricard.dev/how-to-set-docs-as-homepage-for-docusaurus/ + // to serve a markdown document on homepage + routeBasePath: "/", + // Note that we add dummy/dummy so that the `../..` above has something to strip + editUrl: + "https://github.com/cursorless-dev/cursorless/edit/main/dummy/dummy", + sidebarPath: require.resolve("./sidebar.js"), + beforeDefaultRemarkPlugins: [ + remarkPluginFixLinksToRepositoryArtifacts, + ], + }, + theme: { + customCss: [require.resolve("./src/css/custom.css")], + }, + }), + ], + ], + + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + ({ + navbar: { + title: "Cursorless", + logo: { + alt: "Cursorless", + src: "icon.svg", + }, + items: [ + { + position: "left", + type: "doc", + docId: "user/README", + to: "user/", + sidebarId: "user", + label: "For users", + }, + { + type: "doc", + position: "left", + docId: "contributing/CONTRIBUTING", + to: "contributing/", + sidebarId: "contributing", + label: "For contributors", + }, + { + href: "https://github.com/cursorless-dev/cursorless", + position: "right", + className: "header-github-link", + "aria-label": "GitHub repository", + }, + ], + }, + prism: { + theme: lightCodeTheme, + darkTheme: darkCodeTheme, + }, + colorMode: { + respectPrefersColorScheme: true, + }, + algolia: { + appId: "YTJQ4I3GBJ", + apiKey: "2cc808dde95f119a19420ddc2941ee7d", + indexName: "cursorless", + }, + }), +}; + +module.exports = config; diff --git a/packages/cursorless-org-docs/docusaurus.config.mts b/packages/cursorless-org-docs/docusaurus.config.mts deleted file mode 100644 index 694c7b1f0dc..00000000000 --- a/packages/cursorless-org-docs/docusaurus.config.mts +++ /dev/null @@ -1,175 +0,0 @@ -import type { Config } from "@docusaurus/types"; -import type { Root } from "mdast"; -import { dirname, relative, resolve } from "path"; -import { themes } from "prism-react-renderer"; -import type { Transformer } from "unified"; -import { visit } from "unist-util-visit"; -import { createRequire } from "node:module"; -import { fileURLToPath } from "node:url"; - -const require = createRequire(import.meta.url); - -/** - * Files within /docs reference repository directories - * and files outside of that folder. They are not served - * in documentation hub. - * - * This plugin rewrites these links to point to GitHub. - * The algorithm roughly is: - * - For each link: - * - If absolute or already relative to index - do nothing. - * - Try resolving it relative to repo root. - * - If anywhere but /docs - link to GitHub. - */ -function remarkPluginFixLinksToRepositoryArtifacts(): Transformer { - return (ast, file) => { - visit(ast, "link", (node) => { - const { url } = node; - if (url.startsWith("http://") || url.startsWith("https://")) { - return; - } - - // Docusaurus runs this plugin on its intermediate - // markdown representaiton as well as on our original files. - // These are relative links that docusaurus already figured out - // based on realative links to .md files - if (url.startsWith("/docs/")) { - return; - } - - const repoRoot = resolve( - dirname(fileURLToPath(import.meta.url)), - "../..", - ); - const artifact = resolve(file.dirname!, url); - const artifactRelative = relative(repoRoot, artifact); - - // We host all files under docs, will resolve as a relative link - if (artifactRelative.startsWith("docs/")) { - return; - } - - const repoLink = - "https://github.com/cursorless-dev/cursorless/tree/main/"; - const linkToRepositoryArtifact = repoLink.concat(artifactRelative); - - node.url = linkToRepositoryArtifact; - }); - }; -} - -const config: Config = { - title: "Cursorless", - tagline: "Structural voice coding at the speed of thought", - url: "https://www.cursorless.org", - baseUrl: "/docs/", - stylesheets: [ - // Icons generated with https://favicon.io/favicon-generator/ - { - rel: "icon", - type: "image/svg+xml", - href: "/favicon.svg", - }, - { - rel: "apple-touch-icon", - sizes: "180x180", - href: "/apple-touch-icon.png?v=1", - }, - { - rel: "icon", - type: "image/png", - sizes: "32x32", - href: "/favicon-32x32.png?v=1", - }, - { - rel: "icon", - type: "image/png", - sizes: "16x16", - href: "/favicon-16x16.png?v=1", - }, - { rel: "manifest", href: "/site.webmanifest?v=1" }, - { - rel: "mask-icon", - href: "/safari-pinned-tab.svg?v=1", - color: "#7c7c7c", - }, - { rel: "shortcut icon", href: "/favicon.ico?v=1" }, - ], - onBrokenLinks: "throw", - onBrokenMarkdownLinks: "throw", - trailingSlash: true, - - presets: [ - [ - "classic", - { - docs: { - path: "../../docs", - // Followed https://ricard.dev/how-to-set-docs-as-homepage-for-docusaurus/ - // to serve a markdown document on homepage - routeBasePath: "/", - // Note that we add dummy/dummy so that the `../..` above has something to strip - editUrl: - "https://github.com/cursorless-dev/cursorless/edit/main/dummy/dummy", - sidebarPath: require.resolve("./sidebar.js"), - beforeDefaultRemarkPlugins: [ - remarkPluginFixLinksToRepositoryArtifacts, - ], - }, - theme: { - customCss: [require.resolve("./src/css/custom.css")], - }, - }, - ], - ], - - themeConfig: { - navbar: { - title: "Cursorless", - logo: { - alt: "Cursorless", - src: "logo.svg", - srcDark: "logo-dark.svg", - href: "https://www.cursorless.org/", - target: "_self", - }, - items: [ - { - position: "left", - type: "docSidebar", - to: "user/", - sidebarId: "user", - label: "For users", - }, - { - type: "docSidebar", - position: "left", - to: "contributing/", - sidebarId: "contributing", - label: "For contributors", - }, - { - href: "https://github.com/cursorless-dev/cursorless", - position: "right", - className: "header-github-link", - ["aria-label"]: "GitHub repository", - }, - ], - }, - prism: { - theme: themes.github, - darkTheme: themes.dracula, - additionalLanguages: ["bash", "diff", "json", "python"], - }, - colorMode: { - respectPrefersColorScheme: true, - }, - algolia: { - appId: "YTJQ4I3GBJ", - apiKey: "2cc808dde95f119a19420ddc2941ee7d", - indexName: "cursorless", - }, - }, -}; - -export default config; diff --git a/packages/cursorless-org-docs/package.json b/packages/cursorless-org-docs/package.json index 2619ca1808d..9fcd70227be 100644 --- a/packages/cursorless-org-docs/package.json +++ b/packages/cursorless-org-docs/package.json @@ -15,23 +15,23 @@ "write-heading-ids": "docusaurus write-heading-ids", "compile": "tsc --build", "watch": "tsc --build --watch", - "clean": "pnpm clear && rm -rf ./out tsconfig.tsbuildinfo ./dist ./build" + "clean": "rm -rf ./out tsconfig.tsbuildinfo" }, "dependencies": { "@algolia/client-search": "4.15.0", "@docsearch/react": "3.3.3", - "@docusaurus/core": "3.1.0", - "@docusaurus/preset-classic": "3.1.0", - "@docusaurus/theme-classic": "3.1.0", - "@docusaurus/theme-common": "3.1.0", - "@docusaurus/theme-search-algolia": "3.1.0", - "@mdx-js/react": "3.0.0", + "@docusaurus/core": "3.0.0-alpha.0", + "@docusaurus/preset-classic": "3.0.0-alpha.0", + "@docusaurus/theme-classic": "3.0.0-alpha.0", + "@docusaurus/theme-common": "3.0.0-alpha.0", + "@docusaurus/theme-search-algolia": "3.0.0-alpha.0", + "@mdx-js/react": "2.3.0", "clsx": "^1.2.1", "mdast-util-find-and-replace": "^2.2.2", - "prism-react-renderer": "^2.1.0", + "prism-react-renderer": "^1.3.5", "react": "^18.2.0", "react-dom": "^18.2.0", - "unist-util-visit": "^5.0.0" + "unist-util-visit": "^4.1.2" }, "browserslist": { "production": [ @@ -46,12 +46,9 @@ ] }, "devDependencies": { - "@docusaurus/module-type-aliases": "3.1.0", - "@docusaurus/types": "3.1.0", - "@tsconfig/docusaurus": "2.0.2", - "@types/mdast": "4.0.3", - "typescript": "^5.2.2", - "unified": "11.0.4" + "@docusaurus/module-type-aliases": "3.0.0-alpha.0", + "@tsconfig/docusaurus": "2.0.0", + "typescript": "^5.1.6" }, "license": "MIT", "main": "./out/index.js", diff --git a/packages/cursorless-org-docs/sidebar.js b/packages/cursorless-org-docs/sidebar.js index 7d2ad5d0c41..4478dafa6b0 100644 --- a/packages/cursorless-org-docs/sidebar.js +++ b/packages/cursorless-org-docs/sidebar.js @@ -6,4 +6,4 @@ const sidebars = { contributing: [{ type: "autogenerated", dirName: "contributing" }], }; -export default sidebars; +module.exports = sidebars; diff --git a/packages/cursorless-org-docs/src/css/custom.css b/packages/cursorless-org-docs/src/css/custom.css index 911fe1a5d7a..090404f5fd1 100644 --- a/packages/cursorless-org-docs/src/css/custom.css +++ b/packages/cursorless-org-docs/src/css/custom.css @@ -16,7 +16,3 @@ background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") no-repeat; } - -[data-theme="dark"] .dark-mode-invert { - filter: invert(90%) hue-rotate(180deg); -} diff --git a/packages/cursorless-org-docs/static/favicon.ico b/packages/cursorless-org-docs/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..0aebbfbb7bce9d9a7c43d51e1478334f2ae4c0f8 GIT binary patch literal 15406 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/cursorless-org-docs/static/logo-dark.svg b/packages/cursorless-org-docs/static/logo-dark.svg deleted file mode 100644 index c612c886d09..00000000000 --- a/packages/cursorless-org-docs/static/logo-dark.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/packages/cursorless-org-docs/static/logo.svg b/packages/cursorless-org-docs/static/logo.svg deleted file mode 100644 index 1f19410e824..00000000000 --- a/packages/cursorless-org-docs/static/logo.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/packages/cursorless-org-docs/tsconfig.json b/packages/cursorless-org-docs/tsconfig.json index 0c1f97ebfad..9dd75ec1d10 100644 --- a/packages/cursorless-org-docs/tsconfig.json +++ b/packages/cursorless-org-docs/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "rootDir": "src", "esModuleInterop": true, - "emitDeclarationOnly": false, "outDir": "out" }, "references": [], diff --git a/packages/cursorless-org/mdx-components.tsx b/packages/cursorless-org/mdx-components.tsx deleted file mode 100644 index 4687d27db04..00000000000 --- a/packages/cursorless-org/mdx-components.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import type { MDXComponents } from "mdx/types"; - -// This file allows you to provide custom React components -// to be used in MDX files. You can import and use any -// React component you want, including components from -// other libraries. - -// This file is required to use MDX in `app` directory. -export function useMDXComponents(components: MDXComponents): MDXComponents { - return { - // Allows customizing built-in components, e.g. to add styling. - // h1: ({ children }) =>

{children}

, - ...components, - }; -} diff --git a/packages/cursorless-org/next.config.js b/packages/cursorless-org/next.config.js index 2b6cfa3aac4..c8eb6fc1e7d 100644 --- a/packages/cursorless-org/next.config.js +++ b/packages/cursorless-org/next.config.js @@ -1,10 +1,3 @@ -import mdx from "@next/mdx"; -const withMDX = mdx({ - options: { - providerImportSource: "@mdx-js/react", - }, -}); - /** @type {import('next').NextConfig} */ const nextConfig = { webpack(config) { @@ -16,10 +9,7 @@ const nextConfig = { return config; }, - experimental: { - mdxRs: true, - }, reactStrictMode: true, }; -export default withMDX(nextConfig); +module.exports = nextConfig; diff --git a/packages/cursorless-org/package.json b/packages/cursorless-org/package.json index 3e24a01b85b..a2c76201e4b 100644 --- a/packages/cursorless-org/package.json +++ b/packages/cursorless-org/package.json @@ -10,32 +10,27 @@ "lint": "next lint", "compile": "tsc --build", "watch": "tsc --build --watch", - "clean": "rm -rf ./out tsconfig.tsbuildinfo ./dist ./build" + "clean": "rm -rf ./out tsconfig.tsbuildinfo" }, "dependencies": { "@cursorless/cheatsheet": "workspace:*", - "@mdx-js/loader": "3.0.0", - "@mdx-js/react": "3.0.0", - "@next/mdx": "13.4.10", - "next": "13.5.4", + "eslint": "^8.38.0", + "eslint-config-next": "13.2.3", + "next": "13.2.3", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-player": "2.12.0" + "react-player": "2.12.0", + "typescript": "^5.1.6" }, "devDependencies": { "@svgr/webpack": "6.5.1", - "@types/mdx": "2.0.5", - "@types/mdx-js__react": "1.5.5", - "@types/node": "^18.18.2", + "@types/node": "^16.11.3", "@types/react": "18.0.28", "@types/react-dom": "18.0.11", "autoprefixer": "10.4.13", - "eslint": "^8.53.0", - "eslint-config-next": "13.5.4", "http-server": "14.1.1", - "postcss": "8.4.31", - "tailwindcss": "3.3.5", - "typescript": "^5.2.2" + "postcss": "8.4.21", + "tailwindcss": "3.2.7" }, "license": "MIT", "main": "./out/index.js", @@ -45,12 +40,5 @@ "cursorless:bundler": "./src/index.ts", "default": "./out/index.js" } - }, - "postcss": { - "plugins": { - "tailwindcss": {}, - "autoprefixer": {} - } - }, - "type": "module" + } } diff --git a/packages/cursorless-org/postcss.config.js b/packages/cursorless-org/postcss.config.js new file mode 100644 index 00000000000..12a703d900d --- /dev/null +++ b/packages/cursorless-org/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/packages/cursorless-org/public/andrew-dant.jpeg b/packages/cursorless-org/public/andrew-dant.jpeg deleted file mode 100644 index b97798f53bde234fc65b8c14ad408db4f30fecaf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25740 zcmbT7WmFtN*PsWN;0_s_1PczqHNggVClK6aaF-yN41+@;XmA+_t`i_Q!QBH4PH@*O z@AvK5J!gOI?(ORS)75qA={|ky)|G$r|JDFRAO&Rw0165Kfbx6*{w)FC0nkuU|I?lY z{kdUaV_=}8W8h+8VPfOq;^Do(eenXHfP@I2fSBOL3nB_4Vp1}4a&kOEN-7F6DiShs zvi}T%g7*9jItC5~1`Zki3w*NwXZhC&AjU>XKuJJDVFI8Mqo5I^{ObYGKhF~b<-Y{* zKLrK#d5)M^*f_W^o;x%U0Z>uU&`{CQ{xj?6-oelJ0qDdSB#eBrn50^kSWF&d{NaiD z*vxV@UF6ymCoBRVJtJ^%DJZF^Xl?_;t?ixNz5Ua(^NY)?>zmuV|8SuI(Ec0i`TE~r{|6WG zGZ!j4IvP6Gf4ERkeV

8KOKm&et_^K{ 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 e?94#c4E#TGW0ju=Jmq5m0000 - - - - - #da532c - - - diff --git a/packages/cursorless-org/public/favicon-16x16.png b/packages/cursorless-org/public/favicon-16x16.png index 2379e470c961661f16fd518f410b922a78c622b9..b3c57a3fc3c181718a41d07f6e5a2604c9a879c2 100644 GIT binary patch delta 395 zcmV;60d)TD1eybo8Gi-<001BJ|6u?C00DDSM?wIu&K&6g00C4f8=%GpSOSV*j-!I!Yo02SWx210CXY(Z+Rd+;(79I zOG{e2g#yjyB}d0)Q~UTAfz7V4@gr`$#&t%@DaAN3Qn6HI>if9f3L_=Yyu!*3wtbjb pc@UG=T6r$A$!A*Z`>)^m6PGZ?0o7UN$N&HU07*qoLBZ#gC7b&;Md_C;3+N^h>9T!Y*}5R4w0eIo@TL<+;#xMRW38a-ttV;x0e0h zkBlcf8?)1VZzdni&s^pc`PTK+luWmns*}q~HrM%wE58oCAeO#XCbiV3d(AVAwLb!l zZI{2j;LNx6?8hx>hmw7+{E@M^`15$l9ElIBpS@nW&&hI`ck903Z!c|&o?QsKJ5zFQ zcIkTC%NMpSO25uwccbCZxBB?K$8f};Gi%$!t(lFEWqh0KDIWCn(cIgdZ_a1@4V zXq@stea7=?5CgL^w_Y;0u(GiCWD#az1(ybs!zs+ln?n>%-?(z($eANDN7zp{cr5VJ ZV|XPlSn|oqbSlsa22WQ%mvv4FO#ml*@C^U} diff --git a/packages/cursorless-org/public/favicon-32x32.png b/packages/cursorless-org/public/favicon-32x32.png index 6e51c1f7b64740160f6894e553a2dd0cec0f660f..9b4c54d1182c15ab467974b8524d58ed173c3042 100644 GIT binary patch delta 1005 zcmV5FccaB@UI@zw3^TdjO9c*Z{$Sf z1gu?6Ud99bN1We{5VeV-IH{$h1;8pW)(oH?fJu*I6`3%A&Y&nB2QaT@LlppHZ1Wn< z?}2Dbl8%?FJ%5V;pNpdS`|^Vo0IVicE*T6D0DP3lc}7MCwr?*&*2ayp$e+{G7#Vqj zxw$zlyt6zS-8ml)k12)X0LV87e2JW!OeQonev7)gS_py==PVcu;_{WNXl-pnI4nh8 zbp?d{Wg zj&ng#JSqvu02pIAYk=RhvfXGjYTYW%nGV^o0oeLV6enc>g4yf=(V-M&ygoCW-w1|6 z6%qiOm4C6o@*-ogSWxCF#qB#kBNB<|GrCMlip2i?`_SJ%up)X=v6>e}I|*jW z)XlWnFgVzco}OQD;bLb}&SOdqN9s{rT#T~vFAxfa;%#yM6S|P0R-xP5lM(=BE*ISHAJFvO_vq}rq_nx90pKvY zy?@>`07%OdG@zyBwE7dQOu{TojE|)_34ess=~PcbwQqRC{ftF2KdrI)XuwXHpA zQYr^RH!UwJLRMCaX?d*hFVgdS0Mb90D7w$P8_kq0P-e_Y4yOj9Hi`LawbWIoV}hUVgw=T=}$00000NkvXXu0mjfey`$o delta 959 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 V{fu$uYtip#Y>W8+&wp0}{{o0;x@-Ud literal 15086 zcmdU$U2GM{701^Ye?W`uNCixdiXUv^(l&v%`A|t~9tzZaJR%SXXxay81r=$f&`Qu4 zKk%Wp5*FZqkRp=@8nsbXK^}@)iEButw0#50m(_5ClVI93xIhi6si*(n*t1&i-Mx4B z`q~ah`rnyf>OW?^)0D8X894Yd!Bh<<;s*`PQkP zw^t0!;!zdvy8`)^8iyYx{;iR`7lfCEH-*0mcZB~5W(1_kyDa=p_?gfmJRwX5l}qWD z1nf8`{7VSh>+Ftu!uyHvwy;}xN>I;_J57;>MM9_Wp)e%G*_bB3PjZe6&j|F*cu<{$ zwhJE#X>3cwdt0*i3-v;&s7!)d1ip15ADJ;@hG}kYHj5W8wjfQO>L&r;^v}Xlf$u#Q z!Y98cB+qP|{zrR1u?3{df zsgtk`4`l;wNb?{)Z-#0k^U(P2TFJj&p4L|tSg(IpN$4!&Z3Ur4F=z|9+n@f!=q;GgpWs{A@@lD6^rV z!Cbp`&CV;UR;@DArcEnY$H|3v<;s<|E;5ki$`U+TAEM^frS8XJ*cv znMU_0Ug{!)wj|XnzCPhuAxMmi4k59e*|TS->hn0+d<$g7mB-{0YXswrX1%{3!)s+v znKH$$J@i!(`U={IOui}W8@lq@qOw~8{^IDzO2pP-+%ZCP1?JXKeBpJK`EK><)uVXAbxQG$54pLuz&g#Iqea**JPPY3M!9q6j_nJ6 zn6sI~!+fQFN5`pCr+mHGfGrVvnCIC)y&f)OKE80_f-mFIqeo`*=FL$u#w8D3=yZfF zF>3^S(Z7c6C(aEL>wbdqRI;|93!Op2rm&rQzbt$d%x9l*?%cUxRg=kNCd7A~9rzGB zgM>{HdmzpPi0%Bgu~)iv>sGL;jm3iTOpt#((&!@Q3lcVATSy=K!BKlc_I&J{ferHFD@yi()XBEEvq#vXC^OEfC z3fun}tzVqCvM(MCw;>!qu%=Ih51}Jr{J^~PvhX#5czTo%Ma6H#R$;zUzo&@bK9+9I zy+0%TA-K?v~BEHL&y}{l@mK+rO~4V2|-B*}o8bI%-nlh7j9^Puc#F z^QkX8nl)T>{*apT~Db7#!?%kXA{Dk%Pt3nk0 zRGFjVA-zX_6V?cKe#MzY+ViUwD^}Pzy@>OxcG-l#MA7Gz8M&8Neoi~0&JP0*e1wOyIo5=GLf$rn*XiJ%BQDLk z$oB2qliptp$OhsB?o`rHg_vnW!S6sDh?mCU{)m3Z_B3}dV)u#ffG_1e8&$deMx0#| zdza|`4u5}9NZaqKl0(la=TAb;IhXQs{EI!%817G*zq^HR3UTwKic%AEE9*m6$g#OZ zdA*Xu9SZkA<3aSt0)bc~D1o#6d2!U1nxu<`Ih)- z3%r~eXJ*k;UHd=+UG8Jyb9b;~bc>Ja?%0 zOltuHX!rFf-8D5e=H$tfL6wndc;Jnap*(De>xX)kosX$!cI?<;?|yFIzHRT!_UzeX zwr<^OL7ICs%D5kbH%^Z7-xb3Cz`FB`xH@y@%&~jA&dyG=aN$BzSy`DQpFGOo;ZB4) zaq^UpPcpU~(eM8dBI_(zu)wgd%yVbz*MkRM>cq)YKI4M13DNdfg&cm`fSihoihN@% zryk>xI@Hb653flleL&oTU-)wHAHE^|NLzwsY0_>lj;siuWIlUZ*d`1*xr`rtn7=7I za^y&&K6iD)Prd~*kcG_9*kqn$u71~3VcIb@nwD_(% zUgj{j|7Sdfc#E*w+IKYSY1$V7&8+v z{)pv%AWYW$^OAHEs{UQ@`(=XW-}j~SD+24!;h=t(9_RJvxb$d;V2M2!driL&g6XvD zZ)SPPTHAFMYC;t%3#*LG(E=eK9$YzW3*+yfGGZP~KL zf;4#vWhGNrAbV^@5m*b(6K5a~#ftuL;C*#FJkXh;0j! z>8~-St<2~ny&_>P4|UqY(Lz?I6dBnL+H{2A;1wXp$1^ihKPy?tL^e9mg-&!c`ExAM zAo%ALg)OfV`wD@+;QWd{0JntS3af-_A&Qu1_@4Isp8K}->(`qN8#V<0mQUu||AqQ| zNC0(NGp!FSS+c}jx^&4rc<{i2GsQM>`V*3w2{f-#?@jZw+_4k66k-&fPb$mWZ$iNQlvfr2Q5*k1F9KIf| wt1L^{vs|E0dj;l9@PY7#fUo28K0Tc0d0FLTG!wR!4Z|-CC0seY)S>SG0XyQXlmGw# diff --git a/packages/cursorless-org/public/favicon.png b/packages/cursorless-org/public/favicon.png deleted file mode 100644 index 6a87a091ab8f10ed9dda73e9056421e0f124544c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 651 zcmV;60(AX}P)Px%MM*?KRA@upngMRZAPhyx$=020>&e=kY}1e8$ntE!#vNplrcPae|7>HxY%BTC zt(1bFx8oBdJWDBG$55Y{LvD$kLG+`uzk4Yq1tbdq!U5oUQXnz_zCEgycZW0#H9kVd zYkA3l`SBh#!UzCj_#-;7XcrErD1ap%)`S?!JX|MbCw!-Y!wYEddNKe=w0CgILIe{E zr6>REzg_F1@o6NC4k(R z&9pv&XsiCIn*(TD;+fX30i5AP0M=ooH%lc(joOvAW#1u4p!UKF;ZySh{L@}EPtyYDCf z25P$3AsnwF=5dqh>Ng5Nw~-l>nnekzM=rSKkVEySQ2>a!^hI~8@Kkf~kmaf43=c#g(u!u8 l02~CrYyWQJzJ+Yf(I2FLjBSV8d1e3r002ovPDHLkV1hxsD|7$= diff --git a/packages/cursorless-org/public/favicon.svg b/packages/cursorless-org/public/favicon.svg deleted file mode 100644 index 580faa4dd17..00000000000 --- a/packages/cursorless-org/public/favicon.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/packages/cursorless-org/public/fonts/Inconsolata-Bold.ttf b/packages/cursorless-org/public/fonts/Inconsolata-Bold.ttf deleted file mode 100644 index c83ecca68d57bae46fbaf5ba7438d8ee89172e52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102152 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 diff --git a/packages/cursorless-org/public/fonts/Inconsolata-ExtraLight.ttf b/packages/cursorless-org/public/fonts/Inconsolata-ExtraLight.ttf deleted file mode 100644 index 37320d6a45d3b4657c691c35843b4af1ade4f113..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101972 zcmd442Yehw(l^}Qvs&exgS9KIB+Hg9ORMat>>MT8lAN^4vSmpqIDx^KEaDLjM=;UA z5o8XGG2wtCAIAa5kp$jKD>dkv%vj~ zi6yB2y0xcm!@<}a>lw>_fwAB#+gyD;z=xpyBpiL(I=8gmxV!2+#;&bp?7LsvTU^bt zB^OiuX4L1m1L5vi1QBG;!(7)L?()uuC$xnixPiJ?NtLro8R>r(@kI zkr5V*Bh#K{ce07Bk9jcxji<2dK=JqBvzUfIs$V%$%9z)Ik)gxic->DJ&wpr57>$*d zf7tis+TiKmGk@(9qIfsjx>O$TE-M`wI@05HzrOP{V8=H# z_qTK68-mf45_t`SWdU<0_!8C(*usBi!_b@3>`TCKsVNM=~GV}7KoUvVujWG7} zX8`R;tgLQX1$z?6!+PJe&-rr=j9>BRHz43e(G3zi)5NvR3fMx4zsUSR|2@)AbR4N0 z`9<_d+z+6xWMymy{^qc$_^Skz%}UucHlIxgZW>C($jeYS8+EhTJirUsWLAj!Y*|wQ zx&lBm&@P+hDY%%Gqs4r-40NU7I~T2pY8J}?RRJpkJQKXjKs68C%fV%y?Vq7d0RmhhMv=Viq4*6Pvw!$SEk++Bz#=E0#tPxwslo4C|lwn(2<~Cbv=CG|LbHvsRxG8g%t#R^*%{6Jn z)-b8rwl<^LwkBiPwmM_PwhG6U6Nhc}6Gv=y6L;HcCydxuq&aQN)3@1b(noC7X(P6( zv|-z_@gugSR|+<2cW;+cwuRVw>X_w#{}_+bWYs zY!x=UtvqSOR%Y96E47W-N^mT;58GzhM{G0g+iWxJ)wb!0BerSdnr&0Zjo6CD4ciLG zRoe;@hKt{~?%j>h%MO{K$2}1 zM9s3<@?xS^CB{s&jf)cgF3HKERsny|W% zy1>kU8n11Znt(b>U9iPwnPpjQIm2?3O~e4p9?S*B!+D>a2Ca z)>+oY*0t6%tT$P$tS*=>hWFjXzQO{L=~JU^6E!{<|E~mpRq$Y86SKr(afY}_SVNdr zT_DEA8v+!_3Xd$iP8D$mpNK>UBKB{fBCfdO}bo!7|gE zQAz%jc*)qn=wv2JC&)0%IvGuB{2PyTWIkr$cFelH>^1fg8|IOG5-;QRyo;a7ujF^| zNBGP9eg3Vm3WvxO>%}(lvKFsR)@Er-we{LI%=f1(R!fY6d>t?S9y`J}a*Xsvsm^HOZ}Vuuk?S^{}ulq1AGJG12O}O1F8Zp3%E7lp@1&~ zSzuUTO5n7><$)Ul&kp=;;QfJ52fi2hb5KA~Vo-KadC>Bpj-XS6E(zKd^!uRag5C-G zJ~%Yk5!@MkdhlhzzYBgo_@j`*kaZ!uLw*g-4Xq5V4P764M(E|Cw}VK;{D3HxK%n_=IC&kwH(-w^(r@LR(l3V$K|@8MrYjEk5OQ4&!V(H5~a;^K&# zA|8l%HsY;_Pa}Sf4312S%#EBKSs%G6@`A`4BJYoUDe_QMXp|!=FKSLyebiY|w?{o3 z^F()qjyH%9sPLpXEF0*R>yS5oEvj<%)Xev#2kwGDKPgy>bY;>VN&AvsO7=>QNzO=~nY=W)Df!IgE0S+d zemME1){`+*F z^px~j>C4ia(>JDHkpA2B`_i9Ge?9%<^dBeqPKck7KVj*FRTFNX@bH8eCwx4SO^ly- zn$+eUFCZ98T*W?E#KQsBQ$^V}G zYi4xjmdr<|Sf|8InKWhAl&UGMQ?^XmH|3=%2c~?P#j_%^#%C2}&Cgns)suBr)>T=% zvmVKMIqSWwud@TPZQ0K3^6a(Q=Vb58ekuDv_E%2sOm(hzZgXDhyv6yT^Lghx&d;2O zbAodUbLQo&%IV5EGv~?NwA^*My}5Vhev=oJSDUvl@8kS}{G0NhE^roHQE;#@p)j>D zv#_ABxNvUavci>x&4n8ZHx`~=cy8gPg*yvxF1)L7PvIklPZhpc_*&sRg&!9FyYQRB zpNn{rZ&7GbY|+Z1O+}AR4WBw~>bX-tnx;)_owk44E7LQkZ=U}13^BuhM)-`mGnUP$ zpV2tuo*B>2_*!4X1y}&=i-Fo?&7nGuPwg0_~qj7O5#ge zO71UtuH?OvFH3$X^)8JmwU?%sW|bC~&Mm#T^si-cWu;~7$}TFqzwFtvcgy}+&dUAE zCzUTNzu>69w=2>s&a8N|vZ3;&+1aztnZ0xNXLFo$rq0@VpuGcFg;7 ze(L;=`B%<=aQ+MPe_5a{NLt`ruwucb3+`I*=7Mh)1})58xN_lH3olvt+`@Mk{T51Mr&aJto=FXZ&YF?`O zd(G!HhnEL0w=d6LUb?(y`TFH&EWcv;ZOfln{@RL%Yj3DqUw3KUD|H{#{ZgM;Kd*j$ z{YCY+*S}W(pOuj-Ggr2(ykzC0EC0Uor&W=wrmQMo)wpWYs;gE#yy~@8hgNH=V^-&_ zUa|Vr)jL-|wEE@MhgSc%CUi~OnrUn1uUWaKZ_Um%FRgiZ%`a;c)=pkqxwd|7&)T!s zUbXh&wXd!HtRb*rVnankbHnzA-!|-T_vGq_uD`erxqfU6ZA@#N z*0`W?b>l$euEtjy-*4hg$xS&;bDJ8QHZ@(;bVJi0n%-&pPjf_bR`dMkb-t{kd%K_Yr}by|m-bipuj=34e{26k{m=Hl+5cYuq5d!Xf9O9l5I;~juy&wr z;QE2v2HqHWf1}sNi5tr{F4$PJam&UtH{Q1K-i>=VKELrV8-LjpxoN_tnVZ&b+Op}& zP5U=}x#@?^*3J2w>o&VKcWgdo^OntLZoYBz9h>jlym#{xo8Q@D*%G)Vc}u~Tx-FZw zoUvukmi=44-ty~KpRM6r6Sq#>n!mMl>!PjoTU)pGZasbL={N_|J&qrLLHxu-dF6s? zes!m-zl#O&X692;Ut#An%Sx*4Jf>_}wVi!Czog#IUS7C(ft}s4Z1F-n+m72+JFBl= zHs8*0KZrX!+*yLBz}=G4mURT-ArO2o}krSoATd0#Ax6;H0ShPm0R#q^NvP zipuAtsJxFu6)f$gDSI7lEeq<&t~#Az*Q4oTT&~W3p5El@YvIXFO&fZ6oXkU-J3HFA zUvpRY25xEXbv3bJ+|zfm?_~a^%s-L&L75+r`I|C-Rpu{s4Q%LT&vf@Tcd^I%AcgJi z>&wb!L&%-%Zsa-aw!VSJK6Yc@Ku;grxwWOYn_VvZl_c{BnTN|fRpu!&cgQ>$xxk%T zqAW$qT=ycq&jAt>DDxnhhsvDpvAMio)ZkSyxZk64l+5kOHE{L9eLis~h-z)JL{OU7 zw_XXB9t#YwJ*}OMKOgao*o(g_@weUlYZtj9O~eR`NaK(3`|#Jp7x78j*|?9tj-7_T zX0{0Yh^G${?J~gsMVTl!u>yC{Ui@PbD#Ap#i15G%;BJ4SIA2@5^xT{GfQHDPCcy zrJVxe6;IZOg|Js5xg~gTi<5Of3n6K_2=w4;9ie-DE^vP@YpIXR;Y;q)9A-C5s@xEXS8)o#;n*Y41EYj;BS-P-T8d$fDC`?UM9 z^RY*JK>NM+xb}qh2k54IRD$w?6mUBv#}3<+=mGh|8%X3G473;*NccV6;&HUqZ6sx5 zCn}Cl<@5f>@&)texQvCMxqL46WVUK&LB<8z1uQ_jLc4|qYS(JlvoP%u?J?Mlw6(DF zv07xowlpfF8SSBxeiqUX5PHDh=5OO@P#CjBu4YmOlQR6I41XyjM9PRzy)Fi)2$t{W z3;GMu?~7?KNzv%@f+Q1P(j9whXd%#}xr&CoG6m-b3Tt09R+=yog*;S5Vx{&RS%rmt71|0tbN#FAy z_>a(R0@mh0Q6Va^?|?P>f9xR~JDs%tVfJDToXeYN4)bCD3;&fL=10&s7##gi#>zil z;EaJa17`q?#;KT3+qBa$Pqt&G?7&RB0ONfnb^@=~uECgJr~OvD9;3crdlcS9D=Up8 zHsF!ds75f0ANK!w5DMP#H^u_7zh1;n=h=J?Kb>F7FNZES^C9f7ya@Y!CgR0pks}Jk zLhMMMDt3zN#AD(Q;$`s<&7uWp!CDx0T~f4kEmOmhu?dA3! z`xg7D_A~4k*l)JqX5VeU%YLu@0sBMt{r1O`!jqzsl9N)B(vmWhu1)$hStMJNeUgKd z!;&MDqm$#36LCjBC%GZHCHX3caKt#qJ2D&>I$lX}q;5|=KlRGgn^K=o{Zr~+(x#;~ zq&20rj*lE4li{6lRc6@8VO&emzd&ZkOq|Mg@mzR-ZjW93er<4=?%@UNli;jk3oh z;tBDbcpFp53VVdY9u6%{+9MD4@JS3vj7UsKv?rz{PE5>9%*U=pY2t#!`ouMfor#+h zwc?w5l1?YT;j$8+Qc@pF4o3cnG5@yt44kvReRjRM}Y_FnvfkF zZ;*WWuH@Bzj?eB?v&a`xf%lpmaZu<~H`2M>N&dvFSs zKiGlP_`xa2t3SYVgb!AKuO4p)bvdy@_U?7USqGbx7ge4pqL`kG1In+LOkX8 z1W#JLcmNN>F7RZ`Oq`AQ0=^i}R_d{Op3Be2GnFgwEM+%;g8zX(!=L4U5tFqQA`|Q8 zLTsQf6V0Mpv}(2560Da?`QNamzC}2-W!eo|wb)44YueS~EN!t!)@~FQ{-!7v!6Hb6 zh$Nhk1@pySLHnj|AyHxo3xoitNm0itth%R;|dx|~E9%p}G z@38CnjqGRkZ}v6Z=SOygbMC{FcsP&diP+7a#%J(ZJdii?Q+P9P#m@Ey(aq1my~LgT zZhjAcj-SV0z}@k$SiL{RwZdVR$gM0HUg+Td%*MT08V_RQc`%#KQ`jUP!3wyI&En(P zWFE;Xc@`_@nQRVsve`VFE#w7kKF?#T`5d;ASF)viI$OnOv*mm$Tg&G&7hlL1u@*eb zY{N6GR=$+A^D5TKSFj$wlJ)Y{>=eF=4e$nb89$Y6-NUbCzvDaEUHocXpWebA;y1Gg`7ZVs{uuic-^U)qn(_*Nl)cFJvOn|v><#`D zdzU}Y{?0z)ud;vg*V)JXHFiGlV}Hcc?h-s|XlCp1ytRT)VOQ|eaZfkG;<;c~@$I+{ z`2lCOUsxU=$EI-ytKu_RJ+EMA@=kUs-^y;`7qi>=W$X$5JN6QPnBB{-!`b~-b{6kq z*W#Jn*}R*5!2hiEYp3AZTDP`Q8_;&*Ou9wu)i!B;+GdUX?_fLmS?qGYjs1q7#%{$E!rS?8*nRxB?0$YdyOUqV?&jC9 zA$|kf$8Tqk@H^P6{Bia&e}uis|H%HzpJadIPqPDfE_?`26hqlh*jX9IHSjmMZvPL? zYTw~(k0;^mTU=9qhO5pmm^b?p_iT9P#6D+*+|H)*WLC^4uq+;f>!3K6!{b>lPhi=vu(VcUBLU{6-sdl~5BV!%u9zi zT#+wkh?$~DOcT?^RIN^1i6=dEVilf`t`IBnOtfA!iPd6_XcU*>Ir~N85^=e>Li|Qt zC@vP4ifeGUewDadbBWXN=d)(XU* z@T4nWyd?gPYq6&^r{)mPYBRMw@uD~)4vP_7jd=3r3=&ky-#7X%*nv9%Tc6tm8`1Wvet3M@lo0mLn}v zM}j?*flmaUXem`5C(ZG|lP&*mNTJYUF;WE*^?kvANz{jvO(meEKH5%@j%O=R{4BIT zR`R4d7Cag4Qjd{njIvHL9g8pNLi6Q+J9*AcvSaxP63r1O67|`0z8F6F|MtQKd7OHZvIIUNtdN6(YTTv;@OHs^NQBMsYrA_GyH|x()w=Lj_mszq*IZ0AoU}i zfkfkQ0n%wmg#Z7Gt{t-DR3cv|Jx-KfL;X`ouOmH*L~AACC{?ROb+01Pe18FHJW?$Z z%`d7W{3S@+k;pg6epex#g>uzB1Iz6 zIz#n@&qks?KZi6GiTsF;Mrr{}{$pH=P(AgPWTqh%A{n-A1l)l{V?}bvFT;@x8JU1d z2Rl+aQU(&~Isu7ztVgOsqCSjMM=Dc4Le|2H0n9%GNB1K~_vNQS5VRlPyu*3pOwRHAbz%?CQt93{WYLn3*Er$pCH0?CkP2b_cyOluI{e(;bMifi;ylx>Op!y9ZA>yn8Wlm zA8-ES?N5fiLB<|IB3UGR9TM@~jkF#*T!A*%Arb$#k@g{7h}3|z18FxB>3=2?>1Cwt zfIE=D1MizM)`>*?&4hNWc;2-;uetiXbI&>ZtQ}`=KjZXmr=7ZW%jQiR2m1SZPwDCI z+R(XvT}OLcYfE!eqpM-^Uu&-zY>=&hsUB6*>kEmatW(gCD66g=s>}dh*68KgvJ67K zIA=`tT%+1yA7V=e2b=dWEfs8vcY4$1#j`&gc1vko^5*_-V4A#19maY^l9 z(hzTO#H;eMT3C#`;s=u)N%p$BeIrjL5Va!-yaX%V{Qz)wK`c zd0SZn-i=N{UF|+Q8!DDqysyzvN=PEHQvqA37?}s~Y@g`k_Z73D?XuP)5whHbUPzoy z^hh!Gznk_69Ty_$_N0*@)Cknz`7iM=mNmdxfb-FD+jZ)6MeT!{5URl=bIxEo=%D|D zl`xRSeqO~s#lFP>cs_}-Ak+iE?8o-AFK53G;DJ1T4|t*nK=0$*_xKjaLtAjtQTzFJ zP!evtiG$`u=D`Re^^VuLdr(tf`}+Vaknu7HMJfH8JgH)jSd`&#yYrCPyPY zuy{#rTYPJs3%rMl9j+mZqcnbxg_UA<#c*_~Vh>xCfxgX$4=&DFvJ#V&jA0)fEVu6| zwxqe5TvRSk!n_|;RgUsuU!CnjOs!Sh%=&(1mWt+neg*2kV-o#i0&VW0NO&xmPE(I0;$ZI5^Ky(F_VouI3>PUYKNW#!nQ;W!MtAZXA~g zEKDLh##AyN44FoLLnYM95(@Y~IMg<}*lrdpQ4MFXq-N^AGGs|3&#O%uS{FamSx5e& zlemVqH`)j7A&#jI%A}voM(yl|A+OZgL))8N=m*v$_#P1RfUws#!k59YvSHBhI5e}Q znUaROF!mlSv83{9h!&}2g`w?B>xo4|(BeZ*`G#(XzV)^6`HO)_xpZ zgH>qDXadC#dE*Sw>S}Q$VQ~kpPTExtAEeKNhtv+S_`yNP;1Gw3sg)oG`?Miz+FUx| ze@}+P)q+7Jd3INeY+DI+rFBTZ_zFi-9Y{nf*_{lB)uNHIra^e)&}z&!uhh`Nut9s# zAXcr_Sa2WQPzW2 zRD$KC-K6QLftGq64Fo2sns+VnL+y1L%{nuyewb^=ii(xHX{o&0Sc%!-Nb<%y1`A+8 zvkz5e;3OjZcAjjJ1{bF#guIehI#?xqNC9}5I>a1v@O06E7x;#_W6qF3(S#fi;O!?L zM(tJp<L8k-0coMYhoMhJ=vtBL z8*FnL`n`mtLkDzN7OQKi`~GkO={)|Z2!S1+(p}phl_BW(Q&`ZH-up&I$bgDkHy!K? ze$vlXwVW8ljM{C=r~_00>tpIWy3%1XqZ7Tugf##98sOjKWHsoJM*Dn~rAzxaDGBLi}o+WpKSIEl= zkJF(L#Q=4t1X-;0o$<}fZ8WbE^>po;OTJT)QokA z)}6W-TuUvZt7F^&I6~}r4`RB0TjbC^t_tS>OKR=(_@X-8SL_@4cLJ?fFpa=T9;tfJ zZVw4X)u25LHyT6d&{VXjI)}vJEN)FxRMdlWG6n~AI=Utg5QFopUHxc z<3-KM7&`m)DASv?@51rTffOa2Q}U zEjMfN$I`88TzDdzWL=~1HkM+Ys$e_Iv>IcPgkOEgH>;sTvd0)Xm>>4n zblp40`FT(qOI~2Sa z@BbNdX9?b`TBYzy@kW}V!!o=lXxOI;^l^%&8W2-(jfamd_wcb59=g?f_*k8XkJWqV zywbzRR!JYL!476W>t!xhf%htVaO}dnb1g_zK7NfSWfkZ*U{`c3hedc-vllfk$S`Qi zfYT*(Azll~IU3`Zd~}^#-xJl1)x?gsNIRiN6ZUQ09FC@POD=_;ozU(?)F(q@^!sFJ z7fO3{umRZYL~@sbt_@VwquvuzF2Ja?!2|nGNagOeo8FB(+DdL)o`}j_XY}2TITlad z-Y23NYs(YSdfM_tbfax~BFdAqjhn-0de8ad>5W7`y3WnP({7__j$d;u8;x!|)-t1O zkG99?`V;lat+|`Z(C6rWy1nT5G;WSYkB?9L-zki?|DDp)MnP*;8{jCxhzfHPh1`umU;l2VmR`1-lJu#h|vtip4 z)1MsGSlgbMr>AXCOgY-NC#F4FOSvuJZm|N_Ma{S>YG*5OEoEFI9gA`)0k-hjpOb4>%L41J`Dmpzp=i*A)DAsS>|%twyU3)Y(y@ zYv6uBRe)LnZIV}VEx_m$oj5i@GvgZBj;lTWs<{_5q&Lx4$!L0Z@b8hdo}8(#ZVr<` zy&N>XQa6%rXW7t@lHEhI(Q*xKTx=usqdvJ7K(Ffn(9TV6z@rqg9R)T}Ssr zN*{6>K^pN5V|rmo_}|iqG$F4b`E7u^k&`S#n`P)zkF@v#51Y`)mU;A<%B9i*#7iIP zD)elF>@Af~p3iI#Esi}8CVSi^x@Xr|Ps>3cvhbJ9+z`c*tb;BUi0=45;XQhVICe|> zF}0#qv`1RXnD2J{s+#o5hs|hql3yQ>;}Y1k8*dS{z&B{-mS9Gb|I-|&Ih}5LOP^X5 z+SCjgz??D0a0*(x{j(o1&D<%+kvc*ChSU#x5#>zA)L}t-OdY)Mfq(e@vA_Ypwcp_C zUC&}RtlzL+{z4mj5~$H+9e%_qTJcU&A%59q#ZCiu4pB$HuGD|Ik4O^n2jVXwPVsmr zEB<_Hi{FUfZBlc_`Stik8OJXP1Mu6$@9-l)nsB7@(V>F@@R@H%VUHKle?M|v6QIix3%2)`fcY?bg9THI!&UL?FdW+tPa=#A6> zn0O;e*@P!LYF96h7-#&d@O*3(dB!m{Mw+~%7Jn4w1JPU%*(D9W8i(IM1_Afe2yBYH z9DNQRSq%8|BmY7EtHggbQiB#O7P`kih;$#)ok;lQG}72esTS#Ni1ZM9F#3At71N71 z9{0vhWh{Cy8X8BV*9t=46$A@-;5sE;tBFJ3RV{j|plTDsZ?QdadfPcBuGEC4n^3+9 zWf_pvPj5TXz(uE+P@)ON7?4Mg!VFw=fC<4~x>h@L0=k>to_8S z)uDq%ZPWo1!rY7=MCsM2mrRIo@C4uhMLi>-C#W`RAK(W}=pGZg!-Rl~+9m0(GjUg% z5aBvy?IkAed=uJXLZ_L~MiatYlS%{9Mdz~4#5J4H8WXBDp=Bntz=YgAsx)wJ>qZr$ zA5*3Ma!n}Hgwjoj=#nK}f{BYVAcJ4jtD~W)5Kz1tT}^TclC`?U{iH4y#v+fH&`&1x ztqFZ@LWfM~0~31JfTD!!@xzpVnQ#N(9;GaTMSYQHx&68)lx4b_nOd91yZK_p}l%~&aDfe$3PG~I;qO(@HNBDb1QzX3@N zbbb>JTy%;79ZSCxw}`eHZKD&90mT@&$SxCVHz2n(H{@X#lXGOF(IRq{2`x7uIUY-N z>y8?alNiD1{826B=tn1d;`9-WoQKgaCmE45O{ma>oF+8Mgs4TDY+)aTi<7vBQMe!z zCn2{rq)(zBkv?uHQhB0|i`r$>N^jTc&<|BhJ`P-@h#rji75zHhgf^Q{wF%{$P?iD7 zwwn84H6MD{o;4g+&ZYajU!FN@yhxTCx z4qm5f;TtBMF>Vo0LZAI)(})L6=spv=(}Zp@Aj7))+>f}P+S1%t5Y|Zr;S8%oH1~Cg z+D2S0TTC=?bgoq`VoV6DfR2;;T}CaWemaCvj?kgAP3TEL&;nXrM}3RfjB>9DVU!iF z)r1JwDe2s}2D7%_gwP|^c997YPH#KM#Fd)RbQ6+uM#_LSbS_dqy)A5@IKu`Ck~2!S zfHgc?=sgNEa1j9}1Y3F1kqr~rh!;FQ0N4W4WP3RL7qS}LItqvV9Yu_}W*z3Yy zrSnJlOJg9|P{+~S2eb?8_;5JEPngg?6MDde2=|GkyT`=cVM4%#?~=6`OU3U>6S~BN z&NrbQCUlwskuHkMMgte#V?ygpsM&&c}9z{aub?q zLWS_R%cPy1CN#-}(o6`oVRlIu=ZVu-{;&v7Tv*T;em-G1`!N>!YuIrhx<1fr$-_c_ z4gFzM3;3E|OTHHRYwUHQUx$7g`Y~konoy?+Rhv-031u0OZ2O*UJJG;Jq!>`>+o7+A zz8v}-q&#UtgxfE151P39Oz2Jn3R`7xiAXe|7y}AxHy{t~!wg)6)quk08PJ#+1^ZEd zjk&6?FA|q!;wBo9yKU$#=*#s)7kae`VZ0TNMn$hZ+k~ja>9WOU69>79j>bZ7(P}_$ zX>R?(K0jKQW33GC`}5ES@T(`e9=PhzMWJ(mFLhu0gigmA(@b=Pi(Eob#FL=GI*Z)2 zMkuVI{|ikqAUcL(CB;9^7K)dU|5NTZeJ^*XMg&E`rQZ_L4i;cOLnIRo-do}PD*g_^ zl;bV649c;y$Jt?Vn#`Mk(Zp`RZ^>P*UhLpdE$v_(p`2eLijjwqL=KBmE#f~RS}5&- zvCn1OC*{7^0onFvNx4!|9-y3WL*y;c%U1s)8jdqDF#nRZLlXb3+=2TWqF8aBFEQVU z`GA8)Xb&%$cH?*u^_K_HeiJaX1D7XdB@;cOO_El_8pX~1MZ>No57a2q>Kj@S!QvO9 zk>7wC7C#aV<**6%1$i5P5V<^uas%GKoT_)+@d4I~kGvZ1DJL+&N@)HLwtUQ&}EC1)?mXSLM% zdqe}qzOA+s`7qwO#O%}dNcaqi-y-vCz`-VUI2F;jK`-SF6Mr@=_jzBC{MSp}9+czt zg4Fz=w8K0p@hi<2^k2~~JNDNpF5>}dfiEPtFSI^jzL0zEf0z65=gA&@rG--~X&;x= z`76n7Snf545l^f_G%kM94tGn5VY2UG)Ry9AA`g?T4omxgD*Jd?qdp#%S{;^q|C-e5 zQ>oQ2QmbF2KK~|tKnXh_$0#GeS?2V#;VP-;u-x@NENyaF>U>!0e6AeR!%AoJu>-o@ zq^%ARo(D+%?~t0u$Po;Z`Ugo4F;f2^orBbWSo;n53`?zsrT)WGeMyr;s$o|7plZT}Jhmi~B05%p7 zea$Qu&jQjA>7Bl2=D;(>EyBGy8?UX2v5pzGlXw=xb(tI(^Ly@hb5(Gd`2PX2vV&Yi4{Mea(!o z=lGf#qFCZ1$^EUiz9DqNd_&X8eBP5{-O_zGlWB(C{@g{(Jh4 z8GjHzFd9N+K%8&+IwYKt`5KjKaa@M90I3qG7zyWUj{7y9iG;f|iO0E>C*X(Ch$GDr z@g80$xCKwnj=)y}ta5eTsr!t?B+EQd<~|bti=Ojo7|EZ|8rKPwbNvek#Ft{?Q~s62 zUnI}hpUZE?1T%$>hm&A<7{1@c<6Q|4N6Q{db zto(u;UEc^K{2M96Q&o~b=ATA=O+f@t0k5$jHmeoUNT26E+?V@te?)2xWQ|y#?}ayo z@K7Gcn(%9Y`w%%a0#Dx35Xp1|@i!vjThVMh`!|o_u{;j(Cev99PvGNl?tg*XxSc2Q zWbWW8h}@aV(-1p!JWrRNnIYrAX0i#0DEkwi!n1fbck&#>rpe`bxJoI&v$2;kyZ?+c z)+_LpVOaPt@ZlNo-C6LT$-D&dIZJsNBD|FI3i$GDTm#JI^Z0x`3(dj^XHzs(M3`N| zmtqc7u~yjORbGv#L^YTPD=-i0a9z;GSMpVejQUr;2J@l;^P-VA@n+t_TXE&m&O6{E zzd?M=`*|ndfQX|*cxL_u-Ve{?-S}R_DZH2WVZIC?4%kLS&HR{e#?0HoxAIf@X}C5! zou7fIAlnfab_YKTGwvKb_kDw(i%6g6;TqX&XeYlGQOtjf=kn9pXL#=WD8GT&5WkJz&hNle=?=ad zk!SBh?AhP(dl1*>UPPk3pAYdph}PMO=$-5MgZv@H)_EB5()M93*@ft%6?{M57dZk4 z>E@5(OBj#iyN;hC3NJ?--Y3}{MD}=!KaB{by)r8AbBLn-0=%w|zl7+Yr{EiIf99|7 zzwlT2Yy5Sr9dGcz;pzE2_A{V?T8|>1XtHfjTr9yXNtFuw{@4XE&Nx+ z((;JA&Q8O_Ykb3jZ5{I!hd@LG4i+Kwy$*J>2xr?6!5&}XV0-ZH&X;)SpoYH3f#}C^ zGWzj2L`b%=

rOcFZhZd5i!EuI1H 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 - - - - - diff --git a/packages/cursorless-org/public/logo.svg b/packages/cursorless-org/public/logo.svg deleted file mode 100644 index 1f19410e824..00000000000 --- a/packages/cursorless-org/public/logo.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/packages/cursorless-org/public/max-foxley-marrable.jpeg b/packages/cursorless-org/public/max-foxley-marrable.jpeg deleted file mode 100644 index e1f8c550c0c7ed98f77ba225cb27229588860ce5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151067 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 C3>KRJ diff --git a/packages/cursorless-org/public/fonts/Inconsolata-Light.ttf b/packages/cursorless-org/public/fonts/Inconsolata-Light.ttf deleted file mode 100644 index 36b47d6d6d5ed48ccea9fbd2dc392f6f2f45e028..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101832 zcmd442Yehw@-N=qvs&exgLhY2NtP{JUahjDvU60hWH=5u?hZKM3^s-%N0S9u?^``#SF-Vs_y7Fg|NSj@Pjz*5RdscB&rHv34daZl z2xKN^n_FH{SyNwA!kALb7%!Z=Y-!cszAyicv6}A~OS)-pRZZ!EKRMzU3we|=|7Vs~ zO>?f#wr7L(YjA0(sxGNMeC>hjQFfzT+|=djUEVxlJ!5g(84D6tz zf8E;K)^#X;*DA)cUtlcsk~UX=FYsY#KLtm>w$3fBPg^>J8M`u80))&vGl8Y`&xQ4NBXA2IFKhEVVv>N zQ5K3LQ=VeCvB|8T`7i;Er?IO*@t@Gsn1Vm5Up-pNn9u%E_ivy1>>-TzKeQ%{!b%UH z|MN@hLuY=^0+o-6;_X=Ta(UccRyyiF((AKF;?0nv{(}z8PnM!&p321Lw)O$A1H5b{ty5&0xO8TnMc0(muN4Tp!+BCq4%%w7C+G@AU&#N>|IN5qE~=2%3bYdSq8|BrfwsaW8j-h%7RHrcr5E{D zQsq*>*P;K4;#Q!W?6*=px+yosI+#1pI*{9J?av*t_T`RRPsqL1+M6?K?a3Ljc01=; zyPUULJDsD}joG8t4USQ3$Fxyv`?L{jTh=yfYu1RhC2Q2$47e$4j>sMR%P)Y>qm z*}6Wn*}5)s#JVnGo8t(!DzU77B*)@E$8)?|!YtJ6oVRp}$v z6%$9T%O{Rlm!%h4m!^$cm!wr&7pHEsE=nD>F2r$x{Z{LI`>1uEeZ)G~UTv*R8MRhe zZPxPSQEQp?R%@ws)LMdLv2DaU$2Mx6ZQEv@WvjN%w2WG3OlY=FpD=1InlNH5oKS5o zNE#_VV9ie&wdN&_Se@D1tQqOIS|_GAThkL0YfWF7d_$Wiv* zFEy_>pJKk&Y-aVLY$?3&TJ{wdh%CPvWt*t+!}xzC_^X143agkSmWorvwZa_6l;UC^ zzK>tvuFhPz&v$giLbw02)oy;4JFSZH;^nK{=Cjk{@ zBwjMsF)EpXQVBARvPwpi8voL<4lTfndJ0zl``N4P5c`=&L1Zbf=Usd|znI?)6a0<8 z%fAsmB1Pni4soJ*QHfVFm08MCr9(LpGyX3o#T0FtU~-tsOs%FN)3E7k(*vd#Ob1LO zKH)wYK68Akd|G{me9rN?#>egRw9gwphs_~oo7rjJj$!%U*Vi}RH`8~v?=s&e--~@; z_C4r(*w4o=-LKGZf!`XxUcb})uJzmN_l(~gexLaL>L2Q#?4RSm(SMu&UjJtTf&wN5 z^akt*cqHJJfcFBv3tSkuF7Qu*4+Q=-@S7kdC^{%3XnN4%py8lvg7yS`95fOf6l@93 z3tkr77JPE>rNOrcKN|dI@V6o6khqY{kl7*2LYhJbL(U4hD&($^Cqn)e@>OVH=!DSL z(4o-b(3?Y_41Fie8P*(jL)eeu)51%_tHN8uw}zh=eqH#z5eX4fA}S;5BKjkCMqD1T zJL1uZzeju;SsuA4vNduz^6JRDBcF_XE%KwNn5c}X=~0WK8lw86&WO4q>W-+#qh5`A zKkEBvzvzVMsnNyJRnfiCJEAX(zAgIc=mRkUF-b95F(oloF(<|BigCw074v$`M=>L@ zL9y0YXKZ z!kH7UnsC>IUo62Et0mjA(6ZJtVEL2f7RzIn*DN1dMyx?rt2G;oMvb-2y2E;nb&oCB zX0>(MHreh;u1#)F-kN-F@~&ie@>9vbrG%x}Q}R>hr>sudl5$SUH7R>io=SN=<*?mk zkF`&-&#*7HueWcppJTtq{;K^@YE8GT>oPIF<@WiPT=S*Bav1#JgiI+~ibK=tz-=6qI2FpmwD9Bilu_mKC zfx;5te&jBS-(vS zpJtzyKW)LZwbOd1?V0xEw0}+e@3fyBfewqq;V5;~INBUr9p^fBIoyt?9j`k+%2u*t zvL|KF$ga&kDSJ=$liB~u{xJI|XOh$9?04>TUg6yBe9ZZG=X=g?b9{2La*A_S|0?`X;roT36@FXzOOa9(ShTpP zqv)>bKGUa8ADaH!^zUY@oN?!jCuUBVxnbs~Gryhr>nzi(>9fjaEu2*~>zY~nX1y~z zV0P*39kcJ5eQ-|BoSk#7o%5GDpB4ufHxv&P4;Nol{8;gSOM*&jORg{3SMqAfdnKQg zjFbkJMwTX)+DmgvXO?a+eXcCHEU#>B*(qf=logn^K!o zTUooNwzu~5+DmKq)IPQHwz~7{*VJ#X|4aQp>OWr*Q{96wr1y=Th=_W=Jhp)*ZQtaU0boXW9=DhZ(RHE+Sk_p zckPjNk?S(n6|S4Nu3_EIbq}t4e%;6G{nsa~cdoBozh-^!`cv0mzy9I%|62cDLwLiK zhJ_8S4ci;8X?U#RorWVWo2%5d$~EA+(zVz1g6l2Uw~c;{6B?&B&T6b_Jf-oj#>X1p zZ5(Y1Yf5jL(^S>e)-=>~RnvV>a#r@Q%TM4F0ew zbW_}>kP;H&<+K*nGz3hc`d9`JY2#C~au! zP~On2p^Bl!LmP(rhPDpv7#beBdFa)lw}!slqHIaqQnqE`mTg@lc<{}5HsAEFBULsS8Oh|2#DQThELD&OCs3YGR!GnV!DpZuV$Dq_7A2`yJWLjoit0BhO(s^$#}o zvt9jzz5VQptu1{$>>}B(WSK|FJW}RqGEbGcUFIps1@6==vJ@?I)r-_V2T2TeFyL1q zG7pzI-D7ikzo@{g;&8u5%J0TsFJHo^D5v8-{wj77{+ihm@FSjnNVLlU{}*MV z+`tOlLHqCzM7W3$ks`_qAB4O8$>J<=HgJka6+>dHS8W(ty)U9gjEEI+!29sG_<#9V z{AWS_qD!nr-xlEBb_z?uToWt^cf*~~AY17|j=M-^QZ`CRt=j;&Pw9ZXUbR-tB@EGt zc?Q-;SVT4``b58%EYh8NX;RiOg*OSh$L6dDN!3PRgiQQ({stwYLmI+8bQA1CvjTG}ZfUWsIVSO|M1l3S7& zw**=Dvk;P&i(oIV=25!W=K}ZlvX=T-3t#e-<}sU5B5w^83Vgyxn1!$K6aFGV1d1R5 zJ7bsVEq(}{?Gjzk(8Ixuksi8$q1}tAw!tWgp6?DGwswsXT!EB;|hO+q@_ql@yOiiiah|Ly`iXuAHKrs@yEK zkvnlboyB2)<9f)sQMpOES-C~IRk;nacPn=&cPe)&cPo3a^RZXCN4ZydOnF@S3v^RG zDoOK#RB-!Hjvcls(F5{_*O16N7-%srkZ>>D;xV*UZ6sx5Cn|wY=L`O~O&oO!eU`}84EsT+p$8-*K*|V|GQy;cD6QAU;1tF3J$ylb4qBZ@dr2CNIxk2v z@uhtx?5UxJK#%5YG~|`3IPbi`9>#vyE$nKn>1VN%*#O(X8rUjUjXl9i(1fDRTl{VQ zAHJWzgM0M@{2+giA2L=dA)>H)Df}y}eX&?+B18=Ga1o7_;!FOM5F!ZB7yL)TMIfNh z`42Eg0HDwK_k2|N1NxMI$Bzg~+2Xs}<%MT7CnL-$K&&{0IIcG@FFAIapMPO0kjF z=>KgG;n?Y<^$)WbYv6p|M01#r@L%|^{5O6CeS^W#{}inJ69vu~STk@2z-XL^`LsEwPpfmSjtsCDSs^Qec^3nQy7GthRJmdMqbe zcH(aRV$0>0U6!A1fwnMPv@OAAv8CA3Z4O(GZMv=8)@$2hJJEKE?QGliwwr9X+HSYq zWxL0AzwKe$W66=pG07>(smbZdS;f0`mv%qe~;p(zn5(J8Sh2`QG8%#?X44Jj=t zm)eCr&OXteiTn3gQtfHm)6Pn}B<k>8%r^C&p#^W?q^VG5Q;> zrRZNUvtcGqXV>vucz|k;>-Zk*H$4w8`V?L?Svbbn<00|5cuu^DDP)E{!eI})k}mC$ z2YdKgf-F&%B#X_GYME@wvgBK)TS_g9EUPT*ES;7i%XZ88mW!l4uCw{V9uc-UTawKt z?cuZ)NqY=Pdu)e2ZnWJ3d)#5$3wu0ddvuIFE=c|m_VAJR2$%MVH|)`@*(1%c2TMCO z?d-Hm)1FIv5%wsO_Gp0+%D~cY}C%4JMyAl@*GDaM=Or}V>IeW z=aKV0SU{WECf3c`SSxd3e{;>~&tqzTxA1=OA-X1HhbHPI@BMhF_I>*yzxV$7-o^O) z`n|gMTHd>dvG*Q&kG!0{cQxgQ<{qj%lzs5N_v#K!qw>KWNR09t5) zC(-O-9M4>MI=@@Iiu)q@Pg$j`QPwF9O0&|cwBx+wR`FUb$~ZSYuDqbU>W$ZGUsPUF z{;9mFyshk4-c=4Nhm;SL50&ps!elZfm~5tW>|HvE7Drq;m_9arX*z78=R3#vXZnDU zrb8y2D@-4n36Sgkrm0i9z)agJ3h|WVV?1f`;XyotPr(zGTsj-^MSLlq zt*pZ8c?LfV&r~kPvy@x;J}3HuuE^CLULIrrnq zJd($93oqj{_$)q$2lGaL0&nK6{8Zj0diW{0m$;4Z=6CYv_?i3#+#Ual)%#OiEBwYR z+{{wog?1jutlXES^AI+Xhq9SGl}+JMtbkkD96pgv<)_KK3Zqlvns8?63R*_A-B%y~dwpZ}aEbf7tu{RrX*0Pxb--2Rn=R zv#0U2y9AFKn%M?k!z%bRb}>I0_jIEykqdSy-;V2$A8=Oth2`-HYzDWpDn6U7;uY*v z-pT&Nx3U}fdF&>B0ehU^!CvGKvb*?IIJ@7-PUGF|N<5Q0o%gVV{AFc8IRVesdX!Dd zpmGJyq+66eWwX++4B?!53C^n5;=FpfJo}!4v+n6Q`<{sN@lKqBPgb_GWbV&0co>_+ z!`W<}&Svp6mc?V(e4fLW@ItnT=d&7K%sTKGXd|y>-MpUl|gu|_Bwxx?Z`UCU z;h7WroE35#o6b{MF`vX7JPy}E2`q;vvRt0TvUxnK=jCiAFJ(Jv6FZkt{FPm zDSQLl&Ns4cyq%rR2iQ4$6FZl0X6NB8f?+<$p5S+}r}!TB4ByM1Z>GVwRXKio^^tQ%qOtmDR$IYmhZ~ zKDtt@#xv1XqDib3>qMit0MFUa73YhK#Kq!5agI1o{7GDnyY)-OWr|Cjghywm;tHx= z>=1)uKxx5R-KYeJ50qH(jS?n4Rl>z*O0f7y2@xMF{^CvXPw_tP`rp7Re@KbJbxo%D zT8UPsDU-yPN&=oRO&0%Bri-@}hxiW9oMtK+;vY(p__vZJzEyn14@#1FUHo0Kil4=M zN|g9fnV?KnCMq^DBEC@K#7~MvnW3bM*OWr>tCAwVR}#hB$`mD8{2~r3T)e9YaR7S` zFNk-AU1Vx>U*O_`(Qixww7{n)YBrs^N{E`KI!;))a7VtCXUBSWMdtl2KfIEDHwWG zAnD^;3ixubXQ?IW#ok0%{z zeo)`nBa!beK*~d+wUE|y@}CkU(pR?;+4nr8%}6IBoq$ARK=2tzTQvCp7Tqey*KHI4 znDjVadK&fjBGJ)}6sy5hCVNmK_z@&J7ruaGL!!C17>Vi#e>xKNo$N^Gk#mtwLn1p- zB0i*#ek2^NQx781JZnT+i}V~4;mGH(PT(%#JKW`b$1XuSfOHDde&u79?XzF5bqwX> zC7Rs+^{FTaj zqJEGpqNhal)K|K8qBWe(JxjE-9>*pml0!OBpGh9+G#!a#QC$*Js+RP6;?aUM7s-kg zs~xEvfkbq4q%~s(QVLSQagN8c;~%XX!A|W1kU{i-k2yBpc+!z{B6{jGB^m=t({P@E zPg27Dn*r-(Z`|*}lJ+{ZN78xeN8J4$g_pQFD&D(|H!OLEX*9%x#%7!hz3ko28`gC= z){%6OGKe?nLPxTXp0s+M#+wHty@;L?>7~P7{nv4NJ1Xn&|8(@Wvren`RWIvDiTC2| zEytUWw_V22knXxq&@mXv2Pp_C6p8vuHlg`ObtWX5Us*^MTB12ciRQsJBwAmFk>1x* zE{+qB=m>w4en<0@IWr4MAklh3^2n~qNTIX_VJ(`1bTLvT(xt%PgY*#6V@M=x zJJQ2QB%9K+NPj_k4~g~-PeXbWX&2G~Bs>?w?i^$7NZXL^MB0e79f@eDj_`PHhJ7E# z{)$9A9!J8yEOx@w`t3NLgtQrQXf1vdX&2G~q;rsH%_jXeBHgJSNmuBPoi4_9BE61u z1rlW8DHCIjNG_y7q#Kc1p~Hn}vlHnZq!*Fsd_w2Ll}KBVZbTyePedZU^|Tdm2NKn_ zAax=UeU!)8IgV-wC}v-Cdm1m9;h1Rm+zxU9x!5!Ugl^&8^I^h6VUf;d=uE%Isw=0aK^2 zy#av$1E)^mZgZL2S0dd@Gi`W_w=Q|%in@yO#N_1qM0>Kk*lkLypyX;EZqh62!2+$& z7AzK4*%vNfRcEUhZjh~jsUA~O>kEmatkWR3D66h>S7rh)Yt-^wSq7n6oHwp|zFuv& zx!JPe;pV+eNdueW#JyYsK4s_BqbK!tcVnhK*PCx@~7w*WH8XZDkF3H#!w{ zb^C10T`aM9U!$RvkVImm0=7^wGWX!wKG7%cD`xKPveqOKvfPATNSsRaP%-wuoAwD6 z7bfZUrjsDl2-M*DFYzyyHNcsG^HXu#Rq70l+7C5hRD(z6oWXR^LH!3SVIYeGe2V>w z{fmR}d=g_psC$5U7~9YOoZTD5gL&d!@I()Q-p9A^^)F6@w&0|q9>$icKPTLF0|(8C z%!?63svWQK^q^){-Mv9r1QTTrica9L*j!9d4_n&2O?-Hh{#AX@mdsfoiI?HMkoaG6CAcDu+>RYjP1ai`grbw7uMv zhTY@Yu$wu^9bj)MbqCr@jhZ=Zj#^`;8ee;J+FjTw!8RaHM1T6MJGa5@lQ!4Ay~%}sU`>MW0kHrGTU{f384N2MhINlaGgG=D$=!{y_hN}9 zl~+TwNFyt_w=c6b)Y}>wfW=86Inn0!!O_<0BIlxIcNyg4|1zxoIJkzZ(3a5zN_6|; z4AAOou_t432d-Y)RSqAdFMx;Cxmn`yuzlFgp<-Gkh`~PHZBCz02mJ5Nw7Xg`h$PSE zYLRU#p{}$J>6chxPp$`vNF%$G;jmgXQr0vKZ*;H4Z1YJAAC4Hd6%Aw6T8jnOl-^X^ zfYX94%vNcWL+yemlM&`qsUD0}LVwIy*&ZxNo36~gYkku^7$DQ!J(()8pX3V7R@Awd zkx=^YEB^yHA=52l3sFe}#8+Vbz^Z_OBIEg_&4+o5;d+VG+U6EGmB~dzZ9kuyCTbY1 z88C9)rL!i^E2;{Cs=lgFGx2u^$^ZUoZof1PwA%z7)M{Vqj?PoUP+DyRm7uQL0l*MN z=Q;W>JJO&POldGX_{mcvb$~{`*o9f|vM25vePS8b$Oe=e?Dh2|9{=HX)IzczRvDAI zz}fGZrqCp*!UNOXfuN!;s0cL=NOR*qIt87nPBk1v044P$IhysL6_sE)X*X#)YM`W@ zNdtjNs?EEWM0b0AX0yu7tRCjuu%cq+Zdxv{HdbRc*pq#+j==(0&}{CiOq@hy-_DdR z(&6H?gpgPAN;|8B4`~1%rn;GZ9-c1R@dBTl+vm9jiUwrAM=PGKzF6(C z2HV4egRsyKH#Ib?Cu&%k6(-K4OC{I?1C9R}+fB4IRoD3>nrLQWM!7euLyBnyyAXj< zzZokbSxdE~AJq*Tm1IcSn5>PdDf3O4e&Ba>t6{%CCJe41N7L;u6`|EA-H#OeeNlLk zfd*&+3BW<9-B>_f@qwW+r-z4|T)4to8$vTQC_Nnb2=u84T`SW12HTv3elH{G&;cEm z#p*ihejuDcI!_=f!eGZIRo4zgWf(gCBo;JH?|q}AWI&BtH682=e$vmiYB@288MWJ- zSr4d^QUjP%+&5h#fJcU*o70Df1MTW5#ZJrrL%8c;^5T-!V|5;jaBsuV4-fkVAG^kH zJbkciK$9P%9Bdqki#8ns%G`lvbp3(>bo_kFBoT1|ejrXJL#mH^nNIqg8#ALPvtGUA z+D5*yLr$q3nKoMouCvNGuC{QZ1Z=}<0BXNa4ofhu8wgB zU=Oq5J&2j=ZINB|xGJ0jOlfs96N~C`U$JlWlO$TNU>bpwJW}Cy(4y4Y`{kmoymG1@B{R#}rF0$5&G>|I4oKV>lbz zRYgqcn(W~e$+n7of!NW7*Gl|zzf8J7xOObRjFtNX;@y%=ut2Yg@1OB&2sN(g=r zE%A6?I^=2%R#;(3vj&^IXna^g$N~+IcWXj2G}w>j2Orj8e>N{z=NZV(4^GnXLF}TS zVGR!Ew!jS<9Kvz~^EEh(#RS?kIGhCpYC7YFEGRHQ#UrjjKp@j#!JGlFXt2UE0&dY@ z6PpsSRfB!l68XV6ozB4sAfjNBXO?2vGB1<>RH=+S2 zvB~B~HT(pYVZKCzEo_RpU4yMG)m*N@HkM`9$08ZO`uJMIr?4pOsj2+!UgMSO@g=<5 z6Xf%%Mw8CMeDuCdWPU#TG<*h&@X^O^5)1Ir`#70p`E+YEnJm>uxBnED;iHe^RF-b~ zRinvblTH8B;At$yFCXgghlb6Ao|AJbfBQ;ul(JZ4c2YH&VF z!JGVQe+yWGqWei9OT~LlD!zy%Da{%@ojH_T4W7Z$75UCO>_3xD79VK%Su8{7V=|mrNQNFGTtat^{K$Kj9v|{#Pi;A z4W5hV6E+Q=hu=JC^A~Tfr!##nEbtn~gpc1%uWr01HoQgJ2|b#yZ|mW3G?hnkDfH}wcE_XsBQ$!y{|N13X^#%< zQ+FL#?h4Sgfr@(6cU;Ov7?n17;J|UIJiYeNdvHfv$z#joQF-e0zI!mo;;GvEcr@c} zc|2NgTON;YtSyg6`NwSI;V_ood%k#kBhino^KkIC+gO_4uQ`^D#yeY!tl4Np%!)E*0Y zYIWW9qb^l1du#4#<>9H*AH8~dd*$({JY02|$D{ruGz1^|;a_q4=7Udta zji=Wh`eSkPjM=ejJzVs@9*gRDb$XwVN8@dyWAPtrn`2QNzmJ|?c<4O1WAXD?<@j`- zTD^ZB%(3~7KWiL|YP`*k&(qs_$EO@?$K%ufQA>Hacv^U_L5|fsk8O`n=i#i|_W1OF zjB31XkI&QFw#TO&Yun?~{!vSLEZ}Le5?4sgxISuUD{)n&UoCm+=i_R%NnW$|%PT?` zXkGG(Y5?c$>G)mGG+f6v;X14Xw@a1yg=;lhb)e3M5?uoi z0ICAi3TU&ul4}7*rRc=53Hs>Q$TnQ#sSoAK~tQXd3m7_%0(F2gu zkDNx3M!aiWFLVk2r!*o>$SX*G8{i(~Bum$31^U!0ExyRhCN#2TUVWx=sk8v`Qb)Q9 zJ?oOarSc!=GuKOtW6y)B@N0d}jQ6h`XzsvYHuFFfL9!kiRInNF-DAxxZ;oTvfMe6! zyfmQIu~*tc*U5(8O_L7!unNsTnl-=2XBn*4gI}b#VDxEjmSE12htn*kS({<_L%%lf z+t7ES7{sj5M`;>bdpvLeFwMbH@4A_|+K4J5)jVed2fcrPs%Zps}C5!CqxAvS*@)VrJuAt$pksyxDaN zyABacE@9`#Z;jm-zl)uP{SJy>vI%|NfYo#ze(AU(zMCzIZ-k^HN-XkU6brZuh4lJG zNdwHpD>6qsR&G|H0UK3TNgA7^q39C7D2c$ND3g%~i~j=iz2x?@H~{!(@f-5b75p|H zKYl-*=*1xNZ^X60aB;uHQ{+r0)*wGe6e5qM*s(lLxIlS;DA}l3i~LvQX^bWOiiF?2 zCgAt4GJT5U2T1QC;f=S1eO?NDm_s{yrqUZ6?zYj(tdYJ1hZjn;A*3Cwe`t z0!+Lqk!->f9kr{LM~pLmId~Q}gS=yv>LX1aREIx`?8VnrzuGONa8iZe2YtTFcBAnW`)WFR&pnL;z z7|>)LlKQD_Q*~Ud#em`rC_;z4dK9GNVqqmsD;PnAR5}z{%m~tV68h4BJ~kk#J!I6X z(0-%#4Fkg5j6EHt7h|3=Ai}{DfCCisxPIX>*}$zcpgIFuVL*!vsM3HuJu235Ue=wCe&kB~ zWf@S00i_ra(IrW`7y}okLpr~h7so;|0ibv>mOM<_Ue>A>HxVxS2xHMd8PH(^`rLp% zG@ye9^tJ)Lrb98ruT}DUMaM`V44^0nIZY!nMj4r3P-M0p%Nz!+<91Q1pNSb?cDSK;@UJ<6F59DPRgLCv6y+w4b0WH%ZIUWnh&T<4bJL?ud z{s_i8bUN8qj(%*MH%=YF=yHtqY?2XOXh2Q_nqold21G4vvPHreT$IFxjKTRCI0<>I zq4y|Sc%W#_6IEQyRp2CRrMIhe=!aHIJ`P;eud$~`{eXTA8Bm`AEioX60ZrB+*|t@- zP1SL+79EQEI_lG?52D^h$ecF~h;aXuxR(sva|ZN;4#mdlT)dzN9Tz>ILtfek>9|;? zL(yw=NVgDlc^K(FvT4-a26USN-C#gh>yW1{K~a}cTk;$Y!aAuzIK!$C&3zS;EiRBP zQgs}iYqb^;21NQu&QiZ&Y9aMgA^2^S3Y}~~)DLI@&%T6wGO7>dP6NUyYq$mjB3!Ga z^Wat)wbcfM9%*go84%&rwxtGcrUB&}keoA82CSiSk@~4^VFQgbY@k7MM#&bihF1%< zM?pF+%4|UBvo{@zEOJDj@sZ!5^rggoY(R$$h-&v6wJP+6QTwV6#a|NnBCX1i&y0g$ zLlsAJ9}s3(%y*Fl?=zr#4Cqb+BHSTKcZ-3$&VYc6yh_$$EH!@T8_-z>w8MZ-GN4U5 zM7n5PdUagn1_Np~pmhdRXFw}-$g4+-bX;U5I2T7wN1lt6CGF>dG7Mab0VNqwi~)ri zPyme}N~Xv$5M6mhnj(&jsU?e>B7P!V#9`gr$3jt{QEQ{fPbFQH^u)1r5ufX|9)1#P zCAui-of5L>bWzefB`!k8dA0q}z#YWr72YPhM7(A|uNcq^L?>$jsn-V)PZ_vJBOajI z2sfgO>yQTrh+3eQaOkNDk^e=w)wxfc)mbKG+=QB461u{Gh=Yow+H+;?8DntUjka4Q zG@#eUUlP#`o3=-|qdEm~B9X2ISP&@rWq~ zlx{#a143;?f*g-1Z=AaFM}&CeBK#zsho1UqY1S`BE40XYn4vJT0%@5;8RIxfnhL*Z|R|17XP(-5+d1)V{iJNTT zQgz7FHv9(k$#gKvPGazW7(b1^L79MFH{USa*T9;$3 z44(V*@CNW(MRL7x)!|FR=K){px%LU4i8W>&(Gf0s0YP-F5}r>`xLj=|1iPsJ!eJNB zzi^9$Ia@AX!k)>0qxy#ju9UQ8q9jqgi^Yg__KIhI37Yh z)B=l*03ZjusBq#-cWcaxOpFC`{Pi6*JJza}vh+(uw&j>w{9lM#F&i6d$m!R-X| zx1{yvskQiO6zB7#ZAT=}5b-@Q~?O-Bqz>`%2Rq7BTdxywZz?&4rVCFbKAQviLj?p)?Ta3No z-;iG|-bQYcyU0f*C4CnQd%z0qH2+tbkNhRMyZkP3z~1nGLH`ulhrKK5FI4H}oXwJU zdro4$qq)F-lyVihGyS9V!)r()@MJ?p*@oOl>ZvH?u|86hA0=lW$!D$9`Fq6r#g46V z1@aNRQOVgy%3cYdBJo>femOW;r4A<|);8#++!5l>M&u6f3zGjvsoQ;Wyk3x+ACh)h zASHgK_=El{+F!@cI$2=9w7?gV+ZRedFki@B_W#J8_%mgXzEUEom9&pb>im`DHX?VK zBZw!~9~zecX@}iXVub8_1hu88n8+ifK1|yG3+f|h3i^ngI54^EZPCgn0Imr0#(l6GU7&g5hJRl7-B?Uz~wN&Rn; zn#V~#A(BssBL?}}5ZB_-K^L~62I+J6MOV0K{R0nxY0;_(z99dX?0 zTV-}U5nRt^;>lDKqAk-??$tQgY-A0LzE$Ru-zqy_eyi+Hc)s%?ek1=e9!k9_zg6~) z{8rg7^sO=;#qq5&9z)+M<1^`7Wr#+JZpN#82t8|YhQd?UxV$`GRx-zwt+ z^sO>}yTG@~_-^`E8NZ9ZRfd?T_*NO;BV3}9yXjkH{2m40D&zOkSIYQ(`1z0M zZkDU-6{^ojOp45dW$q{Ozo_3X{JHW>{ki-iT&SGm zpGnM!ltthC!*ej13z_5FfM`1+X?~U%ABh>2`7g-TXH6H$XHC0Vy!<{~DzNh3Xd#}b zlJs%^@C8K%pZhBp@EH^LL0^3lxzUgN^8g-*D6GMVl@o$UnxQ<5hw}(TkBMY=BPwVV zp17qWO6e$T=F#x1ST>P;!sB>6Pr$qS8LWjT@d-Hdzrd~B#*=vpxARoQYe?hihzmNA zXGp)ylrdhj*d#=Y{fSTG4xY`Oh@+Xwb9o-FQ3~)(>?O?YmvO#&1)eej`~DpsJPV#X z2i`N4mmvN|DKA4bjdETAPo9g|*7NxSz7Wqq9q_Ykigb$TvCH^!%z!G^3Ol^YtJyzz z4Q9bg%z}Dc6}0iyd<|cV*qZAwD;h8>8hI1qw6^e8T(`9I4tU6gh<&+-cjBvL-FSOE z2T?V15pSo5_hPp6@qWyfLBx#Pgov0Q@FDgK-@>=@6ZuKFCOes*g2+AF5%YBiKMnJ3 zC!Y7d#?Qc&*qOM3ISWxe&*sDY9DXi84>Ryjn1L5!4qnVJ!8PS&hy+@M*gRM8D-ogm z&v^PilYNHgy^ru~_%6)S>kz^F2E+`x5m$XT;ah39;AwORzZFqsZ|A%D9sEwj+qer+ zX7_M6--}3`orui2f#1jPN8FqT5u0=$R+8%wS+s&bjCVnfz(IQWBlyb2WB6v{r--o2 z5o7lWHV<)OpX5*Rrx6>LBJMti2-z>d=lc1Ji0pX+e~G`$U*Uh}ukwHJe`4i$jlYiP z<_p-*xH9=SqS+%hJc21`(c$sj|KEs)dH|844kB6z#fg6(v1Tb&`-g}_{xKpweZoIQ z%%acu=ZK*71tP?M#kI)n?0p%tXt^Gr9be%@EOoqzy8^L4eq|?m$5dx0;h{CY&%m~h z`$9u7qWy-7F!~k;yIw@HZHP{fFKn>AcrWKmylqfJ-`YTA;{+MmcmkpyTUjkaLL}pE zAO%mG?TCJyhIq&m+1YF*A{SGPc#4TURb=65?#W^r+b$gJRFTb25l$K3G!GF@3q&Cz zoKBZ9PAS^y98runDprXSQ7RDk9V`19T;o@;hY@Rju9$}ysSCtHwpJ`+A0e*s60sEP z{4TLfEJw6g{X07J#ghbl@gfOPkE;;%xJE`yt-~t43UO1{$e5|?MFXwWh@jexwYpWb zAv$V@*noKUorsj$EqX++IDx+LAqEgLb(7ePILccPi}^(MDBdRcp8bHRs@ufLh^)FD zu~m17(^xnn@lL?ETJFFqd?U_OH?XJKnJgGrjb{9UVvg7;&Or3pAQ|_Wz7QHF&cxa2 zUW%VDhH*xFhCR#f!`J>EU=Om}*>1d@@E1g;4L~&4a}m$=d_;7;KwQWa8RJz(c4eoF z%h_Yh7m-S@#5)W>A~OA-#ns{(u}fSlt`pab8*r_}FRZD(ao=Dx67g7I(2L5Fz(Daktnb++we| zN8Bs!6Zhj=Fb|4-TD;Up5iRv`M8tnWJSm<+wAN?Dvxo-&JfgS$713G$hUly>BZ}+a z#jD~Uh%5Uq@fu>oz9IgND6?;gw-LQ{Kcc+8i+HaG#e3qAcwc;gNUa~Thr~zXW5jFy zRD6cGtzU>Q5wZ1a@r^hvz7^kz@5K+|NAVNl%Z?ys?5~LTdPGKi#jPYFzM2sE)vWj` zeu}>mfcURLO0W`w7_ec8O^@p}B?_@@W0Y7W4zX(!5UoB5@o6oJRk10_N{V7fH2*Xu z9r0>2lu62Dd{J=aNL@8Cu zlyap)sZ{1F^OX6@0%f7HNLj2b!B-iVDa#RWyGp56YLr@KC1P>cBYOI3#7|#~2y~+tnAFh7<@rKG7>>M`C&Sj?|Lh}Hw zhCXIHltK0sqBn0w#O5t{zvAdGC7h0E&1WcQDrezc8U3rU=hJs#l?#=NyuPA9(Vx}t zC|slLLfq%;e((Du?0mdYQ^w9?2M{~yJw&g5hrNX>jd$6>abG6659i$nln0f4`j;8> zZVl^2!2Au9aK$}8rQ#=e$KExv=@9oZEn73#4xUpqRq zqfc%jSf-UV`jSGeTtY{O)1kF5(T|c3@J`>7E>}}uPq%MLPg_rS%f^6`zK-rT zSJU7?i*HGVdXy?T3IofUI{KOhyIMP2h62i(dj?!hO)cF6=JF;N7~s&?;~G%qIy8M8 z73K=rEpvq=Qfsrd+ET5TWt!Gyns#McFUw@_pk;1Ag&|I5QL1&YRPSKEZ-v$oscp8# zGCS9|LhYE=PKtJ9mlm4mN{s^NdOAfUj%=qhVD30+PKRk;qpMG4;VcQ9H?~c7g)`SY z-xxk9tZC=eJ1Dixt|*gu)R*|q*R-9lYGQqPH;dE+)lcSHTHtuB=K1<_KKr>AwHU=8l%Wmi~@@^UAh9*QS=hdQYX= zu237^%3O23BvH|on)P!uQ&kq4S4s8(tHw>rBBxT5)nRrS#=w|Ys!U1?v}3k*%+ZdT zub1e@aur{q(U%ly1r|D!{JotZFYsDD6q+6 zf`BHYGv;Pv&_Sgs(gfcNpV|4rtmsEB!mN=p%&qz@*xbGO0gSR8qm#SqIMWg z>Tu>11a25B3u|UU(8jjDmX_{LS9fzqletrlnz_?3I7rG&o#=upGDn)mk*$ivvZ|?& zn`7=)n|6CO&6R$fU12P*1xkyttQMJjj9y|{)rPNJ>utF6=1);dqh!m?T#*mKmfs&USh zoS|R2xlc7npO-=Mv|eOuTIXrKDA11Cx+INDZn?SNm`B+a`I<5E3j+JcjifVMGhDvL zI$vXzUt}7fWp%(y4YdyIre>ZZ&EfO4PUKgb2aT}-nI^VEKNk25dTd;w39i%xSLim^ zm{n8;A1nk$J0RAFy@YTrJ8`2D3VdnbT1qnK`qax&HJ~&n(JRh`#-) z(iF;53@&}7EpXKFQWDDY1cjrtB#v@|;3zf1QJ$)BEK)hsmrDI`MVcjnfz3S<2pDL` zl$D@=YtLYx26b%G==wW`RJwj#OLwbaOGjJ#fJ)fip)pit&=*am3<;170yG%}sxnlF zWJo%aA?Z{Z5>#bKLMekF&34i*_z<_cQaMVcT~OBSQlQzTK(kAMW|soZE(Mxh3W|c{ zSQI+4$mk(*AjmdeMUpCuDrtdAYP6#!UhO4a!6yv%474;ic2a|!Fj?xy z1}W6UXL}|1;$zQ!P?lCp{7n(*ZP(d23?(MF7YaBhh`#NPD|6Mm)+1p zb4B&^ftw#}uB=c=O7nu7dO8uq6`nQV>f2&!?&)qbRSasq)kX&w=;fx)jy{*xNaJ5B zubNPqZ|-gBM|-VW^LX{#h*OaqX^<5K=_cxO4XEbO)+#40EG?ZaU9hRjq@dKVrK@*f z3)o6Two~;3r$Zjmhr9rqy)!egLUWY@mA{Eow(yG(stC+@~fp!%d>}}SlD^%NOt5=xLY;`HbQB}KC zRohuwq`GyfHddvMyx`_;Ia}HraYo-5(%g-)?Zbe}Vq|l-oZ%`(zr+PLcelGbTO}OP z+}(b+MvjLO~$Mib&F6@v+D zu#BS8cr{~;hGP_!{EkvJM2?ifFiaM`)PmKB9XK`jxw;2Jo4X~2UJe=T^{!4-i)x#3 zq|tia7zSF4!Cr|SD=bNEVbqOj7^4_Z<6yS%c3AgnO(n4Z3^jYG|9fsBDdu&j}iQ3^oGiwZ8`X`*&f zYoc{QYqF`Ok9dWkHGx_qy{JhF)oOKF7$8kre|H;Nt7Rfq%VDx!QmY8~Z+nYt(-vYc z?SV!*j+*JXXpN3=P?{_UN=ymaS~Ap;G2TcIt zK&9&j&kzmNsP!TVA&FY8l!0=PENirCL8FY3HB|8Q4-KLunkIsmN@J0lPQj8=7o?I5 z^!0joWh`<`Uj}=PzNj|zDry>rO99%LH&fr$-g!J*?U2SdOp;SU>#heeh9ObtS|?D= zu{|t~sytoP+yF|9tMK@wWaeo>a-?bXHXb``5|6I%IGAMSX(79%`KheZC{uX zWeZnd6Vz25BEo~wJ8cj_^>IWV(?-g6<2=(FM;aLtn>$=>*huZ~2PR&n0!HPpEtKPG zbj4K#)YVgtafsSnUkdf2rfH~FtM?^HmUaJ@1&uPsD0qehIz&nIc>f-Q)Or>yk-8wY z-FW|&Bsx-Sr}jnqw`yr^sJwdT@p#F=7zed?ocv8u62TD zW@!SV@_1{UtTHOR{CjMLr-jPQXhCwM2C%BiOqNKBmw!uUMunGukFAj1(*0XjX{0JU zT@Fsva7pUFdcsl5M5C6&WW8*!B5)>`3PU6BbCQPj#_5z}1x9+Qp(_!i;iMRk-J-nF zIxStO(CJN;FI9oLz*S;NzK+u=$J$S)B&<#e`LeYpUq?f}2dyJvAQ*z=s3#n?EM>?u z6by!Xm6Jq-(@2c5v5uies!<~}8gDxr131Q}29_F2?a=!e11lNm=x9RA!Wgp{*fAzB zu#$z|TdC@p{^}S{kEQZs`z)`;@^gy(`@1?o=xS;S>ge8N6ny%7aaCt(>KttJfuz0x zUo3aH6>FC53e+tiXMwt>jiY++P@rx~qFiY1>gdLkDRX~Ilin&@Yn7dy@88ltfL%b` zV@iIxPW2W$r?Awgy=Sn$MPji_ERQ)(^$sRS-A;4nXg6FrPE~4-x_R%+DU%!3m6es{ zFDlON?Ae5oG5Dxkc{%EqpCdKOLOF?yPi18VZt$=HZ7=QSxv6~7OhYq3n4}q)uPc) zZ_-llg44TD=3U75E|kbZh+zen5{rXPW`Vcue3iZcvtJ*}d?quzXj)Eq zkt4gsUXY_G_Q;$_JMTFhu)kwZ_I|(pInPeymfwC5TYozP(KaM6#m}5hZ@D2Z#f@Ju z7WjY&^yNIEmSyHrL=KfE$e_6uT7V`LG-+dLHmfv)tRF| zL3@qY%&}Ba1{Hq$5m__o;O73(#?2<;Kx35Va-&E5k%|#?Yw4Dj3ME6NYLiAG&HR^)^Cs`cSV>886{58U>xOERD7;9SDs6(b zZWd~u$NR#Fjg9wPClrSSCMVkfLX{X*5vYNcF9IuHe|V15BBGGWZnx)2FgHus?XzypUz8o2;IJoUr$#3h)Xv(vp)W z`S*o~goVWh;+?EaCoH6z3HGT-$r5?Fvy~iYOsuc(#QgM$>FK^HA<)+%NVkGmv)Rrk z8?djz?Nr^cXlPo!tLQ^L!n-!3@WT*MccgWrdN7 z**7R8&BASE?ep+IJt{3B)=7RMwUhRppxPIUec%IpGA64{_c@h@R%4as77Pk#rh;aI zhh{eQ(x5pHq2)nSgt$%tV`y|)@JZ0nh(aP(6HzKfdRnOKn<|^uH&yn{s%+9P(Zd%O zR(uSa>m!Xmlt>zQZ1L!*^pQ}Uv%(%sfNO;5uHndD38#pOiG^Q;D4IXyl0OumnLj@_ zDmp$;Smrd(Uo?MtGlAy9%5eCb^hOfw@kA+^=E$17ywj$XOtS?9Mh2ypt(`u% zqI9iu%F5E^Jv~^0Ch@Qs`=rQ-!Uc{61Is2&E*V;0byE39lQ5>Tuk!4PU*f^Sw;UpS z2n*&+if%JaSF@QSJ;^p($v&{5+D2PBlkwX8zR}m^vLdO5#!y{=*Wt0gCP}JYk_sMQ z2B~{QFWy;=FAnnY^TVedu_)-~rkP0dFgaTO;aJ8yk37YFkNnJMh~CUkY5GH!O+Gdi2^kro3V^32c3Zp4i| zGefe&Yxw_*wD*9stf=zGZ{3%3&N=7&x?kro-80h@7-pCV0|EkTU=_Ae2AM&SAd*p3 z#5_cm6=Xp{6hQ?<1;gf5*EQfSM$}bS(Ruy*o~rw9ze(u-^Jkb2Z_cecb?Vf~r!F{^ zo)DZV#wE@abKfP#CHxZVxDb|MuFD0?V>&US2TMGNS6!f$FYO7#xQVs)iI&(*N`q3&`&61 z2QcTA1Qa9+(QK_s zU!s_Nz6v9__AnZ$TtfO@jC4C1N|cd=4pCu9-wWKYf;J(2&xnjdil|Ve?*-J=D}AoX zIacdbtcd?Lr0)e3)p3(mz@g4P9O`xfB^5LritFhAMGZCWi4$wxE~w0(8s@vBpSvBl z$16Su`(l_@A2D+(;F^Y2>w6F;LkUS|#6n-}%+At))#B8bSh!n|FP;x4fB>8U$yP;HkO@{dNQKd z8EiIB*y_y9?44PB{f2_x>apBY`9(4XPUN_9iA8$`S%pSCaM%cZqSAoFj)b{ez;pql z>P`VeGDnPamw;&jCZvwj|0U5yg}FXXQlCvXNfP~Rpc}+UbY8_s2XVs{FrtxW)scw8 z{A3V}0X!cRCxf8Q;ZWFz9{%lf+@6E}FnBzY%V&iCfD)~=D{Vpl?O-Uq-selfdZHg( z8CS}c>9tHc4GT5#wcUTAEuUx5+FUjk|20GIZoBMO)K;cY!x-586JWb;-7xklhE%yb3|RK`=5 zOgd%I8f+GaE4yWuU05phubbL25+K`@=KCJ!AnJQX)MP8iI|kJ(I0!g(R}Qh~e8;9Ae;f^SzMgY#=b_2wOa+XF4u#0kcDXto#P(}3s~mZJPT}+u%_d4uB(jBxylMtyY?OC8S3!FGU0hi+R`7-%@A)O{oV(?`=J!a^(O}G@cvv=!K%3wD# zz1HeLAHTiWUAuFnb9$EfrWH(I+$1sG{ zs8qoX?es8_~Nv>0#FB4Ya2~Zb2A+Wk0*Dru40?=s#o*3Z13MHp; zu?nDEK>3js-#`OwhI|@N)VaV6 z&VLEjX7)M)e#9*T@_A;b;n06p?sLSvHNC}ZH*578Pi{QRt}XSqbv8Bv@{a-zmp|Zi z1Zd?e7ag`H;WaWVr_YDPnc@BVoYVa9c5KX}wP__NEw8c|ets`-8Af{Kt7Fd$E?AKr zp8;OvN#o-axc7uTWUy$yiY{l#UG|`T8Rny>|H}!Dt~U4IWX?(*eEAZrLo3M$wD%dc zu*KwM!@x6D=ID4l(2Fj#^SL^iJMT%=-x;`0KCk~(Hg@P{)`yp>?`yEC4t5HoVb|Zl zc~RLZ4+3k0s5IupCbP$Ie(YqCT4iRj8<#cMByP$eGDb&`sWuFAWv1#ZT8BW&^}pM| ztTO8h<3)BH`VD5~WdU=yup-=$QL6tx1)c?7DvZLj5yVx7 zcvj3t8c~dNkjDa<10$&#aSC)89!a5tkB_9(Mw8o_&bwLvg+`r)(7*Jv$F9E*{vq=K!KO5}%Rp_C-UxEhmjbu?qo1 zyDeZSOM+-m7BJO;<`*yy6-L;Ve4OYIjFNW{;|%f+1q^f@+O_eG!wOp|hh6_B*U5l} zjfGt&&5WNZ?@;ByGJ@xz@qh6X&ST304~kWYIR<$Ln&aMM%mI4yScQNdPXHHq(V7aNpE?dSS)2qtoOhsw)`=+GmJ}G1#VJM|xyoVua%0|15`td2kmoqTqR6fM2Vm~OPaY`) zo7Jw7T*$Q#s0PLE0t;v;0P+g*Zfk;F82|clgkHfRKkhvAs^f}2u`j@g z^V7SB`6-K_*b)3oQk&?Fc$LUi5&4eT-#Y{h&L&_KT7Q6_u`vLDeixUQ{Fz}|A3Wlz zkAh!5z)!S>9{cyh9vhMu_bAU5G!L!3#P{~fl|Qj@b-q7|2mg+!kNIE%+E)I^ekflA zJG&y)=7PSUaoK5;m#vwM%j=a)n&nV5DwK_DoTu@T(HbZo${BIR6M)IRnqJfEp@VuZ zQb8i}c5iO7=+CX|1lq3e-T$8VeDXW)x-VWgSsUqKG3JbP4fzu{xU7K&l=U;!qsrzRL)3u=V7huuY5W9g*V@I+tNCpi#S|Y*0El#cm;qYZ#FxV7T zm|6RU`ICyi+S}{77P~ z77o`ZQn~3$pt|{L*&Oc_bQ`WY`?O0oByuObWyjj{PHGtvIhU?^Z))MJH7CAtA(2~q z*36#Eun975{*V~myXHU~3%;4z>9pIW5NM>NU&U?=vYx^$F?cc>u_fF%$*j3=X;&dV zRe0~nyRW@!X)!w8xk^5-v}H86wrTADfW>HA)^!WxNpL=&kDtg7^V6nOgoHs#HL4+C z$Qlta!uFJ7fKhGFHLyK_w+bU{PdSg1J!E@|kw`<+NW&VMCR~jPt$`&nJer~nlYBH` zf2z2X{1&6B@|y-z<0xxjD-MsPCSiZ5r7PRU z($j4>Lc)4WU_2kGCS4|fZmdwANIT0r=gq}J*`U=sEdH=3T@SnCk#NKj7@f`3*B0FA zU>boHyVd7ru6QBfj>jTVrz=~kM{3(TpbTFP-&O1tWau4#;6C+yVko;SVD^K0w4Zr` z0pvmRg(T7BwE%r+7gL`Q5>z}xoFK-%o5HN0VT%A(>xTpk$!0MwV6f8%5vTYtA9)GD z-`lnN%wXghqQ5%w4KMJKw?b;Dxn?mkS-fKQyTt5-V{o8{XSffvI?nZgfk%GA9PPFm z*A^p@4+#yw}v6qg<(YTyD1%%(3MJCTX-A;*@uIPFab;Q2s$2?~xvNK_LI(L{S=s z#4=m8nV~s{_u~ycb+Bg%xEzqrnTctoVIkF}*xhZq6Y3b~4q&aJLx^hOV z-kl#W~cLU7bhlxJ?BMRnP5V1}QE9+ce1^&9#ggo-#Nof{~MqP;rZit5| zlf(yjfUOZ@uyl#y*nAwGDS43dH_;w^Xn|*^+7Sule}NzNSis!ya}GmS5+bK0xGn*1 z8HQ0jW-pfwBJxMGkzX`4l8{EY@{M>(l|~83nPDi!CxwC=mNQeZs6P++9)!1P51N)e zgX{zsFe4&r5O8@ZrH0?Q-~6Xno!O*#;o_#v>+1Dg)0TbbviDI0p?~wvSD(I@y|;hv ziRZM)zT%_vbN{F~_q@K3g|tJ`T)@y77BIrMWHI+pd|$xONfR)_x8&of@qGb9vYcR6 zWx343R%N+>BX3KLCA=*G#ocgjV^PEbbWx!c8Yhq;A9$O`SfB7BSO~bQ+DgnvUWCAF z;Qz2Bpwt-rDE8rhYQ~(So=PDnN z|08HF{2$O9Kz?F=h34QzUg;(%HPD}&3ab7T^rSq5fExHe97@eY2&j(=C~4LI`6zbn z{bXHh$Jc{E>!0~{QRS0>Bi})+ zTZ#A(Zy!M$(ocYa-aEo~kXrzLVi!LT{253Jh>Xn2pV>b{+UZH!X(V~I{D*9@-5Lro zYJUA(=M#4|zN(eqbm$kd=gm_DFvd`|+W7vTya9w7+~*&X-_FaPJ-e$7P#s*lH6n zbcO}YT|&nZjCzIz44q8@^HEfIQPlD;BXc^KK2<%qKDG}qje){F!-M4if#O<7~?|+Sr_TSt86X?Xp;B@+T zK_?*(O(>yO<%NJDItds>))9RAS2q-18Y8uWp=D98*IVWJQ z^>DdEvECtFawOi0oTHJBz?-B6jkFpq;dwn(&WVxe^a?2T^b+do=@n3PZUk1!xv^nB zac;056gPef`vG@k4sYVqBj}AtJ86AV-1N8E+Q(8**(?PgwSzqV6r1Zm%ihp`k|kYs zy`jG^EvGB#L*Lix%~TD>N94QnBe6SzizyPVu2R5|wh}OR3obr9?oF6+8%)3)6m^P6 zMYMsvI?lB)At3L4JYuXyv`GTPk9=kAj9~V#cK*?hJr$!)o>^EsQ!Z`k9Y;AcX&Pfc z$i9h6h{Bw=WnQ)#jW(A{%2o`^ok&EosC0x01j7%^4UdDD*}$?31P0!xs6UeT>8s$yA`bbLKavh6-UDc8lXLQ=|%}Ib_Zy zBIiGbTxxM3rv=Q_D$Lvdz$L{LU{rm=VKg}v=F@;7k7NB5V`uMTDy*>3rg2^#l$8-7 ztzj2nZW@>B=a%@uY=)nnp_ufMbA0A6%z>TJjH(zttUzx8M&};`BZ3a8(2t;^fbic0 z=notlTE0hxz7!P!&~8LEHIh%*{zyaGT2S`0FN+ap#~8b4*DCBVMU)X$iqN=3kwrf6 z@hH+!=Xi8zjvJ0K$L~>57*U}=w<0iF2aG@w75f23M3IIH{dt9c3xIz1*w90K^mf?g zq;ph8;=6nFtp&;*yDQsfuh=GrkwQ58X3@zl_c$#<%wU-6Q9PDL#vV#aRxs4uW@L0&B& z|2{q!UAwrLHcd^X(rIZ!G#a#d4a?oJv0}41kX>92Q0+T;aS&njhf6Uo#)Q|Z7a|K1 zO>tb2?Hw+JM+CZn@&bx3iU4O%c}{;rc{CF4ZtHnUiD1zY_Kjo_GBKD_l|Zc%_$Oz) z81%;c#;|8J6YJznhD0@5$XRDLr98P0e!`YcMoIy5dNQ9I&3fgL#k9{G3x|C9XgD8e z?3sxh#*(9Xui0gZ2E*Y>I9v^tMo$^h_-chj!SgG9b0L#o2TtNNA>PG>{9Fd|-PN3c z)&(I0;o~mgG=CX)@Wv2pOwGBqtyavkY%dl)24tm|^=1mGu4+uGIV>2I3Kmf@GN>F^ zgN~GJgxF_>{A9uEN^oD$oG3Ix`Gs~gIkJ$|L^{QQKi`h#7s`QRH)e@f{X6B`xQp2L zWh3^))UL7FQzxTUZ++89b3-ds-o4n_P)D68WeHX@pcT^X`D9WG8g)p7+DIo2s`H?Y zUNJe)8!9+BUSf3A=JD99DzzMZejwTqHFq zYz?Kag2EqaUxf(Jl8PMkRRmjG$CJ>CjmaI+xL(H$R^MnPIav>f>T|hJv*L=Tw>K@> zx!v8)uGw^{7&D-b$?A27TWc$|4I?o})RWF;$>!$R@V(cGy$|s-Q$odqTAe9i?gxJe zn9JfErVg0q;AGDrE`e34FgG|j%vcfM4ucuYg>wxUXuV4?BWap>J|$D15NBG<4ZWbu zeQB0UFv734IxZ+GU!lV6hZO|rL@>KK4EVQ=bN_kpZ(155{*8}}q%F%~^Rh!)wpXjz z17YteyRchyx9}iTK&g4~ph}D)qsSEW22m>|a^86{vpAYek1uA^V`X!VinKI_rcTQ& z#qokM+ey3fv-#v`(O+1onB!A>r)T$!;WS1WVxcJa{5N;T&8&%pHCT&QVxvoy`JI(O zV{Lu$)H*P)t^5w13e}E2Pp;wm+JxHZq zKYAy*5_~k8bG{rpi%U zxV@oX+0c#B$tVL<+a)ua`1&u2{F5vV_c2BO`XnhFWHWGz$?s+i5&IOFxjT z9i%V(%4Sd~X>~IOPyLg7j;UY@j+Ddr^Wt6B{+C2BE4 zrV)%cF9sJLOSuXJ^2{ zZ5}5YK&QpvX&pYFu z*2L2+?#;FlnJom&$?4s_iIb-j;qKN^qs7?T&%Rmf*Kq*E&<#^ z+Q9w+EvleJVL%H3b2U~eVBRKkm?mJZrsXhHo6QR%i1Iy1q=(7ICK!@7 zyoZZMgS62s@!{l2{1cDF3uz<9C21qZz0^$7hT~Tm#_tzo*D5fd#oRPvr%HD1D(qmy zi-CnQBCxo&L^6-YrRtM0U{Tp6x4ES+qVK%=gyW%sU8~IT=+GQD9Al1`*jLD|RiHly zPmwU107mB@6Z&DYYZd6vD-`Jg`q^Vc5AE37VP#S`tGZ>}t`&5HU8{_FF^{+is56Lg zLr^5A1$FmBoha1Zxk_Eoi+xLl0lnxX3{&VBe01Qrd<5H9neD0&-^&h2u6D%=ykYw) zFjos+qs6H`u>uCRuL5%=_tiN8xXCVf4QEa>C19}2fZ-M^MG0vqnxO3&g0}pb0dE}Z zsRLNwD?e2}j6xsz7ZXu&1e{#vRD{kLMGpVV@XGzLbCGW~77C4qlyIQza-cE>U8cK5 zuCMpXR#2zi?)e73y5IlXv7L=jHIho!PN+|v-0Ge_+ge}9EH=~asIykrS@c@7NuO#b zotY^eE3GYut8tyZ5y|!9)30A#c>Pqlxoe`gyY0&co#&%JkNJ zBAGGj^mePm9-Zn`iv8EXbFQxJVE@AYQ5wbjU3TG}9Mf~@-KU zBLPFNC+*ogYgpcESoTN`juA?w(Yq2DCs)Tk&c6+`Fj=6Ao+WQ)lxjBW8sIHHrZReA z>Hnpwn;wEZfk0mWhtB3sIFJj3JyEBpFj?xZNi)~zSZ1n`a>qkKo70fpFw&k)+k(xF zi}m%z;`(}XT>+%XbffWZD%p+4y9d3&iIOhe{d;G;8i`lp7P}>s33=i^Yp@gwB^)}7 zH|heVetiwjz}>SY32iLvAk5RtS^_>SE@_pa;%$9({QP5H~Pg;G>F$@*l9;O z9py{Fku|Qh-p?a(+S6y1XhFryR%ETWaGxkbbh7P??V$zg6q7ZPw& zp!6E03n_6}7t+f2X)MjSI@Vn)2ha})+dlz~s>Zpu!nztBONpoChWe0z*XuCW)!d7i zz)yP3{y!1Lm{})5bQ4xM$s7i6;^JL3Et1wrqFiND+4w!8N%A5s6-pMTrF^&>@qjAKo2N-7y zUkiEk0%j16BB0eci@=Dqwt%_?7*RBapm@N9Yi$liaYTZGZbQt9>$aEhR-N!enzWN4 zS@qJK2?3ea2e}m^#wR`%##S1>f@a1isdW%wAC!M7-@AqN~}v=&MJLL z-;3FlSeFZnQBRH-hxEOGQDR**jvC1oFm!SRj1uc27&Wu-I`k*0yaJkFW#E__&lH|) z5_FPwacb~&3T=Pn8XgkSDcW1nuY`STLU+88^Wa8Kjr|)q4~Ee{r1Bua{4IDeMDYV_ z$nDWDhe<_<>T-1D|iTqe_TaV`^>T)Kt(-Gqs9w+4E3kUjhsl4C8-O#~_Tw6IkKu`h7BxSv=u9Sy&i$>QPyc4(VMTQ8{~lgS_fY>gTHrw)E0_bj zLESQXjZ({SSQnFm3Hu5#Nzb{hZgkBNGFtsI92Yc|2IGi!Ac5_pUY03IeBKL0yze8*>RD9KC3LpSsD&!5z^v62({O78e2 zmsG@8s`MwANBL?A#-KS5_W^MZ2*6a<56;XE&;&TBBPleY-pfH%8f-wY4tqdgN;aU= zY=*Qt0$ylt;JZZ*#COAk?#Mtgdrt*7v?wM zy;ndfk0xh{L>!Ks!LZEq%PGGY8t00KqlLb~fI>I(&@<{g2P#^$8h1rat*c(Q#4}z` zI;6EEiUD8JZ)G({(C#k=>(PWY8gj6wI&M_krNV)<$C;>v`**Sp#j-Oy67E04*36V0 zv2vvU73_K)yABM&eS3iGAXdTJsi9qGyu0%gu+Z_Ix;dN1?G{V0i4`ca>H-yaUh~E6 z3Y34H*mSh!GP&t|Ggwc?N6JC=)EO`)GAC^yV`6MR8mdfWge^g*<|v68cz@~WSI$=%S;?54j467a3W3=uvKBM5Ar-}4iy7~6NQzFkw~A3k@kzMEzPF- zuP2hNF*MS(K0Z={kECW~x2$Z#TN=MD)o?NqO7Ub2%TfJu#EilM#R4BhgLxMmFH2TR zb;Tp_0%9^!w67N6!`nxMrM z+?QuD&_eanTDX6Kyin>wg06BR{=OQ8QgbM;(1!T&H4IX^{0*a-6&qsk%$) zjrkrg{^3>>$Aia$1g=Vslh1)z&{1=M<~$Z8pp_h_rVfk{3pyq=#exL1lH=4=0F7AC zv7m=2E38VqH;=SXAJVwMd>84S`32Yrgv;#jvQ?}O?u>-r?3AD@{KSeF1>V^Z>Za7h;L}OX(t73#ZGb#JbWiLJ5?$HMxpJ4{3MMv z@p^XA{llLbrtRDjPhAYoc#xl44IV@6bag5v_A7QWb;NVD=jv=|gc^Q~azz&8zFvR^ z$)TfTlhl|CEctx-L_%7KNcf|lbUO^o8a>|zvWW)Q_YL*=Q-iJuaZ*NA(KWsdy8ltl zg?oKOLM*SeJO~{t+F*Mf9_c`|?M=mTue+HEwael1Vlm!udE1HNMB=A%sGUo+oZ-;e z@2q~8g~>X-Y%p5f0ZXhEi?sGX?kS~X)u1)%_eTP~Q`hc!O*I?{1q)lJyPHnQGi3H7 zk+RY5vB(y4q>4;ZFRrz??Z)iZg$<`xe?3kuG}Jw_fLO@Wpn@N<4dgC;fq=`htVt$? zO(ogM`4g5i&z31xm6C8zBN6BuBrFSbvr$~T(6m;j^Vx-NJb^qr^2YWXqup{aGgC_T zN&yBFqIi$|w`ZoB;pq78$(hq8UpC}&hXs>_MKc^v8pcq~sVXRT78>vlk3_Te_>p*e6rb^Te+9BKPV>pA zQTetMfPD>I1NLP<;;`v7*oXy#I?hO<>aT)`>{{e{4QlQYECUn%@TRG_%r3W;#)}2q zXc+IVFGU;qh@tjGtXuH=i>*j<6fwub$UQ5OT8L$4_l%D1noc?+8Sg2FZhi(i{9b2W z*&AxEZ`3w+>C!+6v46Z{`&-1^b9R`6Xl?X*$!J29iEpup6n7B99^AahyK{It*Oxia zLET}ZHWE!Q1_N4y(e6%p5@VHMi#>IfA=$~ob<5!@0jt?!3fAY#FX7bk8M!pMMo1Ij z0Sh_`ajsg>0)}M1fVnKqVN!rmE$9QVpnkhJ@^?pCn07@z!(Mz5Y?@wnI@M>>H{R$`-s*v7s<5ziI&2d+=_uKj#*v!co0mZw)R~Y7=p1s-13asuVViB-`bTGm2|?tp17g z*lcX3HL^aF+lFEhM>1G7Xp!>phP;KSD;n^cZ23+q-H94qAs4bCsCaR?^BG?{ZnI|_ zsr*a^JHl7NIq(+2@6bTt_o?_0zjGLFLjwj@$0dL?X!aw5@jlXw^4ttWAZj89&j`&Z zMy69DM!rmpJP#=Kl!%f20tO=khL6nfesUUlVTwss^rsD;8H_wblvhW-L5#c!$!ngw zrdW)a{SFldw!vUsl|kHyy2ysdxgId!w53Tpqla~oJ;-B_VjcTeM^e39>JJ+p=~^+; z8a~otU1aJ=SS_F!;_86qRjyd%&RuNy87z0Ti);cC+ST@W&_k9ev*jGp6H4+Dngo1K z9SXdQjDkc|>Vfe144vRON^JG!;zFN71Vw5z<;>~I#W_CRSYnHVVqiWYyo5R5jmp5`g@{oU-I?Qa;Z zZ)wDPWt%Zko5+mp?vPGghaTzA%S%#Nm}GuYZM$bz#&bvgwR2r)XJ=v(fvE|RZLtWEDEVX+V1!mtzqj< z`wKYzxLEwzE1?BWCE7eGKMGF$23Y=bZ1MhT` z>tQAt1{}Q(96b!9^ygN1Ma=)Kj)dLN*wh&>Uin|?GG4_%Q}S>H_gdD0tA|HZyu=(I z?Ypa^Q5DWAUP={C5_k>nm;e`VK!*C$h|;G?J0aBRGw7G&XnG!Kr#7#IN9NQ6O+=-A z1Emzmz+AO!o)0$)Q3q>yQq^#@mG?I^h6W1C%#mEv;z+g@t4vyv8uNLVuQFHpbN>c+ z-EED=ES_Y@0UGn!xs*d69L}6l)t*5`Cs(s1F$4_7Km?4EYeMP#YOYDZPz*%CD7mH# zqC9G@>BzYTxh4Wy)#(C?q5@*1LFF?+arc7nzy|C9sHQ?)i;NT`6l!L`8KM$i#hg4K zF_w}II>zeA-xV-QHmHo%so5a9t?gTK05Jc|sdUY6_-u6H_)xc;fTGzxC209WlB{xd zn3fdT5hDqhYkx^2DOD>f-bapf;Fu#3PK37@>8d}8s+FVhUd8Ako@=OZ{%f;)e2J97a5?mC89Q^=>O<=MsiFO*o8;div`sZENv^>u7Z`j>#b8i1PHW+1IzwwApI6{1d|pQU zd^lCO&kGpfd4$g^Pj<-XU3~@$31^uy=wHHFwn0am(XM4eFrEjpsnA5}a?9Y3uU-d& zT=V?H?K`Ze2V=&jDIGeWJ=K5XfAmf%md}{zBXKH)VaNR&#`2PduhDxnl1+=@+)7~l z*^V%yMBf}#*+>UI2-?anJhirEPx3W(uT|eL2O`eqt4?9;>Hb^U-u@kX-m+sn;5gyd z_ikoO{YU6*^I7=$e_Ze^sjC!^O44qm5GdQ&bw0dff zoJ~28tFvLOT)=eGKcBPX})+636GKJ#S!wY(aPN3H@1TqD~_?-uPZ+~m&y`LDn z;Tx?&`f9%7^e$HkkZkbt?$&G9Z` zZL0JXf}!N02=cxK*#M@|jT22xDp zs1Ce5Qb8y7zt8Nv1MkW-yQq@sUo+H!_XyvaZ;G7}+)tfz>dx?4Ws;8q=CYRwGv)=% z_(1Lm7^1m=dAE>FG>%Gh>hK2kDvYohj_klA$$u@@m?q0NY(B~u!0nnSaz3sx@a14F z7q+u1DwIQ!de&Ey4OJKerf|0Qmy7|jMo*MJ#_o~-4&AIhsXFKFLH0L-Xw^3uq&o7A zsiL?uy3uKnT`f9XE+I#9J5L8wK3Hkh6Ol3X(uOo@>C})Kj1~jT*6)o>ls7dj(YRf< z#ADV%FXl@7O7n7?9M2Vweh zZ6TjWN@*dNTd1cRp>Q*iY=lCM>o{7v+DX0MNj32`mz%HF<}%s2YHdEd7jGm09>_c* zqoAi;AZXmi@83d?r4^DrJ?C`Wa6hcWiCZC23Cc|9?FC)M+cS9Dc3)x8O*+ClfdKC> z&1`eCvpGMX#gc_FZ~r{@!TwK+J}cNdRgf24mQ?=G)1U$MM0`em9e$#iG;;fBdW~9j z%aTUp)$;BZesJ)GPELRY5Cc>y3y*o>-?_}~>i_c6sU6koj;ZM#mCBCk`b;7*Q?Jq2 z8`vr7{yqDauK$~}ZrHf-hO_?W`lZV3#k+RAWnu9x+jm_&i-k+4<4acl8}yOmo*BJ$ zS=Qi;Xtm-9^OzMb#4O+)D!;qhen(oaj7E1JdOx0{hyMX9sgP!sGMS2X*%HD+s49|U zKcgKubBJ~X3K5;r34sWBic%KLG*jGVd&T$ZZE!p(}?q-9!T);qbO+}%=5O>8=; z^aoDU59UWs-MV3IHrY8$sQ>fzudKwu!lX zMeCStIawUwrTCtTiqWf;Ht;$PBLh#A*O?Cco+8lk>-LUh+5mUX;%TNDlkr%0sn%R9 zdz`UCz+Wl4V(E?L*1CMOo6XJUO53I^*-TEa)7z|0Z+5nr>m+QNVxZ6rh6*8@1vlhm zVwpAda2e&8Lo&9sl2cKoLpvqcMX5`<=MAUiBn> ztlj^k!&NAIiwmttdsolWuE%tsf-MyCmuCw3iGs%w@!8N^`5mj<9PVsr&Yjw#Q@Df} z)j!B@PR)JTs4HDh??`yWrH40 z8q-bftd6~Ux-=6**OkF$_66<1W+m-m_S$$dJyj1kwlp=tTH5Q))I#1;E^d~cnO@es z?ro=>|Gq6O8Y7#+W;U91?$Z1jvq3b|wAa^XPU}zP*;7sl;3H{Q6FBUB;Ct1Q1{G)VKF4Q%S_YQ{hJ1o1E!+^D$SrUC6e= zzI4@G*-+2TkNKR{(O6|oJ~v-N32Dk|&sN)!*5+z8HJ%C93Q4OqRjdSa;|Vrli6(R2 zcs&}aMMC*Rgs8NE@A>Pb33%GpM6uYmPGG;=L;KB_Mq$Yzu2hOm$o2NaG(=6a$P>}_ zlYD_C|9oRHmchNdCaWVIsLdAK@#%WBk@0xa&1hz{=4PI1FPoohL~!d+c49}Zb?Ur1 z7EM7=Su7TFbNd^nww>Ga6~{8EPS%U7!()@aj6c*|C|B2aqcazr^wxtX%0trJBGHX{ zSc6`YtXZ#aIchzuQ&A{mUn$0s_#&@IPrUHKWifL(x3KtO&^ z#^0^H%x-3H!6yb~oC6s7Qg#tOF)E+D6&c3;?5+3&WkGzdx8tb`ISk5s_$O}x%mEIA zwk-Y$J#{h15GgSJ$pB|P`w2c-#aPe&oBw_+eE$vjo}u9T0-iZOzIygEKFR=FJwq@I zPYiI?vtRJv2bk&^0uY=g0#7~r761K0=|%Qd`64I;qAakKUSeVS&G;R3#qay@`^Eg< ziK?I};4k36gQocX@9^(8b9kaCvPby$OYtr(J*OwZ|C;T`TkZ6mn!pe67xI56TCPZM z!M`8i|4x(?@M1pD5obZck6Sh=*b-LUNyD^W?Y;<^HYYlHH5iJGUZ0A2lzP-7=dv<1bgP})yc6U9!dsBNuvACgq z!cLMW3Qb_k_~*ZBjyjx zTV5FNMnh@bpJ=nAaMzzHMp~J~GThnfG)O!?t58*SEzyIM<46jQZ`)t&SP%I;ub zG}f6eq=SWEe60Lpz#qdR%@)0}1_Q+|CvCo{!yC3cTp_=wQ%N+I|||Mfwmv*eA|Q=ZIJ{>5YzA$;5}Z#MfY@kG&!Hv^cTOz$^aoykTV zl>%6$ax(Cig;C*3oS7`(v|8=-k^S(5B!3E>lz{I|bW^j&`6OVXJ6`np$w4vt9X=Bp95&O`I#*UE5 zAuJD};s$ItP;IzBf$R=Wfq~tDyUM55`b!aS!ZXnu@41t{aNd`kC`60CU?uL)`~4-n z(8A+Nh0uo@$o+bv8Z4%4rfAAt9PJi7nW)*4ECdpbXvUNDdNL8CDU$N|lkUe%pqMk_ zbVMAUD9Wn&?mpMXVnR#GxhUi+ZV>3S!_m+ zCEpBqi}4WfEd&FZxK(y{GMQd7g{w3dH!c2}Z^8OTSr%P`6J`euYzw#*ivHbUt za#>i*y}1zH_h>Mt(*{>4WGEI2TF5;OqE%=kqqqPUeUvAnKjJqYAP}O^GolK&)rbJy zGu!dyF!9-IO?#s6%1xF7&WPKU2${mpaTLacf~9Wsmj3$)E$CN$AW-gqt3MM-k5o!N zPsnQVy1dbZuMi2T6##nSX#Y;JaTvNJk5K0YwOEoP^~c1+aS#~ci@g{s?;?<_}2rPrI$iXzJ<37}P8{)II_iWfdc5B;s^MaW_JU zzK7XD*h#24!~K5<;={1Z6~f4$0*)Ds?2!`4o_WL46E?z=4#NXO}je8)o)hQ~%VI(+Eu z9S_-b#I7FhQsPHU@Pnk+NMjq47?y@-*YwW~Bpi;2OMU~nl=LB;TZ)o>3{`)5=tRW) z^7&e=U|F_?l$K_QFreR6!*@qU@3gqvEikmCUwV_7q}P?KMawbrm`=Y zP5Np zIUs2bk=P{}i`Of8?ONrYCZzA^MUNB)peP6sAL-!oVW?_Bm=4o>fr%Gk#z>{-$DM^* zW5(B*Z?`rB#T-x!@y!T@Tx=@a$)$3wY`B_m2EzhLM3#YMX{?ya)RU#B!0}=FOXry- zah@*3c``l#@zOZr9N{$c4y>WpD<*wT`Wc&GuR&*p@d0?U^bBke+CUzxCv*K}SIp&# zJ6&;?EA}&2%;|;=7)9ihzv;OvU4{3e1(9=!%sFJd5*s&onoTCX4P9nLo;JVMa$lhb zniM()^0y3yEAp4$>$%f3V!gxl@k?_TUKRh~T=j%UAKg@$`A{6`R3<%xT*xNra>+?K zd+7=ELp3_#ZveO5Be?dLqD3Q$SbU~Z^%P>o3A~c}?U*D~3Fop?S^SSZOG;+k53>x3 zn}BXlcpMI^Kant*tbu6MXw-#eS!cx`ts5^L;MNJx!ix8H5A2k|cNo>ZjKR>$^g8@+ z&(P`NuOY+#7Vsep`mgYneP?RV^1eZHp110|+*|YR)$jG4r8~=i%jLc+%#VGRJ(7Mn zbHDtlzi0PmKb`*EcRz!*ZeICU&i}`-vo0*NcDd}8@Am=j1i*b9=Y-%GdEK}N8}e)| z>oIm|{~IONDa)VqA3BM=VTBXmJ;Ra1vt8+n*rgqOmz=A+M4N=A(@V?A8-C?o`r=W$ zbmhwX*sbz^LCRVmG#NcAMk4BmNEm-HXnyX7sHX-7LJ>g4TWgXc*nM{nI)Uj^6V0z}l z*OsH(&OU!)^1N4Xja2fNee~p$@4Nz|&8{3|H_DG85*EPiScs#UgT9i$5z1Dn`O1sy z)2P}D3amg}534P$_XWWCypQsOC#f(3o=|w zk2zisYBi-(PcH>0yE`hgC8MQ0ky|%8TPmC|u~h2#OWtnt?1jxqqWkqL_psaL596kC z>w{W`c#Yt!-FP(|HHcl$d@ua;WcmNfhxQf$eFdOzQ=n0%E|3Qwrg%$birv=#*-u|! zzLSgcU1b`5A2ji0>?H85@d3W4(C!E}@59T>GPp|w+^Rr;TM>H46C3fwCy#z&BRh*f z0SGf7es(m3nf+ierZNV`L>V3CP@cf=D8x9%oW+&TvgcNwAI5Swuq?8>)>r5*)`wTl zVMXa=Sfn$Obm;q#E?e-)JEfDs{RPSUFxrD5s8TR9I^k!jsgf)W;bW`XRv$R(lh=ei zxZ}xT33@#-PyWHfe)~YcT`E{@PMaM@Qz{aknNJ+`3GjF|yBb}l`#BznQvi{a?Fkg0 z(76UG&`%(^a?^&Ygy2Y$7t9ZoP)nnahTIXm#bG5>+{K?C_M5yv=ql&zR;SHj_6E^% zJ3XH`>J#8{8oP#lK)z&v3%1+meZrO+;KIo=e-shK{aUNWBT}IYhf(4ehyBK`Ig$)> z$)i3YK6)CI>2b=~Kh11UaFT?d1v%!AT0DynueWfF^Dw)9qPJWUz1e-Y_=c6; zCM~e7>^fj#e1KyCbtfigUCe&TRSS1}Zi?@xGG5eSEwGamSU%f8arhpNz5T7xcP~V5 z*&n}&ytsF>TiKcNZQ8uN_-WEKi<{{A|H7w!=rOWV5c_RB2l{o$#n03=|J9QBQ%kK{GFfYGp!0eu`v7|jA8XwmG}gLB8tZ%bbOd8L;EOPH(l?&NZV-d5nz(v2 z#XD@W>~K09CO`Xtr7~Ab*?d8-J2zitp2 zt3gQV<+7o(Yd#lgOf94r_XdkbjRx;4oyp|UjuPptEyX(}M>e)~dcFL!L;mU9mW#G; zc*Dl3cVWz<(HpGxT%08rUb}?<^WI!I(Cz}enU#mxlc;0RAYKP;m#s=tHEfqSEc(_kacL;EklkS|y-`-zC$NQg&KXVrTzUQx}=3h_Ijnc>QrgsZG%nsy5Hd*DQ z#5Til<0d;9+1zdqKz#664q4mWIV<$Yz)|z8e*f9wF$d~O#>3;j1}^*bkB7&cPN$<6 z9`iLrp{D;;xpoL$Y3X((-2Qk3K*3PcI}sTNjB_jkpm4b9?L~S{r^{(bbz_Nk0{_Rm zuqZUB%>Fj}l6)N^)U(o(v}P_}ouBt-vf0Vjti3kpUTb8DfWx2gU+UNRaq*45XS0n+ zxYuy@IjSbW|Ffq(NA-*NiT;q?PxhZ*k2a40ekAv#H!^q!7IlN5H?6KI_=JUM@Qsk_ z#b<>P5$yfn>`XV1(aIWExfN+WRoOE|L6bl=>$zC!#k}qdk z!9cSyt?{ITRgF#S2|MNAxr(DGrYLD~ku{S|hP>=W09Cf@%x;HS{;spwE9cg?^s}$k zCfccZF>0OuhBj6ThI27UhP9F&_i6>HHkYJoSw0A4L}!x}wSsN5Sco(tf61q`+H61T#{;D=zN1^uSt2 zCV`7Ce5~9Hhj4X9W0%hi=Ik-8&g^k}(;5_H4Yxo&9i>|Ldz4KpN4vJ$WB;`)I+j)9JV{K$)&AOZ%y z54<*m>j!WMm`?wPvU%y;2|3=Lo(fi`%W-Q=XL2TS9csIl@iumj2kSM@=C@S$auqSR z`TEngEpI3}?ZLD!Eqg+EHF9p|=H4MjzU zuWf<%3Lg&A^2ZJT^sag%HrE}QjcPT$($3e&jYHpN|5QI~OaCr*>eSX!>BNct6GpR9 z$6mGm)g8=g$E-i)6mawUFQ#{+KvL^)TbJ?v67ny^#!w0b3x?qF9R6NsJNs@Qug+pp z2_3kp{vXP0A;-2I{(fgkhc_qumi>ZPJQiUqoGJaSG(H#Eu~ZwcA?;Q|@lMKCv=yyq z)@(Ja^;`(k+4d}M^`)DA@r5XU0JcQX`6QX*IElRI1}|ZxxF8(-!Yn#7&==*Sz9>qN zQw|MXjTxQDTPwYsLXH;H*cX{1Lmh^q!7#%HYBb}UUaU{XB4hPL`LS5S#I#J4H_2Kw zGoTFLZMQ{Sc2_>|=DUq|GIOfq4{G&HXEsN??uf${_SJ9^c_@LT4Qlet)({NRcp{#2 zkJS6W&zGE@VkRh`S6nF8))o7YTccCW3$>GG*`RZ{!rJ9p&F*w(ogQY+{1k~kqXt1- zu#CrM^Ei!;R3s302EtLQ53`uHE(i9@5{!EDb@t|HHxp|megG08^uvA&nj2uH;^dJ& zipJ-Rrpq8iiba=p*$K|3@-T39IQac`_yBiwV4-F*sf=(lfqrx`Cvo=Z z;E7s6Y`;JaFGdGixEJY|D0%nnVS(=*jYq6fIlofD>*tStC#Oal)ZzwtmjH0^qS`rr znJE;qVjuh*2hb?|{b#vr3+7X_ab^U`cTxOBFQ23rwUK4txv@JJi_dj#di#cx%gKq- z&D|S5#Mp=XuVx=+>l3|9aw=bQ);2ejb9Gbyhb+oUVru(QB{0)L=BaosqGTmfxT8dPD87y*AqQ`A3X-@96r5XEITA z6&$^7wNN9SelUx?Y{d1A{T^^P%3}bC`^AN_luo4xIrv8cSNFUv=7L zyO!iD;*+F&A!8wFg!E^ktwp>Jip0!^PpK@N;@vryJK1x}87v3R`tDILhSDJxD6!{I zzdrEKg3`!bm`<$hKv>x94*E16*({q~evfw9rLfp|;{YXBxn0V?K-OkPCS??Oh;M<6 z@|LCFf9S*ETW^hg=tGfPZ#6fb7`^?y-3R}(SiHDUIEz)-y8a8y-+vS+ARhZJ#A9>+ zzoO>vIw~If3F&dR0e5M=LM;D}zAP$keZFkKpMBh$@nQdbX}>Rxq$R^W*RNp*HF{9z zsEq%qIkq-;n?rN66MI%e-_m333CRZ?>HQ3P*DWIW3!`-$3Xs>IhztUcrSkr4*sZw& zJZJm*b4Ge+FFtT^&1tR1scR4RuVUsNS~E&@jC#~TP$(3ePw@~G^}xTPzzn#rxfVWV^bqL*|#sRMQcw6)XEE;HkOUlb{Y zwhB83lC&_Cw$cp!j6mmo%8MZIG6hrQ}z5YIr&EfUgZJz$a9=pTCUjl*M7{RW8 zk$o2P8IUc}qQjT4=D7iivy#{uVb}NH#I9#IRx01bay59Sz`iI`OqSvlDbz~IveAgj zZaj-9g@{lIz4V@3L!a#{u%5;c<^r< zc-`DjT2KEc#Xt&@pM90Rd_?qyNtf|B3vxz-+=iH1gF5E|-nexOyWQM>9lQ0+#(mee zKauXgP{mj|jP;e(u>>N(EzBtrRA%7=QOlp~2Nvz>mYFYNLr=?8z*htw_Y)alZP z5p&xHtIhlmRCC;*c;IZfefa9?gMd4WordhodDs`kr1cVBOQ&)sbQEP@ zwii4dL?^D!zT106?)B_6M9Nk?U!xOblRnLU%07Y9Q${UzVa|;nBSR%C^7(%Bf_GaO92-RS^s`uT5nGT_bN4v2W#jlxOR$o3MIYPAyY<#Ii|Z>Cy~ z_41X1KNkq({62im`#iaDIOp-_|6h4u0v%UzrTywXb+>v^cfa2Eebds~T2f1vElaj+ zV=!PNE5-tw1aJZvFxY@uY!Jaf0P_NrqTY^WA#ywOR{9l5=v-f6gyi-R{@5+`3hFt-7}`Dp@!O+H?m0qnt6|3!u4_ zoe2RVw-QzZhC{9#x@Mj{9O_I_TE3~7Vsc*gJ=MURxy6Ht$>?d&sApn!-25rL$A1+4Mdqm5Y?-WwQfqQ54B$=arBzMOZrSM6AP~ zuuE!t%I_qfETDn%0QI<&Ys|Q5RYRv&LnPh1dYe1$tc$v04Ze6^t1D`=#p~h?-c;Wa zqp@hLjm~KoFP(c*!B|r?m?8t+V>iq>fqM-|v-<#+X}thD8#J=soJz%F$)wHdB9j7( zmVW6F$bc3S0Ni($nz08su_sLiw&vquLho?V-_V_Sd_xS`a(dP-UUXJZW}soiH`*3t znobfg85|wyTy?@MS5vcl*72*$=ia*bnA^@fX5)%Lb5mf&B@0%K&Ih&D<9P7Pu&@m9 zBID#dLgLIOK>|el5QW?Wu!s-3y~$3uTWXV-e~+^I>3usM61R=roJ@)9$L^otDRiF!t38Qk7wiRKZCFNOc6sPK1mBag`qGU2iN8gufjvht* z#_?g?6nP)009*sQy$MEzg;}jMEo5852w`(F8)*nIU8J2sMqq3mFmNduj!IMfZeG>g z($6g7+$9}}$YVu&BQ>z2i>^c-r*DHzwt&+fF&VvbA?VBcn5DjiOa&P;ylh{0Em^(# zSozP&N6mB64k)5bQXY?HWslvG4B^;cAXad@aR7KuUta>Vn88_+e--Z(GKjgt2~kg& zt#2_K*JrhKAFx;Xvd-mmL|ria;A_?xqq?^IKD$KZRwhS|UBn&bKkq)i(P(tF5A~+| zI%H82YjcZwB7J^iY))j+sU0{r674>@w|zmqSE@sBiLZSyZ#UFD^gU1Oc4=e*;)HeN8&Rp?lLT2r_Xsw*!3Od-*pabx9W5P$L}_LtOXypk{o ztIS253ArCBh{NW=&IFI-;PRc+Vos@2=wsa_lkPUhSVi9p70_1DK@4PNLT9*p?C zsu9meHrz9ylZTfN4q}y_y2P-4c2iSF25xyeE@#t&5;?QvL7JRla4c->WL~C^QZv4$ zV&N~w(kImSuve6afucxjINCx8aYS71sDm&OWk&u*B-#=Qwc=hZmnVuV6kP7e;ZLaW z?*&#{uSkhc`MU`-|Ti@p3T+-m?h&^BdwU@MQ2pGkiE$6g9}SqH3t5n}Qc|-xr;@hc+P} z+LYK?_gMN;3;WjxL%%v4d=M7`(_QSBvY&`eXvc@USxrXVFf18rYs_eeOgo5OX3A&% zQohXMY}G49mNqvv#FU5bVXGpA28;53?Muo-XvZ&H#D2!!L_1+br-C&TJc5CaC*fif zRdSIh40Zx;oG&N+?Ch@wKRg_GSh<_^ZBFbW$cU%Lg(mhB_Hzv$2?^HBIF*A92_2rH zGRv3Urfk_CPqNjqh9<#6vM}mhx41JaLanN=pC`lF|x(sUrmL{LE8c8(QnkHdrjfwe9QrUpx$v*^EVvV?J zCuMy3D?ryvwJdCDC~yo}p>=)84#O5}?)M4~ht+1Yu(~?rU#qDl(Q1UEjBsjh*AuR^ z|B}h0&Y%h=jD|T+?2KNi?AsiE@*D9{wqP?m{G9XY)RwEWPdlHB-E;$B?iIS(b2tm< zK!k%GL8ee5DigYfW1k;#r)64Z&rPcR{x_bCZf1j5hIc*@yGr@iX2>#}+`^68n}7lG zzS?VzHc6Ci_;tYa810~PUJLM-f4O3J7>Qfe&w9xmGZZ~U9(=?q})!uvL(uGG$?ld zlu@ycbSiC0L}yShqL>Bc<_)tq_f0+%?Gyg zp!==2+y~iBIso?l`_99hPmGKF@+Jfk8ft1eThV=RXcGz_%?^9*?00|{c25)R&-0oN z(K?@)1MHC_RUjya)$)Uwr0pS%0x>6YY;bg2e$;g6P}Aeo%FAa@>%F#Cf|;x`5xsX> zchJi4%U&bQy>s>6PBs=qMpnQ1?H2oX-K(7nBRwN8@qGoQhv% z8CilKDHlBXWaax;E8l}vFN5w&-?P=6qw*Gn%`=q{>&AYsx51ibEU|BFuu|g9nMz1& zkKU=55O18RL`~?=ztl@eJu{a0!Jo^O5{G9hVYu|;FHs42nLd(cD8ZUU4N|FRS_zIX zsYl0`Fn4MTC3&uL0q;VELfAaL#OBE*_DwIbZ*qx`rHv@J--law#aPgCPJ_Fe?;} z5fPMH?5BvW=ghy~8+^h##s3Xdw+u=L?WoN3H$j7GQvYWBgKh{HUD^v95)_Ll>%Y_cVD-<2 zjt!+V=2!pFlj}R)D7{pAqa*$ozAG1;JG^1y_f+~>JMnpV!z%hYcNjls{%tSBStqRY z+Fe}#g`zjb9-nG+PqVH`vz}-t5C5$P2EKLzcxr3p*HUA?>8MytoZ9+Si+);f(`*LAQy*V;C%e;uU(f;3$swaa#B?Yj0-qX<&c8mwvz`yw(mq^xDX)0#mG zM|WU+!&Q)>1%O1mZz@Q<1^9MJ(gK`eR9;KKTp)dJwFKIowZQ5(8o9PWsMQ)nGj!`#NnXnC98u&)N3I`{ zOh;l}#tEHDH)M)dEki6q>VQ@cN0-(t!Hp%vkp`;ct7y`UGP41P z*DZB*I`a7X=EO#*;|mJsb~qBTrbb4vtf*0Kd26_28s)6SY`FH;8Z9CZIU}Q4Cl-nh zqTk_1#XB%?z<0~Y$k>JAEn^pgbTtYg-<0!dW9>wBjXFrvrMm2QTGcVXR#T%4ttLN- zPh%LD8Y z0*FR|UeuCWFUZynlYUY!)B_(!afC&AJ?ccQtIine@)HsgWt`DLL^TZudVPXYZQ+&? zy$OBJubT;fw8NW}4=9Jg4-Wz0)A#Hd+pgm!&#s$_LE?NU&0r9s?9pFO!l3i%TBK#E zK*w>xS9_Z39N9zoJAIFM`q5wWK7<4KJgD_C34iDVJpdlbN8nWB&-t_go)jH@>iGGx zN1fuHBkCX|-`Mtvad6(qv4`U&Rq(0UqX0Mjs#rLpw*V;BCb&%C{FrPY4^BT!5(;`7 zghdiBIwo(>q#Wi>H=FJE9;D;po1LJYFoO?@n z%%FPYgzp&xL&RJjK*4v(#Ut+HjvjSp7*U$;DH;DtgoAvo>2PZD6tWbzFyyHI1%051a)Ka{^4qi`098m^M@Dk1G$#bx%i%FdSu>7FETHbN>l|X@vpQ{j99~fE{GrxLfky=>Ig=!Z=!(Q4VK%b~>yZQ-?Y*h=O7N)=lKiZKu~;qLu(F6Ng12ev$OKnZc^h#=mA7Gt zysAdg7@wJ}j|q{$DH5YoX_CYt5hc)aA?UIitM)x63oh?gr9Ht*{Fm3`5>BnDvX@C@w`aE7eM)!*z zNOT|DxO8dj%454?Bkc{xbtgt*UB{l>ru1PIsZw37Z>2pCsy~2m1q7mCDNu|e%TxK4 ztxK0uU1;~;Z9AEoN^~FB!0C7#2NMqi0^3s-GbWglH(-Wv48<;SC}8p)P`gx{kPa(- zDm1(af@43%_R zi|A+>((ig%5@rJqLi|&kGKbx!%xPo)q`Y=}TUhNbqX_s4tEyCB|xS%rL@Cg%^p?wTa$XVlU`S)`#;{H6hY6 zxuQO?s;24M6^%uWAY^-{cHUmGqE^{6r+i!J?3i z5cGSvq#uW*S67K9pRp%dQ-hSs)e@4+$m*ptRp|3&#FtVHuzep^(uB-M9`icfB4!Za z4#3v-TW=q5zKs`^GwXt$-f4x=&nF6djWQ;WUz7DTevx zUDm6x&M50ay_^G7Nk@{Q2S#*RPZkxI-IMlYICqmDz{Jq1)C@IkMQD-`RLnKdD*pxP zZp7`!Rg;OYORaxeZCZIJq=_jyAbnWI5O}DA&H5Hi;ixt|5%3nEVb!{~5C4E#?NJ%-- zF@q8Q)jD6beuDZmGvooJ6sr8OHDIzRDxRcCHifpTIfudYlG31ASZYm`lUCbU66Q_Q9_r<;O99g;p9nN!-IoI=1&>G>+c#RZQZG`)J_;^T{fX{pzT)(QX zNAs6cJyR7!CT{`nkL((PmMX$g4p;p)-k(MV$c@-v=d>8CCduxqUYo!S{&90#V+3f9 zOf%JC%c)uS_Y!S!`qKTr+Rg}YqI$t_K|xj9)0!QAl$xu^8E()*Kc4Vv6JD(#a|@zo zR2HSRLG!1A#VK8LV$UFZK9SmWE>~q0PonjT-Y~@$)9otFDyBMrtyMhTV_UW6bqS@( zHchHdv)IY*A)Tf|lWM(+mGYkZ-qZ(J&qcM{tbwEW;|R5=P?@m54yP`G)G0l(bIqhGr{xph7y z-YOP~+8PF?Y5KqdZ$~m(Oh){w%cMum;z#WenQPE##6VDCp=baZCheehA*;d(Lb%`D zQkY+!v)Jeno@M>J_^D|GfbpZkQ#NU*ZmS}XJf$O{gY}g8ygJCQI_2l|-PeKkaJYRS zn;D?P(gWFew_El!`{iWB>_wb{)#b9sCfna0iL~QPHUfOM$3y;5 zsLt;QM8Y{<7ZEo4J2+eQzHu2Rb55jD7g`6qkL~+gMoqEwYUl^Wd;G1V&cwTXUTY-o zloK(l>@A=1R}Xt$G#qgH>ui3fKOFs{K3@GDR@lV2)7WF~6@1TlBCVN*E+ftKP8^R9 zy)yGOca`-B7Ub4JWC0S)V3LuU8!=>+|4*CNc-iZ+Mw3owB5d<`yD~H&tJ{62_C9SM zKN}4LbX%PtSxHs+-BuL|^bX#LeQWkBk@n^4DT*u{utuXsn~7)Jq>LUEr?dtsar{Zj zaPE!)LJEn?r}08DAbo~ToJ)?*?U0mjO6C4YQVivb#Vjsai48Z_G!Em&`9Q9vIT!f& zgfrV~TrR0?&57)^OlLzjU+hIBd9+-PcBb>a#eBA*GehwP;6Utm;$p=5H6W7`G6^)f z91bIbj9Xd}uY-FJ;CNQKHEnU?zoe+))Nofr5q8;`;;nM%l9?N5Ka zT1o`(PR~lEW~B@LcKh5yx;K^TO&gqe!DHvTR4^f}{`g~8&3PMdMIn6Ml)^v$Z8W9U zOhs?qcwUVQ+ynPSAjkHJLQ-(=jt1+V9UtGl9w%m6+8bp!QwDh7c7r$F(QK$ho|O=S z#x6;e;=oW#E>KY4;vMl+SKN{=izgFVlTR4gv)?dqCyTx+H~5h`V~?P2uk z5G3}#xPtR-EJc1=qU82UNDy!&_WJ9wcf}RT2Qftc$0_>3Ier8gX)eZ$JNBA!CclQ9 zJ=|rA1a=bQ3;cZ&+dkJfxO}8|cVS)Xn8C7mvG2^i+qaY+OJ7yo@P8h|5D{5HnI0}f ztho!PD9jc#WaKh~Ryk$DGvyI#fNS8{^=tF%uU|CMc2@gf@}%M8#mn;7{_M$lt-tpx zN;Gx$)~`{_h88D{sO8X(q&)YP=_P)*{7a3Ik)V|XFq!htKaQhcVPE1Xt8E|OmvF3qGe=--XqwJ z9y>`MuH6Glv}*7p)l=E$@}IuC=bUpk%wODc(&Bmj{r}m#WNw@5g2dX-7>AbLwCR%G z6B|xiwtU5DeLdIT_vGga|De1*N)Tr$S2OU@j?C)y{hsbv$t%m=7=DG6MOu#_5sGW8 zq=MzUC3MSERZJ!hHtA8OeWITy)l!et@VHuVKRRiX#{B&DNQ1pI zm+DDHdWL(F{l(1uaw0S5#HQG+fG0j^52gdQ*+Wh3*8GW=FCV(>gj~3LxaZKU1X7*m zQstbhrfESTIsfwumaJQx_Q)Bp=Us1cafi{@mTqVR6*l80nb)yenvo;ocp=^IWu;=G zBW~}jH7xW=>st)w_05>3xfmJ-N0Yxm<7X6W$`gpGL2(pvYQoYgBRLZ-4?jgwf%oxj zuIg<~dej)ZzuVI>JJ~Ql>q<07QyEvPC6eooJL3)E&2?Uf8F%qDTOv`%z<8jg(fuV~ z1~+$vvuR&CSl5*DWxe*O?c_kgSHGY>(Nk)4HZDs=aFuqhHx+1Y$~m5K#G?_bWDw(? zV$pr7jC=*(v!&~s{K3YA%of^W>8xDn_Sc7GUwT;W?BdH_AZ3Y)ejb+5$V>~C|g7KHx4snOD1SeEu{Vvxr z3yxnFS`kl`EkY^B*3;1;9f=erTlUfQ3?%(9@04~-T`Ou*Hl9bBGy*L-6dk=nTp@8~ zo} zG~5WVE{MW~;#-N_&Fo znA4qUh{*A<$KWgFb8{(mUmn>H9U+%B)DQ@zko_AM#KxT7Ld@c8O(nYuK4z=+$8nj0 z&ts`W0xN%=BjWd35Whk3%^vo9(Jf>VvweaP*ek@m=9&eq&$1VG_2wV}H1%nXDugKf z5}BqXJhiiP)xtty;i}GtCH*ZS5bCn#;<7oJ^qiBLo0s;b!M^no z+rg=tgnq=w0uN%H!*4K^Q#9^kplaNC+DlP$(-=Whn$nPVf7)n=`j@3oYbg0sp?P}; z3fcO6U;n3#?wYGdS;3zR#PYRYye}LGg_Ilqf&qayx^RH*5aKZrnJF~(d$D(nQw+%1 zBDq|GgThiI9KoY>(Gcf7kVG))xqFnGL^M34%EaA_=}ttQc+VYq>$BH{k6#*0EU@;Y z;cz0Myw7^?y;u4E2UlDHOF$Ghv-8%ou8hag;M9q%+97~XBvX_fna?oM7Qn)z$ad0;|xi) zv1V&`0SKOf6j|sFr~GB^0v;D`M2Qjc$(o!ryb#$&rQz=pe>pUMHgkzvQP1)e1Ds$k z6w_Uj54GGSrH}G_6cc6O`FI+sG^ik9Of^Nw^M0tM1s6uKRm#K4EVf*E94&XC<)*RM2$RwAKe30!e?b0? zS;&1skN8 zw@+lAV9I9`TO~Q&-H`1_I^?wa7oXLTY){I~s}@;&=~LuP#GiI|EX<^2$b;;hra++B zms@7EnQIyixW(zit_3Mit|vR|jHS_4$#&#W_-(c|;BC&o7wTVD!NbjnT&?eSJ0x;T z2v(CFJi&yVGaTb|nvF0*? zIcY;&{u!Pvw&`pan&=Wa>J&kRF>U1 zzyKSkN=+rH4~1688TeUC<7Q{cl)BdO{jYt-pY!8JD}T-x$om|DI#^|nfW0n==;@CWnC-c0)hfz#saslc+?vop-h@JZy(O7WdoB4m)l`92m-i6AD2p-# zU`dv+`czqpy<|ig(q&qR70r`z#bb~0p1^73xiEMUeB3@ayC-5k{Y2?`-+s|h9f6!y zZRs=xATR!0ZPfQ&FDO|Q&^>z%cQMyMAp%?iA_EaRhx|84`BRAq8VWhhX1~qms%8D~ zp1c6p1m%4J#+*DYjkt zhrV7#UxYuX&HY}N$1A&QoECGP!)mwTJ~@M=1~FFkn8(#wNmHq+&+7=4Tkd8a<=;2F z&ih0A=$m?dd;gSfanlrfeXqJ#yUpsTV-}~;?Uh{~do2zdnURtPM5~T-z;D7~yK){= zh}8pwiTBM`Z`pzw>|DQI`Eb{yvA+E_+oznlf4{P2Kc4GfVYJAK#6Du*17@v)`xzuk z!l7NVp^*N9&)*se{KsALN+1Dt%1^HS%1^fJ+GSwdlgjByye1(-uv==wZs|*ig&N=y zP@hBG)1v-lYG}xOy4O2@zIkmZbc`&U(@U4GYHjW5!R^T%f^yF&&2fivjnc7_~|kh9wnbn^e5H8QeW z4%zJ?x!Vz{?^gfo2svz}Tqy5fiG+x`QYqKnO|QWM9^^y%g9No>56WnVS+tty;j)## z#uswXPF*pJ+7a3(8czyI_6qv}X3Qtd>JPbb9gl31kXRIVTiYE@rx^|av)KZZm2inf zLIK*LKuV@p@wS-+B}eT5-zMNO!KE?`Kf1sK$A4J=R^>lkH{IkJO?*pUzs?Dl$`6#? zBlr7mIeGj3(=3;c)}F%bpcDu4%DfM64QW(mfo|Wmmz&~XiMrxPnZOSelwNJ;7qRH6#VEa4aUw}MyQPw#+yI@}Cw)~s2W#KL<*iTX z=nvF+JfeX~UZ)MWBYA6O*~zEG$!CG^&*y?>0yBU&=z%!Sg6v(`f-uPlaEF}Xzic=A zgJNOND#tY8N4cC`M}Oiu%HfQ1xZ@9hRKEInR9qg}`C-%ZJRjHXNo} zGxEDps`q{*3p3H#$Pltzl8e_#0&Sz3FN`6n$nETa(j~I7qv8vg!lSnZ%xBuOcu1U638PE#ZH^-QZQP z(~F3Di&usg6KAh_9r3W$Vzb(sVJIX6Vy2{*O#eYDe}wZk|c*YcFA zd=>N#6%9^+7hN$|AGERAfSoJ6uKprtqskHxR`2H8j)<`!lRL%SVeeY{;XW#xAdG)Rl2iV1w zcSS;40DS(b*u}EqHTZl7|Gb?kEG|BT&v)|A@8I)k{PQ;9KT!TA;Q4E?myFU~9EWF! z0=pI2rYQRxOh`5L8&|D(mK0J!)O;;hMQ--o9Nr`f{;ga68v*NCXlWa4GhUN?#|Ah( z4IrkLb|n8Kb}&RK7}NPJS8NKSuK467m!K|cZWdGQOXBt5G}wt11XJxOF2mq%2bGIp z)sdIEtU4OlnHk?;Q^NvZMsACHGcoa6M?*tny_`zc#RvnBizZlrJ29er`H0ryq}WdJ z5m@?&Aw%w$rw`E1;zW^ z`IzjNy&-#|AO~a*^*kybgH?S#dcGg}6%)1tBc0+i&?~VXjiY|rpdhYDX|y1Z;JZ`h zgm%rYk9EpkIWK#i9@!Z*g`AmyC*>6{^7!m7r#&X$`HZ&7vRJ+{Ceo6fV}9Q4AWYtA3#jcD5jn{Mts>gBkx|W8(sE#@QbC0GUB& zLw#exl}g#8XzM9)KFdm-;4HPfAaq-BU!ckZxUoqJ2?l{nNRttp(;A=)13hqv`%_3N zVz)bNu24GSt}nJBGx1jT2zy8LgS+CaX3Z$t;?@UG{YN*0v3H!Axa<@CjW9>zC1CRh zxJk@6{!)!ex?=o4#s=}^8e}=Wc>F1&NxB?2`Q!lKe&shTGyW1d72P6Y1%R~qjS-T* zGoeGh=8NJ+IAT)vjPe^WDYsRY>tuf-=qvTm%3pof zpvY0X3rytQB2O2&jD5^(0S}3FCj6m>U}|4l^rS=Kt`ZE0=4MYQj8->~uVh~u-w$}N z2E1iF86CfrT{6BMPqyF*EFW|Fd`^eof0xtirFU__=WzOcvcuC+ zUK|7gh`{NAc2$cZ7}4P$&W)dZO6WYXcB}uQ4S^d`YprN!H;9`#rQwn?sb-W8V-cls zzJ=M)cowagqs2whuxoZUH9O*yizU&X&txJEnN-4`@nGB<*Mim=794wgwWG+_j;46- zZq=QpYmwYtQPDS<74iDyt!ZgajT66D}kzPm`#c6Q@i*xh^l_3&9kZtNc;ot~O zUYFb$jK-j^T9c+k&Q<=d)rPy=ytvSJs8jTW>ypiwEoKCzefiTU?J^5;w#7S=zF=c8 zJrku}D}Ix0l#CeF*SVDYvG^=YNd|m={7*FMyT$G7c&Qejzws)4eoDNTeSv>|0=Y|Z z2fcVR`!^|u@1NvYIUV0`l^m0#pen+rNWsheH#)!U8x`*juN(<2LQ9_$?_xJeHnfBd zX?(s|{6~0O=<}|l7JPnKJeQp$dGUEShxGH}UiNidrGokRGg4MU_8yO2xdX7yK~cge zjh)y|6tCf)Q#?+UaEc$TkbFfxg9vdW7HHnLC9ZtOwbmTz&Kkz@yC& zr$pORzFJO*T&_&_8dk{g&)89h;Y*%EP+>IcB`Q2ur^28YR2cIGVzGdaOYXJei)^Qq z17?W|3A0y-i;#8qAs*{7YNeiw@O+;|%s877t zkx3#8aM){)7o1)>i1Bi5OUfE^B$Wh{v>7t_ni-yNn)JL&D{qvpm9IkS%b~N~ECnl1 z_l$4E)3c#H9tIudq^ls6sO=ksO?bW*&mWXZ^c>D5le7tAz7@~c;Q4+jOwYk_P13a} zev@a%3*(4ctSWweGYoPt@8XKe0!tz{9DpJ YmFL$A*9q@c%HLOczGwUo!pDN}KVJVDl>h($ diff --git a/packages/cursorless-org/public/fonts/Inconsolata-Medium.ttf b/packages/cursorless-org/public/fonts/Inconsolata-Medium.ttf deleted file mode 100644 index 86ba05ae86665e61397d6a5a666f78b28742a683..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102176 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 diff --git a/packages/cursorless-org/public/fonts/Inconsolata-Regular.ttf b/packages/cursorless-org/public/fonts/Inconsolata-Regular.ttf deleted file mode 100644 index d1241516bc2357fadd283371e34055d9b1cc89a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 101752 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�qnEPT11X=ckn@bDcNSYq1*MY8OvKB(de&^F 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

1kl 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 NAdhm{!}!-E|Jjj(v_b#? diff --git a/packages/cursorless-org/public/mstile-144x144.png b/packages/cursorless-org/public/mstile-144x144.png deleted file mode 100644 index 3d42de031eab1f7d58eb5418f85bc1a775ae2697..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2857 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 F{{fHVIYIyc diff --git a/packages/cursorless-org/public/mstile-150x150.png b/packages/cursorless-org/public/mstile-150x150.png deleted file mode 100644 index dc7c9aa28691a9c897b719f8a5910137ca502b4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2958 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 KW8&o-_x=Nm(ZLu1 diff --git a/packages/cursorless-org/public/mstile-310x310.png b/packages/cursorless-org/public/mstile-310x310.png deleted file mode 100644 index a2c8fa0d1861dbae38f4c3132293aac83be30bac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6386 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 diff --git a/packages/cursorless-org/public/mstile-70x70.png b/packages/cursorless-org/public/mstile-70x70.png deleted file mode 100644 index 5333afc58141403a95275233ee3936f0119a51e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2090 zcmZ`)dpOe%7yr6$%x&iW6H_b|v$?EalHx}h=GM~k6Nb@3xr|t7xkY6YS}v1Inp_sq zMOT`YYl2^4{u0Vvr8C!`T7AJqBcpC?n?ZASW*z08kO)xikO}iA%I;0Ek5az-#~j zSQh|*W+dy0r;WHF8R&Av0r-81(bFPkAPN@e2>J$5R53Iz!lzIHK=v)x!44lkyx{8+ ze#}wpSFfpQI42BmK_2rCkKKpU0_J_b^s$ zOi>?{lradH>`%$>lAKBX@uQIYE#(tcKj!?DV1EpIV3W!3-5OahiCHY%{9PzT_;1@9 z8Qsv&RloD{a2+ptk|-gIy6Pr44Ax{R@#ChMeq8tX)as}b{iY#Hm!xq9+WwqEW0oWP zV~xhra?%f{%u-$ureLbh>(};&RF#8Sd=slTzS&#y8T=gg+!Ei2qNFLIe~5pP5ZicT z4!5VnH96;B+8sMPZM_SoMI=Oq`KX|>=T^9t>21q^3= zg^m?CkY4sp{n@w;Kj@;8)NJ0FaWtlh4lxuV1Gc$GTaweL{F=$HppEmoYe>E2Cp;o_ zeI;37{77pVld(_g;j4Eq+79%%#jwH`>BWv`tT?XBjcVgDJH07^LVMSkfzsjjFbv0) z9t~~B=5l;1PVpM215dNk*#n*Lk}gexm8+8i9~VP&pSsrOm5X3YF`SI3!DaVfr+i8j z`ZSOOmeIQ|U^u-c!5XWUbX&#=wz^MchX3&+5v+ZM$}hJ+yT~cHRHD_JXel=-1Sw2t zvZ6$ZS$ng;1CJUDCk&Tj?lGcDt9)K3Rj{!jm=2xRO>V0~kNr)q;7%`xD_p9wDO#-P4jUDw`Hqy;>}v@{ zxWJqvB5YB_9A%iQ`lUA=ARw99db@b;yR0iRM$k!lSqv@pjYBNYkUadG2j+3k_yzP% zeV}=7mZ$RZS-A(9=kiiwH@~;#6&+K0nn#Fja7cn5A&eae@U{gSJX`1TMJRnR_bNGZ zcz;v>DcRk6=LckWO$FKIgz(32&HG3TsQG@ndbhx5iRYct4B=%)-dA z)7}ld;W)V{QAl!-63TD}S;_qV(zcoQSi2a#FULr&pST}Z+38QCKUVVq?@^;M{kuip z3tgmbH};@_;-mLRFdS=HB13RM8}3JjopY^aq5|^drM$s^|72y72Yz$4X@Bl-=02}~ zD$$+BNo6~_telwo()XE`a)L3$pD8ulQdM8~ z>2@{iNlxh!)fxv>^AtvMW&@o}hI|zxt<$dH%7*WsK8_sJHENNd#fQ3OlLyc$W>oxw zaUc|wrd_Tb{qV}GsOw!=g$`1k;UZ9_JR(=rEuD)6-he?wPw^e4hsU6XG`NYNYZ_7;e;dW6#B#5~H2dx~5!r zi<2f6H%i@26X?a>2$v_A5ayT8_5L?HQOG~y%|hx-+1EQ&m0dYd1S~Y$k6&f-^<`R5 zn<6Z%mts0}GyjfGC}fW0yvt-t=_WLoI`=(tU`@SH#R2j@bVE_|9UaAW6TF6Kl&M}P zFm&qFUle^>uDMy?F)gCMquzhqgBGnwL$7Yv+$0oKyf~OuH8k2&SyJt#p?ljpk?4c7 zmJM#gUE9i;$-~b0G!&eapZtA$?uuG6p~20=c_l+nU-h$(DVQoMINi8acwgBF2l1QK zCwDE4?&i-A5IoG+B6gYmxl$_PnXk(~B2;pBD6S>(1E9reRc}?%t@R;Y36|Rsx|0vc zJb%)yk#QV;jTvNtDOWXv>&s{zG8DybuA2W8nf$Mr^9~|cs)G<-ck9L9&WPejpac^s zBiqPKbx_AYEb#!yMYafvE EZ*ShYfdBvi diff --git a/packages/cursorless-org/public/nathan-heffley.jpeg b/packages/cursorless-org/public/nathan-heffley.jpeg deleted file mode 100644 index 3094f5302464a13bfe5451a4e6c7e60c30542e73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15300 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 - - - -Created by potrace 1.14, written by Peter Selinger 2001-2017 - - - - - - - - diff --git a/packages/cursorless-org/public/site.webmanifest b/packages/cursorless-org/public/site.webmanifest index f6d4826fe58..401d9145574 100644 --- a/packages/cursorless-org/public/site.webmanifest +++ b/packages/cursorless-org/public/site.webmanifest @@ -3,17 +3,15 @@ "short_name": "Cursorless", "icons": [ { - "src": "/android-chrome-192x192.png?v=1", + "src": "/android-chrome-192x192.png", "sizes": "192x192", "type": "image/png" }, { - "src": "/android-chrome-512x512.png?v=1", + "src": "/android-chrome-512x512.png", "sizes": "512x512", "type": "image/png" } ], - "theme_color": "#000000", - "background_color": "#000000", "display": "standalone" } diff --git a/packages/cursorless-org/public/sohee-yang.jpeg b/packages/cursorless-org/public/sohee-yang.jpeg deleted file mode 100644 index 844a612275da11f22f1becaa87e63fbe99234884..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43256 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 literal 169731 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%0At!RrYA6ii<$PBYUwJHN1mMdhicrFB@(!AKd8I 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

$n7W3V)%1{&!4qgIZ;f|p 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 diff --git a/packages/cursorless-org/src/components/IndexSocial.tsx b/packages/cursorless-org/src/components/IndexSocial.tsx deleted file mode 100644 index 076e7e088f2..00000000000 --- a/packages/cursorless-org/src/components/IndexSocial.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import BaseSocial from "./BaseSocial"; -import { DESCRIPTION, TITLE, VIDEO_SHARE_THUMBNAIL_URL } from "./constants"; - -export default function IndexSocial() { - return ( - - ); -} diff --git a/packages/cursorless-org/src/components/Layout.tsx b/packages/cursorless-org/src/components/Layout.tsx deleted file mode 100644 index cc4be3c6a03..00000000000 --- a/packages/cursorless-org/src/components/Layout.tsx +++ /dev/null @@ -1,135 +0,0 @@ -import { MDXProvider } from "@mdx-js/react"; -import type { MDXComponents } from "mdx/types.js"; -import Head from "next/head"; -import Logo from "../pages/logo.svg"; -import BaseSocial from "./BaseSocial"; -import { SpamProofEmailLink } from "./SpamProofEmailLink"; -import Link from "next/link"; - -const components: MDXComponents = { - h1: ({ children }) => ( -

- {children} -

- ), - h2: ({ children }) => ( -

- {children} -

- ), - h3: ({ children }) => ( -

- {children} -

- ), - h4: ({ children }) => ( -

- {children} -

- ), - hr: () =>
, - ul: ({ children }) =>
    {children}
, - ol: ({ children }) =>
    {children}
, - li: ({ children }) =>
  • {children}
  • , - img: ({ src, alt }) => ( - // FIXME: Figure out how to use next/image with MDX - // eslint-disable-next-line @next/next/no-img-element - {alt} - ), - CursorlessScreenshot: ({ src, alt }) => ( - // FIXME: Figure out how to use next/image with MDX - // eslint-disable-next-line @next/next/no-img-element - {alt} - ), - CalloutBox: ({ children }) => ( -
    - {children} -
    - ), - Testimonials: ({ children }) => ( -
    {children}
    - ), - Testimonial: ({ children, src, name, title, company }) => ( -
    -
    - {children} -
    -
    - {/* eslint-disable-next-line @next/next/no-img-element */} - {name} -
    -
    - {name} -
    -
    {title}
    -
    {company}
    -
    -
    -
    - ), - Tiers: ({ children }) => ( -
    - {children} -
    - ), - Tier: ({ emoji, type, price, address, subject, body }) => ( -
    - - {emoji} {type} - - - {price} - -
    - ), -}; - -export const bodyClasses = "bg-salmon-100 dark:bg-salmon-900"; - -export interface Props extends React.PropsWithChildren { - title: string; - description: string; - relativeUrl: string; -} - -export function Layout({ title, description, relativeUrl, children }: Props) { - return ( - <> - - {title} - - - -
    -
    - - - - {children} -
    -
    -
    - - ); -} diff --git a/packages/cursorless-org/src/components/BaseSocial.tsx b/packages/cursorless-org/src/components/Social.tsx similarity index 55% rename from packages/cursorless-org/src/components/BaseSocial.tsx rename to packages/cursorless-org/src/components/Social.tsx index b349d5f572f..0ea09354b4c 100644 --- a/packages/cursorless-org/src/components/BaseSocial.tsx +++ b/packages/cursorless-org/src/components/Social.tsx @@ -1,114 +1,60 @@ import { + DESCRIPTION, BASE_URL, - VIDEO_SHARE_THUMBNAIL_HEIGHT, VIDEO_SHARE_THUMBNAIL_URL, + YOUTUBE_SLUG, + TITLE, VIDEO_SHARE_THUMBNAIL_WIDTH, + VIDEO_SHARE_THUMBNAIL_HEIGHT, } from "./constants"; -export interface Props { - title: string; - description: string; - relativeUrl: string; - youtubeSlug?: string; - thumbnailUrl?: string; - thumbnailWidth?: string; - thumbnailHeight?: string; -} - -export default function BaseSocial({ - title, - description, - relativeUrl, - youtubeSlug, - thumbnailUrl = VIDEO_SHARE_THUMBNAIL_URL, - thumbnailWidth = VIDEO_SHARE_THUMBNAIL_WIDTH, - thumbnailHeight = VIDEO_SHARE_THUMBNAIL_HEIGHT, -}: Props) { - const url = `${BASE_URL}/${relativeUrl}`; - +export default function Social() { return ( <> - + - - - - - + - - - - - + + + + + - {youtubeSlug != null ? ( - - ) : ( - - )} - - - - - - - - - - - - - - - - ); -} - -interface VideoProps { - youtubeSlug: string; -} - -function VideoSocial({ youtubeSlug }: VideoProps) { - return ( - <> @@ -121,12 +67,28 @@ function VideoSocial({ youtubeSlug }: VideoProps) { + + + + + + + + + + + + + ); } diff --git a/packages/cursorless-org/src/components/SpamProofEmailLink.tsx b/packages/cursorless-org/src/components/SpamProofEmailLink.tsx deleted file mode 100644 index 56bda2c9148..00000000000 --- a/packages/cursorless-org/src/components/SpamProofEmailLink.tsx +++ /dev/null @@ -1,72 +0,0 @@ -import { EmailAddress } from "../parseEmailAddress"; - -interface Props extends React.PropsWithChildren { - address: EmailAddress; - subject?: string; - body?: string; -} - -/** - * Encodes a string for use in a URL, but unlike encodeURIComponent, it encodes - * every character, including regular ASCII characters [a-zA-Z] etc. For example: - * - * encodeURIComponent("user@example.com") === "%75%73%65%72%40%65%78%61%6D%70%6C%65%2E%63%6F%6D" - * - * @param str The string to encode - * @returns A URL-encoded version of the string, where every character is encoded - */ -function strictEncodeURIComponent(str: string) { - const components: string[] = []; - for (let i = 0; i < str.length; i++) { - components.push("%" + str.charCodeAt(i).toString(16).toUpperCase()); - } - return components.join(""); -} - -/** - * A link to an email address, attempting to prevent spam bots from finding it. - * Encodes the URI for the href using very aggressive uri encoding, and for the - * displayed email text, injects dummy text in a hidden span so that bots will - * see it but humans won't. - * - * Tricks taken from https://spencermortensen.com/articles/email-obfuscation/ - * - * @param param0 The email address to use - * @returns A link to the email address, attempting to prevent spam bots from - * finding it - */ -export function SpamProofEmailLink({ - address: { username, domain }, - subject, - body, - children, -}: Props) { - // URL encode every character of the email address, including the mailto: prefix - const rawEmailHref = `${username}@${domain}`; - let href = `mailto:${strictEncodeURIComponent(rawEmailHref)}`; - - if (subject != null) { - const subjectEncoded = encodeURIComponent(subject).replace(/\+/g, "%20"); - href += `?subject=${subjectEncoded}`; - } - - if (body != null) { - const bodyEncoded = encodeURIComponent(body).replace(/\+/g, "%20"); - href += (href.includes("?") ? "&" : "?") + `body=${bodyEncoded}`; - } - - return ( -
    - {children ?? ( - - {`${username}@`} - Die spam! - {domain} - - )} - - ); -} diff --git a/packages/cursorless-org/src/content/enablement-group.mdx b/packages/cursorless-org/src/content/enablement-group.mdx deleted file mode 100644 index f4dfa0496f2..00000000000 --- a/packages/cursorless-org/src/content/enablement-group.mdx +++ /dev/null @@ -1,220 +0,0 @@ -export const meta = { - title: "Cursorless Enablement Group", - description: - "Help enable the adoption of Cursorless by accelerating its development", -}; - -import { SpamProofEmailLink } from "../components/SpamProofEmailLink"; -export const emailSubject = "Cursorless Enablement Group"; -export const emailBody = `Hi Pokey, - -I'm interested in joining the Cursorless Enablement Group. Please send me more information. - -Thanks, - -`; - -# {meta.title} - ---- - -## {meta.description} - -Cursorless is an open-source spoken language for editing code, enabling users to write software entirely by voice faster than with a keyboard and mouse. Software engineers can code using high-level semantic manipulations (increased productivity), and all computer users can reduce strain on their wrists to prevent injury (preventative healthcare). - - - -## Cursorless development is user-led - -Your support will help Cursorless founder, Pokey Rule, and his team develop the following feature requests as quickly as possible: - -- Reduce the learning curve with interactive tutorials, videos, and documentation to increase the rate of adoption. -- Launch Cursorless in other IDEs, such as JetBrains, emacs, etc, as well as in a web browser, and even work globally using OCR / accessibility APIs to operate anywhere on the screen. -- Further improvements to the Cursorless execution engine to advance the state of the art in voice coding. - -## Developers love Cursorless - - - - "Phenomenal extension. This is the state of the art for coding by voice. - Nothing else comes close. Awesome to see this from the open source community!" - - - - "This extension is a genuine game-changer. As someone who suffers with chronic - RSI, I was seriously concerned I would be unfit to continue my career - long-term. Discovering Talon and Cursorless has given me hope again and has - additionally given me the means to write code and interface with my computer - in ways I never thought possible. It's also made coding way more fun than - before! I often feel like a code-slinging wizard!" - - - - -"For developers turning to Talon due to typing limitations, Cursorless isn’t just beneficial—it’s indispensable. When I lost my ability to type due to RSI, I was consumed with the fear of significantly reduced productivity and potentially not being able to work anymore. However, when I discovered Cursorless, it gave me hope and confidence that I could regain my prior efficiency once I mastered the tool." - - - - - -"This is fantastic extension that is not only saving my career but is even speeding up my workflow within VS Code more than when I was typing anyway. The best part is you really feel like a hacker when you rattle off a long command and the code does exactly what you wanted!" - - - - - -## Goals - -Cursorless needs a dedicated, full-time software engineer on staff. This will cost $5,000 USD per month. The Enablement Group guides development and the participation fees contribute to this crucial funding. Cursorless will always be open source. - -## 🙌 Join the Cursorless Enablement Group - -The Enablement Group consists of stakeholders whose talents, lived experiences, and career experiences bring vital perspectives to the development of Cursorless. Support and input help increase the speed at which new features can be delivered. - -**To join, send an email to Cursorless founder Pokey Rule** - - - -## benefits - -Members of the Cursorless Enablement Group enjoy the following benefits: - - - -### Become a Distinguished Accessibility Champion - -By joining the Enablement Group, you solidify your position as a dedicated -advocate for accessible technology and inclusion. Your active involvement -showcases your commitment to driving positive change and making technology -more accessible for everyone. - -### Gain Prominent Visibility Online - -As a valued member of the Enablement Group, you gain increased visibility -within both the open source and accessible technology communities. Your -participation will be recognized on all web properties including GitHub Repo, -cursorless.org, social media, via any other acknowledgments in project -updates, newsletters, and events to cement your role as a key player in -advancing Cursorless. - -### Empower Future Accessibility - -Your commitment to the Enablement Group supports the long-term vision of -creating a full-time staff engineer dedicated to developing Cursorless. As the -group grows, the possibility of achieving this goal becomes more tangible, -contributing to a sustainable and impactful initiative for accessible -technology. - -### Join a Collaboration with Industry Leaders - -Joining the Enablement Group provides an opportunity to collaborate with -like-minded individuals and industry leaders who share your passion for -accessible technology. This network allows you to exchange insights, share -best practices, and collectively drive the advancement of inclusive digital -solutions. - -### Obtain Collective Influence on Development - -While the development of Cursorless is guided by its community of users, your -annual fee directly contributes to the development of these feature requests! -Use your expertise and experience to help prioritize and comment on effective -solutions around feature requests. You're ensuring that development directly -aligns with the needs of users who value inclusive and accessible technology -and rely on it to succeed in their lives. - - - -### All participants also enjoy the following benefits - -Members of the Cursorless Enablement Group enjoy several privileges. The access and public visibility participants receive make for a dynamic combination of benefits. The value that individuals and companies gain from their involvement in the group is tangible. - -#### 🤓 Technical - -- Be the first to access Cursorless feature updates and new versions. -- Lead the adoption of Cursorless by understanding its implementation and having superior knowledge of its use. -- Have some influence over the direction of the technology through your expertise. -- Gain an advanced and deeper knowledge of any outputs of the group (recommended practices, engineering guidelines) - -#### 🥽 Visibility - -- Ability to promote your organization as a champion for accessible technology and in particular Cursorless. -- Ability to promote your organization as a leader in the area of accessible technology. -- Opportunity to connect with other influencers in software and accessibility. -- Networking and ability to cultivate deep relationships and potential partnerships with leaders, founders, and influencers. - -#### 🪖 Strategic - -- Support an initiative targeted at facilitating an increased and more rapid shift of adoption of Cursorless as a faster way to code and a healthier way to code. -- Support of open standards approach. Standards are critical to interoperability and openness is consistent with a positive image in the industry. - -## 🚀 Join the Cursorless Enablement Group - -Your participation will help Cursorless maintain its growth trajectory and uphold its cutting-edge quality and esteemed 5-star reputation in coding by voice. And you'll make a lasting impact on the direction of accessible technology. - -## Annual Membership Rates - - - - - - - -_All prices listed are per annum._ - ---- - -To join, send an email to Cursorless founder Pokey Rule - - diff --git a/packages/cursorless-org/src/content/enablement-group.mdx.d.ts b/packages/cursorless-org/src/content/enablement-group.mdx.d.ts deleted file mode 100644 index 0da46b532b2..00000000000 --- a/packages/cursorless-org/src/content/enablement-group.mdx.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { default } from "*.mdx"; - -export const meta: { - title: string; - description: string; -}; diff --git a/packages/cursorless-org/src/pages/enablement-group.tsx b/packages/cursorless-org/src/pages/enablement-group.tsx deleted file mode 100644 index 76f6db51c37..00000000000 --- a/packages/cursorless-org/src/pages/enablement-group.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { - default as EnablementGroup, - meta, -} from "../content/enablement-group.mdx"; -import { Layout, bodyClasses } from "../components/Layout"; -import { env } from "process"; -import { parseEmailAddress, EmailAddress } from "../parseEmailAddress"; - -const RELATIVE_URL = "cursorless-enablement"; - -export async function getStaticProps() { - return { - props: { - // See https://github.com/vercel/next.js/discussions/12325#discussioncomment-1116108 - bodyClasses, - - //! IMPORTANT: Don't return the email address unparsed, because it will - //! be serialized as JSON and exposed to the client, so spam bots might - //! find it. Instead, parse it and return the parsed object. - emailAddress: parseEmailAddress( - env["ENABLEMENT_GROUP_EMAIL"] ?? "user@example.com", - ), - }, - }; -} - -interface Props extends React.PropsWithChildren { - emailAddress: EmailAddress; -} - -export default function Page({ emailAddress }: Props) { - return ( - - - - ); -} diff --git a/packages/cursorless-org/src/pages/index.tsx b/packages/cursorless-org/src/pages/index.tsx index 6e0ed190c15..1abf9a8a56e 100644 --- a/packages/cursorless-org/src/pages/index.tsx +++ b/packages/cursorless-org/src/pages/index.tsx @@ -2,7 +2,7 @@ import { EmbeddedVideo } from "../components/embedded-video"; import Head from "next/head"; import Button from "../components/Button"; import { TITLE, YOUTUBE_SLUG } from "../components/constants"; -import IndexSocial from "../components/IndexSocial"; +import Social from "../components/Social"; import Logo from "./logo.svg"; // See https://github.com/vercel/next.js/discussions/12325#discussioncomment-1116108 @@ -19,9 +19,9 @@ export default function LandingPage() { <> {TITLE} - + -
    +
    {/* Note that the font scale gets applied to this element so that all nested elements can use `em` units and will automatically be scaled. diff --git a/packages/cursorless-org/src/pages/logo.svg b/packages/cursorless-org/src/pages/logo.svg index 784726d12f8..b1e2ec41ca3 100644 --- a/packages/cursorless-org/src/pages/logo.svg +++ b/packages/cursorless-org/src/pages/logo.svg @@ -1,6 +1,6 @@ - - - - - + + + + + diff --git a/packages/cursorless-org/src/parseEmailAddress.ts b/packages/cursorless-org/src/parseEmailAddress.ts deleted file mode 100644 index 912f5ec99c5..00000000000 --- a/packages/cursorless-org/src/parseEmailAddress.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface EmailAddress { - username: string; - domain: string; -} -export function parseEmailAddress(email: string): EmailAddress { - const [username, domain] = email.split("@"); - return { username, domain }; -} diff --git a/packages/cursorless-org/src/styles/globals.css b/packages/cursorless-org/src/styles/globals.css index f839c576ccb..99c212068e3 100644 --- a/packages/cursorless-org/src/styles/globals.css +++ b/packages/cursorless-org/src/styles/globals.css @@ -74,67 +74,3 @@ /* Modern Browsers */ url("/fonts/Inconsolata_SemiExpanded-ExtraBold.ttf") format("truetype"); } - -@font-face { - font-family: "Inconsolata"; - font-style: normal; - font-weight: 200; - font-stretch: 1% 500%; /* Required by Chrome */ - src: - local(""), - /* Modern Browsers */ url("/fonts/Inconsolata-ExtraLight.ttf") - format("truetype"); -} - -@font-face { - font-family: "Inconsolata"; - font-style: normal; - font-weight: 300; - font-stretch: 1% 500%; /* Required by Chrome */ - src: - local(""), - /* Modern Browsers */ url("/fonts/Inconsolata-Light.ttf") format("truetype"); -} - -@font-face { - font-family: "Inconsolata"; - font-style: normal; - font-weight: 400; - font-stretch: 1% 500%; /* Required by Chrome */ - src: - local(""), - /* Modern Browsers */ url("/fonts/Inconsolata-Regular.ttf") - format("truetype"); -} - -@font-face { - font-family: "Inconsolata"; - font-style: normal; - font-weight: 500; - font-stretch: 1% 500%; /* Required by Chrome */ - src: - local(""), - /* Modern Browsers */ url("/fonts/Inconsolata-Medium.ttf") - format("truetype"); -} - -@font-face { - font-family: "Inconsolata"; - font-style: normal; - font-weight: 600; - font-stretch: 1% 500%; /* Required by Chrome */ - src: - local(""), - /* Modern Browsers */ url("/fonts/Inconsolata-SemiBold.ttf") - format("truetype"); -} - -@font-face { - font-family: "Inconsolata"; - font-style: normal; - font-weight: 700; - font-stretch: 1% 500%; /* Required by Chrome */ - src: - local(""), - /* Modern Browsers */ url("/fonts/Inconsolata-Bold.ttf") format("truetype"); -} diff --git a/packages/cursorless-org/tailwind.config.js b/packages/cursorless-org/tailwind.config.js index 26d3cbe7dce..d96f4f226a8 100644 --- a/packages/cursorless-org/tailwind.config.js +++ b/packages/cursorless-org/tailwind.config.js @@ -1,6 +1,6 @@ -import { fontFamily as _fontFamily } from "tailwindcss/defaultTheme"; -import { join } from "path"; -import { readFileSync } from "fs"; +const defaultTheme = require("tailwindcss/defaultTheme"); +const { join } = require("path"); +const { readFileSync } = require("fs"); const CONTENT_RATIO = 1000 / 814; @@ -48,55 +48,43 @@ const references = JSON.parse( ).references.map((ref) => ref.path); /** @type {import('tailwindcss').Config} */ -export const content = [".", ...references].map( - (pkg) => `${pkg}/src/**/*.{js,ts,jsx,tsx}`, -); -export const theme = { - extend: { - screens: { - stretched: { raw: "(min-aspect-ratio: 2/1), (max-aspect-ratio: 1/1)" }, - }, - fontFamily: { - mono: ["Inconsolata", ..._fontFamily.mono], - monoWide: ["Inconsolata-SemiExpanded", ..._fontFamily.mono], - }, - width: { - smBase: smallWidth, - stretchedBase: stretchedWidth, - }, - height: { - smBase: smallHeight, - stretchedBase: stretchedHeight, - }, - fontSize: { - smBase: smallFontSize, - stretchedBase: stretchedFontSize, - xs: "1.2em", - lg: "1.8em", - "2xl": "2.4em", - "3xl": "3.6em", - }, - colors: { - salmon: { - 100: "#FFFAF8", - 300: "#F8C9BA", - 400: "#FF9273", - 700: "#372e2a", - 800: "#161110", - 900: "#0A0707", +module.exports = { + content: [".", ...references].map( + (package) => `${package}/src/**/*.{js,ts,jsx,tsx}`, + ), + theme: { + extend: { + screens: { + stretched: { raw: "(min-aspect-ratio: 2/1), (max-aspect-ratio: 1/1)" }, + }, + fontFamily: { + mono: ["Inconsolata-SemiExpanded", ...defaultTheme.fontFamily.mono], + }, + width: { + smBase: smallWidth, + stretchedBase: stretchedWidth, + }, + height: { + smBase: smallHeight, + stretchedBase: stretchedHeight, + }, + fontSize: { + smBase: smallFontSize, + stretchedBase: stretchedFontSize, + xs: "1.2em", + lg: "1.8em", + "2xl": "2.4em", }, - teal: { - 100: "#F9FFFE", - 200: "#CDFFF9", - 300: "#99FFF3", - 400: "#00907F", - 500: "#47D4C3", - 600: "#0F776B", - 700: "#005349", - 800: "#00443C", - 900: "#00110F", + colors: { + salmon: { + 100: "#FFFAF8", + 300: "#F8C9BA", + 400: "#FF9273", + 800: "#161110", + 900: "#0A0707", + }, }, }, }, + plugins: [], }; -export const plugins = []; diff --git a/packages/cursorless-org/tsconfig.json b/packages/cursorless-org/tsconfig.json index 1c78f7cd34c..833ac655043 100644 --- a/packages/cursorless-org/tsconfig.json +++ b/packages/cursorless-org/tsconfig.json @@ -6,8 +6,9 @@ "allowJs": true, "skipLibCheck": true, "noEmit": true, - "emitDeclarationOnly": false, "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "nodenext", "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", diff --git a/packages/cursorless-vscode-e2e/package.json b/packages/cursorless-vscode-e2e/package.json index 97255b135eb..176e20b1776 100644 --- a/packages/cursorless-vscode-e2e/package.json +++ b/packages/cursorless-vscode-e2e/package.json @@ -13,7 +13,7 @@ "scripts": { "compile": "tsc --build", "watch": "tsc --build --watch", - "clean": "rm -rf ./out tsconfig.tsbuildinfo ./dist ./build" + "clean": "rm -rf ./out tsconfig.tsbuildinfo" }, "keywords": [], "author": "", @@ -21,21 +21,19 @@ "dependencies": { "@cursorless/common": "workspace:*", "@cursorless/vscode-common": "workspace:*", - "immer": "^9.0.15", "lodash": "^4.17.21" }, "devDependencies": { "@types/chai": "^4.3.3", "@types/js-yaml": "^4.0.2", "@types/lodash": "4.14.181", - "@types/mocha": "^10.0.3", + "@types/mocha": "^8.0.4", "@types/sinon": "^10.0.2", - "@types/vscode": "~1.66.0", + "@types/vscode": "~1.61.0", "chai": "^4.3.6", "js-yaml": "^4.1.0", "mocha": "^10.2.0", "sinon": "^11.1.1" }, - "types": "./out/index.d.ts", - "type": "module" + "types": "./out/index.d.ts" } diff --git a/packages/cursorless-vscode-e2e/src/suite/commandHistory.vscode.test.ts b/packages/cursorless-vscode-e2e/src/suite/commandHistory.vscode.test.ts deleted file mode 100644 index c7234aa6bf6..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/commandHistory.vscode.test.ts +++ /dev/null @@ -1,155 +0,0 @@ -import { - CommandComplete, - CommandHistoryEntry, - LATEST_VERSION, - ReplaceActionDescriptor, -} from "@cursorless/common"; -import { - getCursorlessApi, - openNewEditor, - runCursorlessCommand, -} from "@cursorless/vscode-common"; -import { assert } from "chai"; -import { existsSync } from "node:fs"; -import { readFile, readdir, rm } from "node:fs/promises"; -import path from "node:path"; -import * as vscode from "vscode"; -import { endToEndTestSetup } from "../endToEndTestSetup"; -import produce from "immer"; - -/* - * All tests in this file are running against the latest version of the command - * and needs to be manually updated on every command migration. - */ - -suite("commandHistory", function () { - endToEndTestSetup(this); - - let tmpdir = ""; - - suiteSetup(async () => { - tmpdir = (await getCursorlessApi()).testHelpers! - .cursorlessCommandHistoryDirPath; - }); - - this.afterEach(async () => { - await rm(tmpdir, { recursive: true, force: true }); - }); - - test("active", () => testActive(tmpdir)); - test("sanitization", () => testSanitization(tmpdir)); - test("inactive", () => testInactive(tmpdir)); - test("error", () => testError(tmpdir)); -}); - -async function testActive(tmpdir: string) { - await injectFakeIsActive(true); - await initalizeEditor(); - const command = takeCommand("h"); - await runCursorlessCommand(command); - - const content = await getLogEntry(tmpdir); - delete command.spokenForm; - assert.deepEqual(content.command, command); -} - -async function testSanitization(tmpdir: string) { - await injectFakeIsActive(true); - await initalizeEditor(); - const command = replaceWithTextCommand(); - await runCursorlessCommand(command); - - const content = await getLogEntry(tmpdir); - assert.deepEqual( - content.command, - produce(command, (draft) => { - (draft.action as ReplaceActionDescriptor).replaceWith = []; - }), - ); -} - -async function testInactive(tmpdir: string) { - await injectFakeIsActive(false); - await initalizeEditor(); - await runCursorlessCommand(takeCommand("h")); - - assert.notOk(existsSync(tmpdir)); -} - -async function testError(tmpdir: string) { - await injectFakeIsActive(true); - await initalizeEditor(); - const command = takeCommand("a"); - - try { - await runCursorlessCommand(command); - } catch (error) { - // Do nothing - } - - const content = await getLogEntry(tmpdir); - assert.containsAllKeys(content, ["error"]); - delete command.spokenForm; - assert.deepEqual(content.command, command); -} - -async function getLogEntry(tmpdir: string) { - assert.ok(existsSync(tmpdir)); - const paths = await readdir(tmpdir); - assert.lengthOf(paths, 1); - assert.ok(/cursorlessCommandHistory_.*\.jsonl/.test(paths[0])); - - return JSON.parse( - await readFile(path.join(tmpdir, paths[0]), "utf8"), - ) as CommandHistoryEntry; -} - -async function injectFakeIsActive(isActive: boolean): Promise { - (await getCursorlessApi()).testHelpers!.ide.configuration.mockConfiguration( - "commandHistory", - isActive, - ); -} - -async function initalizeEditor() { - const { hatTokenMap } = (await getCursorlessApi()).testHelpers!; - - const editor = await openNewEditor("hello world"); - - editor.selections = [new vscode.Selection(0, 11, 0, 11)]; - - await hatTokenMap.allocateHats(); -} - -function takeCommand(character: string): CommandComplete { - return { - version: LATEST_VERSION, - spokenForm: `take <${character}>`, - usePrePhraseSnapshot: false, - action: { - name: "setSelection", - target: { - type: "primitive", - mark: { - type: "decoratedSymbol", - symbolColor: "default", - character, - }, - }, - }, - }; -} - -function replaceWithTextCommand(): CommandComplete { - return { - version: LATEST_VERSION, - usePrePhraseSnapshot: false, - action: { - name: "replace", - destination: { - type: "implicit", - }, - replaceWith: ["hello world"], - }, - }; -} diff --git a/packages/cursorless-vscode-e2e/src/suite/crossCellsSetSelection.vscode.test.ts b/packages/cursorless-vscode-e2e/src/suite/crossCellsSetSelection.vscode.test.ts index 76e883e56f2..095a550e155 100644 --- a/packages/cursorless-vscode-e2e/src/suite/crossCellsSetSelection.vscode.test.ts +++ b/packages/cursorless-vscode-e2e/src/suite/crossCellsSetSelection.vscode.test.ts @@ -3,12 +3,15 @@ import { openNewNotebookEditor, runCursorlessCommand, } from "@cursorless/vscode-common"; -import assert from "assert"; +import * as assert from "assert"; import { window } from "vscode"; import { endToEndTestSetup, sleepWithBackoff } from "../endToEndTestSetup"; +import { skipIfWindowsCi } from "./skipIfWindowsCi"; // Check that setSelection is able to focus the correct cell suite("Cross-cell set selection", async function () { + // Skipped for now; see #1260 + skipIfWindowsCi(); endToEndTestSetup(this); test("Cross-cell set selection", runTest); diff --git a/packages/cursorless-vscode-e2e/src/suite/editNewCell.vscode.test.ts b/packages/cursorless-vscode-e2e/src/suite/editNewCell.vscode.test.ts index 6e74a031fee..91ddb690e69 100644 --- a/packages/cursorless-vscode-e2e/src/suite/editNewCell.vscode.test.ts +++ b/packages/cursorless-vscode-e2e/src/suite/editNewCell.vscode.test.ts @@ -8,9 +8,12 @@ import * as assert from "assert"; import { window } from "vscode"; import { endToEndTestSetup, sleepWithBackoff } from "../endToEndTestSetup"; import { getPlainNotebookContents } from "../notebook"; +import { skipIfWindowsCi } from "./skipIfWindowsCi"; // Check that setSelection is able to focus the correct cell suite("Edit new cell", async function () { + // Skipped for now; see #1260 + skipIfWindowsCi(); endToEndTestSetup(this); test("drink cell", () => diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/breakBat.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/breakBat.yml deleted file mode 100644 index 422c113feb4..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/breakBat.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: break bat - action: - name: breakLine - target: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: b} - usePrePhraseSnapshot: true -initialState: - documentContents: aaa bbb ccc - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: - default.b: - start: {line: 0, character: 4} - end: {line: 0, character: 7} -finalState: - documentContents: |- - aaa - bbb ccc - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - thatMark: - - type: UntypedTarget - contentRange: - start: {line: 1, character: 0} - end: {line: 1, character: 3} - isReversed: false - hasExplicitRange: true diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/breakCommentSit.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/breakCommentSit.yml deleted file mode 100644 index e25dd73133d..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/breakCommentSit.yml +++ /dev/null @@ -1,45 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: break comment sit - action: - name: breakLine - target: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: i} - modifiers: - - type: containingScope - scopeType: {type: comment} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - [ - 0, - 1, // interesting - 2 - ] - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: - default.i: - start: {line: 2, character: 8} - end: {line: 2, character: 19} -finalState: - documentContents: |- - [ - 0, - 1, - // interesting - 2 - ] - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - thatMark: - - type: UntypedTarget - contentRange: - start: {line: 3, character: 2} - end: {line: 3, character: 16} - isReversed: false - hasExplicitRange: true diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/breakJustThis.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/breakJustThis.yml deleted file mode 100644 index 5673a013767..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/breakJustThis.yml +++ /dev/null @@ -1,32 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: break just this - action: - name: breakLine - target: - type: primitive - mark: {type: cursor} - modifiers: - - {type: toRawSelection} - usePrePhraseSnapshot: true -initialState: - documentContents: "ab " - selections: - - anchor: {line: 0, character: 1} - active: {line: 0, character: 1} - marks: {} -finalState: - documentContents: |- - a - b - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - thatMark: - - type: UntypedTarget - contentRange: - start: {line: 1, character: 0} - end: {line: 1, character: 0} - isReversed: false - hasExplicitRange: true diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/breakJustThis2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/breakJustThis2.yml deleted file mode 100644 index 9f1dcf7464c..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/breakJustThis2.yml +++ /dev/null @@ -1,32 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: break just this - action: - name: breakLine - target: - type: primitive - mark: {type: cursor} - modifiers: - - {type: toRawSelection} - usePrePhraseSnapshot: true -initialState: - documentContents: " ab " - selections: - - anchor: {line: 0, character: 5} - active: {line: 0, character: 5} - marks: {} -finalState: - documentContents: |2- - a - b - selections: - - anchor: {line: 1, character: 4} - active: {line: 1, character: 4} - thatMark: - - type: UntypedTarget - contentRange: - start: {line: 1, character: 4} - end: {line: 1, character: 4} - isReversed: false - hasExplicitRange: true diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/callFine.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/callFine.yml index ce28c2d8d3b..1dd484ddee8 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/callFine.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/callFine.yml @@ -7,6 +7,7 @@ command: - type: primitive mark: {type: decoratedSymbol, symbolColor: default, character: f} - {type: primitive, isImplicit: true} +spokenFormError: Action 'callAsFunction' with argument initialState: documentContents: |- foo; diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/callFineOnBatt.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/callFineOnBatt.yml deleted file mode 100644 index 990596ee6a6..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/callFineOnBatt.yml +++ /dev/null @@ -1,41 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: call fine on bat - action: - name: callAsFunction - callee: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: f} - argument: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: b} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - foo - bar - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: - default.f: - start: {line: 0, character: 0} - end: {line: 0, character: 3} - default.b: - start: {line: 1, character: 0} - end: {line: 1, character: 3} -finalState: - documentContents: |- - foo - foo(bar) - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - thatMark: - - type: UntypedTarget - contentRange: - start: {line: 1, character: 0} - end: {line: 1, character: 8} - isReversed: false - hasExplicitRange: true diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/callVest.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/callVest.yml index 0796f6d295b..dd90002c66a 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/callVest.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/callVest.yml @@ -7,6 +7,7 @@ command: - type: primitive mark: {type: decoratedSymbol, symbolColor: default, character: v} - {type: primitive, isImplicit: true} +spokenFormError: Action 'callAsFunction' with argument initialState: documentContents: | diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/callVestOnCap.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/callVestOnCap.yml index cb557fe47cc..f7f9d4688a3 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/callVestOnCap.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/callVestOnCap.yml @@ -8,6 +8,7 @@ command: mark: {type: decoratedSymbol, symbolColor: default, character: v} - type: primitive mark: {type: decoratedSymbol, symbolColor: default, character: c} +spokenFormError: Action 'callAsFunction' with argument initialState: documentContents: | diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/changeNextInstanceChar.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/changeNextInstanceChar.yml deleted file mode 100644 index ce81a4e812f..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/changeNextInstanceChar.yml +++ /dev/null @@ -1,42 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: change next instance char - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: relativeScope - scopeType: {type: instance} - offset: 1 - length: 1 - direction: forward - - type: containingScope - scopeType: {type: character} - usePrePhraseSnapshot: true -initialState: - documentContents: aba aaa - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} - instanceReferenceMark: - - type: UntypedTarget - contentRange: - start: {line: 0, character: 0} - end: {line: 0, character: 0} - isReversed: false - hasExplicitRange: false -finalState: - documentContents: ba aaa - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - thatMark: - - type: RawSelectionTarget - contentRange: - start: {line: 0, character: 0} - end: {line: 0, character: 0} - isReversed: false - hasExplicitRange: true diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/decrementFile.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/decrementFile.yml deleted file mode 100644 index 3a359d2da32..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/decrementFile.yml +++ /dev/null @@ -1,162 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: decrement file - action: - name: decrement - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: document} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - foo - - 0 - 1 - 0.5 - 1.5 - - -0 - -1 - -0.5 - -1.5 - - 0rem - 1rem - 0.5rem - 1.5rem - - -0rem - -1rem - -0.5rem - -1.5rem - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: |- - foo - - -1 - 0 - 0.4 - 0.5 - - -1 - -2 - -0.6 - -2.5 - - -1rem - 0rem - 0.4rem - 0.5rem - - -1rem - -2rem - -0.6rem - -2.5rem - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - thatMark: - - type: UntypedTarget - contentRange: - start: {line: 2, character: 0} - end: {line: 2, character: 2} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 3, character: 0} - end: {line: 3, character: 1} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 4, character: 0} - end: {line: 4, character: 3} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 5, character: 0} - end: {line: 5, character: 3} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 7, character: 0} - end: {line: 7, character: 2} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 8, character: 0} - end: {line: 8, character: 2} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 9, character: 0} - end: {line: 9, character: 4} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 10, character: 0} - end: {line: 10, character: 4} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 12, character: 0} - end: {line: 12, character: 2} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 13, character: 0} - end: {line: 13, character: 1} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 14, character: 0} - end: {line: 14, character: 3} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 15, character: 0} - end: {line: 15, character: 3} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 17, character: 0} - end: {line: 17, character: 2} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 18, character: 0} - end: {line: 18, character: 2} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 19, character: 0} - end: {line: 19, character: 4} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 20, character: 0} - end: {line: 20, character: 4} - isReversed: false - hasExplicitRange: true diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/findVest.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/findVest.yml new file mode 100644 index 00000000000..8befe1d3a5a --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/findVest.yml @@ -0,0 +1,37 @@ +languageId: typescript +command: + version: 1 + spokenForm: scout vest + action: getText + targets: + - type: primitive + mark: {type: decoratedSymbol, symbolColor: default, character: v} + extraArgs: + - {showDecorations: null, ensureSingleTarget: true} +spokenFormError: Action 'getText' +initialState: + documentContents: | + + const value = "Hello world"; + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} + marks: + default.v: + start: {line: 1, character: 6} + end: {line: 1, character: 11} +finalState: + documentContents: | + + const value = "Hello world"; + selections: + - anchor: {line: 0, character: 0} + active: {line: 0, character: 0} + thatMark: + - type: UntypedTarget + contentRange: + start: {line: 1, character: 6} + end: {line: 1, character: 11} + isReversed: false + hasExplicitRange: false +returnValue: [value] diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/fromThis.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/fromThis.yml deleted file mode 100644 index 119874995bb..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/fromThis.yml +++ /dev/null @@ -1,35 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: from this - action: - name: experimental.setInstanceReference - target: - type: primitive - mark: {type: cursor} - usePrePhraseSnapshot: true -initialState: - documentContents: aba aaa - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: aba aaa - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - thatMark: - - type: UntypedTarget - contentRange: - start: {line: 0, character: 0} - end: {line: 0, character: 0} - isReversed: false - hasExplicitRange: false - instanceReferenceMark: - - type: UntypedTarget - contentRange: - start: {line: 0, character: 0} - end: {line: 0, character: 0} - isReversed: false - hasExplicitRange: false diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/getTextAir.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/getTextAir.yml index 1a74a188fc8..2ef5ca5c184 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/getTextAir.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/getTextAir.yml @@ -3,7 +3,7 @@ command: version: 6 action: name: getText - options: {showDecorations: false} + options: {showDecorations: false, ensureSingleTarget: null} target: type: primitive mark: {type: decoratedSymbol, symbolColor: default, character: a} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/incrementFile.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/incrementFile.yml deleted file mode 100644 index 46f764d49e5..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/incrementFile.yml +++ /dev/null @@ -1,162 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: increment file - action: - name: increment - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: document} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - foo - - 0 - 1 - 0.5 - 1.5 - - -0 - -1 - -0.5 - -1.5 - - 0rem - 1rem - 0.5rem - 1.5rem - - -0rem - -1rem - -0.5rem - -1.5rem - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: |- - foo - - 1 - 2 - 0.6 - 2.5 - - 1 - 0 - -0.4 - -0.5 - - 1rem - 2rem - 0.6rem - 2.5rem - - 1rem - 0rem - -0.4rem - -0.5rem - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - thatMark: - - type: UntypedTarget - contentRange: - start: {line: 2, character: 0} - end: {line: 2, character: 1} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 3, character: 0} - end: {line: 3, character: 1} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 4, character: 0} - end: {line: 4, character: 3} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 5, character: 0} - end: {line: 5, character: 3} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 7, character: 0} - end: {line: 7, character: 1} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 8, character: 0} - end: {line: 8, character: 1} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 9, character: 0} - end: {line: 9, character: 4} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 10, character: 0} - end: {line: 10, character: 4} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 12, character: 0} - end: {line: 12, character: 1} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 13, character: 0} - end: {line: 13, character: 1} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 14, character: 0} - end: {line: 14, character: 3} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 15, character: 0} - end: {line: 15, character: 3} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 17, character: 0} - end: {line: 17, character: 1} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 18, character: 0} - end: {line: 18, character: 1} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 19, character: 0} - end: {line: 19, character: 4} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 20, character: 0} - end: {line: 20, character: 4} - isReversed: false - hasExplicitRange: true diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/incrementLineFourAndEveryTokenOne.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/incrementLineFourAndEveryTokenOne.yml deleted file mode 100644 index 6fde7838b6a..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/incrementLineFourAndEveryTokenOne.yml +++ /dev/null @@ -1,74 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: increment line four and every token one - action: - name: increment - target: - type: list - elements: - - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: '4'} - modifiers: - - type: containingScope - scopeType: {type: line} - - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: '1'} - modifiers: - - type: everyScope - scopeType: {type: token} - usePrePhraseSnapshot: true -initialState: - documentContents: | - 1 * 2 - 3 - 4 5 6 - selections: - - anchor: {line: 3, character: 0} - active: {line: 3, character: 0} - marks: - default.4: - start: {line: 2, character: 0} - end: {line: 2, character: 1} - default.1: - start: {line: 0, character: 0} - end: {line: 0, character: 1} -finalState: - documentContents: | - 2 * 3 - 3 - 5 6 7 - selections: - - anchor: {line: 3, character: 0} - active: {line: 3, character: 0} - thatMark: - - type: UntypedTarget - contentRange: - start: {line: 2, character: 0} - end: {line: 2, character: 1} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 2, character: 2} - end: {line: 2, character: 3} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 2, character: 4} - end: {line: 2, character: 5} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 0, character: 0} - end: {line: 0, character: 1} - isReversed: false - hasExplicitRange: true - - type: UntypedTarget - contentRange: - start: {line: 0, character: 4} - end: {line: 0, character: 5} - isReversed: false - hasExplicitRange: true diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/incrementThree.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/incrementThree.yml deleted file mode 100644 index bac94b99875..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/incrementThree.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: increment three - action: - name: increment - target: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: '3'} - usePrePhraseSnapshot: true -initialState: - documentContents: 1.37.2 - selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} - marks: - default.3: - start: {line: 0, character: 2} - end: {line: 0, character: 4} -finalState: - documentContents: 1.38.2 - selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} - thatMark: - - type: UntypedTarget - contentRange: - start: {line: 0, character: 2} - end: {line: 0, character: 4} - isReversed: false - hasExplicitRange: true diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinAir.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinAir.yml deleted file mode 100644 index 787e8f6ab72..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinAir.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: join air - action: - name: joinLines - target: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: a} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - aaa - bbb - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: - default.a: - start: {line: 0, character: 0} - end: {line: 0, character: 3} -finalState: - documentContents: aaa bbb - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - thatMark: - - type: UntypedTarget - contentRange: - start: {line: 0, character: 0} - end: {line: 0, character: 3} - isReversed: false - hasExplicitRange: true diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinAir2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinAir2.yml deleted file mode 100644 index 75ce85ca86c..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinAir2.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: join air - action: - name: joinLines - target: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: a} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - aaa - bbb - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: - default.a: - start: {line: 0, character: 0} - end: {line: 0, character: 3} -finalState: - documentContents: aaa bbb - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - thatMark: - - type: UntypedTarget - contentRange: - start: {line: 0, character: 0} - end: {line: 0, character: 3} - isReversed: false - hasExplicitRange: true diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinAir3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinAir3.yml deleted file mode 100644 index 0cc8c8dfdb9..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinAir3.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: join air - action: - name: joinLines - target: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: a} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - aaa - bbb - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: - default.a: - start: {line: 0, character: 0} - end: {line: 0, character: 3} -finalState: - documentContents: aaa bbb - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - thatMark: - - type: UntypedTarget - contentRange: - start: {line: 0, character: 0} - end: {line: 0, character: 3} - isReversed: false - hasExplicitRange: true diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinAir4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinAir4.yml deleted file mode 100644 index 95d45b19dba..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinAir4.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: join air - action: - name: joinLines - target: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: a} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - aaa - bbb - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: - default.a: - start: {line: 0, character: 0} - end: {line: 0, character: 3} -finalState: - documentContents: aaa bbb - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - thatMark: - - type: UntypedTarget - contentRange: - start: {line: 0, character: 0} - end: {line: 0, character: 3} - isReversed: false - hasExplicitRange: true diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinBlock.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinBlock.yml deleted file mode 100644 index 1105dfa8b1b..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinBlock.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: join block - action: - name: joinLines - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: paragraph} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - aaa - bbb - ccc - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: aaa bbb ccc - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - thatMark: - - type: UntypedTarget - contentRange: - start: {line: 0, character: 0} - end: {line: 0, character: 11} - isReversed: false - hasExplicitRange: true diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinFile.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinFile.yml deleted file mode 100644 index 3254c7a02e1..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinFile.yml +++ /dev/null @@ -1,35 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: join file - action: - name: joinLines - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: document} - usePrePhraseSnapshot: true -initialState: - documentContents: |+ - aaa - - bbb - - - selections: - - anchor: {line: 5, character: 0} - active: {line: 5, character: 0} - marks: {} -finalState: - documentContents: aaa bbb - selections: - - anchor: {line: 0, character: 7} - active: {line: 0, character: 7} - thatMark: - - type: UntypedTarget - contentRange: - start: {line: 0, character: 0} - end: {line: 0, character: 7} - isReversed: false - hasExplicitRange: true diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinLineThis.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinLineThis.yml deleted file mode 100644 index e94fe433793..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinLineThis.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: join this - action: - name: joinLines - target: - type: primitive - mark: {type: cursor} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - aaa - - bbb - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: |- - aaa - bbb - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - thatMark: - - type: UntypedTarget - contentRange: - start: {line: 0, character: 0} - end: {line: 0, character: 3} - isReversed: false - hasExplicitRange: true diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinTwoLines.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinTwoLines.yml deleted file mode 100644 index 3446c208df2..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/joinTwoLines.yml +++ /dev/null @@ -1,38 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: join two lines - action: - name: joinLines - target: - type: primitive - modifiers: - - type: relativeScope - scopeType: {type: line} - offset: 0 - length: 2 - direction: forward - usePrePhraseSnapshot: true -initialState: - documentContents: |- - aaa - bbb - ccc - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: |- - aaa bbb - ccc - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - thatMark: - - type: UntypedTarget - contentRange: - start: {line: 0, character: 0} - end: {line: 0, character: 7} - isReversed: false - hasExplicitRange: true diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/parseTreeFile.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/parseTreeFile.yml deleted file mode 100644 index 95de60ec68c..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/parseTreeFile.yml +++ /dev/null @@ -1,30 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: parse tree file - action: - name: private.showParseTree - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: document} - usePrePhraseSnapshot: true -initialState: - documentContents: const value = 2; - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: const value = 2; - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - thatMark: - - type: DocumentTarget - contentRange: - start: {line: 0, character: 0} - end: {line: 0, character: 16} - isReversed: false - hasExplicitRange: true diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/scoutAir.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/scoutAir.yml deleted file mode 100644 index 5483392a6ac..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/scoutAir.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: scout air - action: - name: findInDocument - target: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: a} - usePrePhraseSnapshot: true -initialState: - documentContents: aaa - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: - default.a: - start: {line: 0, character: 0} - end: {line: 0, character: 3} -finalState: - documentContents: aaa - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - thatMark: - - type: UntypedTarget - contentRange: - start: {line: 0, character: 0} - end: {line: 0, character: 3} - isReversed: false - hasExplicitRange: false diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/scoutAllAir.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/scoutAllAir.yml deleted file mode 100644 index 6b5e0c9504d..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/scoutAllAir.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: scout all air - action: - name: findInWorkspace - target: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: a} - usePrePhraseSnapshot: true -initialState: - documentContents: aaa - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: - default.a: - start: {line: 0, character: 0} - end: {line: 0, character: 3} -finalState: - documentContents: aaa - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - thatMark: - - type: UntypedTarget - contentRange: - start: {line: 0, character: 0} - end: {line: 0, character: 3} - isReversed: false - hasExplicitRange: false diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/snippets/customInsertAfterWhale2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/snippets/customInsertAfterWhale2.yml index 8278ae11fcb..d2c358da2b1 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/snippets/customInsertAfterWhale2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/snippets/customInsertAfterWhale2.yml @@ -7,8 +7,7 @@ command: args: - type: custom body: "dummy snippet hole1: ($hole1), hole2: ($hole2)" - scopeTypes: - - {type: line} + scopeType: {type: line} targets: - type: primitive mark: {type: decoratedSymbol, symbolColor: default, character: w} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/snippets/ifWrapCap.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/snippets/ifWrapCap.yml deleted file mode 100644 index dcdbd5eaeea..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/snippets/ifWrapCap.yml +++ /dev/null @@ -1,40 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: if wrap cap - action: - name: wrapWithSnippet - snippetDescription: - type: custom - body: "if ($1) {\n\t$0\n}" - scopeType: {type: statement} - variableName: "0" - target: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: c} - usePrePhraseSnapshot: true -spokenFormError: Custom wrap with snippet -initialState: - documentContents: const value = 2; - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: - default.c: - start: {line: 0, character: 0} - end: {line: 0, character: 5} -finalState: - documentContents: |- - if () { - const value = 2; - } - selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} - thatMark: - - type: UntypedTarget - contentRange: - start: {line: 0, character: 0} - end: {line: 2, character: 1} - isReversed: false - hasExplicitRange: true diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/snippets/snipPrintAfterPit.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/snippets/snipPrintAfterPit.yml deleted file mode 100644 index 19c2f19ca9b..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/actions/snippets/snipPrintAfterPit.yml +++ /dev/null @@ -1,47 +0,0 @@ -languageId: python -command: - version: 6 - spokenForm: snip print after pit - action: - name: insertSnippet - snippetDescription: - type: custom - body: print($0) - scopeTypes: - - {type: namedFunction} - - {type: statement} - destination: - type: primitive - insertionMode: after - target: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: p} - usePrePhraseSnapshot: true -spokenFormError: Custom insertion snippet -initialState: - documentContents: | - def my_funk(): - print("allow") - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: - default.p: - start: {line: 1, character: 4} - end: {line: 1, character: 9} -finalState: - documentContents: | - def my_funk(): - print("allow") - - print() - selections: - - anchor: {line: 3, character: 6} - active: {line: 3, character: 6} - thatMark: - - type: UntypedTarget - contentRange: - start: {line: 3, character: 0} - end: {line: 3, character: 7} - isReversed: false - hasExplicitRange: true diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/containingScope/changeGrandState.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/containingScope/changeGrandState.yml deleted file mode 100644 index dd890307c35..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/containingScope/changeGrandState.yml +++ /dev/null @@ -1,27 +0,0 @@ -languageId: javascript -command: - version: 6 - spokenForm: change grand state - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: statement} - ancestorIndex: 1 - usePrePhraseSnapshot: true -initialState: - documentContents: |- - function myFunk() { - const value = 2 - } - selections: - - anchor: {line: 1, character: 4} - active: {line: 1, character: 4} - marks: {} -finalState: - documentContents: "" - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/containingScope/changeGrandState2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/containingScope/changeGrandState2.yml deleted file mode 100644 index 4a13a62f9f3..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/containingScope/changeGrandState2.yml +++ /dev/null @@ -1,26 +0,0 @@ -languageId: python -command: - version: 6 - spokenForm: change grand state - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: statement} - ancestorIndex: 1 - usePrePhraseSnapshot: true -initialState: - documentContents: |- - def my_funk(): - value = 2 - selections: - - anchor: {line: 1, character: 4} - active: {line: 1, character: 4} - marks: {} -finalState: - documentContents: "" - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/containingScope/changeGrandState3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/containingScope/changeGrandState3.yml deleted file mode 100644 index 59240fd15e6..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/containingScope/changeGrandState3.yml +++ /dev/null @@ -1,29 +0,0 @@ -languageId: javascript -command: - version: 6 - spokenForm: change grand state - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: statement} - ancestorIndex: 1 - usePrePhraseSnapshot: true -initialState: - documentContents: |- - class MyClass { - myFunk() { - - } - } - selections: - - anchor: {line: 2, character: 8} - active: {line: 2, character: 8} - marks: {} -finalState: - documentContents: "" - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/containingScope/clearWord.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/containingScope/clearWord.yml index e6e6ed54855..789bea01d39 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/containingScope/clearWord.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/containingScope/clearWord.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: change sub + spokenForm: change word version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/containingScope/clearWord2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/containingScope/clearWord2.yml index 2350056b8ac..c06833afd2f 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/containingScope/clearWord2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/containingScope/clearWord2.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: change sub + spokenForm: change word version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/customRegex/clearWhite.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/customRegex/clearWhite.yml index 14cb2f4936f..e383561f606 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/customRegex/clearWhite.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/customRegex/clearWhite.yml @@ -9,9 +9,7 @@ command: scopeType: {type: customRegex, regex: '\p{Zs}+'} usePrePhraseSnapshot: true action: {name: clearAndSetSelection} -spokenFormError: >- - custom regex with id \p{Zs}+; please see - https://www.cursorless.org/docs/user/customization/ for more information +spokenFormError: Scope type 'customRegex' initialState: documentContents: "\" \"" selections: diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/decorations/chuckBlockAirUntilBatt.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/decorations/chuckBlockAirUntilBatt.yml index 5662c395007..576f5503ac1 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/decorations/chuckBlockAirUntilBatt.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/decorations/chuckBlockAirUntilBatt.yml @@ -39,7 +39,6 @@ initialState: end: {line: 5, character: 1} finalState: documentContents: | - b c d e f g @@ -49,4 +48,4 @@ finalState: ide: flashes: - style: pendingDelete - range: {type: line, start: 1, end: 4} + range: {type: line, start: 0, end: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/decorations/chuckBlockBattUntilAir.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/decorations/chuckBlockBattUntilAir.yml index 67d43756d9c..63704811285 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/decorations/chuckBlockBattUntilAir.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/decorations/chuckBlockBattUntilAir.yml @@ -38,7 +38,7 @@ initialState: start: {line: 1, character: 0} end: {line: 1, character: 1} finalState: - documentContents: | + documentContents: |- a a @@ -48,4 +48,4 @@ finalState: ide: flashes: - style: pendingDelete - range: {type: line, start: 3, end: 7} + range: {type: line, start: 3, end: 8} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/everyScope/changeEveryLine.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/everyScope/changeEveryLine.yml deleted file mode 100644 index 306d46f4356..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/everyScope/changeEveryLine.yml +++ /dev/null @@ -1,39 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: change every line - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: line} - usePrePhraseSnapshot: true -initialState: - documentContents: | - - a - - b c - d e - f g - selections: - - anchor: {line: 3, character: 0} - active: {line: 3, character: 0} - marks: {} -finalState: - documentContents: |+ - - a - - - - - selections: - - anchor: {line: 3, character: 0} - active: {line: 3, character: 0} - - anchor: {line: 4, character: 0} - active: {line: 4, character: 0} - - anchor: {line: 5, character: 0} - active: {line: 5, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/chuckSecondWordThat.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/chuckSecondWordThat.yml index f0baa72479a..90b308ad1b3 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/chuckSecondWordThat.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/chuckSecondWordThat.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: chuck second sub that + spokenForm: chuck second word that version: 2 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearFirstCarSecondWordHarp.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearFirstCarSecondWordHarp.yml index 67b37619159..fce8984fad5 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearFirstCarSecondWordHarp.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearFirstCarSecondWordHarp.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: change first char second sub harp + spokenForm: change first char second word harp version: 2 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearFirstWordPastTrap.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearFirstWordPastTrap.yml index a6fbaa1701c..209863677dd 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearFirstWordPastTrap.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearFirstWordPastTrap.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: change first sub past trap + spokenForm: change first word past trap version: 2 targets: - type: range diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearFirstWordThat.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearFirstWordThat.yml index 5ace03b3c03..a4e494005ca 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearFirstWordThat.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearFirstWordThat.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: change first sub that + spokenForm: change first word that version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearLeadingSecondWord.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearLeadingSecondWord.yml index 51c1d29417e..468aba064f1 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearLeadingSecondWord.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearLeadingSecondWord.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: change leading second sub + spokenForm: change leading second word version: 2 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearSecondWord.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearSecondWord.yml index 5ba8a97ec7f..8f2de1c6006 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearSecondWord.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearSecondWord.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: change second sub + spokenForm: change second word version: 2 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearSecondWord2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearSecondWord2.yml index 05f44a286af..e5951cf5242 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearSecondWord2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearSecondWord2.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: change second sub + spokenForm: change second word version: 2 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearSecondWordAir.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearSecondWordAir.yml index e2a2d34a271..36eaee0a161 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearSecondWordAir.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/implicitExpansion/clearSecondWordAir.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: change second sub air + spokenForm: change second word air version: 2 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/inference/takeFirstWord.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/inference/takeFirstWord.yml index 4993ec7de7d..4d63bcfa152 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/inference/takeFirstWord.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/inference/takeFirstWord.yml @@ -1,7 +1,7 @@ languageId: typescript command: version: 1 - spokenForm: take first sub + spokenForm: take first word action: setSelection targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/inference/takeHarpAndStringEach.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/inference/takeHarpAndStringEach.yml index e31761c62a5..5889176cf64 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/inference/takeHarpAndStringEach.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/inference/takeHarpAndStringEach.yml @@ -1,7 +1,7 @@ languageId: typescript command: version: 1 - spokenForm: take harp and parse tree string each + spokenForm: take harp and string each action: setSelection targets: - type: list @@ -11,9 +11,7 @@ command: - type: primitive modifier: {type: containingScope, scopeType: string} mark: {type: decoratedSymbol, symbolColor: default, character: e} -spokenFormError: >- - simple scope type type with id string; this is a private spoken form currently - only for internal experimentation +spokenFormError: Scope type 'string' initialState: documentContents: | diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/inference/takeHarpPastStringEach.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/inference/takeHarpPastStringEach.yml index 254e53f347c..09045e44a1a 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/inference/takeHarpPastStringEach.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/inference/takeHarpPastStringEach.yml @@ -1,7 +1,7 @@ languageId: typescript command: version: 1 - spokenForm: take harp past parse tree string each + spokenForm: take harp past string each action: setSelection targets: - type: range @@ -14,9 +14,7 @@ command: mark: {type: decoratedSymbol, symbolColor: default, character: e} excludeStart: false excludeEnd: false -spokenFormError: >- - simple scope type type with id string; this is a private spoken form currently - only for internal experimentation +spokenFormError: Scope type 'string' initialState: documentContents: | diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/inference/takeStringHarpAndEach.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/inference/takeStringHarpAndEach.yml index 772fd0e5ff4..cddc264ee18 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/inference/takeStringHarpAndEach.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/inference/takeStringHarpAndEach.yml @@ -1,7 +1,7 @@ languageId: typescript command: version: 1 - spokenForm: take parse tree string harp and each + spokenForm: take string harp and each action: setSelection targets: - type: list @@ -11,9 +11,7 @@ command: mark: {type: decoratedSymbol, symbolColor: default, character: h} - type: primitive mark: {type: decoratedSymbol, symbolColor: default, character: e} -spokenFormError: >- - simple scope type type with id string; this is a private spoken form currently - only for internal experimentation +spokenFormError: Scope type 'string' initialState: documentContents: | diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/inference/takeStringHarpPastEach.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/inference/takeStringHarpPastEach.yml index 6fd0480dca8..cd736de89a4 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/inference/takeStringHarpPastEach.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/inference/takeStringHarpPastEach.yml @@ -1,7 +1,7 @@ languageId: typescript command: version: 1 - spokenForm: take parse tree string harp past each + spokenForm: take string harp past each action: setSelection targets: - type: range @@ -14,9 +14,7 @@ command: mark: {type: decoratedSymbol, symbolColor: default, character: e} excludeStart: false excludeEnd: false -spokenFormError: >- - simple scope type type with id string; this is a private spoken form currently - only for internal experimentation +spokenFormError: Scope type 'string' initialState: documentContents: | diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/itemTextual/cloneTwoArgs.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/itemTextual/cloneTwoArgs.yml deleted file mode 100644 index 3c545296235..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/itemTextual/cloneTwoArgs.yml +++ /dev/null @@ -1,26 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: clone two args - action: - name: insertCopyAfter - target: - type: primitive - modifiers: - - type: relativeScope - scopeType: {type: argumentOrParameter} - offset: 0 - length: 2 - direction: forward - usePrePhraseSnapshot: true -initialState: - documentContents: aaa(bbb, ccc) - selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} - marks: {} -finalState: - documentContents: aaa(bbb, ccc, bbb, ccc) - selections: - - anchor: {line: 0, character: 14} - active: {line: 0, character: 14} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/itemTextual/cloneTwoItems.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/itemTextual/cloneTwoItems.yml deleted file mode 100644 index 3c3aabaf421..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/itemTextual/cloneTwoItems.yml +++ /dev/null @@ -1,26 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: clone two items - action: - name: insertCopyAfter - target: - type: primitive - modifiers: - - type: relativeScope - scopeType: {type: collectionItem} - offset: 0 - length: 2 - direction: forward - usePrePhraseSnapshot: true -initialState: - documentContents: (aaa, bbb) - selections: - - anchor: {line: 0, character: 1} - active: {line: 0, character: 1} - marks: {} -finalState: - documentContents: (aaa, bbb, aaa, bbb) - selections: - - anchor: {line: 0, character: 11} - active: {line: 0, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/cpp/clearSubject.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/cpp/clearSubject.yml index 6339e98c144..dd7876f978f 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/cpp/clearSubject.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/cpp/clearSubject.yml @@ -7,11 +7,9 @@ command: - type: primitive modifiers: - type: containingScope - scopeType: {type: private.switchStatementSubject} + scopeType: {type: switchStatementSubject} usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.switchStatementSubject; this is a - private spoken form currently only for internal experimentation +spokenFormError: Scope type 'switchStatementSubject' initialState: documentContents: | int main() { diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/cpp/clearSubject2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/cpp/clearSubject2.yml index 8d172c76125..b01328d27f1 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/cpp/clearSubject2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/cpp/clearSubject2.yml @@ -7,11 +7,9 @@ command: - type: primitive modifiers: - type: containingScope - scopeType: {type: private.switchStatementSubject} + scopeType: {type: switchStatementSubject} usePrePhraseSnapshot: false -spokenFormError: >- - simple scope type type with id private.switchStatementSubject; this is a - private spoken form currently only for internal experimentation +spokenFormError: Scope type 'switchStatementSubject' initialState: documentContents: | int main() { diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/cpp/takeString.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/cpp/takeString.yml index ca13958b19f..bcd97676e5a 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/cpp/takeString.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/cpp/takeString.yml @@ -1,14 +1,12 @@ languageId: cpp command: version: 1 - spokenForm: take parse tree string + spokenForm: take string action: setSelection targets: - type: primitive modifier: {type: containingScope, scopeType: string} -spokenFormError: >- - simple scope type type with id string; this is a private spoken form currently - only for internal experimentation +spokenFormError: Scope type 'string' initialState: documentContents: | char* a = "hello world"; diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/csharp/clearSubject.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/csharp/clearSubject.yml index 900f4aaad01..d2da4cdfd03 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/csharp/clearSubject.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/csharp/clearSubject.yml @@ -7,11 +7,9 @@ command: - type: primitive modifiers: - type: containingScope - scopeType: {type: private.switchStatementSubject} + scopeType: {type: switchStatementSubject} usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.switchStatementSubject; this is a - private spoken form currently only for internal experimentation +spokenFormError: Scope type 'switchStatementSubject' initialState: documentContents: |- switch (aaa) { diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/csharp/clearSubject2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/csharp/clearSubject2.yml index 9fe3e89bd38..c998355f1f1 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/csharp/clearSubject2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/csharp/clearSubject2.yml @@ -7,11 +7,9 @@ command: - type: primitive modifiers: - type: containingScope - scopeType: {type: private.switchStatementSubject} + scopeType: {type: switchStatementSubject} usePrePhraseSnapshot: false -spokenFormError: >- - simple scope type type with id private.switchStatementSubject; this is a - private spoken form currently only for internal experimentation +spokenFormError: Scope type 'switchStatementSubject' initialState: documentContents: |- switch (aaa + 1) { diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranch.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranch.yml deleted file mode 100644 index cf5fba1475a..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranch.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: go -command: - version: 6 - spokenForm: change branch - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: "if x {\n\tx++\n} else {\n\tx--\n}" - selections: - - anchor: {line: 4, character: 1} - active: {line: 4, character: 1} - marks: {} -finalState: - documentContents: "if x {\n\tx++\n} " - selections: - - anchor: {line: 2, character: 2} - active: {line: 2, character: 2} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranch2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranch2.yml deleted file mode 100644 index a15eafb9679..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranch2.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: go -command: - version: 6 - spokenForm: change branch - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: "if x {\n\tx++\n} else {\n\tx--\n}" - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: " else {\n\tx--\n}" - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranch3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranch3.yml deleted file mode 100644 index ea3cda03181..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranch3.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: go -command: - version: 6 - spokenForm: change branch - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: "if x {\n\tx++\n} else if y {\n\ty++\n} else {\n\tx--\n}" - selections: - - anchor: {line: 2, character: 7} - active: {line: 2, character: 7} - marks: {} -finalState: - documentContents: "if x {\n\tx++\n} else {\n\tx--\n}" - selections: - - anchor: {line: 2, character: 2} - active: {line: 2, character: 2} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranchAir.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranchAir.yml deleted file mode 100644 index fabb4747d67..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranchAir.yml +++ /dev/null @@ -1,36 +0,0 @@ -languageId: go -command: - version: 6 - spokenForm: change branch air - action: - name: clearAndSetSelection - target: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: a} - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - switch x { - case 1: - case 2: - panic(x) - } - selections: - - anchor: {line: 4, character: 1} - active: {line: 4, character: 1} - marks: - default.a: - start: {line: 2, character: 0} - end: {line: 2, character: 4} -finalState: - documentContents: |- - switch x { - case 1: - - } - selections: - - anchor: {line: 2, character: 0} - active: {line: 2, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranchCap.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranchCap.yml deleted file mode 100644 index 4e5a03bf54d..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranchCap.yml +++ /dev/null @@ -1,35 +0,0 @@ -languageId: go -command: - version: 6 - spokenForm: change branch cap - action: - name: clearAndSetSelection - target: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: c} - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - switch x { - case 1: - case 2: - } - selections: - - anchor: {line: 2, character: 7} - active: {line: 2, character: 7} - marks: - default.c: - start: {line: 1, character: 0} - end: {line: 1, character: 4} -finalState: - documentContents: |- - switch x { - - case 2: - } - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranchCap2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranchCap2.yml deleted file mode 100644 index a28dcadf4d9..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranchCap2.yml +++ /dev/null @@ -1,37 +0,0 @@ -languageId: go -command: - version: 6 - spokenForm: change branch cap - action: - name: clearAndSetSelection - target: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: c} - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - switch x := x.(type) { - case int: - default: - panic(x) - } - selections: - - anchor: {line: 2, character: 8} - active: {line: 2, character: 8} - marks: - default.c: - start: {line: 1, character: 0} - end: {line: 1, character: 4} -finalState: - documentContents: |- - switch x := x.(type) { - - default: - panic(x) - } - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranchDrum.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranchDrum.yml deleted file mode 100644 index 34e90746b66..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeBranchDrum.yml +++ /dev/null @@ -1,36 +0,0 @@ -languageId: go -command: - version: 6 - spokenForm: change branch drum - action: - name: clearAndSetSelection - target: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: d} - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - switch x := x.(type) { - case int: - default: - panic(x) - } - selections: - - anchor: {line: 2, character: 8} - active: {line: 2, character: 8} - marks: - default.d: - start: {line: 2, character: 0} - end: {line: 2, character: 7} -finalState: - documentContents: |- - switch x := x.(type) { - case int: - - } - selections: - - anchor: {line: 2, character: 0} - active: {line: 2, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeEveryBranch.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeEveryBranch.yml deleted file mode 100644 index 1b2006169a5..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeEveryBranch.yml +++ /dev/null @@ -1,27 +0,0 @@ -languageId: go -command: - version: 6 - spokenForm: change every branch - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: "if x {\n\tx++\n} else if y {\n\ty++\n} else {\n\tx--\n}" - selections: - - anchor: {line: 0, character: 1} - active: {line: 0, character: 1} - marks: {} -finalState: - documentContents: " " - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - - anchor: {line: 0, character: 1} - active: {line: 0, character: 1} - - anchor: {line: 0, character: 2} - active: {line: 0, character: 2} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeEveryBranch2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeEveryBranch2.yml deleted file mode 100644 index 26a2679316d..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeEveryBranch2.yml +++ /dev/null @@ -1,27 +0,0 @@ -languageId: go -command: - version: 6 - spokenForm: change every branch - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: "if x {\n\tx++\n} else if y {\n\ty++\n} else {\n\tx--\n}" - selections: - - anchor: {line: 2, character: 4} - active: {line: 2, character: 4} - marks: {} -finalState: - documentContents: " " - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - - anchor: {line: 0, character: 1} - active: {line: 0, character: 1} - - anchor: {line: 0, character: 2} - active: {line: 0, character: 2} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeEveryBranchEach.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeEveryBranchEach.yml deleted file mode 100644 index 65a4b3d688d..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeEveryBranchEach.yml +++ /dev/null @@ -1,38 +0,0 @@ -languageId: go -command: - version: 6 - spokenForm: change every branch each - action: - name: clearAndSetSelection - target: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: e} - modifiers: - - type: everyScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - switch x := x.(type) { - case int: - default: - panic(x) - } - selections: - - anchor: {line: 2, character: 8} - active: {line: 2, character: 8} - marks: - default.e: - start: {line: 1, character: 0} - end: {line: 1, character: 4} -finalState: - documentContents: |- - switch x := x.(type) { - - - } - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - - anchor: {line: 2, character: 0} - active: {line: 2, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeEveryBranchSun.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeEveryBranchSun.yml deleted file mode 100644 index 8eb778e9c1e..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/changeEveryBranchSun.yml +++ /dev/null @@ -1,38 +0,0 @@ -languageId: go -command: - version: 6 - spokenForm: change every branch sun - action: - name: clearAndSetSelection - target: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: s} - modifiers: - - type: everyScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - switch x { - case 1: - default: - panic(x) - } - selections: - - anchor: {line: 0, character: 10} - active: {line: 0, character: 10} - marks: - default.s: - start: {line: 0, character: 0} - end: {line: 0, character: 6} -finalState: - documentContents: |- - switch x { - - - } - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - - anchor: {line: 2, character: 0} - active: {line: 2, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/chuckBranch.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/chuckBranch.yml deleted file mode 100644 index 4fdf9705655..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/chuckBranch.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: go -command: - version: 6 - spokenForm: chuck branch - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: "if x {\n\tx++\n} else if y {\n\ty++\n} else {\n\tx--\n}" - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: "else if y {\n\ty++\n} else {\n\tx--\n}" - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/chuckBranch2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/chuckBranch2.yml deleted file mode 100644 index ddf79a28baf..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/chuckBranch2.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: go -command: - version: 6 - spokenForm: chuck branch - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: "if x {\n\tx++\n} else if y {\n\ty++\n} else {\n\tx--\n}" - selections: - - anchor: {line: 2, character: 7} - active: {line: 2, character: 7} - marks: {} -finalState: - documentContents: "if x {\n\tx++\n} else {\n\tx--\n}" - selections: - - anchor: {line: 2, character: 2} - active: {line: 2, character: 2} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/chuckBranch3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/chuckBranch3.yml deleted file mode 100644 index 36fcaa68a61..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/chuckBranch3.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: go -command: - version: 6 - spokenForm: chuck branch - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: "if x {\n\tx++\n} else if y {\n\ty++\n} else {\n\tx--\n}" - selections: - - anchor: {line: 4, character: 7} - active: {line: 4, character: 7} - marks: {} -finalState: - documentContents: "if x {\n\tx++\n} else if y {\n\ty++\n}" - selections: - - anchor: {line: 4, character: 1} - active: {line: 4, character: 1} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranch.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranch.yml deleted file mode 100644 index ef81c6d1123..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranch.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: go -command: - version: 6 - spokenForm: clone branch - action: - name: insertCopyAfter - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: "if x {\n\tx++\n} else if y {\n\ty++\n} else {\n\tx--\n}" - selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} - marks: {} -finalState: - documentContents: "if x {\n\tx++\n} if x {\n\tx++\n} else if y {\n\ty++\n} else {\n\tx--\n}" - selections: - - anchor: {line: 2, character: 6} - active: {line: 2, character: 6} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranch2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranch2.yml deleted file mode 100644 index 1e0676338ee..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranch2.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: go -command: - version: 6 - spokenForm: clone branch - action: - name: insertCopyAfter - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: "if x {\n\tx++\n} else if y {\n\ty++\n} else {\n\tx--\n}" - selections: - - anchor: {line: 2, character: 4} - active: {line: 2, character: 4} - marks: {} -finalState: - documentContents: "if x {\n\tx++\n} else if y {\n\ty++\n} else if y {\n\ty++\n} else {\n\tx--\n}" - selections: - - anchor: {line: 4, character: 4} - active: {line: 4, character: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranch3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranch3.yml deleted file mode 100644 index a6c2babb386..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranch3.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: go -command: - version: 6 - spokenForm: clone branch - action: - name: insertCopyAfter - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: "if x {\n\tx++\n} else if y {\n\ty++\n} else {\n\tx--\n}" - selections: - - anchor: {line: 4, character: 4} - active: {line: 4, character: 4} - marks: {} -finalState: - documentContents: "if x {\n\tx++\n} else if y {\n\ty++\n} else {\n\tx--\n} else {\n\tx--\n}" - selections: - - anchor: {line: 6, character: 4} - active: {line: 6, character: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranchCap.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranchCap.yml deleted file mode 100644 index 98f6a9a136b..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranchCap.yml +++ /dev/null @@ -1,38 +0,0 @@ -languageId: go -command: - version: 6 - spokenForm: clone branch cap - action: - name: insertCopyAfter - target: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: c} - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - switch x { - case 1: - case 2: - panic(x) - } - selections: - - anchor: {line: 4, character: 1} - active: {line: 4, character: 1} - marks: - default.c: - start: {line: 1, character: 0} - end: {line: 1, character: 4} -finalState: - documentContents: |- - switch x { - case 1: - case 1: - case 2: - panic(x) - } - selections: - - anchor: {line: 5, character: 1} - active: {line: 5, character: 1} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranchDrum.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranchDrum.yml deleted file mode 100644 index 6582fb2687c..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranchDrum.yml +++ /dev/null @@ -1,39 +0,0 @@ -languageId: go -command: - version: 6 - spokenForm: clone branch drum - action: - name: insertCopyAfter - target: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: d} - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - switch x := x.(type) { - case int: - default: - panic(x) - } - selections: - - anchor: {line: 2, character: 8} - active: {line: 2, character: 8} - marks: - default.d: - start: {line: 2, character: 0} - end: {line: 2, character: 7} -finalState: - documentContents: |- - switch x := x.(type) { - case int: - default: - panic(x) - default: - panic(x) - } - selections: - - anchor: {line: 4, character: 8} - active: {line: 4, character: 8} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranchEach.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranchEach.yml deleted file mode 100644 index 5090a935471..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranchEach.yml +++ /dev/null @@ -1,39 +0,0 @@ -languageId: go -command: - version: 6 - spokenForm: clone branch each - action: - name: insertCopyAfter - target: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: e} - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - switch x { - case 1: - case 2: - panic(x) - } - selections: - - anchor: {line: 4, character: 1} - active: {line: 4, character: 1} - marks: - default.e: - start: {line: 2, character: 0} - end: {line: 2, character: 4} -finalState: - documentContents: |- - switch x { - case 1: - case 2: - panic(x) - case 2: - panic(x) - } - selections: - - anchor: {line: 6, character: 1} - active: {line: 6, character: 1} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranchEach2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranchEach2.yml deleted file mode 100644 index d6c7f60e5e6..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/cloneBranchEach2.yml +++ /dev/null @@ -1,38 +0,0 @@ -languageId: go -command: - version: 6 - spokenForm: clone branch each - action: - name: insertCopyAfter - target: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: e} - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - switch x := x.(type) { - case int: - default: - panic(x) - } - selections: - - anchor: {line: 2, character: 8} - active: {line: 2, character: 8} - marks: - default.e: - start: {line: 1, character: 0} - end: {line: 1, character: 4} -finalState: - documentContents: |- - switch x := x.(type) { - case int: - case int: - default: - panic(x) - } - selections: - - anchor: {line: 3, character: 8} - active: {line: 3, character: 8} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/drinkBranchCap.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/drinkBranchCap.yml deleted file mode 100644 index 9d91dc80710..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/drinkBranchCap.yml +++ /dev/null @@ -1,38 +0,0 @@ -languageId: go -command: - version: 6 - spokenForm: drink branch cap - action: - name: editNewLineBefore - target: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: c} - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - switch x { - case 1: - case 2: - panic(x) - } - selections: - - anchor: {line: 4, character: 1} - active: {line: 4, character: 1} - marks: - default.c: - start: {line: 1, character: 0} - end: {line: 1, character: 4} -finalState: - documentContents: |- - switch x { - - case 1: - case 2: - panic(x) - } - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/drinkBranchEach.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/drinkBranchEach.yml deleted file mode 100644 index c736445112c..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/drinkBranchEach.yml +++ /dev/null @@ -1,38 +0,0 @@ -languageId: go -command: - version: 6 - spokenForm: drink branch each - action: - name: editNewLineBefore - target: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: e} - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - switch x := x.(type) { - case int: - default: - panic(x) - } - selections: - - anchor: {line: 2, character: 8} - active: {line: 2, character: 8} - marks: - default.e: - start: {line: 1, character: 0} - end: {line: 1, character: 4} -finalState: - documentContents: |- - switch x := x.(type) { - - case int: - default: - panic(x) - } - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/pourBranchDrum.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/pourBranchDrum.yml deleted file mode 100644 index e6f99e0f42a..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/pourBranchDrum.yml +++ /dev/null @@ -1,38 +0,0 @@ -languageId: go -command: - version: 6 - spokenForm: pour branch drum - action: - name: editNewLineAfter - target: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: d} - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - switch x := x.(type) { - case int: - default: - panic(x) - } - selections: - - anchor: {line: 2, character: 8} - active: {line: 2, character: 8} - marks: - default.d: - start: {line: 2, character: 0} - end: {line: 2, character: 7} -finalState: - documentContents: |- - switch x := x.(type) { - case int: - default: - panic(x) - - } - selections: - - anchor: {line: 4, character: 0} - active: {line: 4, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/pourBranchEach.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/pourBranchEach.yml deleted file mode 100644 index ceea055e5ff..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/pourBranchEach.yml +++ /dev/null @@ -1,38 +0,0 @@ -languageId: go -command: - version: 6 - spokenForm: pour branch each - action: - name: editNewLineAfter - target: - type: primitive - mark: {type: decoratedSymbol, symbolColor: default, character: e} - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - switch x { - case 1: - case 2: - panic(x) - } - selections: - - anchor: {line: 4, character: 1} - active: {line: 4, character: 1} - marks: - default.e: - start: {line: 2, character: 0} - end: {line: 2, character: 4} -finalState: - documentContents: |- - switch x { - case 1: - case 2: - panic(x) - - } - selections: - - anchor: {line: 4, character: 0} - active: {line: 4, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/takeString.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/takeString.yml index 7780ee15b38..ef6a3e77c2e 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/takeString.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/go/takeString.yml @@ -1,14 +1,12 @@ languageId: go command: version: 1 - spokenForm: take parse tree string + spokenForm: take string action: setSelection targets: - type: primitive modifier: {type: containingScope, scopeType: string, includeSiblings: false} -spokenFormError: >- - simple scope type type with id string; this is a private spoken form currently - only for internal experimentation +spokenFormError: Scope type 'string' initialState: documentContents: x := "hello world" selections: diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/html/chuckValue.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/html/chuckValue.yml deleted file mode 100644 index b233ac36d75..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/html/chuckValue.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: html -command: - version: 6 - spokenForm: chuck value - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: - selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} - marks: {} -finalState: - documentContents: - selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/html/clearEveryItem.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/html/clearEveryItem.yml new file mode 100644 index 00000000000..f7b1040614c --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/html/clearEveryItem.yml @@ -0,0 +1,24 @@ +languageId: html +command: + version: 5 + spokenForm: change every item + action: {name: clearAndSetSelection} + targets: + - type: primitive + modifiers: + - type: everyScope + scopeType: {type: collectionItem} + usePrePhraseSnapshot: true +initialState: + documentContents: + selections: + - anchor: {line: 0, character: 8} + active: {line: 0, character: 8} + marks: {} +finalState: + documentContents: + selections: + - anchor: {line: 0, character: 8} + active: {line: 0, character: 8} + - anchor: {line: 0, character: 9} + active: {line: 0, character: 9} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/html/clearItem.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/html/clearItem.yml new file mode 100644 index 00000000000..5e5eae7004f --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/html/clearItem.yml @@ -0,0 +1,22 @@ +languageId: html +command: + version: 5 + spokenForm: change item + action: {name: clearAndSetSelection} + targets: + - type: primitive + modifiers: + - type: containingScope + scopeType: {type: collectionItem} + usePrePhraseSnapshot: true +initialState: + documentContents: + selections: + - anchor: {line: 0, character: 8} + active: {line: 0, character: 8} + marks: {} +finalState: + documentContents: + selections: + - anchor: {line: 0, character: 8} + active: {line: 0, character: 8} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch.yml deleted file mode 100644 index 8730465b3f6..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch.yml +++ /dev/null @@ -1,42 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: change branch - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: | - public class MyClass { - public void myFunk() { - if (true) { - } - else if (false) { - } - else { - } - } - } - selections: - - anchor: {line: 2, character: 4} - active: {line: 2, character: 4} - marks: {} -finalState: - documentContents: | - public class MyClass { - public void myFunk() { - - else if (false) { - } - else { - } - } - } - selections: - - anchor: {line: 2, character: 4} - active: {line: 2, character: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch2.yml deleted file mode 100644 index a0bd1df2934..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch2.yml +++ /dev/null @@ -1,42 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: change branch - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: | - public class MyClass { - public void myFunk() { - if (true) { - } - else if (false) { - } - else { - } - } - } - selections: - - anchor: {line: 4, character: 4} - active: {line: 4, character: 4} - marks: {} -finalState: - documentContents: | - public class MyClass { - public void myFunk() { - if (true) { - } - - else { - } - } - } - selections: - - anchor: {line: 4, character: 4} - active: {line: 4, character: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch3.yml deleted file mode 100644 index f16ab7ed3ce..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch3.yml +++ /dev/null @@ -1,42 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: change branch - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: | - public class MyClass { - public void myFunk() { - if (true) { - } - else if (false) { - } - else { - } - } - } - selections: - - anchor: {line: 6, character: 4} - active: {line: 6, character: 4} - marks: {} -finalState: - documentContents: | - public class MyClass { - public void myFunk() { - if (true) { - } - else if (false) { - } - - } - } - selections: - - anchor: {line: 6, character: 4} - active: {line: 6, character: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch4.yml deleted file mode 100644 index fdd3478822b..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch4.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: change branch - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - public class MyClass { - public void myFunk() { - true ? 1 : 2 - } - } - selections: - - anchor: {line: 2, character: 15} - active: {line: 2, character: 15} - marks: {} -finalState: - documentContents: |- - public class MyClass { - public void myFunk() { - true ? : 2 - } - } - selections: - - anchor: {line: 2, character: 15} - active: {line: 2, character: 15} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch5.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch5.yml deleted file mode 100644 index 7f9af7cf219..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeBranch5.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: change branch - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - public class MyClass { - public void myFunk() { - true ? 1 : 2 - } - } - selections: - - anchor: {line: 2, character: 19} - active: {line: 2, character: 19} - marks: {} -finalState: - documentContents: |- - public class MyClass { - public void myFunk() { - true ? 1 : - } - } - selections: - - anchor: {line: 2, character: 19} - active: {line: 2, character: 19} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCallee.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCallee.yml index 1ad63c3f097..7d66f2ad858 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCallee.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCallee.yml @@ -13,7 +13,7 @@ initialState: active: {line: 0, character: 9} marks: {} finalState: - documentContents: ().bar(); + documentContents: new ().bar(); selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCallee3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCallee3.yml index 7956b3cba9d..2e515f23523 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCallee3.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCallee3.yml @@ -13,7 +13,7 @@ initialState: active: {line: 0, character: 12} marks: {} finalState: - documentContents: (); + documentContents: new (); selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} + - anchor: {line: 0, character: 4} + active: {line: 0, character: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition.yml deleted file mode 100644 index 74ea19720ac..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition.yml +++ /dev/null @@ -1,43 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: change condition - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: condition} - usePrePhraseSnapshot: true -initialState: - documentContents: | - public class MyClass { - public void myFunk() { - if (true) { - } - else if (false) { - } - else { - } - } - } - selections: - - anchor: {line: 2, character: 4} - active: {line: 2, character: 4} - marks: {} -finalState: - documentContents: | - public class MyClass { - public void myFunk() { - if () { - } - else if (false) { - } - else { - } - } - } - selections: - - anchor: {line: 2, character: 8} - active: {line: 2, character: 8} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition2.yml deleted file mode 100644 index cdde7c4e8f0..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition2.yml +++ /dev/null @@ -1,43 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: change condition - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: condition} - usePrePhraseSnapshot: true -initialState: - documentContents: | - public class MyClass { - public void myFunk() { - if (true) { - } - else if (false) { - } - else { - } - } - } - selections: - - anchor: {line: 4, character: 4} - active: {line: 4, character: 4} - marks: {} -finalState: - documentContents: | - public class MyClass { - public void myFunk() { - if (true) { - } - else if () { - } - else { - } - } - } - selections: - - anchor: {line: 4, character: 13} - active: {line: 4, character: 13} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition3.yml deleted file mode 100644 index 8bd757a2a03..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition3.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: change condition - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: condition} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - public class MyClass { - public void myFunk() { - true ? 1 : 2 - } - } - selections: - - anchor: {line: 2, character: 15} - active: {line: 2, character: 15} - marks: {} -finalState: - documentContents: |- - public class MyClass { - public void myFunk() { - ? 1 : 2 - } - } - selections: - - anchor: {line: 2, character: 8} - active: {line: 2, character: 8} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition4.yml deleted file mode 100644 index 5d7c1f26b22..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeCondition4.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: change condition - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: condition} - usePrePhraseSnapshot: true -initialState: - documentContents: do {} while(true); - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: do {} while(); - selections: - - anchor: {line: 0, character: 12} - active: {line: 0, character: 12} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryBranch.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryBranch.yml deleted file mode 100644 index 6bafca6f1b4..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryBranch.yml +++ /dev/null @@ -1,43 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: change every branch - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - public class MyClass { - public void myFunk() { - switch (true) { - case "0": - return "zero"; - case "1": - return "one"; - } - } - } - selections: - - anchor: {line: 2, character: 8} - active: {line: 2, character: 8} - marks: {} -finalState: - documentContents: |- - public class MyClass { - public void myFunk() { - switch (true) { - - - } - } - } - selections: - - anchor: {line: 3, character: 12} - active: {line: 3, character: 12} - - anchor: {line: 4, character: 12} - active: {line: 4, character: 12} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryBranch2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryBranch2.yml deleted file mode 100644 index 078cb8695b2..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryBranch2.yml +++ /dev/null @@ -1,41 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: change every branch - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - public class MyClass { - public void myFunk() { - switch (true) { - case "0" -> "zero"; - case "1" -> "one"; - } - } - } - selections: - - anchor: {line: 2, character: 8} - active: {line: 2, character: 8} - marks: {} -finalState: - documentContents: |- - public class MyClass { - public void myFunk() { - switch (true) { - - - } - } - } - selections: - - anchor: {line: 3, character: 12} - active: {line: 3, character: 12} - - anchor: {line: 4, character: 12} - active: {line: 4, character: 12} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryBranch3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryBranch3.yml deleted file mode 100644 index 9e1c3983ac5..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryBranch3.yml +++ /dev/null @@ -1,39 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: change every branch - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - public class MyClass { - public void myFunk() { - switch (true) { - true ? 0 : 1 - } - } - } - selections: - - anchor: {line: 3, character: 12} - active: {line: 3, character: 12} - marks: {} -finalState: - documentContents: |- - public class MyClass { - public void myFunk() { - switch (true) { - true ? : - } - } - } - selections: - - anchor: {line: 3, character: 19} - active: {line: 3, character: 19} - - anchor: {line: 3, character: 22} - active: {line: 3, character: 22} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryCondition.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryCondition.yml deleted file mode 100644 index 6ceb8d0f896..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryCondition.yml +++ /dev/null @@ -1,45 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: change every condition - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: condition} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - public class MyClass { - public void myFunk() { - switch (true) { - case "0": - return "zero"; - case "1": - return "one"; - } - } - } - selections: - - anchor: {line: 2, character: 8} - active: {line: 2, character: 8} - marks: {} -finalState: - documentContents: |- - public class MyClass { - public void myFunk() { - switch (true) { - case : - return "zero"; - case : - return "one"; - } - } - } - selections: - - anchor: {line: 3, character: 17} - active: {line: 3, character: 17} - - anchor: {line: 5, character: 17} - active: {line: 5, character: 17} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryCondition2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryCondition2.yml deleted file mode 100644 index 22407febb7f..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryCondition2.yml +++ /dev/null @@ -1,41 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: change every condition - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: condition} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - public class MyClass { - public void myFunk() { - switch (true) { - case "0" -> "zero"; - case "1" -> "one"; - } - } - } - selections: - - anchor: {line: 2, character: 8} - active: {line: 2, character: 8} - marks: {} -finalState: - documentContents: |- - public class MyClass { - public void myFunk() { - switch (true) { - case -> "zero"; - case -> "one"; - } - } - } - selections: - - anchor: {line: 3, character: 17} - active: {line: 3, character: 17} - - anchor: {line: 4, character: 17} - active: {line: 4, character: 17} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryName.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryName.yml deleted file mode 100644 index b2620ee4f0f..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeEveryName.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: change every name - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: name} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - public class MyClass { - public void myFunk(final String value, final int value) { - } - } - selections: - - anchor: {line: 1, character: 23} - active: {line: 1, character: 23} - marks: {} -finalState: - documentContents: |- - public class MyClass { - public void myFunk(final String , final int ) { - } - } - selections: - - anchor: {line: 1, character: 36} - active: {line: 1, character: 36} - - anchor: {line: 1, character: 48} - active: {line: 1, character: 48} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeIfState.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeIfState.yml deleted file mode 100644 index 99a71256d2b..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeIfState.yml +++ /dev/null @@ -1,38 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: change if state - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: ifStatement} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - public class MyClass { - public void myFunk() { - if (true) { - - } - else if (true) { - - } - } - } - selections: - - anchor: {line: 6, character: 12} - active: {line: 6, character: 12} - marks: {} -finalState: - documentContents: |- - public class MyClass { - public void myFunk() { - - } - } - selections: - - anchor: {line: 2, character: 8} - active: {line: 2, character: 8} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeName.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeName.yml deleted file mode 100644 index 8a86cfa14eb..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeName.yml +++ /dev/null @@ -1,37 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: change name - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: name} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - public class MyClass { - public void myFunk() { - for (final int value : values) { - - } - } - } - selections: - - anchor: {line: 3, character: 12} - active: {line: 3, character: 12} - marks: {} -finalState: - documentContents: |- - public class MyClass { - public void myFunk() { - for (final int : values) { - - } - } - } - selections: - - anchor: {line: 2, character: 23} - active: {line: 2, character: 23} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType2.yml deleted file mode 100644 index 1be2dccab6f..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType2.yml +++ /dev/null @@ -1,47 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: change type - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - public class MyClass { - private MyClass () { - Map map = new HashMap(); - List list = new ArrayList(); - } - } - selections: - - anchor: {line: 2, character: 12} - active: {line: 2, character: 12} - - anchor: {line: 3, character: 12} - active: {line: 3, character: 12} - - anchor: {line: 2, character: 42} - active: {line: 2, character: 42} - - anchor: {line: 3, character: 36} - active: {line: 3, character: 36} - marks: {} -finalState: - documentContents: |- - public class MyClass { - private MyClass () { - map = new (); - list = new (); - } - } - selections: - - anchor: {line: 2, character: 12} - active: {line: 2, character: 12} - - anchor: {line: 2, character: 23} - active: {line: 2, character: 23} - - anchor: {line: 3, character: 12} - active: {line: 3, character: 12} - - anchor: {line: 3, character: 24} - active: {line: 3, character: 24} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType3.yml deleted file mode 100644 index 820968d708e..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType3.yml +++ /dev/null @@ -1,39 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: change type - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - public class MyClass { - private MyClass () { - Map map = new HashMap(); - List list = new ArrayList(); - } - } - selections: - - anchor: {line: 2, character: 32} - active: {line: 2, character: 32} - - anchor: {line: 3, character: 25} - active: {line: 3, character: 25} - marks: {} -finalState: - documentContents: |- - public class MyClass { - private MyClass () { - map = new HashMap(); - list = new ArrayList(); - } - } - selections: - - anchor: {line: 2, character: 12} - active: {line: 2, character: 12} - - anchor: {line: 3, character: 12} - active: {line: 3, character: 12} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType4.yml deleted file mode 100644 index 0cd08281b8b..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType4.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: change type - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - public class MyClass { - private MyClass (String hello) { - int[] values = new int[5]; - } - } - selections: - - anchor: {line: 2, character: 27} - active: {line: 2, character: 27} - marks: {} -finalState: - documentContents: |- - public class MyClass { - private MyClass (String hello) { - int[] values = new [5]; - } - } - selections: - - anchor: {line: 2, character: 27} - active: {line: 2, character: 27} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType5.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType5.yml deleted file mode 100644 index 97a06ede7e0..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType5.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: change type - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - public class MyClass { - public void myFunk() { - - } - } - selections: - - anchor: {line: 2, character: 8} - active: {line: 2, character: 8} - marks: {} -finalState: - documentContents: |- - public class MyClass { - public myFunk() { - - } - } - selections: - - anchor: {line: 1, character: 11} - active: {line: 1, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType6.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType6.yml deleted file mode 100644 index 49640ab55d6..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeType6.yml +++ /dev/null @@ -1,29 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: change type - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - for (final int value : values) { - - } - selections: - - anchor: {line: 1, character: 4} - active: {line: 1, character: 4} - marks: {} -finalState: - documentContents: |- - for (final value : values) { - - } - selections: - - anchor: {line: 0, character: 11} - active: {line: 0, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeValue.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeValue.yml deleted file mode 100644 index d15a32f0051..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeValue.yml +++ /dev/null @@ -1,37 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: change value - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - public class MyClass { - public void myFunk() { - for (final int value : values) { - - } - } - } - selections: - - anchor: {line: 3, character: 12} - active: {line: 3, character: 12} - marks: {} -finalState: - documentContents: |- - public class MyClass { - public void myFunk() { - for (final int value : ) { - - } - } - } - selections: - - anchor: {line: 2, character: 31} - active: {line: 2, character: 31} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeValue3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeValue3.yml deleted file mode 100644 index 5fcba7e387d..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeValue3.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: change value - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: map(str -> str.length); - selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} - marks: {} -finalState: - documentContents: map(str -> ); - selections: - - anchor: {line: 0, character: 11} - active: {line: 0, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeValue4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeValue4.yml deleted file mode 100644 index 9e986c0e482..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/changeValue4.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: change value - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: map(str -> 0); - selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} - marks: {} -finalState: - documentContents: map(str -> ); - selections: - - anchor: {line: 0, character: 11} - active: {line: 0, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/chuckBranch.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/chuckBranch.yml deleted file mode 100644 index 95094db96d0..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/chuckBranch.yml +++ /dev/null @@ -1,46 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: chuck branch - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - public class MyClass { - void myFunk () { - if (true) { - - } - else if (false) { - - } - else { - - } - } - } - selections: - - anchor: {line: 2, character: 8} - active: {line: 2, character: 8} - marks: {} -finalState: - documentContents: |- - public class MyClass { - void myFunk () { - if (false) { - - } - else { - - } - } - } - selections: - - anchor: {line: 2, character: 8} - active: {line: 2, character: 8} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/chuckValue2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/chuckValue2.yml deleted file mode 100644 index a5c949b7bd6..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/chuckValue2.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: chuck value - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - int value = 1; - value += 1; - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: {} -finalState: - documentContents: |- - int value; - value; - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/chuckValue3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/chuckValue3.yml deleted file mode 100644 index 45270ba29e5..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/chuckValue3.yml +++ /dev/null @@ -1,29 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: chuck value - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - public class MyClass { - int a = 2; - } - selections: - - anchor: {line: 1, character: 4} - active: {line: 1, character: 4} - marks: {} -finalState: - documentContents: |- - public class MyClass { - int a; - } - selections: - - anchor: {line: 1, character: 4} - active: {line: 1, character: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearSubject.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearSubject.yml index 6fe261c337c..a19ee22d0fa 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearSubject.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearSubject.yml @@ -6,12 +6,10 @@ command: - type: primitive modifiers: - type: containingScope - scopeType: {type: private.switchStatementSubject} + scopeType: {type: switchStatementSubject} usePrePhraseSnapshot: true action: {name: clearAndSetSelection} -spokenFormError: >- - simple scope type type with id private.switchStatementSubject; this is a - private spoken form currently only for internal experimentation +spokenFormError: Scope type 'switchStatementSubject' initialState: documentContents: | class Aaa { diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearSubject2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearSubject2.yml index 0fdd1203572..43ecc96dfdf 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearSubject2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearSubject2.yml @@ -6,12 +6,10 @@ command: - type: primitive modifiers: - type: containingScope - scopeType: {type: private.switchStatementSubject} + scopeType: {type: switchStatementSubject} usePrePhraseSnapshot: true action: {name: clearAndSetSelection} -spokenFormError: >- - simple scope type type with id private.switchStatementSubject; this is a - private spoken form currently only for internal experimentation +spokenFormError: Scope type 'switchStatementSubject' initialState: documentContents: | class Aaa { diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearName2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeName.yml similarity index 73% rename from packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearName2.yml rename to packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeName.yml index 5bb4e947791..0f17e05e6d4 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearName2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeName.yml @@ -1,13 +1,14 @@ languageId: java command: version: 1 - spokenForm: change name - action: clearAndSetSelection + spokenForm: take name + action: setSelection targets: - type: primitive modifier: {type: containingScope, scopeType: name} initialState: documentContents: | + public class MyClass { void myFunk () { @@ -19,11 +20,12 @@ initialState: marks: {} finalState: documentContents: | + public class MyClass { - void () { + void myFunk () { } } selections: - - anchor: {line: 1, character: 9} - active: {line: 1, character: 9} + - anchor: {line: 2, character: 9} + active: {line: 2, character: 15} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeName3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeName3.yml index 646aa3873bc..2a80fabb698 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeName3.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeName3.yml @@ -1,21 +1,23 @@ languageId: java command: version: 1 - spokenForm: change name - action: clearAndSetSelection + spokenForm: take name + action: setSelection targets: - type: primitive modifier: {type: containingScope, scopeType: name} initialState: documentContents: | + String value = "hello world"; selections: - - anchor: {line: 0, character: 15} - active: {line: 0, character: 15} + - anchor: {line: 1, character: 15} + active: {line: 1, character: 15} marks: {} finalState: documentContents: | - String = "hello world"; + + String value = "hello world"; selections: - - anchor: {line: 0, character: 7} - active: {line: 0, character: 7} + - anchor: {line: 1, character: 7} + active: {line: 1, character: 12} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeString.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeString.yml index 2781e22f6e3..bc5e8814b9b 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeString.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeString.yml @@ -1,14 +1,12 @@ languageId: java command: version: 1 - spokenForm: take parse tree string + spokenForm: take string action: setSelection targets: - type: primitive modifier: {type: containingScope, scopeType: string} -spokenFormError: >- - simple scope type type with id string; this is a private spoken form currently - only for internal experimentation +spokenFormError: Scope type 'string' initialState: documentContents: | diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeType4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeType4.yml deleted file mode 100644 index 4a2abc6233d..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeType4.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: java -command: - version: 6 - spokenForm: take type - action: - name: setSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - public class MyClass { - public void myFunk(int value) { - - } - } - selections: - - anchor: {line: 1, character: 30} - active: {line: 1, character: 30} - marks: {} -finalState: - documentContents: |- - public class MyClass { - public void myFunk(int value) { - - } - } - selections: - - anchor: {line: 1, character: 23} - active: {line: 1, character: 26} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeGust.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeGust.yml similarity index 81% rename from packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeGust.yml rename to packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeGust.yml index c71d6982fc5..57df12173a6 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeGust.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeGust.yml @@ -1,8 +1,8 @@ languageId: java command: version: 1 - spokenForm: change type gust - action: clearAndSetSelection + spokenForm: take type gust + action: setSelection targets: - type: primitive modifier: {type: containingScope, scopeType: type, includeSiblings: false} @@ -27,9 +27,9 @@ finalState: public class MyClass { private MyClass () { Map map = new HashMap(); - List<> list = new ArrayList(); + List list = new ArrayList(); } } selections: - - anchor: {line: 3, character: 13} - active: {line: 3, character: 13} + - anchor: {line: 3, character: 8} + active: {line: 3, character: 20} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeGust2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeGust2.yml similarity index 81% rename from packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeGust2.yml rename to packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeGust2.yml index ffe75dfd7f0..182e3de0e36 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeGust2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeGust2.yml @@ -1,8 +1,8 @@ languageId: java command: version: 1 - spokenForm: change type gust - action: clearAndSetSelection + spokenForm: take type gust + action: setSelection targets: - type: primitive modifier: {type: containingScope, scopeType: type, includeSiblings: false} @@ -27,9 +27,9 @@ finalState: public class MyClass { private MyClass () { Map map = new HashMap(); - List list = new ArrayList<>(); + List list = new ArrayList(); } } selections: - - anchor: {line: 3, character: 42} - active: {line: 3, character: 42} + - anchor: {line: 3, character: 32} + active: {line: 3, character: 49} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeSoon.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeSoon.yml similarity index 80% rename from packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeSoon.yml rename to packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeSoon.yml index 418f981c17a..776acf1faa5 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeSoon.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeSoon.yml @@ -1,8 +1,8 @@ languageId: java command: version: 1 - spokenForm: change type sun - action: clearAndSetSelection + spokenForm: take type sun + action: setSelection targets: - type: primitive modifier: {type: containingScope, scopeType: type, includeSiblings: false} @@ -26,10 +26,10 @@ finalState: documentContents: |- public class MyClass { private MyClass () { - Map<, String> map = new HashMap(); + Map map = new HashMap(); List list = new ArrayList(); } } selections: - - anchor: {line: 2, character: 12} - active: {line: 2, character: 12} + - anchor: {line: 2, character: 8} + active: {line: 2, character: 27} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeSoon2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeSoon2.yml similarity index 80% rename from packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeSoon2.yml rename to packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeSoon2.yml index 700e7fe436b..8cfcb12d16f 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeSoon2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeSoon2.yml @@ -1,8 +1,8 @@ languageId: java command: version: 1 - spokenForm: change type sun - action: clearAndSetSelection + spokenForm: take type sun + action: setSelection targets: - type: primitive modifier: {type: containingScope, scopeType: type, includeSiblings: false} @@ -26,10 +26,10 @@ finalState: documentContents: |- public class MyClass { private MyClass () { - Map map = new HashMap(); + Map map = new HashMap(); List list = new ArrayList(); } } selections: - - anchor: {line: 2, character: 54} - active: {line: 2, character: 54} + - anchor: {line: 2, character: 38} + active: {line: 2, character: 61} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeTrap.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeTrap.yml similarity index 80% rename from packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeTrap.yml rename to packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeTrap.yml index 4e6721dfd3c..f212a2ae55b 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeTrap.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeTrap.yml @@ -1,8 +1,8 @@ languageId: java command: version: 1 - spokenForm: change type trap - action: clearAndSetSelection + spokenForm: take type trap + action: setSelection targets: - type: primitive modifier: {type: containingScope, scopeType: type, includeSiblings: false} @@ -26,10 +26,10 @@ finalState: documentContents: |- public class MyClass { private MyClass () { - Map map = new HashMap(); + Map map = new HashMap(); List list = new ArrayList(); } } selections: - - anchor: {line: 2, character: 20} - active: {line: 2, character: 20} + - anchor: {line: 2, character: 8} + active: {line: 2, character: 27} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeTrap2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeTrap2.yml similarity index 80% rename from packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeTrap2.yml rename to packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeTrap2.yml index 343fb97c5ac..8beaf7e7dbf 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearTypeTrap2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeTypeTrap2.yml @@ -1,8 +1,8 @@ languageId: java command: version: 1 - spokenForm: change type trap - action: clearAndSetSelection + spokenForm: take type trap + action: setSelection targets: - type: primitive modifier: {type: containingScope, scopeType: type, includeSiblings: false} @@ -26,10 +26,10 @@ finalState: documentContents: |- public class MyClass { private MyClass () { - Map map = new HashMap<, String>(); + Map map = new HashMap(); List list = new ArrayList(); } } selections: - - anchor: {line: 2, character: 46} - active: {line: 2, character: 46} + - anchor: {line: 2, character: 38} + active: {line: 2, character: 61} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearValue4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeValue.yml similarity index 76% rename from packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearValue4.yml rename to packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeValue.yml index e470fed5cd6..32d6b2831a5 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/clearValue4.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/java/takeValue.yml @@ -1,8 +1,8 @@ languageId: java command: version: 1 - spokenForm: change value - action: clearAndSetSelection + spokenForm: take value + action: setSelection targets: - type: primitive modifier: {type: containingScope, scopeType: value} @@ -17,7 +17,7 @@ initialState: finalState: documentContents: | - String value = ; + String value = "hello world"; selections: - anchor: {line: 1, character: 15} - active: {line: 1, character: 15} + active: {line: 1, character: 28} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeEveryValue.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeEveryValue.yml deleted file mode 100644 index b51f67cdf8f..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeEveryValue.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: javascript -command: - version: 6 - spokenForm: change every value - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - function aaa() { - const bbb = 0; - const ccc = 0; - } - selections: - - anchor: {line: 2, character: 18} - active: {line: 2, character: 18} - marks: {} -finalState: - documentContents: |- - function aaa() { - const bbb = ; - const ccc = ; - } - selections: - - anchor: {line: 1, character: 16} - active: {line: 1, character: 16} - - anchor: {line: 2, character: 16} - active: {line: 2, character: 16} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeEveryValue2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeEveryValue2.yml deleted file mode 100644 index 4eddf369143..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeEveryValue2.yml +++ /dev/null @@ -1,29 +0,0 @@ -languageId: javascript -command: - version: 6 - spokenForm: change every value - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - const bbb = 0; - const ccc = 0; - selections: - - anchor: {line: 1, character: 14} - active: {line: 1, character: 14} - marks: {} -finalState: - documentContents: |- - const bbb = ; - const ccc = ; - selections: - - anchor: {line: 0, character: 12} - active: {line: 0, character: 12} - - anchor: {line: 1, character: 12} - active: {line: 1, character: 12} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeName.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeName.yml deleted file mode 100644 index b381255cd1c..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeName.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: javascript -command: - version: 6 - spokenForm: change name - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: name} - usePrePhraseSnapshot: true -initialState: - documentContents: const aaa = "bbb", ccc = "ddd"; - selections: - - anchor: {line: 0, character: 30} - active: {line: 0, character: 30} - marks: {} -finalState: - documentContents: const aaa = "bbb", = "ddd"; - selections: - - anchor: {line: 0, character: 19} - active: {line: 0, character: 19} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeName2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeName2.yml deleted file mode 100644 index da2076527fb..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeName2.yml +++ /dev/null @@ -1,105 +0,0 @@ -languageId: javascript -command: - version: 6 - spokenForm: change name - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: name} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - const aaa = 0; - let bbb = 0; - var hhh = 0; - ccc = 0; - kkk += 1; - const ddd = 0, eee = 0; - let fff = 0, ggg = 0; - var iii = 0; - export const jjj = 0; - export let kkk = 0; - export var lll = 0; - export const mmm = 0, nnn = 0; - export let ooo = 0, ppp = 0; - selections: - - anchor: {line: 0, character: 14} - active: {line: 0, character: 14} - - anchor: {line: 1, character: 12} - active: {line: 1, character: 12} - - anchor: {line: 2, character: 12} - active: {line: 2, character: 12} - - anchor: {line: 3, character: 8} - active: {line: 3, character: 8} - - anchor: {line: 4, character: 9} - active: {line: 4, character: 9} - - anchor: {line: 5, character: 23} - active: {line: 5, character: 23} - - anchor: {line: 6, character: 21} - active: {line: 6, character: 21} - - anchor: {line: 7, character: 12} - active: {line: 7, character: 12} - - anchor: {line: 8, character: 21} - active: {line: 8, character: 21} - - anchor: {line: 9, character: 19} - active: {line: 9, character: 19} - - anchor: {line: 10, character: 19} - active: {line: 10, character: 19} - - anchor: {line: 11, character: 30} - active: {line: 11, character: 30} - - anchor: {line: 12, character: 28} - active: {line: 12, character: 28} - marks: {} -finalState: - documentContents: |- - const = 0; - let = 0; - var = 0; - = 0; - += 1; - const = 0, = 0; - let = 0, = 0; - var = 0; - export const = 0; - export let = 0; - export var = 0; - export const = 0, = 0; - export let = 0, = 0; - selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} - - anchor: {line: 1, character: 4} - active: {line: 1, character: 4} - - anchor: {line: 2, character: 4} - active: {line: 2, character: 4} - - anchor: {line: 3, character: 0} - active: {line: 3, character: 0} - - anchor: {line: 4, character: 0} - active: {line: 4, character: 0} - - anchor: {line: 5, character: 6} - active: {line: 5, character: 6} - - anchor: {line: 5, character: 12} - active: {line: 5, character: 12} - - anchor: {line: 6, character: 4} - active: {line: 6, character: 4} - - anchor: {line: 6, character: 10} - active: {line: 6, character: 10} - - anchor: {line: 7, character: 4} - active: {line: 7, character: 4} - - anchor: {line: 8, character: 13} - active: {line: 8, character: 13} - - anchor: {line: 9, character: 11} - active: {line: 9, character: 11} - - anchor: {line: 10, character: 11} - active: {line: 10, character: 11} - - anchor: {line: 11, character: 13} - active: {line: 11, character: 13} - - anchor: {line: 11, character: 19} - active: {line: 11, character: 19} - - anchor: {line: 12, character: 11} - active: {line: 12, character: 11} - - anchor: {line: 12, character: 17} - active: {line: 12, character: 17} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeName3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeName3.yml deleted file mode 100644 index 1789821b207..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeName3.yml +++ /dev/null @@ -1,47 +0,0 @@ -languageId: javascript -command: - version: 6 - spokenForm: change name - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: name} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - hhh = 0, iii = 0, jjj=0; - lll += 1, mmm += 1, nnn += 1; - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - - anchor: {line: 0, character: 9} - active: {line: 0, character: 9} - - anchor: {line: 0, character: 18} - active: {line: 0, character: 18} - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - - anchor: {line: 1, character: 10} - active: {line: 1, character: 10} - - anchor: {line: 1, character: 20} - active: {line: 1, character: 20} - marks: {} -finalState: - documentContents: |2- - = 0, = 0, =0; - += 1, += 1, += 1; - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} - - anchor: {line: 0, character: 12} - active: {line: 0, character: 12} - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - - anchor: {line: 1, character: 7} - active: {line: 1, character: 7} - - anchor: {line: 1, character: 14} - active: {line: 1, character: 14} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeName4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeName4.yml deleted file mode 100644 index 4335acfe1a4..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeName4.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: javascript -command: - version: 6 - spokenForm: change name - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: name} - usePrePhraseSnapshot: true -initialState: - documentContents: for (const aaa of bbb) {} - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: for (const of bbb) {} - selections: - - anchor: {line: 0, character: 11} - active: {line: 0, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeName5.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeName5.yml deleted file mode 100644 index c94d33aa77f..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeName5.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: javascript -command: - version: 6 - spokenForm: change name - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: name} - usePrePhraseSnapshot: true -initialState: - documentContents: for (const aaa of bbb) {} - selections: - - anchor: {line: 0, character: 24} - active: {line: 0, character: 24} - marks: {} -finalState: - documentContents: for (const of bbb) {} - selections: - - anchor: {line: 0, character: 11} - active: {line: 0, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeValue.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeValue.yml deleted file mode 100644 index 4cb1bdd9b87..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeValue.yml +++ /dev/null @@ -1,47 +0,0 @@ -languageId: javascript -command: - version: 6 - spokenForm: change value - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - hhh = 0, iii = 0, jjj=0; - lll += 1, mmm += 1, nnn += 1; - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - - anchor: {line: 0, character: 9} - active: {line: 0, character: 9} - - anchor: {line: 0, character: 18} - active: {line: 0, character: 18} - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - - anchor: {line: 1, character: 10} - active: {line: 1, character: 10} - - anchor: {line: 1, character: 20} - active: {line: 1, character: 20} - marks: {} -finalState: - documentContents: |- - hhh = , iii = , jjj=; - lll += , mmm += , nnn += ; - selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} - - anchor: {line: 0, character: 14} - active: {line: 0, character: 14} - - anchor: {line: 0, character: 20} - active: {line: 0, character: 20} - - anchor: {line: 1, character: 7} - active: {line: 1, character: 7} - - anchor: {line: 1, character: 16} - active: {line: 1, character: 16} - - anchor: {line: 1, character: 25} - active: {line: 1, character: 25} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeValue2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeValue2.yml deleted file mode 100644 index 3898f69f5a6..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeValue2.yml +++ /dev/null @@ -1,109 +0,0 @@ -languageId: javascript -command: - version: 6 - spokenForm: change value - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - const aaa = 0; - let bbb = 0; - var hhh = 0; - ccc = 0; - kkk += 1; - const ddd = 0, eee = 0; - let fff = 0, ggg = 0; - var iii = 0; - let qqq; - var rrr; - export const jjj = 0; - export let kkk = 0; - export var lll = 0; - export const mmm = 0, nnn = 0; - export let ooo = 0, ppp = 0; - selections: - - anchor: {line: 0, character: 14} - active: {line: 0, character: 14} - - anchor: {line: 1, character: 12} - active: {line: 1, character: 12} - - anchor: {line: 2, character: 12} - active: {line: 2, character: 12} - - anchor: {line: 3, character: 8} - active: {line: 3, character: 8} - - anchor: {line: 4, character: 9} - active: {line: 4, character: 9} - - anchor: {line: 5, character: 23} - active: {line: 5, character: 23} - - anchor: {line: 6, character: 21} - active: {line: 6, character: 21} - - anchor: {line: 7, character: 12} - active: {line: 7, character: 12} - - anchor: {line: 10, character: 21} - active: {line: 10, character: 21} - - anchor: {line: 11, character: 19} - active: {line: 11, character: 19} - - anchor: {line: 12, character: 19} - active: {line: 12, character: 19} - - anchor: {line: 13, character: 30} - active: {line: 13, character: 30} - - anchor: {line: 14, character: 28} - active: {line: 14, character: 28} - marks: {} -finalState: - documentContents: |- - const aaa = ; - let bbb = ; - var hhh = ; - ccc = ; - kkk += ; - const ddd = , eee = ; - let fff = , ggg = ; - var iii = ; - let qqq; - var rrr; - export const jjj = ; - export let kkk = ; - export var lll = ; - export const mmm = , nnn = ; - export let ooo = , ppp = ; - selections: - - anchor: {line: 0, character: 12} - active: {line: 0, character: 12} - - anchor: {line: 1, character: 10} - active: {line: 1, character: 10} - - anchor: {line: 2, character: 10} - active: {line: 2, character: 10} - - anchor: {line: 3, character: 6} - active: {line: 3, character: 6} - - anchor: {line: 4, character: 7} - active: {line: 4, character: 7} - - anchor: {line: 5, character: 12} - active: {line: 5, character: 12} - - anchor: {line: 5, character: 20} - active: {line: 5, character: 20} - - anchor: {line: 6, character: 10} - active: {line: 6, character: 10} - - anchor: {line: 6, character: 18} - active: {line: 6, character: 18} - - anchor: {line: 7, character: 10} - active: {line: 7, character: 10} - - anchor: {line: 10, character: 19} - active: {line: 10, character: 19} - - anchor: {line: 11, character: 17} - active: {line: 11, character: 17} - - anchor: {line: 12, character: 17} - active: {line: 12, character: 17} - - anchor: {line: 13, character: 19} - active: {line: 13, character: 19} - - anchor: {line: 13, character: 27} - active: {line: 13, character: 27} - - anchor: {line: 14, character: 17} - active: {line: 14, character: 17} - - anchor: {line: 14, character: 25} - active: {line: 14, character: 25} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeValue3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeValue3.yml deleted file mode 100644 index ce24f8114e9..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeValue3.yml +++ /dev/null @@ -1,43 +0,0 @@ -languageId: javascript -command: - version: 6 - spokenForm: change value - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - const ddd = 0, eee = 0; - let fff = 0, ggg = 0; - export const mmm = 0, nnn = 0; - export let ooo = 0, ppp = 0; - selections: - - anchor: {line: 0, character: 15} - active: {line: 0, character: 15} - - anchor: {line: 1, character: 13} - active: {line: 1, character: 13} - - anchor: {line: 2, character: 22} - active: {line: 2, character: 22} - - anchor: {line: 3, character: 20} - active: {line: 3, character: 20} - marks: {} -finalState: - documentContents: |- - const ddd = 0, eee = ; - let fff = 0, ggg = ; - export const mmm = 0, nnn = ; - export let ooo = 0, ppp = ; - selections: - - anchor: {line: 0, character: 21} - active: {line: 0, character: 21} - - anchor: {line: 1, character: 19} - active: {line: 1, character: 19} - - anchor: {line: 2, character: 28} - active: {line: 2, character: 28} - - anchor: {line: 3, character: 26} - active: {line: 3, character: 26} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeValue4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeValue4.yml deleted file mode 100644 index c5a2f03666f..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeValue4.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: javascript -command: - version: 6 - spokenForm: change value - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: for (const aaa of bbb) {} - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: for (const aaa of ) {} - selections: - - anchor: {line: 0, character: 18} - active: {line: 0, character: 18} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeValue5.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeValue5.yml deleted file mode 100644 index 4ab3abe0e4d..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/changeValue5.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: javascript -command: - version: 6 - spokenForm: change value - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: for (const aaa of bbb) {} - selections: - - anchor: {line: 0, character: 24} - active: {line: 0, character: 24} - marks: {} -finalState: - documentContents: for (const aaa of ) {} - selections: - - anchor: {line: 0, character: 18} - active: {line: 0, character: 18} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/chuckName.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/chuckName.yml deleted file mode 100644 index f73bed4682c..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/chuckName.yml +++ /dev/null @@ -1,67 +0,0 @@ -languageId: javascript -command: - version: 6 - spokenForm: chuck name - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: name} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - const aaa = 0; - let bbb = 0; - var hhh = 0; - ccc = 0; - kkk += 1; - const ddd = 0, eee = 0; - let fff = 0, ggg = 0; - var iii = 0; - selections: - - anchor: {line: 0, character: 14} - active: {line: 0, character: 14} - - anchor: {line: 1, character: 12} - active: {line: 1, character: 12} - - anchor: {line: 2, character: 12} - active: {line: 2, character: 12} - - anchor: {line: 3, character: 8} - active: {line: 3, character: 8} - - anchor: {line: 4, character: 9} - active: {line: 4, character: 9} - - anchor: {line: 5, character: 23} - active: {line: 5, character: 23} - - anchor: {line: 6, character: 21} - active: {line: 6, character: 21} - - anchor: {line: 7, character: 12} - active: {line: 7, character: 12} - marks: {} -finalState: - documentContents: |- - 0; - 0; - 0; - 0; - 1; - 0, 0; - 0, 0; - 0; - selections: - - anchor: {line: 0, character: 2} - active: {line: 0, character: 2} - - anchor: {line: 1, character: 2} - active: {line: 1, character: 2} - - anchor: {line: 2, character: 2} - active: {line: 2, character: 2} - - anchor: {line: 3, character: 2} - active: {line: 3, character: 2} - - anchor: {line: 4, character: 2} - active: {line: 4, character: 2} - - anchor: {line: 5, character: 5} - active: {line: 5, character: 5} - - anchor: {line: 6, character: 5} - active: {line: 6, character: 5} - - anchor: {line: 7, character: 2} - active: {line: 7, character: 2} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/chuckName2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/chuckName2.yml deleted file mode 100644 index 483074fd7b7..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/chuckName2.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: javascript -command: - version: 6 - spokenForm: chuck name - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: name} - usePrePhraseSnapshot: true -initialState: - documentContents: const aaa = "bbb", ccc = "ddd"; - selections: - - anchor: {line: 0, character: 13} - active: {line: 0, character: 13} - marks: {} -finalState: - documentContents: "\"bbb\", ccc = \"ddd\";" - selections: - - anchor: {line: 0, character: 1} - active: {line: 0, character: 1} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/chuckName3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/chuckName3.yml deleted file mode 100644 index 04d8c2a8938..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/chuckName3.yml +++ /dev/null @@ -1,47 +0,0 @@ -languageId: javascript -command: - version: 6 - spokenForm: chuck name - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: name} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - hhh = 0, iii = 0, jjj=0; - lll += 1, mmm += 1, nnn += 1; - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - - anchor: {line: 0, character: 9} - active: {line: 0, character: 9} - - anchor: {line: 0, character: 18} - active: {line: 0, character: 18} - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - - anchor: {line: 1, character: 10} - active: {line: 1, character: 10} - - anchor: {line: 1, character: 20} - active: {line: 1, character: 20} - marks: {} -finalState: - documentContents: |- - 0, 0, 0; - 1, 1, 1; - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - - anchor: {line: 0, character: 3} - active: {line: 0, character: 3} - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - - anchor: {line: 1, character: 3} - active: {line: 1, character: 3} - - anchor: {line: 1, character: 6} - active: {line: 1, character: 6} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/chuckValue.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/chuckValue.yml deleted file mode 100644 index 4dcfcd849e3..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/chuckValue.yml +++ /dev/null @@ -1,47 +0,0 @@ -languageId: javascript -command: - version: 6 - spokenForm: chuck value - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - hhh = 0, iii = 0, jjj=0; - lll += 1, mmm += 1, nnn += 1; - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - - anchor: {line: 0, character: 9} - active: {line: 0, character: 9} - - anchor: {line: 0, character: 18} - active: {line: 0, character: 18} - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - - anchor: {line: 1, character: 10} - active: {line: 1, character: 10} - - anchor: {line: 1, character: 20} - active: {line: 1, character: 20} - marks: {} -finalState: - documentContents: |- - hhh, iii, jjj; - lll, mmm, nnn; - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - - anchor: {line: 0, character: 5} - active: {line: 0, character: 5} - - anchor: {line: 0, character: 10} - active: {line: 0, character: 10} - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - - anchor: {line: 1, character: 5} - active: {line: 1, character: 5} - - anchor: {line: 1, character: 10} - active: {line: 1, character: 10} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/chuckValue2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/chuckValue2.yml deleted file mode 100644 index 71da6def1c6..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/javascript/chuckValue2.yml +++ /dev/null @@ -1,101 +0,0 @@ -languageId: javascript -command: - version: 6 - spokenForm: chuck value - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - const aaa = 0; - let bbb = 0; - var hhh = 0; - ccc = 0; - kkk += 1; - const ddd = 0, eee = 0; - let fff = 0, ggg = 0; - var iii = 0; - let qqq; - var rrr; - export const jjj = 0; - export let kkk = 0; - export var lll = 0; - export const mmm = 0, nnn = 0; - export let ooo = 0, ppp = 0; - selections: - - anchor: {line: 0, character: 14} - active: {line: 0, character: 14} - - anchor: {line: 1, character: 12} - active: {line: 1, character: 12} - - anchor: {line: 2, character: 12} - active: {line: 2, character: 12} - - anchor: {line: 3, character: 8} - active: {line: 3, character: 8} - - anchor: {line: 4, character: 9} - active: {line: 4, character: 9} - - anchor: {line: 5, character: 23} - active: {line: 5, character: 23} - - anchor: {line: 6, character: 21} - active: {line: 6, character: 21} - - anchor: {line: 7, character: 12} - active: {line: 7, character: 12} - - anchor: {line: 10, character: 21} - active: {line: 10, character: 21} - - anchor: {line: 11, character: 19} - active: {line: 11, character: 19} - - anchor: {line: 12, character: 19} - active: {line: 12, character: 19} - - anchor: {line: 13, character: 30} - active: {line: 13, character: 30} - - anchor: {line: 14, character: 28} - active: {line: 14, character: 28} - marks: {} -finalState: - documentContents: |- - const aaa; - let bbb; - var hhh; - ccc; - kkk; - const ddd, eee; - let fff, ggg; - var iii; - let qqq; - var rrr; - export const jjj; - export let kkk; - export var lll; - export const mmm, nnn; - export let ooo, ppp; - selections: - - anchor: {line: 0, character: 10} - active: {line: 0, character: 10} - - anchor: {line: 1, character: 8} - active: {line: 1, character: 8} - - anchor: {line: 2, character: 8} - active: {line: 2, character: 8} - - anchor: {line: 3, character: 4} - active: {line: 3, character: 4} - - anchor: {line: 4, character: 4} - active: {line: 4, character: 4} - - anchor: {line: 5, character: 15} - active: {line: 5, character: 15} - - anchor: {line: 6, character: 13} - active: {line: 6, character: 13} - - anchor: {line: 7, character: 8} - active: {line: 7, character: 8} - - anchor: {line: 10, character: 17} - active: {line: 10, character: 17} - - anchor: {line: 11, character: 15} - active: {line: 11, character: 15} - - anchor: {line: 12, character: 15} - active: {line: 12, character: 15} - - anchor: {line: 13, character: 22} - active: {line: 13, character: 22} - - anchor: {line: 14, character: 20} - active: {line: 14, character: 20} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/json/takeString.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/json/takeString.yml index 6cff10b7af2..b8fcf009f2b 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/json/takeString.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/json/takeString.yml @@ -1,14 +1,12 @@ languageId: json command: version: 1 - spokenForm: take parse tree string + spokenForm: take string action: setSelection targets: - type: primitive modifier: {type: containingScope, scopeType: string} -spokenFormError: >- - simple scope type type with id string; this is a private spoken form currently - only for internal experimentation +spokenFormError: Scope type 'string' initialState: documentContents: | diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/jsx/changeEveryItem.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/jsx/changeEveryItem.yml deleted file mode 100644 index 21edaf2508f..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/jsx/changeEveryItem.yml +++ /dev/null @@ -1,25 +0,0 @@ -languageId: typescriptreact -command: - version: 6 - spokenForm: change every item - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents:
    - selections: - - anchor: {line: 0, character: 13} - active: {line: 0, character: 13} - marks: {} -finalState: - documentContents:
    - selections: - - anchor: {line: 0, character: 13} - active: {line: 0, character: 13} - - anchor: {line: 0, character: 15} - active: {line: 0, character: 15} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/jsx/changeEveryValue.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/jsx/changeEveryValue.yml deleted file mode 100644 index 78deddbcac8..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/jsx/changeEveryValue.yml +++ /dev/null @@ -1,25 +0,0 @@ -languageId: javascriptreact -command: - version: 6 - spokenForm: change every value - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: - selections: - - anchor: {line: 0, character: 2} - active: {line: 0, character: 2} - marks: {} -finalState: - documentContents: - selections: - - anchor: {line: 0, character: 9} - active: {line: 0, character: 9} - - anchor: {line: 0, character: 14} - active: {line: 0, character: 14} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/jsx/changeEveryValue2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/jsx/changeEveryValue2.yml deleted file mode 100644 index 184f04dfb85..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/jsx/changeEveryValue2.yml +++ /dev/null @@ -1,25 +0,0 @@ -languageId: javascriptreact -command: - version: 6 - spokenForm: change every value - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: - selections: - - anchor: {line: 0, character: 1} - active: {line: 0, character: 1} - marks: {} -finalState: - documentContents: - selections: - - anchor: {line: 0, character: 9} - active: {line: 0, character: 9} - - anchor: {line: 0, character: 14} - active: {line: 0, character: 14} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/jsx/changeItem.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/jsx/changeItem.yml deleted file mode 100644 index 9d69a1b3cc6..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/jsx/changeItem.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: typescriptreact -command: - version: 6 - spokenForm: change item - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents:
    - selections: - - anchor: {line: 0, character: 13} - active: {line: 0, character: 13} - marks: {} -finalState: - documentContents:
    - selections: - - anchor: {line: 0, character: 13} - active: {line: 0, character: 13} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/jsx/chuckValue.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/jsx/chuckValue.yml deleted file mode 100644 index cf42f543fcd..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/jsx/chuckValue.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: javascriptreact -command: - version: 6 - spokenForm: chuck value - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: - selections: - - anchor: {line: 0, character: 5} - active: {line: 0, character: 5} - marks: {} -finalState: - documentContents: - selections: - - anchor: {line: 0, character: 5} - active: {line: 0, character: 5} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/changeEveryItem.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/changeEveryItem.yml deleted file mode 100644 index 0082833225f..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/changeEveryItem.yml +++ /dev/null @@ -1,47 +0,0 @@ -languageId: markdown -command: - version: 6 - spokenForm: change every item - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - ddd eee: - - - aaa - - bbb - - ccc - - fff ggg: - - - hhh - - iii - selections: - - anchor: {line: 4, character: 5} - active: {line: 4, character: 5} - marks: {} -finalState: - documentContents: |- - ddd eee: - - - - - - - - - fff ggg: - - - hhh - - iii - selections: - - anchor: {line: 2, character: 2} - active: {line: 2, character: 2} - - anchor: {line: 3, character: 2} - active: {line: 3, character: 2} - - anchor: {line: 4, character: 2} - active: {line: 4, character: 2} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/changeLeadingItem.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/changeLeadingItem.yml deleted file mode 100644 index fd0d38aece2..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/changeLeadingItem.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: markdown -command: - version: 6 - spokenForm: change leading item - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - {type: leading} - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - - values - - 0 - - 1 - - 2 - selections: - - anchor: {line: 2, character: 4} - active: {line: 2, character: 4} - marks: {} -finalState: - documentContents: |- - - values - - 0- 1 - - 2 - selections: - - anchor: {line: 1, character: 7} - active: {line: 1, character: 7} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/changeTrailingItem.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/changeTrailingItem.yml deleted file mode 100644 index 46dadadaf71..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/changeTrailingItem.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: markdown -command: - version: 6 - spokenForm: change trailing item - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - {type: trailing} - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - - values - - 0 - - 1 - - 2 - selections: - - anchor: {line: 2, character: 4} - active: {line: 2, character: 4} - marks: {} -finalState: - documentContents: |- - - values - - 0 - - 1- 2 - selections: - - anchor: {line: 2, character: 7} - active: {line: 2, character: 7} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/chuckItem.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/chuckItem.yml index fde3f9ecf9c..2c886b2f20e 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/chuckItem.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/chuckItem.yml @@ -18,6 +18,7 @@ initialState: finalState: documentContents: |- + - whatever now selections: - anchor: {line: 1, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/chuckItem2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/chuckItem2.yml index f1e0cdb73c8..69a6c36df6f 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/chuckItem2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/chuckItem2.yml @@ -21,7 +21,8 @@ initialState: finalState: documentContents: |- - aaa + - ddd selections: - - anchor: {line: 1, character: 2} - active: {line: 1, character: 2} + - anchor: {line: 1, character: 0} + active: {line: 1, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/chuckItem3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/chuckItem3.yml deleted file mode 100644 index f6e10d8a8db..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/chuckItem3.yml +++ /dev/null @@ -1,30 +0,0 @@ -languageId: markdown -command: - version: 6 - spokenForm: chuck item - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - - values - - 0 - - 1 - - 2 - selections: - - anchor: {line: 2, character: 4} - active: {line: 2, character: 4} - marks: {} -finalState: - documentContents: |- - - values - - 0 - - 2 - selections: - - anchor: {line: 2, character: 4} - active: {line: 2, character: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/chuckItem4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/chuckItem4.yml deleted file mode 100644 index 9178465ace4..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/chuckItem4.yml +++ /dev/null @@ -1,28 +0,0 @@ -languageId: markdown -command: - version: 6 - spokenForm: chuck item - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: false -initialState: - documentContents: |- - - values - - 0 - - 2 - selections: - - anchor: {line: 2, character: 4} - active: {line: 2, character: 4} - marks: {} -finalState: - documentContents: |- - - values - - 0 - selections: - - anchor: {line: 1, character: 7} - active: {line: 1, character: 7} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/chuckItem5.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/chuckItem5.yml deleted file mode 100644 index 28ea83d69d5..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/chuckItem5.yml +++ /dev/null @@ -1,26 +0,0 @@ -languageId: markdown -command: - version: 6 - spokenForm: chuck item - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: false -initialState: - documentContents: |- - - values - - 0 - selections: - - anchor: {line: 1, character: 7} - active: {line: 1, character: 7} - marks: {} -finalState: - documentContents: | - - values - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/cloneItem.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/cloneItem.yml deleted file mode 100644 index 2d9a5e3b462..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/cloneItem.yml +++ /dev/null @@ -1,30 +0,0 @@ -languageId: markdown -command: - version: 6 - spokenForm: clone item - action: - name: insertCopyAfter - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - - aaa - - bbb - - ccc - selections: - - anchor: {line: 1, character: 2} - active: {line: 1, character: 2} - marks: {} -finalState: - documentContents: |- - - aaa - - bbb - - bbb - - ccc - selections: - - anchor: {line: 2, character: 2} - active: {line: 2, character: 2} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/cloneUpItem.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/cloneUpItem.yml deleted file mode 100644 index ea8bb53e5bb..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/cloneUpItem.yml +++ /dev/null @@ -1,30 +0,0 @@ -languageId: markdown -command: - version: 6 - spokenForm: clone up item - action: - name: insertCopyBefore - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - - aaa - - bbb - - ccc - selections: - - anchor: {line: 1, character: 2} - active: {line: 1, character: 2} - marks: {} -finalState: - documentContents: |- - - aaa - - bbb - - bbb - - ccc - selections: - - anchor: {line: 1, character: 2} - active: {line: 1, character: 2} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/drinkItem2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/drinkItem2.yml deleted file mode 100644 index 6eeab87bc7f..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/drinkItem2.yml +++ /dev/null @@ -1,30 +0,0 @@ -languageId: markdown -command: - version: 6 - spokenForm: drink item - action: - name: editNewLineBefore - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - - aaa - - bbb - - ccc - selections: - - anchor: {line: 1, character: 2} - active: {line: 1, character: 2} - marks: {} -finalState: - documentContents: |- - - aaa - - - - bbb - - ccc - selections: - - anchor: {line: 1, character: 2} - active: {line: 1, character: 2} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/pourItem3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/pourItem3.yml deleted file mode 100644 index 2cb79a3c7bb..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/markdown/pourItem3.yml +++ /dev/null @@ -1,30 +0,0 @@ -languageId: markdown -command: - version: 6 - spokenForm: pour item - action: - name: editNewLineAfter - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - - aaa - - bbb - - ccc - selections: - - anchor: {line: 1, character: 2} - active: {line: 1, character: 2} - marks: {} -finalState: - documentContents: |- - - aaa - - bbb - - - - ccc - selections: - - anchor: {line: 2, character: 2} - active: {line: 2, character: 2} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/php/changeFunk2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/php/changeFunk2.yml deleted file mode 100644 index 95170090e12..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/php/changeFunk2.yml +++ /dev/null @@ -1,38 +0,0 @@ -languageId: php -command: - version: 6 - spokenForm: change funk - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: namedFunction} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - 'Hello world'; - selections: - - anchor: {line: 2, character: 24} - active: {line: 2, character: 24} - marks: {} -finalState: - documentContents: | - 'Hello world'; + $myFunc = fn() => 'Hello world'; selections: - - anchor: {line: 2, character: 24} - active: {line: 2, character: 24} + - anchor: {line: 2, character: 25} + active: {line: 2, character: 25} marks: {} finalState: documentContents: |+ - - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - aaa().bbb.ccc().ddd - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.a: - start: {line: 0, character: 0} - end: {line: 0, character: 3} -finalState: - documentContents: | - .bbb.ccc().ddd - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessBat.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessBat.yml deleted file mode 100644 index edf2a91d411..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessBat.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: python -command: - version: 5 - spokenForm: clear access bat - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: b} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - aaa().bbb.ccc().ddd - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.b: - start: {line: 0, character: 6} - end: {line: 0, character: 9} -finalState: - documentContents: | - aaa().ccc().ddd - selections: - - anchor: {line: 0, character: 5} - active: {line: 0, character: 5} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessBat3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessBat3.yml deleted file mode 100644 index 7dc22b89ce7..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessBat3.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: python -command: - version: 5 - spokenForm: clear access bat - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: b} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a[0].b[c.d] - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.b: - start: {line: 0, character: 5} - end: {line: 0, character: 6} -finalState: - documentContents: | - a[0] - selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessBat5.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessBat5.yml deleted file mode 100644 index d634680ffb7..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessBat5.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: python -command: - version: 5 - spokenForm: clear access bat - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: b} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - aaa.bbb( - ccc + 5 - ) - selections: - - anchor: {line: 3, character: 0} - active: {line: 3, character: 0} - marks: - default.b: - start: {line: 0, character: 4} - end: {line: 0, character: 7} -finalState: - documentContents: | - aaa - selections: - - anchor: {line: 0, character: 3} - active: {line: 0, character: 3} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessCap.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessCap.yml deleted file mode 100644 index 0c29d785135..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessCap.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: python -command: - version: 5 - spokenForm: clear access cap - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: c} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - aaa().bbb.ccc().ddd - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.c: - start: {line: 0, character: 10} - end: {line: 0, character: 13} -finalState: - documentContents: | - aaa().bbb.ddd - selections: - - anchor: {line: 0, character: 9} - active: {line: 0, character: 9} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessCap2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessCap2.yml deleted file mode 100644 index 762ccabe285..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessCap2.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: python -command: - version: 5 - spokenForm: clear access cap - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: c} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - aaa().bbb.ccc(eee.fff).ddd - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.c: - start: {line: 0, character: 10} - end: {line: 0, character: 13} -finalState: - documentContents: | - aaa().bbb.ddd - selections: - - anchor: {line: 0, character: 9} - active: {line: 0, character: 9} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessCap3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessCap3.yml deleted file mode 100644 index c15a0890ffe..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessCap3.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: python -command: - version: 5 - spokenForm: clear access cap - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: c} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a[0].b[c.d()] - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.c: - start: {line: 0, character: 7} - end: {line: 0, character: 8} -finalState: - documentContents: | - a[0].b[.d()] - selections: - - anchor: {line: 0, character: 7} - active: {line: 0, character: 7} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessDrum.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessDrum.yml deleted file mode 100644 index 3b113d3db16..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessDrum.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: python -command: - version: 5 - spokenForm: clear access drum - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: d} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - aaa().bbb.ccc().ddd - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.d: - start: {line: 0, character: 16} - end: {line: 0, character: 19} -finalState: - documentContents: | - aaa().bbb.ccc() - selections: - - anchor: {line: 0, character: 15} - active: {line: 0, character: 15} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessDrum2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessDrum2.yml deleted file mode 100644 index 44bb58435dc..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessDrum2.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: python -command: - version: 5 - spokenForm: clear access drum - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: d} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a[0].b[c.d()] - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.d: - start: {line: 0, character: 9} - end: {line: 0, character: 10} -finalState: - documentContents: | - a[0].b[c] - selections: - - anchor: {line: 0, character: 8} - active: {line: 0, character: 8} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessEach.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessEach.yml deleted file mode 100644 index d95cb087a45..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessEach.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: python -command: - version: 5 - spokenForm: clear access each - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: e} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - aaa().bbb.ccc(eee).ddd - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.e: - start: {line: 0, character: 14} - end: {line: 0, character: 17} -finalState: - documentContents: | - aaa().bbb.ddd - selections: - - anchor: {line: 0, character: 9} - active: {line: 0, character: 9} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessEach2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessEach2.yml deleted file mode 100644 index 389adaaf5da..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessEach2.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: python -command: - version: 5 - spokenForm: clear access each - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: e} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - aaa().bbb.ccc(eee.fff).ddd - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.e: - start: {line: 0, character: 14} - end: {line: 0, character: 17} -finalState: - documentContents: | - aaa().bbb.ccc(.fff).ddd - selections: - - anchor: {line: 0, character: 14} - active: {line: 0, character: 14} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessFine.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessFine.yml deleted file mode 100644 index 8eb3d315daf..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearAccessFine.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: python -command: - version: 5 - spokenForm: clear access fine - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: f} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - aaa().bbb.ccc(eee.fff).ddd - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.f: - start: {line: 0, character: 18} - end: {line: 0, character: 21} -finalState: - documentContents: | - aaa().bbb.ccc(eee).ddd - selections: - - anchor: {line: 0, character: 17} - active: {line: 0, character: 17} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearCondition6.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearCondition6.yml index 9b8a88e416f..cc3dcd6289d 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearCondition6.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearCondition6.yml @@ -21,8 +21,8 @@ initialState: finalState: documentContents: |- match 0: - case : + case a if : pass selections: - - anchor: {line: 1, character: 9} - active: {line: 1, character: 9} + - anchor: {line: 1, character: 14} + active: {line: 1, character: 14} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearEveryAccessAir.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearEveryAccessAir.yml deleted file mode 100644 index 1ef5a7498d4..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearEveryAccessAir.yml +++ /dev/null @@ -1,43 +0,0 @@ -languageId: python -command: - version: 5 - spokenForm: clear every access air - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: everyScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: a} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - ( - aaa - .bbb - .ccc - ) - selections: - - anchor: {line: 5, character: 0} - active: {line: 5, character: 0} - marks: - default.a: - start: {line: 1, character: 4} - end: {line: 1, character: 7} -finalState: - documentContents: | - ( - - - - ) - selections: - - anchor: {line: 1, character: 4} - active: {line: 1, character: 4} - - anchor: {line: 2, character: 4} - active: {line: 2, character: 4} - - anchor: {line: 3, character: 4} - active: {line: 3, character: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearSubject.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearSubject.yml index 94f2e713494..91e63c279c2 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearSubject.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/clearSubject.yml @@ -6,12 +6,10 @@ command: - type: primitive modifiers: - type: containingScope - scopeType: {type: private.switchStatementSubject} + scopeType: {type: switchStatementSubject} usePrePhraseSnapshot: true action: {name: clearAndSetSelection} -spokenFormError: >- - simple scope type type with id private.switchStatementSubject; this is a - private spoken form currently only for internal experimentation +spokenFormError: Scope type 'switchStatementSubject' initialState: documentContents: | match 0: diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/ditchCondition2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/ditchCondition2.yml index ec34cfa59ee..6865adae6a4 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/ditchCondition2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/ditchCondition2.yml @@ -21,7 +21,7 @@ initialState: finalState: documentContents: |- match 0: - case: + case a : pass selections: - anchor: {line: 2, character: 8} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccess.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccess.yml deleted file mode 100644 index f01ca44d732..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccess.yml +++ /dev/null @@ -1,27 +0,0 @@ -languageId: python -command: - version: 5 - spokenForm: take every access - action: {name: setSelection} - targets: - - type: primitive - modifiers: - - type: everyScope - scopeType: {type: private.fieldAccess} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: aaa.bbb() + ccc() - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: aaa.bbb() + ccc() - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 3} - - anchor: {line: 0, character: 3} - active: {line: 0, character: 9} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessAir.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessAir.yml deleted file mode 100644 index 9028b40f70f..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessAir.yml +++ /dev/null @@ -1,37 +0,0 @@ -languageId: python -command: - version: 5 - spokenForm: take every access air - action: {name: setSelection} - targets: - - type: primitive - modifiers: - - type: everyScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: a} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a().b.c().d; - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.a: - start: {line: 0, character: 0} - end: {line: 0, character: 1} -finalState: - documentContents: | - a().b.c().d; - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 3} - - anchor: {line: 0, character: 3} - active: {line: 0, character: 5} - - anchor: {line: 0, character: 5} - active: {line: 0, character: 9} - - anchor: {line: 0, character: 9} - active: {line: 0, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessAir2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessAir2.yml deleted file mode 100644 index 89c8a2b234a..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessAir2.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: python -command: - version: 5 - spokenForm: take every access air - action: {name: setSelection} - targets: - - type: primitive - modifiers: - - type: everyScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: a} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a[0].b[1] - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.a: - start: {line: 0, character: 0} - end: {line: 0, character: 1} -finalState: - documentContents: | - a[0].b[1] - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 4} - - anchor: {line: 0, character: 4} - active: {line: 0, character: 9} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessBat.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessBat.yml deleted file mode 100644 index ef10a03acbd..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessBat.yml +++ /dev/null @@ -1,37 +0,0 @@ -languageId: python -command: - version: 5 - spokenForm: take every access bat - action: {name: setSelection} - targets: - - type: primitive - modifiers: - - type: everyScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: b} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a().b.c().d; - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.b: - start: {line: 0, character: 4} - end: {line: 0, character: 5} -finalState: - documentContents: | - a().b.c().d; - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 3} - - anchor: {line: 0, character: 3} - active: {line: 0, character: 5} - - anchor: {line: 0, character: 5} - active: {line: 0, character: 9} - - anchor: {line: 0, character: 9} - active: {line: 0, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessBat2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessBat2.yml deleted file mode 100644 index 7c17575b92e..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessBat2.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: python -command: - version: 5 - spokenForm: take every access bat - action: {name: setSelection} - targets: - - type: primitive - modifiers: - - type: everyScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: b} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a[0].b[1] - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.b: - start: {line: 0, character: 5} - end: {line: 0, character: 6} -finalState: - documentContents: | - a[0].b[1] - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 4} - - anchor: {line: 0, character: 4} - active: {line: 0, character: 9} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessCap.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessCap.yml deleted file mode 100644 index f720bd7b5a2..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessCap.yml +++ /dev/null @@ -1,37 +0,0 @@ -languageId: python -command: - version: 5 - spokenForm: take every access cap - action: {name: setSelection} - targets: - - type: primitive - modifiers: - - type: everyScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: c} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a().b.c().d; - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.c: - start: {line: 0, character: 6} - end: {line: 0, character: 7} -finalState: - documentContents: | - a().b.c().d; - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 3} - - anchor: {line: 0, character: 3} - active: {line: 0, character: 5} - - anchor: {line: 0, character: 5} - active: {line: 0, character: 9} - - anchor: {line: 0, character: 9} - active: {line: 0, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessCap2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessCap2.yml deleted file mode 100644 index bf1495045ab..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessCap2.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: python -command: - version: 5 - spokenForm: take every access cap - action: {name: setSelection} - targets: - - type: primitive - modifiers: - - type: everyScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: c} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a[0].b[c.d] - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.c: - start: {line: 0, character: 7} - end: {line: 0, character: 8} -finalState: - documentContents: | - a[0].b[c.d] - selections: - - anchor: {line: 0, character: 7} - active: {line: 0, character: 8} - - anchor: {line: 0, character: 8} - active: {line: 0, character: 10} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessDrum.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessDrum.yml deleted file mode 100644 index 460f01c1d3a..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessDrum.yml +++ /dev/null @@ -1,37 +0,0 @@ -languageId: python -command: - version: 5 - spokenForm: take every access drum - action: {name: setSelection} - targets: - - type: primitive - modifiers: - - type: everyScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: d} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a().b.c().d; - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.d: - start: {line: 0, character: 10} - end: {line: 0, character: 11} -finalState: - documentContents: | - a().b.c().d; - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 3} - - anchor: {line: 0, character: 3} - active: {line: 0, character: 5} - - anchor: {line: 0, character: 5} - active: {line: 0, character: 9} - - anchor: {line: 0, character: 9} - active: {line: 0, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessDrum2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessDrum2.yml deleted file mode 100644 index e3942e2e089..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessDrum2.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: python -command: - version: 5 - spokenForm: take every access drum - action: {name: setSelection} - targets: - - type: primitive - modifiers: - - type: everyScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: d} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a[0].b[c.d] - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.d: - start: {line: 0, character: 9} - end: {line: 0, character: 10} -finalState: - documentContents: | - a[0].b[c.d] - selections: - - anchor: {line: 0, character: 7} - active: {line: 0, character: 8} - - anchor: {line: 0, character: 8} - active: {line: 0, character: 10} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessEach.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessEach.yml deleted file mode 100644 index a62a669551f..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessEach.yml +++ /dev/null @@ -1,37 +0,0 @@ -languageId: python -command: - version: 5 - spokenForm: take every access each - action: {name: setSelection} - targets: - - type: primitive - modifiers: - - type: everyScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: e} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a().b.c(e).d; - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.e: - start: {line: 0, character: 8} - end: {line: 0, character: 9} -finalState: - documentContents: | - a().b.c(e).d; - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 3} - - anchor: {line: 0, character: 3} - active: {line: 0, character: 5} - - anchor: {line: 0, character: 5} - active: {line: 0, character: 10} - - anchor: {line: 0, character: 10} - active: {line: 0, character: 12} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessEach2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessEach2.yml deleted file mode 100644 index b6d1649fde9..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeEveryAccessEach2.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: python -command: - version: 5 - spokenForm: take every access each - action: {name: setSelection} - targets: - - type: primitive - modifiers: - - type: everyScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: e} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a().b.c(e.f).d; - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.e: - start: {line: 0, character: 8} - end: {line: 0, character: 9} -finalState: - documentContents: | - a().b.c(e.f).d; - selections: - - anchor: {line: 0, character: 8} - active: {line: 0, character: 9} - - anchor: {line: 0, character: 9} - active: {line: 0, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeString.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeString.yml index ec0732ee802..cb6a793fe78 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeString.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeString.yml @@ -1,14 +1,12 @@ languageId: python command: version: 1 - spokenForm: take parse tree string + spokenForm: take string action: setSelection targets: - type: primitive modifier: {type: containingScope, scopeType: string} -spokenFormError: >- - simple scope type type with id string; this is a private spoken form currently - only for internal experimentation +spokenFormError: Scope type 'string' initialState: documentContents: | diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeString2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeString2.yml index d826dffe54b..5255d44a5d4 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeString2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeString2.yml @@ -1,14 +1,12 @@ languageId: python command: version: 1 - spokenForm: take parse tree string + spokenForm: take string action: setSelection targets: - type: primitive modifier: {type: containingScope, scopeType: string} -spokenFormError: >- - simple scope type type with id string; this is a private spoken form currently - only for internal experimentation +spokenFormError: Scope type 'string' initialState: documentContents: | diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeString3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeString3.yml index 76b8c15d97c..2e95571eea6 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeString3.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeString3.yml @@ -1,14 +1,12 @@ languageId: python command: version: 1 - spokenForm: take parse tree string + spokenForm: take string action: setSelection targets: - type: primitive modifier: {type: containingScope, scopeType: string} -spokenFormError: >- - simple scope type type with id string; this is a private spoken form currently - only for internal experimentation +spokenFormError: Scope type 'string' initialState: documentContents: | diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeString4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeString4.yml index 0b48a66e51a..d562f3523ac 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeString4.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/python/takeString4.yml @@ -1,14 +1,12 @@ languageId: python command: version: 1 - spokenForm: take parse tree string + spokenForm: take string action: setSelection targets: - type: primitive modifier: {type: containingScope, scopeType: string} -spokenFormError: >- - simple scope type type with id string; this is a private spoken form currently - only for internal experimentation +spokenFormError: Scope type 'string' initialState: documentContents: | diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/rust/changeSubject.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/rust/changeSubject.yml index a24422a131c..53696501f82 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/rust/changeSubject.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/rust/changeSubject.yml @@ -6,12 +6,10 @@ command: - type: primitive modifiers: - type: containingScope - scopeType: {type: private.switchStatementSubject} + scopeType: {type: switchStatementSubject} usePrePhraseSnapshot: true action: {name: clearAndSetSelection} -spokenFormError: >- - simple scope type type with id private.switchStatementSubject; this is a - private spoken form currently only for internal experimentation +spokenFormError: Scope type 'switchStatementSubject' initialState: documentContents: | match user { diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/rust/clearBranch5.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/rust/clearBranch5.yml index 043463df1e5..b18031f39e4 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/rust/clearBranch5.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/rust/clearBranch5.yml @@ -26,9 +26,9 @@ finalState: documentContents: |- if n < 0 { print!("{} is negative", n); - } else { + } else else { print!("{} is zero", n); } selections: - - anchor: {line: 2, character: 2} - active: {line: 2, character: 2} + - anchor: {line: 2, character: 7} + active: {line: 2, character: 7} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/rust/clearBranch6.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/rust/clearBranch6.yml index 407fcbc12bc..47a6172ec16 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/rust/clearBranch6.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/rust/clearBranch6.yml @@ -26,9 +26,9 @@ finalState: documentContents: |- if n < 0 { print!("{} is negative", n); - } else { + } else else { print!("{} is zero", n); } selections: - - anchor: {line: 2, character: 2} - active: {line: 2, character: 2} + - anchor: {line: 2, character: 7} + active: {line: 2, character: 7} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/rust/ditchBranch2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/rust/ditchBranch2.yml index dfc29b74b59..6c5749de0a9 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/rust/ditchBranch2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/rust/ditchBranch2.yml @@ -26,7 +26,7 @@ finalState: documentContents: |- if n < 0 { print!("{} is negative", n); - } else { + } else { print!("{} is zero", n); } selections: diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scala/clearString.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scala/clearString.yml index 04d9d5c3bcf..357ab4fd714 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scala/clearString.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scala/clearString.yml @@ -1,14 +1,12 @@ languageId: scala command: version: 0 - spokenForm: change parse tree string + spokenForm: change string action: clearAndSetSelection targets: - type: primitive modifier: {type: containingScope, scopeType: string, includeSiblings: false} -spokenFormError: >- - simple scope type type with id string; this is a private spoken form currently - only for internal experimentation +spokenFormError: Scope type 'string' initialState: documentContents: | class ExampleClass() { diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scala/clearString2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scala/clearString2.yml index db10ab5c6d9..9f8082f9ecd 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scala/clearString2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scala/clearString2.yml @@ -1,14 +1,12 @@ languageId: scala command: version: 0 - spokenForm: change parse tree string + spokenForm: change string action: clearAndSetSelection targets: - type: primitive modifier: {type: containingScope, scopeType: string, includeSiblings: false} -spokenFormError: >- - simple scope type type with id string; this is a private spoken form currently - only for internal experimentation +spokenFormError: Scope type 'string' initialState: documentContents: | val string = """ diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scala/clearStringOdd.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scala/clearStringOdd.yml index 5724ddc567d..acdc1a250f6 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scala/clearStringOdd.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scala/clearStringOdd.yml @@ -1,15 +1,13 @@ languageId: scala command: version: 0 - spokenForm: change parse tree string odd + spokenForm: change string odd action: clearAndSetSelection targets: - type: primitive modifier: {type: containingScope, scopeType: string, includeSiblings: false} mark: {type: decoratedSymbol, symbolColor: default, character: o} -spokenFormError: >- - simple scope type type with id string; this is a private spoken form currently - only for internal experimentation +spokenFormError: Scope type 'string' initialState: documentContents: | class ExampleClass() { diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scala/clearSubject.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scala/clearSubject.yml index 140d4ec89f9..f50e3eee5a2 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scala/clearSubject.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scala/clearSubject.yml @@ -6,12 +6,10 @@ command: - type: primitive modifiers: - type: containingScope - scopeType: {type: private.switchStatementSubject} + scopeType: {type: switchStatementSubject} usePrePhraseSnapshot: true action: {name: clearAndSetSelection} -spokenFormError: >- - simple scope type type with id private.switchStatementSubject; this is a - private spoken form currently only for internal experimentation +spokenFormError: Scope type 'switchStatementSubject' initialState: documentContents: | def matchTest(x: Int): String = x match { diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/changeEveryName.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/changeEveryName.yml index b6c78bcf71c..b30a3a3753c 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/changeEveryName.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/changeEveryName.yml @@ -17,11 +17,11 @@ initialState: active: {line: 0, character: 0} marks: {} finalState: - documentContents: "(aaa) " + documentContents: (aaa) @ @ @ selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} - anchor: {line: 0, character: 7} active: {line: 0, character: 7} - - anchor: {line: 0, character: 8} - active: {line: 0, character: 8} + - anchor: {line: 0, character: 9} + active: {line: 0, character: 9} + - anchor: {line: 0, character: 11} + active: {line: 0, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/changeName.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/changeName.yml index 007b4a4c976..13e3bcd9dff 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/changeName.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/changeName.yml @@ -17,7 +17,7 @@ initialState: active: {line: 0, character: 0} marks: {} finalState: - documentContents: "(aaa) " + documentContents: (aaa) @ selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: {line: 0, character: 7} + active: {line: 0, character: 7} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/changeName2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/changeName2.yml index 3cbfcd6846b..8d70cd725ac 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/changeName2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/changeName2.yml @@ -17,7 +17,7 @@ initialState: active: {line: 0, character: 0} marks: {} finalState: - documentContents: "eee: (aaa) " + documentContents: "eee: (aaa) @" selections: - - anchor: {line: 0, character: 11} - active: {line: 0, character: 11} + - anchor: {line: 0, character: 12} + active: {line: 0, character: 12} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/changeName3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/changeName3.yml index 0c1497b6d41..8406b97e0f2 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/changeName3.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/changeName3.yml @@ -17,7 +17,7 @@ initialState: active: {line: 0, character: 0} marks: {} finalState: - documentContents: "eee: _ " + documentContents: "eee: _ @" selections: - - anchor: {line: 0, character: 7} - active: {line: 0, character: 7} + - anchor: {line: 0, character: 8} + active: {line: 0, character: 8} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/chuckName.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/chuckName.yml index 110e686430a..3a07b9fc756 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/chuckName.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/chuckName.yml @@ -17,7 +17,7 @@ initialState: active: {line: 0, character: 0} marks: {} finalState: - documentContents: (aaa) + documentContents: "(aaa) " selections: - anchor: {line: 0, character: 0} active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/chuckName2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/chuckName2.yml index 3fc43eed23c..48eca2ec19a 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/chuckName2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/chuckName2.yml @@ -17,7 +17,7 @@ initialState: active: {line: 0, character: 20} marks: {} finalState: - documentContents: (aaa) @bbb @ccc + documentContents: "(aaa) @bbb @ccc " selections: - - anchor: {line: 0, character: 15} - active: {line: 0, character: 15} + - anchor: {line: 0, character: 16} + active: {line: 0, character: 16} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearEveryEntry4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearEveryEntry4.yml index ae6c0b318ce..1b93695f542 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearEveryEntry4.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearEveryEntry4.yml @@ -13,7 +13,7 @@ initialState: documentContents: |- ( (_ - (_) @_dummy + (_) @dummy (capture) @name @_.domain.end ) @_.domain.start ) diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearEveryName.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearEveryName.yml index aec931039c3..3d7ca3e4da9 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearEveryName.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearEveryName.yml @@ -16,9 +16,9 @@ initialState: active: {line: 0, character: 0} marks: {} finalState: - documentContents: "(aaa) " + documentContents: (aaa) @ @ selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} - anchor: {line: 0, character: 7} active: {line: 0, character: 7} + - anchor: {line: 0, character: 9} + active: {line: 0, character: 9} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearEveryName2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearEveryName2.yml index c5357a054fc..05f69f20282 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearEveryName2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearEveryName2.yml @@ -16,9 +16,9 @@ initialState: active: {line: 0, character: 0} marks: {} finalState: - documentContents: "[(aaa) (bbb)] " + documentContents: "[(aaa) (bbb)] @ @" selections: - - anchor: {line: 0, character: 14} - active: {line: 0, character: 14} - anchor: {line: 0, character: 15} active: {line: 0, character: 15} + - anchor: {line: 0, character: 17} + active: {line: 0, character: 17} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearEveryName3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearEveryName3.yml index 9e7b369b8f4..4929f597fa0 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearEveryName3.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearEveryName3.yml @@ -21,10 +21,10 @@ initialState: finalState: documentContents: |- (anonymous_node - name: (_) + name: (_) @ @ ) selections: - - anchor: {line: 1, character: 12} - active: {line: 1, character: 12} - anchor: {line: 1, character: 13} active: {line: 1, character: 13} + - anchor: {line: 1, character: 15} + active: {line: 1, character: 15} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName.yml index c256a343034..b9fb035b801 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName.yml @@ -16,7 +16,7 @@ initialState: active: {line: 0, character: 0} marks: {} finalState: - documentContents: "(aaa) " + documentContents: (aaa) @ selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: {line: 0, character: 7} + active: {line: 0, character: 7} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName2.yml index 0d162e078da..93d278995a0 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName2.yml @@ -16,7 +16,7 @@ initialState: active: {line: 0, character: 11} marks: {} finalState: - documentContents: "(aaa) @bbb " + documentContents: (aaa) @bbb @ selections: - - anchor: {line: 0, character: 11} - active: {line: 0, character: 11} + - anchor: {line: 0, character: 12} + active: {line: 0, character: 12} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName3.yml index b9d903fb6de..6483c5f1a44 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName3.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName3.yml @@ -16,7 +16,7 @@ initialState: active: {line: 0, character: 0} marks: {} finalState: - documentContents: "(aaa) " + documentContents: (aaa) @ selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: {line: 0, character: 7} + active: {line: 0, character: 7} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName4.yml index 027eced85e6..5965b2f56f2 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName4.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName4.yml @@ -16,7 +16,7 @@ initialState: active: {line: 0, character: 0} marks: {} finalState: - documentContents: "\"aaa\" " + documentContents: "\"aaa\" @" selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} + - anchor: {line: 0, character: 7} + active: {line: 0, character: 7} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName5.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName5.yml index 61cf415eb4c..2f239de12bb 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName5.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName5.yml @@ -16,7 +16,7 @@ initialState: active: {line: 0, character: 0} marks: {} finalState: - documentContents: "[(aaa) (bbb)] " + documentContents: "[(aaa) (bbb)] @" selections: - - anchor: {line: 0, character: 14} - active: {line: 0, character: 14} + - anchor: {line: 0, character: 15} + active: {line: 0, character: 15} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName6.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName6.yml index 4c0da036873..47fc49c9ad3 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName6.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName6.yml @@ -23,8 +23,8 @@ finalState: documentContents: |- (anonymous_node - name: (_) + name: (_) @ ) selections: - - anchor: {line: 2, character: 12} - active: {line: 2, character: 12} + - anchor: {line: 2, character: 13} + active: {line: 2, character: 13} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName7.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName7.yml index e0b700e0db6..7f29ed6af72 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName7.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/clearName7.yml @@ -21,8 +21,8 @@ initialState: finalState: documentContents: |- (anonymous_node - name: (_) + name: (_) @ ) selections: - - anchor: {line: 1, character: 12} - active: {line: 1, character: 12} + - anchor: {line: 1, character: 13} + active: {line: 1, character: 13} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/drinkName.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/drinkName.yml index 7116c6e7257..f4501138fc1 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/drinkName.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/drinkName.yml @@ -17,7 +17,7 @@ initialState: active: {line: 0, character: 0} marks: {} finalState: - documentContents: "eee: _ @bbb @ccc" + documentContents: "eee: _ @ @bbb @ccc" selections: - - anchor: {line: 0, character: 7} - active: {line: 0, character: 7} + - anchor: {line: 0, character: 8} + active: {line: 0, character: 8} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/pourName.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/pourName.yml index 13901f9110e..61df78276b4 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/pourName.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/pourName.yml @@ -17,7 +17,7 @@ initialState: active: {line: 0, character: 0} marks: {} finalState: - documentContents: "eee: _ @bbb @ccc " + documentContents: "eee: _ @bbb @ccc @" selections: - - anchor: {line: 0, character: 17} - active: {line: 0, character: 17} + - anchor: {line: 0, character: 18} + active: {line: 0, character: 18} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/pourName2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/pourName2.yml index 607c1ecb5e5..dccd9539974 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/pourName2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/pourName2.yml @@ -17,7 +17,7 @@ initialState: active: {line: 0, character: 7} marks: {} finalState: - documentContents: "eee: _ @bbb @ccc" + documentContents: "eee: _ @bbb @ @ccc" selections: - - anchor: {line: 0, character: 12} - active: {line: 0, character: 12} + - anchor: {line: 0, character: 13} + active: {line: 0, character: 13} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/takeName.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/takeName.yml index 6b089e26452..6c7c8a477d4 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/takeName.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scm/takeName.yml @@ -19,5 +19,5 @@ initialState: finalState: documentContents: (aaa) @bbb @ccc @ddd selections: - - anchor: {line: 0, character: 6} + - anchor: {line: 0, character: 7} active: {line: 0, character: 20} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/changeFirstWordLook.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/changeFirstWordLook.yml index e81ae9a3036..83e40772bbf 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/changeFirstWordLook.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/changeFirstWordLook.yml @@ -1,6 +1,6 @@ languageId: scss command: - spokenForm: change first sub look + spokenForm: change first word look version: 2 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/changeLastWordLook.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/changeLastWordLook.yml index 39e8d28c465..2c6f1014fc1 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/changeLastWordLook.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/changeLastWordLook.yml @@ -1,6 +1,6 @@ languageId: scss command: - spokenForm: change last sub look + spokenForm: change last word look version: 2 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/changeLeadingLastWordLook.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/changeLeadingLastWordLook.yml index 37c9b21b244..17e93e642fe 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/changeLeadingLastWordLook.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/changeLeadingLastWordLook.yml @@ -1,6 +1,6 @@ languageId: scss command: - spokenForm: change leading last sub look + spokenForm: change leading last word look version: 2 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/changeSecondWordLook.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/changeSecondWordLook.yml index de65b729d7a..565e5eb754b 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/changeSecondWordLook.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/changeSecondWordLook.yml @@ -1,6 +1,6 @@ languageId: scss command: - spokenForm: change second sub look + spokenForm: change second word look version: 2 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/changeTrailingFirstWordLook.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/changeTrailingFirstWordLook.yml index 36037c77e83..41e9701e3de 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/changeTrailingFirstWordLook.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/changeTrailingFirstWordLook.yml @@ -1,6 +1,6 @@ languageId: scss command: - spokenForm: change trailing first sub look + spokenForm: change trailing first word look version: 2 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/chuckFirstWordCap.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/chuckFirstWordCap.yml index e341e33eb73..c55307fc14d 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/chuckFirstWordCap.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/chuckFirstWordCap.yml @@ -1,6 +1,6 @@ languageId: scss command: - spokenForm: chuck first sub cap + spokenForm: chuck first word cap version: 2 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/chuckLastWordCap.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/chuckLastWordCap.yml index 321771187c4..7994aebe17c 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/chuckLastWordCap.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/chuckLastWordCap.yml @@ -1,6 +1,6 @@ languageId: scss command: - spokenForm: chuck last sub cap + spokenForm: chuck last word cap version: 2 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/moveFirstWordZipBeforeFineTakeFine.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/moveFirstWordZipBeforeFineTakeFine.yml index 1faf2699983..a60a82ecdfa 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/moveFirstWordZipBeforeFineTakeFine.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/moveFirstWordZipBeforeFineTakeFine.yml @@ -1,6 +1,6 @@ languageId: scss command: - spokenForm: move first sub zip before fine take fine + spokenForm: move first word zip before fine take fine version: 2 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/moveFirstWordZipBeforeFineTakeZip.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/moveFirstWordZipBeforeFineTakeZip.yml index b2d9ad131ff..0fb7e69488f 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/moveFirstWordZipBeforeFineTakeZip.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/moveFirstWordZipBeforeFineTakeZip.yml @@ -1,6 +1,6 @@ languageId: scss command: - spokenForm: move first sub zip before fine take zip + spokenForm: move first word zip before fine take zip version: 2 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/moveLastWordZipAfterFineTakeFine.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/moveLastWordZipAfterFineTakeFine.yml index 01f5c33cc21..05867d42865 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/moveLastWordZipAfterFineTakeFine.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/moveLastWordZipAfterFineTakeFine.yml @@ -1,6 +1,6 @@ languageId: scss command: - spokenForm: move last sub zip after fine take fine + spokenForm: move last word zip after fine take fine version: 2 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/moveLastWordZipAfterFineTakeZip.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/moveLastWordZipAfterFineTakeZip.yml index 777894ac1e2..dfcdc993633 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/moveLastWordZipAfterFineTakeZip.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/scss/moveLastWordZipAfterFineTakeZip.yml @@ -1,6 +1,6 @@ languageId: scss command: - spokenForm: move last sub zip after fine take zip + spokenForm: move last word zip after fine take zip version: 2 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/shellscript/changeThirdWordDash.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/shellscript/changeThirdWordDash.yml index 4a145c8b75e..e2edc51ed98 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/shellscript/changeThirdWordDash.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/shellscript/changeThirdWordDash.yml @@ -1,6 +1,6 @@ languageId: shellscript command: - spokenForm: change third sub dash + spokenForm: change third word dash version: 2 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/shellscript/chuckFirstWordBat.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/shellscript/chuckFirstWordBat.yml index 289cc29b011..30560c9909d 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/shellscript/chuckFirstWordBat.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/shellscript/chuckFirstWordBat.yml @@ -1,6 +1,6 @@ languageId: shellscript command: - spokenForm: chuck first sub bat + spokenForm: chuck first word bat version: 2 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/shellscript/chuckSecondWordCap.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/shellscript/chuckSecondWordCap.yml index 043d0dd1cc5..3b8021321f2 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/shellscript/chuckSecondWordCap.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/shellscript/chuckSecondWordCap.yml @@ -1,6 +1,6 @@ languageId: shellscript command: - spokenForm: chuck second sub cap + spokenForm: chuck second word cap version: 2 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeCallee5.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeCallee5.yml index 416c3ddceaf..d7860bc9b31 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeCallee5.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeCallee5.yml @@ -13,7 +13,7 @@ initialState: active: {line: 0, character: 24} marks: {} finalState: - documentContents: let test = () + documentContents: let test = new () selections: - - anchor: {line: 0, character: 11} - active: {line: 0, character: 11} + - anchor: {line: 0, character: 15} + active: {line: 0, character: 15} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeCallee6.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeCallee6.yml index 051a48e2840..26ab2b8052e 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeCallee6.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeCallee6.yml @@ -13,7 +13,7 @@ initialState: active: {line: 0, character: 28} marks: {} finalState: - documentContents: let test = () + documentContents: let test = new () selections: - - anchor: {line: 0, character: 11} - active: {line: 0, character: 11} + - anchor: {line: 0, character: 15} + active: {line: 0, character: 15} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeCallee7.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeCallee7.yml index 1697ce71e1d..9987c91cec4 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeCallee7.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeCallee7.yml @@ -13,7 +13,7 @@ initialState: active: {line: 0, character: 24} marks: {} finalState: - documentContents: let test = () + documentContents: let test = new () selections: - - anchor: {line: 0, character: 11} - active: {line: 0, character: 11} + - anchor: {line: 0, character: 15} + active: {line: 0, character: 15} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeEveryArg.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeEveryArg.yml deleted file mode 100644 index 9303457e261..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeEveryArg.yml +++ /dev/null @@ -1,35 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change every arg - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: argumentOrParameter} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - function funk( - foo: number, // Comment1 - // Comment2 - bar?: string - ) {} - selections: - - anchor: {line: 1, character: 2} - active: {line: 1, character: 2} - marks: {} -finalState: - documentContents: |- - function funk( - , // Comment1 - // Comment2 - - ) {} - selections: - - anchor: {line: 1, character: 2} - active: {line: 1, character: 2} - - anchor: {line: 3, character: 2} - active: {line: 3, character: 2} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeEveryArg2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeEveryArg2.yml deleted file mode 100644 index ff584048774..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeEveryArg2.yml +++ /dev/null @@ -1,35 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change every arg - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: argumentOrParameter} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - funk( - "foo", // Comment1 - // Comment2 - 2 - ); - selections: - - anchor: {line: 1, character: 2} - active: {line: 1, character: 2} - marks: {} -finalState: - documentContents: |- - funk( - , // Comment1 - // Comment2 - - ); - selections: - - anchor: {line: 1, character: 2} - active: {line: 1, character: 2} - - anchor: {line: 3, character: 2} - active: {line: 3, character: 2} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeEveryType.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeEveryType.yml deleted file mode 100644 index 22dce551cee..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeEveryType.yml +++ /dev/null @@ -1,29 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change every type - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - const aaa: number = 0; - const bbb: number = 0; - selections: - - anchor: {line: 1, character: 22} - active: {line: 1, character: 22} - marks: {} -finalState: - documentContents: |- - const aaa: = 0; - const bbb: = 0; - selections: - - anchor: {line: 0, character: 11} - active: {line: 0, character: 11} - - anchor: {line: 1, character: 11} - active: {line: 1, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeEveryType2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeEveryType2.yml deleted file mode 100644 index ea58ee05081..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeEveryType2.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change every type - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - function ccc() { - const aaa: number = 0; - const bbb: number = 0; - } - selections: - - anchor: {line: 2, character: 26} - active: {line: 2, character: 26} - marks: {} -finalState: - documentContents: |- - function ccc() { - const aaa: = 0; - const bbb: = 0; - } - selections: - - anchor: {line: 1, character: 15} - active: {line: 1, character: 15} - - anchor: {line: 2, character: 15} - active: {line: 2, character: 15} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeEveryType3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeEveryType3.yml deleted file mode 100644 index 3aa8f6544f0..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeEveryType3.yml +++ /dev/null @@ -1,25 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change every type - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: "function ccc(aaa: string, bbb: string) {}" - selections: - - anchor: {line: 0, character: 13} - active: {line: 0, character: 13} - marks: {} -finalState: - documentContents: "function ccc(aaa: , bbb: ) {}" - selections: - - anchor: {line: 0, character: 18} - active: {line: 0, character: 18} - - anchor: {line: 0, character: 25} - active: {line: 0, character: 25} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeName6.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeName6.yml deleted file mode 100644 index a9f51c2bc5c..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeName6.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change name - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: name} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - class Foo { - bar - } - - selections: - - anchor: {line: 1, character: 4} - active: {line: 1, character: 4} - marks: {} -finalState: - documentContents: |- - class Foo { - - } - - selections: - - anchor: {line: 1, character: 4} - active: {line: 1, character: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeNextValue.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeNextValue.yml deleted file mode 100644 index 3abb6a35542..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeNextValue.yml +++ /dev/null @@ -1,30 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change next value - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: relativeScope - scopeType: {type: value} - offset: 1 - length: 1 - direction: forward - usePrePhraseSnapshot: true -initialState: - documentContents: |- - const aaa = 0; - const bbb = 0; - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: |- - const aaa = 0; - const bbb = ; - selections: - - anchor: {line: 1, character: 12} - active: {line: 1, character: 12} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType10.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType10.yml deleted file mode 100644 index 44b85af3f4a..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType10.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change type - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - useState() - useState>() - selections: - - anchor: {line: 0, character: 9} - active: {line: 0, character: 9} - - anchor: {line: 1, character: 9} - active: {line: 1, character: 9} - marks: {} -finalState: - documentContents: |- - useState<>() - useState<>() - selections: - - anchor: {line: 0, character: 9} - active: {line: 0, character: 9} - - anchor: {line: 1, character: 9} - active: {line: 1, character: 9} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType11.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType11.yml deleted file mode 100644 index eb89a273ddc..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType11.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change type - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: foo>() - selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} - marks: {} -finalState: - documentContents: foo<>() - selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType12.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType12.yml deleted file mode 100644 index c398b0bb3f0..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType12.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change type - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: foo() - selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} - marks: {} -finalState: - documentContents: foo<, string>() - selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType13.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType13.yml deleted file mode 100644 index 44327c208af..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType13.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change type - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: foo() - selections: - - anchor: {line: 0, character: 12} - active: {line: 0, character: 12} - marks: {} -finalState: - documentContents: foo() - selections: - - anchor: {line: 0, character: 12} - active: {line: 0, character: 12} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType14.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType14.yml deleted file mode 100644 index 9bd3d60cb72..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType14.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change type - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: Foo() - selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} - marks: {} -finalState: - documentContents: Foo<>() - selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType15.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType15.yml deleted file mode 100644 index 5f2139d9190..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType15.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change type - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: |+ - function foo() { - - } - - selections: - - anchor: {line: 0, character: 13} - active: {line: 0, character: 13} - marks: {} -finalState: - documentContents: |+ - function foo<>() { - - } - - selections: - - anchor: {line: 0, character: 13} - active: {line: 0, character: 13} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType16.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType16.yml deleted file mode 100644 index d0d68f88c30..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType16.yml +++ /dev/null @@ -1,29 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change type - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: | - const bar = () => { - - } - selections: - - anchor: {line: 0, character: 13} - active: {line: 0, character: 13} - marks: {} -finalState: - documentContents: | - const bar = <>() => { - - } - selections: - - anchor: {line: 0, character: 13} - active: {line: 0, character: 13} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType17.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType17.yml deleted file mode 100644 index 3debe09351e..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType17.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change type - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: "const foo: Record = {}" - selections: - - anchor: {line: 0, character: 18} - active: {line: 0, character: 18} - marks: {} -finalState: - documentContents: "const foo: Record<, string> = {}" - selections: - - anchor: {line: 0, character: 18} - active: {line: 0, character: 18} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType18.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType18.yml deleted file mode 100644 index 93ee6a3e166..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType18.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change type - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: "const foo: string = new Bar(foo);" - selections: - - anchor: {line: 0, character: 24} - active: {line: 0, character: 24} - marks: {} -finalState: - documentContents: "const foo: string = new (foo);" - selections: - - anchor: {line: 0, character: 24} - active: {line: 0, character: 24} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType19.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType19.yml deleted file mode 100644 index 2d6199ff980..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType19.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change type - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: "const foo: Bar = new Bar(foo);" - selections: - - anchor: {line: 0, character: 11} - active: {line: 0, character: 11} - marks: {} -finalState: - documentContents: "const foo: = new Bar(foo);" - selections: - - anchor: {line: 0, character: 11} - active: {line: 0, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType20.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType20.yml deleted file mode 100644 index 62a707fc000..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType20.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change type - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: "const foo: Bar = new Bar(foo);" - selections: - - anchor: {line: 0, character: 15} - active: {line: 0, character: 15} - marks: {} -finalState: - documentContents: "const foo: Bar<> = new Bar(foo);" - selections: - - anchor: {line: 0, character: 15} - active: {line: 0, character: 15} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType21.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType21.yml deleted file mode 100644 index d0c99f3377c..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType21.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change type - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - class Foo { - bar: string; - } - - selections: - - anchor: {line: 1, character: 4} - active: {line: 1, character: 4} - marks: {} -finalState: - documentContents: |- - class Foo { - bar: ; - } - - selections: - - anchor: {line: 1, character: 9} - active: {line: 1, character: 9} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType22.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType22.yml deleted file mode 100644 index 1fc169996ee..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType22.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change type - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - class Foo { - bar(): string {} - } - - selections: - - anchor: {line: 1, character: 4} - active: {line: 1, character: 4} - marks: {} -finalState: - documentContents: |- - class Foo { - bar(): {} - } - - selections: - - anchor: {line: 1, character: 11} - active: {line: 1, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType23.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType23.yml deleted file mode 100644 index 854d3fe7139..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType23.yml +++ /dev/null @@ -1,29 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change type - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - interface Foo { - bar: string; - } - selections: - - anchor: {line: 1, character: 16} - active: {line: 1, character: 16} - marks: {} -finalState: - documentContents: |- - interface Foo { - bar: ; - } - selections: - - anchor: {line: 1, character: 9} - active: {line: 1, character: 9} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType7.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType7.yml deleted file mode 100644 index 4209ffa5d4e..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType7.yml +++ /dev/null @@ -1,113 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change type - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - const aaa: number = 0; - let bbb: number = 0; - var hhh: number = 0; - const ddd: number = 0, eee: number = 0; - let fff: number = 0, ggg: number = 0; - var iii: number = 0; - export const jjj: number = 0; - export let kkk: number = 0; - export var lll: number = 0; - export const mmm: number = 0, nnn: number = 0; - export let ooo: number = 0, ppp: number = 0; - let qqq: number; - var rrr: number; - let sss: number, ttt: number; - selections: - - anchor: {line: 0, character: 22} - active: {line: 0, character: 22} - - anchor: {line: 1, character: 20} - active: {line: 1, character: 20} - - anchor: {line: 2, character: 20} - active: {line: 2, character: 20} - - anchor: {line: 3, character: 39} - active: {line: 3, character: 39} - - anchor: {line: 4, character: 37} - active: {line: 4, character: 37} - - anchor: {line: 5, character: 20} - active: {line: 5, character: 20} - - anchor: {line: 6, character: 29} - active: {line: 6, character: 29} - - anchor: {line: 7, character: 27} - active: {line: 7, character: 27} - - anchor: {line: 8, character: 27} - active: {line: 8, character: 27} - - anchor: {line: 9, character: 46} - active: {line: 9, character: 46} - - anchor: {line: 10, character: 44} - active: {line: 10, character: 44} - - anchor: {line: 11, character: 16} - active: {line: 11, character: 16} - - anchor: {line: 12, character: 16} - active: {line: 12, character: 16} - - anchor: {line: 13, character: 29} - active: {line: 13, character: 29} - marks: {} -finalState: - documentContents: |- - const aaa: = 0; - let bbb: = 0; - var hhh: = 0; - const ddd: = 0, eee: = 0; - let fff: = 0, ggg: = 0; - var iii: = 0; - export const jjj: = 0; - export let kkk: = 0; - export var lll: = 0; - export const mmm: = 0, nnn: = 0; - export let ooo: = 0, ppp: = 0; - let qqq: ; - var rrr: ; - let sss: , ttt: ; - selections: - - anchor: {line: 0, character: 11} - active: {line: 0, character: 11} - - anchor: {line: 1, character: 9} - active: {line: 1, character: 9} - - anchor: {line: 2, character: 9} - active: {line: 2, character: 9} - - anchor: {line: 3, character: 11} - active: {line: 3, character: 11} - - anchor: {line: 3, character: 22} - active: {line: 3, character: 22} - - anchor: {line: 4, character: 9} - active: {line: 4, character: 9} - - anchor: {line: 4, character: 20} - active: {line: 4, character: 20} - - anchor: {line: 5, character: 9} - active: {line: 5, character: 9} - - anchor: {line: 6, character: 18} - active: {line: 6, character: 18} - - anchor: {line: 7, character: 16} - active: {line: 7, character: 16} - - anchor: {line: 8, character: 16} - active: {line: 8, character: 16} - - anchor: {line: 9, character: 18} - active: {line: 9, character: 18} - - anchor: {line: 9, character: 29} - active: {line: 9, character: 29} - - anchor: {line: 10, character: 16} - active: {line: 10, character: 16} - - anchor: {line: 10, character: 27} - active: {line: 10, character: 27} - - anchor: {line: 11, character: 9} - active: {line: 11, character: 9} - - anchor: {line: 12, character: 9} - active: {line: 12, character: 9} - - anchor: {line: 13, character: 9} - active: {line: 13, character: 9} - - anchor: {line: 13, character: 16} - active: {line: 13, character: 16} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType8.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType8.yml deleted file mode 100644 index bceb2cd1ff8..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType8.yml +++ /dev/null @@ -1,43 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change type - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - const ddd: number = 0, eee: number = 0; - let fff: number = 0, ggg: number = 0; - export const mmm: number = 0, nnn: number = 0; - export let ooo: number = 0, ppp: number = 0; - selections: - - anchor: {line: 0, character: 38} - active: {line: 0, character: 38} - - anchor: {line: 1, character: 36} - active: {line: 1, character: 36} - - anchor: {line: 2, character: 45} - active: {line: 2, character: 45} - - anchor: {line: 3, character: 43} - active: {line: 3, character: 43} - marks: {} -finalState: - documentContents: |- - const ddd: number = 0, eee: = 0; - let fff: number = 0, ggg: = 0; - export const mmm: number = 0, nnn: = 0; - export let ooo: number = 0, ppp: = 0; - selections: - - anchor: {line: 0, character: 28} - active: {line: 0, character: 28} - - anchor: {line: 1, character: 26} - active: {line: 1, character: 26} - - anchor: {line: 2, character: 35} - active: {line: 2, character: 35} - - anchor: {line: 3, character: 33} - active: {line: 3, character: 33} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType9.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType9.yml deleted file mode 100644 index 2f34eb03e89..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeType9.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change type - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: const aaa = "bbb" as const; - selections: - - anchor: {line: 0, character: 12} - active: {line: 0, character: 12} - marks: {} -finalState: - documentContents: const aaa = "bbb" as ; - selections: - - anchor: {line: 0, character: 21} - active: {line: 0, character: 21} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeValue2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeValue2.yml deleted file mode 100644 index f90f08c9cc7..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeValue2.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change value - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - class Foo { - bar: string = "baz"; - } - - selections: - - anchor: {line: 1, character: 4} - active: {line: 1, character: 4} - marks: {} -finalState: - documentContents: |- - class Foo { - bar: string = ; - } - - selections: - - anchor: {line: 1, character: 18} - active: {line: 1, character: 18} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeValue3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeValue3.yml deleted file mode 100644 index a30afee37ed..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeValue3.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change value - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: map(str => str.length) - selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} - marks: {} -finalState: - documentContents: map(str => ) - selections: - - anchor: {line: 0, character: 11} - active: {line: 0, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeValue4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeValue4.yml deleted file mode 100644 index f2ed3857b7b..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeValue4.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change value - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: map(str => 0) - selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} - marks: {} -finalState: - documentContents: map(str => ) - selections: - - anchor: {line: 0, character: 11} - active: {line: 0, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeValue5.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeValue5.yml deleted file mode 100644 index af3aa84b324..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/changeValue5.yml +++ /dev/null @@ -1,25 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change value - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: | - const { aaa: bbb } = ccc; - selections: - - anchor: {line: 0, character: 8} - active: {line: 0, character: 8} - marks: {} -finalState: - documentContents: | - const { aaa: } = ccc; - selections: - - anchor: {line: 0, character: 13} - active: {line: 0, character: 13} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckKey2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckKey2.yml deleted file mode 100644 index bcecb8a3d7f..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckKey2.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: chuck key - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionKey} - usePrePhraseSnapshot: true -initialState: - documentContents: "const { aaa: bbb } = ccc;" - selections: - - anchor: {line: 0, character: 9} - active: {line: 0, character: 9} - marks: {} -finalState: - documentContents: const { bbb } = ccc; - selections: - - anchor: {line: 0, character: 8} - active: {line: 0, character: 8} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckName.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckName.yml deleted file mode 100644 index 98d3b3a1259..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckName.yml +++ /dev/null @@ -1,55 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: chuck name - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: name} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - const aaa: number = 0; - let bbb: number = 0; - var hhh: number = 0; - const ddd: number = 0, eee: number = 0; - let fff: number = 0, ggg: number = 0; - var iii: number = 0; - selections: - - anchor: {line: 0, character: 22} - active: {line: 0, character: 22} - - anchor: {line: 1, character: 20} - active: {line: 1, character: 20} - - anchor: {line: 2, character: 20} - active: {line: 2, character: 20} - - anchor: {line: 3, character: 39} - active: {line: 3, character: 39} - - anchor: {line: 4, character: 37} - active: {line: 4, character: 37} - - anchor: {line: 5, character: 20} - active: {line: 5, character: 20} - marks: {} -finalState: - documentContents: |- - 0; - 0; - 0; - 0, 0; - 0, 0; - 0; - selections: - - anchor: {line: 0, character: 2} - active: {line: 0, character: 2} - - anchor: {line: 1, character: 2} - active: {line: 1, character: 2} - - anchor: {line: 2, character: 2} - active: {line: 2, character: 2} - - anchor: {line: 3, character: 5} - active: {line: 3, character: 5} - - anchor: {line: 4, character: 5} - active: {line: 4, character: 5} - - anchor: {line: 5, character: 2} - active: {line: 5, character: 2} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckType.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckType.yml deleted file mode 100644 index b5384c9514a..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckType.yml +++ /dev/null @@ -1,103 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: chuck type - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - const aaa: number = 0; - let bbb: number = 0; - var hhh: number = 0; - const ddd: number = 0, eee: number = 0; - let fff: number = 0, ggg: number = 0; - var iii: number = 0; - export const jjj: number = 0; - export let kkk: number = 0; - export var lll: number = 0; - export const mmm: number = 0, nnn: number = 0; - export let ooo: number = 0, ppp: number = 0; - let qqq: number; - var rrr: number; - let sss: number, ttt: number; - selections: - - anchor: {line: 0, character: 22} - active: {line: 0, character: 22} - - anchor: {line: 1, character: 20} - active: {line: 1, character: 20} - - anchor: {line: 2, character: 20} - active: {line: 2, character: 20} - - anchor: {line: 3, character: 39} - active: {line: 3, character: 39} - - anchor: {line: 4, character: 37} - active: {line: 4, character: 37} - - anchor: {line: 5, character: 20} - active: {line: 5, character: 20} - - anchor: {line: 6, character: 29} - active: {line: 6, character: 29} - - anchor: {line: 7, character: 27} - active: {line: 7, character: 27} - - anchor: {line: 8, character: 27} - active: {line: 8, character: 27} - - anchor: {line: 9, character: 46} - active: {line: 9, character: 46} - - anchor: {line: 10, character: 44} - active: {line: 10, character: 44} - - anchor: {line: 11, character: 16} - active: {line: 11, character: 16} - - anchor: {line: 12, character: 16} - active: {line: 12, character: 16} - - anchor: {line: 13, character: 29} - active: {line: 13, character: 29} - marks: {} -finalState: - documentContents: |- - const aaa = 0; - let bbb = 0; - var hhh = 0; - const ddd = 0, eee = 0; - let fff = 0, ggg = 0; - var iii = 0; - export const jjj = 0; - export let kkk = 0; - export var lll = 0; - export const mmm = 0, nnn = 0; - export let ooo = 0, ppp = 0; - let qqq; - var rrr; - let sss, ttt; - selections: - - anchor: {line: 0, character: 14} - active: {line: 0, character: 14} - - anchor: {line: 1, character: 12} - active: {line: 1, character: 12} - - anchor: {line: 2, character: 12} - active: {line: 2, character: 12} - - anchor: {line: 3, character: 23} - active: {line: 3, character: 23} - - anchor: {line: 4, character: 21} - active: {line: 4, character: 21} - - anchor: {line: 5, character: 12} - active: {line: 5, character: 12} - - anchor: {line: 6, character: 21} - active: {line: 6, character: 21} - - anchor: {line: 7, character: 19} - active: {line: 7, character: 19} - - anchor: {line: 8, character: 19} - active: {line: 8, character: 19} - - anchor: {line: 9, character: 30} - active: {line: 9, character: 30} - - anchor: {line: 10, character: 28} - active: {line: 10, character: 28} - - anchor: {line: 11, character: 8} - active: {line: 11, character: 8} - - anchor: {line: 12, character: 8} - active: {line: 12, character: 8} - - anchor: {line: 13, character: 13} - active: {line: 13, character: 13} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckType2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckType2.yml deleted file mode 100644 index bf4a234195b..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckType2.yml +++ /dev/null @@ -1,43 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: chuck type - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - const ddd: number = 0, eee: number = 0; - let fff: number = 0, ggg: number = 0; - export const mmm: number = 0, nnn: number = 0; - export let ooo: number = 0, ppp: number = 0; - selections: - - anchor: {line: 0, character: 38} - active: {line: 0, character: 38} - - anchor: {line: 1, character: 36} - active: {line: 1, character: 36} - - anchor: {line: 2, character: 45} - active: {line: 2, character: 45} - - anchor: {line: 3, character: 43} - active: {line: 3, character: 43} - marks: {} -finalState: - documentContents: |- - const ddd: number = 0, eee = 0; - let fff: number = 0, ggg = 0; - export const mmm: number = 0, nnn = 0; - export let ooo: number = 0, ppp = 0; - selections: - - anchor: {line: 0, character: 30} - active: {line: 0, character: 30} - - anchor: {line: 1, character: 28} - active: {line: 1, character: 28} - - anchor: {line: 2, character: 37} - active: {line: 2, character: 37} - - anchor: {line: 3, character: 35} - active: {line: 3, character: 35} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckType3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckType3.yml deleted file mode 100644 index 98c66b1bdf6..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckType3.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: chuck type - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: const aaa = bbb; - selections: - - anchor: {line: 0, character: 23} - active: {line: 0, character: 23} - marks: {} -finalState: - documentContents: const aaa = bbb; - selections: - - anchor: {line: 0, character: 15} - active: {line: 0, character: 15} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckType4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckType4.yml deleted file mode 100644 index 353fae2e9f5..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckType4.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: chuck type - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - const aaa = bbb as string; - const ccc = ddd satisfies string; - selections: - - anchor: {line: 0, character: 12} - active: {line: 0, character: 12} - - anchor: {line: 1, character: 12} - active: {line: 1, character: 12} - marks: {} -finalState: - documentContents: |- - const aaa = bbb; - const ccc = ddd; - selections: - - anchor: {line: 0, character: 12} - active: {line: 0, character: 12} - - anchor: {line: 1, character: 12} - active: {line: 1, character: 12} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckType5.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckType5.yml deleted file mode 100644 index b3fc76c207b..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckType5.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: chuck type - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: const aaa = "bbb" as const; - selections: - - anchor: {line: 0, character: 12} - active: {line: 0, character: 12} - marks: {} -finalState: - documentContents: const aaa = "bbb"; - selections: - - anchor: {line: 0, character: 12} - active: {line: 0, character: 12} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckType6.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckType6.yml deleted file mode 100644 index c0a5aab13f6..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckType6.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: chuck type - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: type} - usePrePhraseSnapshot: true -initialState: - documentContents: foo - selections: - - anchor: {line: 0, character: 1} - active: {line: 0, character: 1} - marks: {} -finalState: - documentContents: foo - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckValue2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckValue2.yml deleted file mode 100644 index d48d3e78e4c..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckValue2.yml +++ /dev/null @@ -1,85 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: chuck value - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - const aaa: number = 0; - let bbb: number = 0; - var hhh: number = 0; - const ddd: number = 0, eee: number = 0; - let fff: number = 0, ggg: number = 0; - var iii: number = 0; - export const jjj: number = 0; - export let kkk: number = 0; - export var lll: number = 0; - export const mmm: number = 0, nnn: number = 0; - export let ooo: number = 0, ppp: number = 0; - selections: - - anchor: {line: 0, character: 22} - active: {line: 0, character: 22} - - anchor: {line: 1, character: 20} - active: {line: 1, character: 20} - - anchor: {line: 2, character: 20} - active: {line: 2, character: 20} - - anchor: {line: 3, character: 39} - active: {line: 3, character: 39} - - anchor: {line: 4, character: 37} - active: {line: 4, character: 37} - - anchor: {line: 5, character: 20} - active: {line: 5, character: 20} - - anchor: {line: 6, character: 29} - active: {line: 6, character: 29} - - anchor: {line: 7, character: 27} - active: {line: 7, character: 27} - - anchor: {line: 8, character: 27} - active: {line: 8, character: 27} - - anchor: {line: 9, character: 46} - active: {line: 9, character: 46} - - anchor: {line: 10, character: 44} - active: {line: 10, character: 44} - marks: {} -finalState: - documentContents: |- - const aaa: number; - let bbb: number; - var hhh: number; - const ddd: number, eee: number; - let fff: number, ggg: number; - var iii: number; - export const jjj: number; - export let kkk: number; - export var lll: number; - export const mmm: number, nnn: number; - export let ooo: number, ppp: number; - selections: - - anchor: {line: 0, character: 18} - active: {line: 0, character: 18} - - anchor: {line: 1, character: 16} - active: {line: 1, character: 16} - - anchor: {line: 2, character: 16} - active: {line: 2, character: 16} - - anchor: {line: 3, character: 31} - active: {line: 3, character: 31} - - anchor: {line: 4, character: 29} - active: {line: 4, character: 29} - - anchor: {line: 5, character: 16} - active: {line: 5, character: 16} - - anchor: {line: 6, character: 25} - active: {line: 6, character: 25} - - anchor: {line: 7, character: 23} - active: {line: 7, character: 23} - - anchor: {line: 8, character: 23} - active: {line: 8, character: 23} - - anchor: {line: 9, character: 38} - active: {line: 9, character: 38} - - anchor: {line: 10, character: 36} - active: {line: 10, character: 36} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckValue3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckValue3.yml deleted file mode 100644 index a282ba65086..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckValue3.yml +++ /dev/null @@ -1,43 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: chuck value - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - const ddd: number = 0, eee: number = 0; - let fff: number = 0, ggg: number = 0; - export const mmm: number = 0, nnn: number = 0; - export let ooo: number = 0, ppp: number = 0; - selections: - - anchor: {line: 0, character: 38} - active: {line: 0, character: 38} - - anchor: {line: 1, character: 36} - active: {line: 1, character: 36} - - anchor: {line: 2, character: 45} - active: {line: 2, character: 45} - - anchor: {line: 3, character: 43} - active: {line: 3, character: 43} - marks: {} -finalState: - documentContents: |- - const ddd: number = 0, eee: number; - let fff: number = 0, ggg: number; - export const mmm: number = 0, nnn: number; - export let ooo: number = 0, ppp: number; - selections: - - anchor: {line: 0, character: 34} - active: {line: 0, character: 34} - - anchor: {line: 1, character: 32} - active: {line: 1, character: 32} - - anchor: {line: 2, character: 41} - active: {line: 2, character: 41} - - anchor: {line: 3, character: 39} - active: {line: 3, character: 39} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckValue4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckValue4.yml deleted file mode 100644 index 896866b9ea6..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/chuckValue4.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: chuck value - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: "const { aaa: bbb } = ccc;" - selections: - - anchor: {line: 0, character: 9} - active: {line: 0, character: 9} - marks: {} -finalState: - documentContents: const { aaa } = ccc; - selections: - - anchor: {line: 0, character: 9} - active: {line: 0, character: 9} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessAir.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessAir.yml deleted file mode 100644 index fd79d245297..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessAir.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: clear access air - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: a} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - aaa().bbb.ccc().ddd - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.a: - start: {line: 0, character: 0} - end: {line: 0, character: 3} -finalState: - documentContents: | - .bbb.ccc().ddd - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessAir2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessAir2.yml deleted file mode 100644 index 646b1562e25..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessAir2.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: clear access air - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: a} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - aaa?.bbb() - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.a: - start: {line: 0, character: 0} - end: {line: 0, character: 3} -finalState: - documentContents: | - ?.bbb() - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessAir3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessAir3.yml deleted file mode 100644 index fa659192c4a..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessAir3.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: clear access air - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: a} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a?.[0].b?.() - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.a: - start: {line: 0, character: 0} - end: {line: 0, character: 1} -finalState: - documentContents: | - .b?.() - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessBat.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessBat.yml deleted file mode 100644 index e2f730f1daf..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessBat.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: clear access bat - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: b} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - aaa().bbb.ccc().ddd - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.b: - start: {line: 0, character: 6} - end: {line: 0, character: 9} -finalState: - documentContents: | - aaa().ccc().ddd - selections: - - anchor: {line: 0, character: 5} - active: {line: 0, character: 5} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessBat2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessBat2.yml deleted file mode 100644 index 155706af8ce..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessBat2.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: clear access bat - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: b} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - aaa?.bbb() - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.b: - start: {line: 0, character: 5} - end: {line: 0, character: 8} -finalState: - documentContents: | - aaa - selections: - - anchor: {line: 0, character: 3} - active: {line: 0, character: 3} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessBat3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessBat3.yml deleted file mode 100644 index ed2ea3cb34f..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessBat3.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: clear access bat - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: b} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a[0].b[c.d] - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.b: - start: {line: 0, character: 5} - end: {line: 0, character: 6} -finalState: - documentContents: | - a[0] - selections: - - anchor: {line: 0, character: 4} - active: {line: 0, character: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessBat4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessBat4.yml deleted file mode 100644 index ea3e7a5bb7e..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessBat4.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: clear access bat - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: b} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a?.[0].b?.() - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.b: - start: {line: 0, character: 7} - end: {line: 0, character: 8} -finalState: - documentContents: | - a?.[0] - selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessBat5.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessBat5.yml deleted file mode 100644 index 4692b5770fb..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessBat5.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: clear access bat - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: b} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - aaa.bbb( - ccc + 5 - ) - selections: - - anchor: {line: 3, character: 0} - active: {line: 3, character: 0} - marks: - default.b: - start: {line: 0, character: 4} - end: {line: 0, character: 7} -finalState: - documentContents: | - aaa - selections: - - anchor: {line: 0, character: 3} - active: {line: 0, character: 3} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessCap.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessCap.yml deleted file mode 100644 index 98eb43dadc2..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessCap.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: clear access cap - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: c} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - aaa().bbb.ccc().ddd - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.c: - start: {line: 0, character: 10} - end: {line: 0, character: 13} -finalState: - documentContents: | - aaa().bbb.ddd - selections: - - anchor: {line: 0, character: 9} - active: {line: 0, character: 9} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessCap2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessCap2.yml deleted file mode 100644 index 91b305e5d2e..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessCap2.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: clear access cap - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: c} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - aaa().bbb.ccc(eee.fff).ddd - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.c: - start: {line: 0, character: 10} - end: {line: 0, character: 13} -finalState: - documentContents: | - aaa().bbb.ddd - selections: - - anchor: {line: 0, character: 9} - active: {line: 0, character: 9} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessCap3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessCap3.yml deleted file mode 100644 index 235df9f09b1..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessCap3.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: clear access cap - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: c} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a[0].b[c.d()] - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.c: - start: {line: 0, character: 7} - end: {line: 0, character: 8} -finalState: - documentContents: | - a[0].b[.d()] - selections: - - anchor: {line: 0, character: 7} - active: {line: 0, character: 7} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessDrum.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessDrum.yml deleted file mode 100644 index f6c5d5bbb95..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessDrum.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: clear access drum - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: d} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - aaa().bbb.ccc().ddd - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.d: - start: {line: 0, character: 16} - end: {line: 0, character: 19} -finalState: - documentContents: | - aaa().bbb.ccc() - selections: - - anchor: {line: 0, character: 15} - active: {line: 0, character: 15} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessDrum2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessDrum2.yml deleted file mode 100644 index 98e809ef0b1..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessDrum2.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: clear access drum - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: d} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a[0].b[c.d()] - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.d: - start: {line: 0, character: 9} - end: {line: 0, character: 10} -finalState: - documentContents: | - a[0].b[c] - selections: - - anchor: {line: 0, character: 8} - active: {line: 0, character: 8} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessEach.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessEach.yml deleted file mode 100644 index 733b3767afe..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessEach.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: clear access each - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: e} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - aaa().bbb.ccc(eee).ddd - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.e: - start: {line: 0, character: 14} - end: {line: 0, character: 17} -finalState: - documentContents: | - aaa().bbb.ddd - selections: - - anchor: {line: 0, character: 9} - active: {line: 0, character: 9} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessEach2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessEach2.yml deleted file mode 100644 index 479bf379211..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessEach2.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: clear access each - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: e} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - aaa().bbb.ccc(eee.fff).ddd - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.e: - start: {line: 0, character: 14} - end: {line: 0, character: 17} -finalState: - documentContents: | - aaa().bbb.ccc(.fff).ddd - selections: - - anchor: {line: 0, character: 14} - active: {line: 0, character: 14} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessFine.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessFine.yml deleted file mode 100644 index 308d5412bd0..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearAccessFine.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: clear access fine - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: containingScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: f} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - aaa().bbb.ccc(eee.fff).ddd - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.f: - start: {line: 0, character: 18} - end: {line: 0, character: 21} -finalState: - documentContents: | - aaa().bbb.ccc(eee).ddd - selections: - - anchor: {line: 0, character: 17} - active: {line: 0, character: 17} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearBranch4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearBranch4.yml index 3cb1e6eb16a..00478b67f87 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearBranch4.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearBranch4.yml @@ -26,9 +26,9 @@ finalState: documentContents: |- if (true) { const whatever = "hello"; - } else { + } else else { const whatever = "hello"; } selections: - - anchor: {line: 2, character: 2} - active: {line: 2, character: 2} + - anchor: {line: 2, character: 7} + active: {line: 2, character: 7} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearBranch5.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearBranch5.yml index a4bc93f54ae..252c6eac3fc 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearBranch5.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearBranch5.yml @@ -26,9 +26,9 @@ finalState: documentContents: |- if (true) { const whatever = "hello"; - } else { + } else else { const whatever = "hello"; } selections: - - anchor: {line: 2, character: 2} - active: {line: 2, character: 2} + - anchor: {line: 2, character: 7} + active: {line: 2, character: 7} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearEveryAccessAir.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearEveryAccessAir.yml deleted file mode 100644 index 526711dc1fe..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearEveryAccessAir.yml +++ /dev/null @@ -1,39 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: clear every access air - action: {name: clearAndSetSelection} - targets: - - type: primitive - modifiers: - - type: everyScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: a} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - aaa - .bbb - .ccc - selections: - - anchor: {line: 3, character: 0} - active: {line: 3, character: 0} - marks: - default.a: - start: {line: 0, character: 0} - end: {line: 0, character: 3} -finalState: - documentContents: |+ - - - - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - - anchor: {line: 2, character: 0} - active: {line: 2, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearEveryItem.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearEveryItem.yml new file mode 100644 index 00000000000..2ade3e1f957 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearEveryItem.yml @@ -0,0 +1,24 @@ +languageId: javascriptreact +command: + version: 5 + spokenForm: change every item + action: {name: clearAndSetSelection} + targets: + - type: primitive + modifiers: + - type: everyScope + scopeType: {type: collectionItem} + usePrePhraseSnapshot: true +initialState: + documentContents: + selections: + - anchor: {line: 0, character: 8} + active: {line: 0, character: 8} + marks: {} +finalState: + documentContents: + selections: + - anchor: {line: 0, character: 8} + active: {line: 0, character: 8} + - anchor: {line: 0, character: 9} + active: {line: 0, character: 9} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearItem4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearItem4.yml new file mode 100644 index 00000000000..46b904f80a4 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearItem4.yml @@ -0,0 +1,22 @@ +languageId: javascriptreact +command: + version: 5 + spokenForm: change item + action: {name: clearAndSetSelection} + targets: + - type: primitive + modifiers: + - type: containingScope + scopeType: {type: collectionItem} + usePrePhraseSnapshot: true +initialState: + documentContents: + selections: + - anchor: {line: 0, character: 8} + active: {line: 0, character: 8} + marks: {} +finalState: + documentContents: + selections: + - anchor: {line: 0, character: 8} + active: {line: 0, character: 8} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearSubject.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearSubject.yml index 67c755196a9..ae271fbc7fa 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearSubject.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearSubject.yml @@ -7,11 +7,9 @@ command: - type: primitive modifiers: - type: containingScope - scopeType: {type: private.switchStatementSubject} + scopeType: {type: switchStatementSubject} usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.switchStatementSubject; this is a - private spoken form currently only for internal experimentation +spokenFormError: Scope type 'switchStatementSubject' initialState: documentContents: |- switch(aaa) { diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearSubject2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearSubject2.yml index 3002e20800a..0441888bd44 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearSubject2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearSubject2.yml @@ -7,11 +7,9 @@ command: - type: primitive modifiers: - type: containingScope - scopeType: {type: private.switchStatementSubject} + scopeType: {type: switchStatementSubject} usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.switchStatementSubject; this is a - private spoken form currently only for internal experimentation +spokenFormError: Scope type 'switchStatementSubject' initialState: documentContents: |- switch(aaa + 1) { diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearType.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearType.yml index bf3beb30473..9ccad2f42bf 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearType.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearType.yml @@ -13,7 +13,7 @@ initialState: active: {line: 0, character: 18} marks: {} finalState: - documentContents: "function whatever<>(): string {}" + documentContents: "function whatever(): {}" selections: - - anchor: {line: 0, character: 18} - active: {line: 0, character: 18} + - anchor: {line: 0, character: 24} + active: {line: 0, character: 24} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearTypeNear.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearTypeNear.yml index da3273c682f..d6a588d34fe 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearTypeNear.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearTypeNear.yml @@ -17,7 +17,7 @@ initialState: start: {line: 0, character: 28} end: {line: 0, character: 34} finalState: - documentContents: "const foo: string = new Bar<>(foo);" + documentContents: "const foo: string = new (foo);" selections: - - anchor: {line: 0, character: 28} - active: {line: 0, character: 28} + - anchor: {line: 0, character: 24} + active: {line: 0, character: 24} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearTypeNear2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearTypeNear2.yml index cc71200839c..23c919f9e43 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearTypeNear2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearTypeNear2.yml @@ -17,7 +17,7 @@ initialState: start: {line: 0, character: 24} end: {line: 0, character: 30} finalState: - documentContents: "const foo: string = bar<>(foo);" + documentContents: "const foo: = bar(foo);" selections: - - anchor: {line: 0, character: 24} - active: {line: 0, character: 24} + - anchor: {line: 0, character: 11} + active: {line: 0, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearTypeUrge.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearTypeUrge.yml index 95778e1f101..df22813d99b 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearTypeUrge.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearTypeUrge.yml @@ -17,7 +17,7 @@ initialState: start: {line: 0, character: 15} end: {line: 0, character: 21} finalState: - documentContents: "const foo: Bar<> = new Bar(foo);" + documentContents: "const foo: = new Bar(foo);" selections: - - anchor: {line: 0, character: 15} - active: {line: 0, character: 15} + - anchor: {line: 0, character: 11} + active: {line: 0, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/cloneBranch.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/cloneBranch.yml deleted file mode 100644 index ec3c0bfc09e..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/cloneBranch.yml +++ /dev/null @@ -1,40 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: clone branch - action: - name: insertCopyAfter - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: branch} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - if (1 > 0) { - - } else if (1 > 2) { - - } else { - - } - selections: - - anchor: {line: 2, character: 2} - active: {line: 2, character: 2} - marks: {} -finalState: - documentContents: |- - if (1 > 0) { - - } else if (1 > 2) { - - } - else if (1 > 2) { - - } else { - - } - selections: - - anchor: {line: 5, character: 0} - active: {line: 5, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/ditchBranch.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/ditchBranch.yml index 378dca12a02..40aaac6bd9a 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/ditchBranch.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/ditchBranch.yml @@ -26,7 +26,7 @@ finalState: documentContents: |- if (true) { const whatever = "hello"; - } else { + } else { const whatever = "hello"; } selections: diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/ditchBranch2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/ditchBranch2.yml index a244a31b453..67951df1d1c 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/ditchBranch2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/ditchBranch2.yml @@ -26,7 +26,7 @@ finalState: documentContents: |- if (true) { const whatever = "hello"; - } else { + } else { const whatever = "hello"; } selections: diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccess.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccess.yml deleted file mode 100644 index 090d160999a..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccess.yml +++ /dev/null @@ -1,27 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: take every access - action: {name: setSelection} - targets: - - type: primitive - modifiers: - - type: everyScope - scopeType: {type: private.fieldAccess} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: aaa.bbb() + ccc() - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: aaa.bbb() + ccc() - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 3} - - anchor: {line: 0, character: 3} - active: {line: 0, character: 9} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessAir.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessAir.yml deleted file mode 100644 index 52059e1cbdd..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessAir.yml +++ /dev/null @@ -1,37 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: take every access air - action: {name: setSelection} - targets: - - type: primitive - modifiers: - - type: everyScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: a} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a().b.c().d; - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.a: - start: {line: 0, character: 0} - end: {line: 0, character: 1} -finalState: - documentContents: | - a().b.c().d; - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 3} - - anchor: {line: 0, character: 3} - active: {line: 0, character: 5} - - anchor: {line: 0, character: 5} - active: {line: 0, character: 9} - - anchor: {line: 0, character: 9} - active: {line: 0, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessAir2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessAir2.yml deleted file mode 100644 index f1e4131b382..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessAir2.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: take every access air - action: {name: setSelection} - targets: - - type: primitive - modifiers: - - type: everyScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: a} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a[0].b[1] - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.a: - start: {line: 0, character: 0} - end: {line: 0, character: 1} -finalState: - documentContents: | - a[0].b[1] - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 4} - - anchor: {line: 0, character: 4} - active: {line: 0, character: 9} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessBat.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessBat.yml deleted file mode 100644 index 916c0de009c..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessBat.yml +++ /dev/null @@ -1,37 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: take every access bat - action: {name: setSelection} - targets: - - type: primitive - modifiers: - - type: everyScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: b} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a().b.c().d; - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.b: - start: {line: 0, character: 4} - end: {line: 0, character: 5} -finalState: - documentContents: | - a().b.c().d; - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 3} - - anchor: {line: 0, character: 3} - active: {line: 0, character: 5} - - anchor: {line: 0, character: 5} - active: {line: 0, character: 9} - - anchor: {line: 0, character: 9} - active: {line: 0, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessBat2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessBat2.yml deleted file mode 100644 index 6507f59f3e9..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessBat2.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: take every access bat - action: {name: setSelection} - targets: - - type: primitive - modifiers: - - type: everyScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: b} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a[0].b[1] - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.b: - start: {line: 0, character: 5} - end: {line: 0, character: 6} -finalState: - documentContents: | - a[0].b[1] - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 4} - - anchor: {line: 0, character: 4} - active: {line: 0, character: 9} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessBat3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessBat3.yml deleted file mode 100644 index 674f02b387b..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessBat3.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: take every access bat - action: {name: setSelection} - targets: - - type: primitive - modifiers: - - type: everyScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: b} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a.b`c d` - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.b: - start: {line: 0, character: 2} - end: {line: 0, character: 3} -finalState: - documentContents: | - a.b`c d` - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 1} - - anchor: {line: 0, character: 1} - active: {line: 0, character: 8} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessCap.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessCap.yml deleted file mode 100644 index c3ea28db898..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessCap.yml +++ /dev/null @@ -1,37 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: take every access cap - action: {name: setSelection} - targets: - - type: primitive - modifiers: - - type: everyScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: c} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a().b.c().d; - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.c: - start: {line: 0, character: 6} - end: {line: 0, character: 7} -finalState: - documentContents: | - a().b.c().d; - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 3} - - anchor: {line: 0, character: 3} - active: {line: 0, character: 5} - - anchor: {line: 0, character: 5} - active: {line: 0, character: 9} - - anchor: {line: 0, character: 9} - active: {line: 0, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessCap2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessCap2.yml deleted file mode 100644 index c83e733ae46..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessCap2.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: take every access cap - action: {name: setSelection} - targets: - - type: primitive - modifiers: - - type: everyScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: c} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a[0].b[c.d] - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.c: - start: {line: 0, character: 7} - end: {line: 0, character: 8} -finalState: - documentContents: | - a[0].b[c.d] - selections: - - anchor: {line: 0, character: 7} - active: {line: 0, character: 8} - - anchor: {line: 0, character: 8} - active: {line: 0, character: 10} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessDrum.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessDrum.yml deleted file mode 100644 index 486be7502ba..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessDrum.yml +++ /dev/null @@ -1,37 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: take every access drum - action: {name: setSelection} - targets: - - type: primitive - modifiers: - - type: everyScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: d} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a().b.c().d; - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.d: - start: {line: 0, character: 10} - end: {line: 0, character: 11} -finalState: - documentContents: | - a().b.c().d; - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 3} - - anchor: {line: 0, character: 3} - active: {line: 0, character: 5} - - anchor: {line: 0, character: 5} - active: {line: 0, character: 9} - - anchor: {line: 0, character: 9} - active: {line: 0, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessDrum2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessDrum2.yml deleted file mode 100644 index 064e370ce28..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessDrum2.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: take every access drum - action: {name: setSelection} - targets: - - type: primitive - modifiers: - - type: everyScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: d} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a[0].b[c.d] - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.d: - start: {line: 0, character: 9} - end: {line: 0, character: 10} -finalState: - documentContents: | - a[0].b[c.d] - selections: - - anchor: {line: 0, character: 7} - active: {line: 0, character: 8} - - anchor: {line: 0, character: 8} - active: {line: 0, character: 10} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessEach.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessEach.yml deleted file mode 100644 index 35c275d30f8..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessEach.yml +++ /dev/null @@ -1,37 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: take every access each - action: {name: setSelection} - targets: - - type: primitive - modifiers: - - type: everyScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: e} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a().b.c(e).d; - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.e: - start: {line: 0, character: 8} - end: {line: 0, character: 9} -finalState: - documentContents: | - a().b.c(e).d; - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 3} - - anchor: {line: 0, character: 3} - active: {line: 0, character: 5} - - anchor: {line: 0, character: 5} - active: {line: 0, character: 10} - - anchor: {line: 0, character: 10} - active: {line: 0, character: 12} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessEach2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessEach2.yml deleted file mode 100644 index 85738c3186f..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryAccessEach2.yml +++ /dev/null @@ -1,33 +0,0 @@ -languageId: typescript -command: - version: 5 - spokenForm: take every access each - action: {name: setSelection} - targets: - - type: primitive - modifiers: - - type: everyScope - scopeType: {type: private.fieldAccess} - mark: {type: decoratedSymbol, symbolColor: default, character: e} - usePrePhraseSnapshot: true -spokenFormError: >- - simple scope type type with id private.fieldAccess; this is a private spoken - form currently only for internal experimentation -initialState: - documentContents: | - a().b.c(e.f).d; - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: - default.e: - start: {line: 0, character: 8} - end: {line: 0, character: 9} -finalState: - documentContents: | - a().b.c(e.f).d; - selections: - - anchor: {line: 0, character: 8} - active: {line: 0, character: 9} - - anchor: {line: 0, character: 9} - active: {line: 0, character: 11} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearEveryKey.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryKey.yml similarity index 75% rename from packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearEveryKey.yml rename to packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryKey.yml index 131b05eba32..39840a14bff 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearEveryKey.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryKey.yml @@ -1,8 +1,8 @@ languageId: typescript command: version: 1 - spokenForm: change every key - action: clearAndSetSelection + spokenForm: take every key + action: setSelection targets: - type: primitive modifier: {type: containingScope, scopeType: collectionKey, includeSiblings: true} @@ -19,11 +19,11 @@ initialState: finalState: documentContents: |- const value = { - : "hello", - : "there", + key1: "hello", + key2: "there", }; selections: - anchor: {line: 1, character: 4} - active: {line: 1, character: 4} + active: {line: 1, character: 8} - anchor: {line: 2, character: 4} - active: {line: 2, character: 4} + active: {line: 2, character: 8} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearEveryKey2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryKey2.yml similarity index 74% rename from packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearEveryKey2.yml rename to packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryKey2.yml index eb432547583..aa603ec323d 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/clearEveryKey2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeEveryKey2.yml @@ -1,8 +1,8 @@ languageId: typescript command: version: 1 - spokenForm: change every key - action: clearAndSetSelection + spokenForm: take every key + action: setSelection targets: - type: primitive modifier: {type: containingScope, scopeType: collectionKey, includeSiblings: true} @@ -19,11 +19,11 @@ initialState: finalState: documentContents: |- { - : "hello", - , + foo: "hello", + bar, } selections: - anchor: {line: 1, character: 4} - active: {line: 1, character: 4} + active: {line: 1, character: 7} - anchor: {line: 2, character: 4} - active: {line: 2, character: 4} + active: {line: 2, character: 7} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeString.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeString.yml index 37aef03639b..77fb08e29d6 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeString.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/typescript/takeString.yml @@ -1,14 +1,12 @@ languageId: typescript command: version: 1 - spokenForm: take parse tree string + spokenForm: take string action: setSelection targets: - type: primitive modifier: {type: containingScope, scopeType: string} -spokenFormError: >- - simple scope type type with id string; this is a private spoken form currently - only for internal experimentation +spokenFormError: Scope type 'string' initialState: documentContents: | diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryItem.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryItem.yml deleted file mode 100644 index 8206e4505b9..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryItem.yml +++ /dev/null @@ -1,28 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: change every item - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - foo: bar - baz: bongo - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: |+ - - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryItem2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryItem2.yml deleted file mode 100644 index b58812494e7..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryItem2.yml +++ /dev/null @@ -1,25 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: change every item - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: "foo: { bar: baz, bongo: 0}" - selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} - marks: {} -finalState: - documentContents: "foo: { , }" - selections: - - anchor: {line: 0, character: 7} - active: {line: 0, character: 7} - - anchor: {line: 0, character: 9} - active: {line: 0, character: 9} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryItem3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryItem3.yml deleted file mode 100644 index ea006f38211..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryItem3.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: change every item - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - foo: - - 0 - - 1 - selections: - - anchor: {line: 1, character: 2} - active: {line: 1, character: 2} - marks: {} -finalState: - documentContents: |- - foo: - - - - - selections: - - anchor: {line: 1, character: 4} - active: {line: 1, character: 4} - - anchor: {line: 2, character: 4} - active: {line: 2, character: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryItem4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryItem4.yml deleted file mode 100644 index 623f6fbc51c..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryItem4.yml +++ /dev/null @@ -1,25 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: change every item - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: "bar: [0, 1]" - selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} - marks: {} -finalState: - documentContents: "bar: [, ]" - selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} - - anchor: {line: 0, character: 8} - active: {line: 0, character: 8} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryKey.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryKey.yml deleted file mode 100644 index b4d4a3f54b4..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryKey.yml +++ /dev/null @@ -1,29 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: change every key - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: collectionKey} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - foo: bar - baz: bongo - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: |- - : bar - : bongo - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryKey2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryKey2.yml deleted file mode 100644 index fa9c2bfc288..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryKey2.yml +++ /dev/null @@ -1,25 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: change every key - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: collectionKey} - usePrePhraseSnapshot: true -initialState: - documentContents: "foo: { bar: baz, bongo: 0}" - selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} - marks: {} -finalState: - documentContents: "foo: { : baz, : 0}" - selections: - - anchor: {line: 0, character: 7} - active: {line: 0, character: 7} - - anchor: {line: 0, character: 14} - active: {line: 0, character: 14} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryValue.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryValue.yml deleted file mode 100644 index cf62110af2d..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryValue.yml +++ /dev/null @@ -1,29 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: change every value - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - foo: bar - baz: bongo - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: |- - foo: - baz: - selections: - - anchor: {line: 0, character: 5} - active: {line: 0, character: 5} - - anchor: {line: 1, character: 5} - active: {line: 1, character: 5} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryValue2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryValue2.yml deleted file mode 100644 index fc97fb7d5b7..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeEveryValue2.yml +++ /dev/null @@ -1,25 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: change every value - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: "foo: { bar: baz, bongo: 0}" - selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} - marks: {} -finalState: - documentContents: "foo: { bar: , bongo: }" - selections: - - anchor: {line: 0, character: 12} - active: {line: 0, character: 12} - - anchor: {line: 0, character: 21} - active: {line: 0, character: 21} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeItem.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeItem.yml deleted file mode 100644 index 62571ecd7fd..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeItem.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: change item - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: "foo: bar" - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: "" - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeItem2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeItem2.yml deleted file mode 100644 index bdd3b9f6781..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeItem2.yml +++ /dev/null @@ -1,29 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: change item - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - foo: - - 0 - - 1 - selections: - - anchor: {line: 1, character: 2} - active: {line: 1, character: 2} - marks: {} -finalState: - documentContents: |- - foo: - - - - 1 - selections: - - anchor: {line: 1, character: 4} - active: {line: 1, character: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeItem3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeItem3.yml deleted file mode 100644 index bddafbb1191..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeItem3.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: change item - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: "bar: [0, 1]" - selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} - marks: {} -finalState: - documentContents: "bar: [, 1]" - selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeItem4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeItem4.yml deleted file mode 100644 index c44d3c1792a..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeItem4.yml +++ /dev/null @@ -1,25 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: change item - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: | - - aaa: bbb - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: | - - - selections: - - anchor: {line: 0, character: 2} - active: {line: 0, character: 2} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeKey.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeKey.yml deleted file mode 100644 index 5a2719f42d2..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeKey.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: change key - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionKey} - usePrePhraseSnapshot: true -initialState: - documentContents: "foo: bar" - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: ": bar" - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeLeadingItem.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeLeadingItem.yml deleted file mode 100644 index 7e7ac03f06c..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeLeadingItem.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: change leading item - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - {type: leading} - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - foo: - - 0 - - 1 - - 2 - selections: - - anchor: {line: 2, character: 2} - active: {line: 2, character: 2} - marks: {} -finalState: - documentContents: |- - foo: - - 0- 1 - - 2 - selections: - - anchor: {line: 1, character: 5} - active: {line: 1, character: 5} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeLeadingValue.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeLeadingValue.yml deleted file mode 100644 index 949ce201dee..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeLeadingValue.yml +++ /dev/null @@ -1,24 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: change leading value - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - {type: leading} - - type: containingScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: "foo: bar" - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: foobar - selections: - - anchor: {line: 0, character: 3} - active: {line: 0, character: 3} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeList.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeList.yml deleted file mode 100644 index 59f41444f25..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeList.yml +++ /dev/null @@ -1,28 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: change list - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: list} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - foo: - - 0 - - 1 - selections: - - anchor: {line: 1, character: 2} - active: {line: 1, character: 2} - marks: {} -finalState: - documentContents: |- - foo: - - selections: - - anchor: {line: 1, character: 2} - active: {line: 1, character: 2} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeList2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeList2.yml deleted file mode 100644 index d18295231a0..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeList2.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: change list - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: list} - usePrePhraseSnapshot: true -initialState: - documentContents: "bar: [0, 1]" - selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} - marks: {} -finalState: - documentContents: "bar: " - selections: - - anchor: {line: 0, character: 5} - active: {line: 0, character: 5} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeList3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeList3.yml deleted file mode 100644 index 3fbe74cf6ce..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeList3.yml +++ /dev/null @@ -1,25 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: change list - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: list} - usePrePhraseSnapshot: true -initialState: - documentContents: | - - aaa: bbb - selections: - - anchor: {line: 0, character: 8} - active: {line: 0, character: 8} - marks: {} -finalState: - documentContents: |+ - - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeMap.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeMap.yml deleted file mode 100644 index 0a26e04e308..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeMap.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: change map - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: map} - usePrePhraseSnapshot: true -initialState: - documentContents: "foo: { bar: baz, bongo: 0}" - selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} - marks: {} -finalState: - documentContents: "foo: " - selections: - - anchor: {line: 0, character: 5} - active: {line: 0, character: 5} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeMap2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeMap2.yml deleted file mode 100644 index 8811b7de67b..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeMap2.yml +++ /dev/null @@ -1,25 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: change map - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: map} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - foo: 0 - bar: 1 - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: "" - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeTrailingItem.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeTrailingItem.yml deleted file mode 100644 index 65e6593d24c..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeTrailingItem.yml +++ /dev/null @@ -1,31 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: change trailing item - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - {type: trailing} - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - foo: - - 0 - - 1 - - 2 - selections: - - anchor: {line: 2, character: 2} - active: {line: 2, character: 2} - marks: {} -finalState: - documentContents: |- - foo: - - 0 - - 1- 2 - selections: - - anchor: {line: 2, character: 5} - active: {line: 2, character: 5} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeTrailingKey.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeTrailingKey.yml deleted file mode 100644 index 78ba836002c..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeTrailingKey.yml +++ /dev/null @@ -1,24 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: change trailing key - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - {type: trailing} - - type: containingScope - scopeType: {type: collectionKey} - usePrePhraseSnapshot: true -initialState: - documentContents: "foo: bar" - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: foobar - selections: - - anchor: {line: 0, character: 3} - active: {line: 0, character: 3} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeValue.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeValue.yml deleted file mode 100644 index c882b0c046a..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/changeValue.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: change value - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: value} - usePrePhraseSnapshot: true -initialState: - documentContents: "foo: bar" - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: "foo: " - selections: - - anchor: {line: 0, character: 5} - active: {line: 0, character: 5} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem.yml deleted file mode 100644 index dc2d58acbdb..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem.yml +++ /dev/null @@ -1,28 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: chuck item - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - values: - - 0 - - 1 - selections: - - anchor: {line: 1, character: 4} - active: {line: 1, character: 4} - marks: {} -finalState: - documentContents: |- - values: - - 1 - selections: - - anchor: {line: 1, character: 4} - active: {line: 1, character: 4} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem10.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem10.yml deleted file mode 100644 index 2320833dd4d..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem10.yml +++ /dev/null @@ -1,28 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: chuck item - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: false -initialState: - documentContents: |- - foo: - - 0 - - 2 - selections: - - anchor: {line: 2, character: 2} - active: {line: 2, character: 2} - marks: {} -finalState: - documentContents: |- - foo: - - 0 - selections: - - anchor: {line: 1, character: 5} - active: {line: 1, character: 5} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem11.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem11.yml deleted file mode 100644 index 213243ad426..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem11.yml +++ /dev/null @@ -1,26 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: chuck item - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - foo: - - 0 - selections: - - anchor: {line: 1, character: 2} - active: {line: 1, character: 2} - marks: {} -finalState: - documentContents: | - foo: - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem2.yml deleted file mode 100644 index 40262975567..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem2.yml +++ /dev/null @@ -1,28 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: chuck item - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - values: - - 0 - - 1 - selections: - - anchor: {line: 2, character: 4} - active: {line: 2, character: 4} - marks: {} -finalState: - documentContents: |- - values: - - 0 - selections: - - anchor: {line: 1, character: 7} - active: {line: 1, character: 7} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem3.yml deleted file mode 100644 index 10a428d5c27..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem3.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: chuck item - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: "values: [0, 1]" - selections: - - anchor: {line: 0, character: 9} - active: {line: 0, character: 9} - marks: {} -finalState: - documentContents: "values: [1]" - selections: - - anchor: {line: 0, character: 9} - active: {line: 0, character: 9} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem4.yml deleted file mode 100644 index 8db772570a1..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem4.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: chuck item - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: "values: [0, 1]" - selections: - - anchor: {line: 0, character: 13} - active: {line: 0, character: 13} - marks: {} -finalState: - documentContents: "values: [0]" - selections: - - anchor: {line: 0, character: 10} - active: {line: 0, character: 10} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem5.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem5.yml deleted file mode 100644 index b90ab399777..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem5.yml +++ /dev/null @@ -1,25 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: chuck item - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - foo: 0 - bar: 0 - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: "bar: 0" - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem6.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem6.yml deleted file mode 100644 index 1c2f2c0d486..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem6.yml +++ /dev/null @@ -1,25 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: chuck item - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - foo: 0 - bar: 0 - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: {} -finalState: - documentContents: "foo: 0" - selections: - - anchor: {line: 0, character: 6} - active: {line: 0, character: 6} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem7.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem7.yml deleted file mode 100644 index e40b1107403..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem7.yml +++ /dev/null @@ -1,25 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: chuck item - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: | - values: {foo: 0, bar: 0} - selections: - - anchor: {line: 0, character: 9} - active: {line: 0, character: 9} - marks: {} -finalState: - documentContents: | - values: {bar: 0} - selections: - - anchor: {line: 0, character: 9} - active: {line: 0, character: 9} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem8.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem8.yml deleted file mode 100644 index 4d2203e19b7..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem8.yml +++ /dev/null @@ -1,25 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: chuck item - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: | - values: {foo: 0, bar: 0} - selections: - - anchor: {line: 0, character: 17} - active: {line: 0, character: 17} - marks: {} -finalState: - documentContents: | - values: {foo: 0} - selections: - - anchor: {line: 0, character: 15} - active: {line: 0, character: 15} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem9.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem9.yml deleted file mode 100644 index f54ade268d1..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/chuckItem9.yml +++ /dev/null @@ -1,30 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: chuck item - action: - name: remove - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - foo: - - 0 - - 1 - - 2 - selections: - - anchor: {line: 2, character: 3} - active: {line: 2, character: 3} - marks: {} -finalState: - documentContents: |- - foo: - - 0 - - 2 - selections: - - anchor: {line: 2, character: 2} - active: {line: 2, character: 2} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/drinkItem.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/drinkItem.yml deleted file mode 100644 index 44a39b9b691..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/drinkItem.yml +++ /dev/null @@ -1,25 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: drink item - action: - name: editNewLineBefore - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: | - values: [0] - selections: - - anchor: {line: 0, character: 10} - active: {line: 0, character: 10} - marks: {} -finalState: - documentContents: | - values: [, 0] - selections: - - anchor: {line: 0, character: 9} - active: {line: 0, character: 9} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/drinkItem2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/drinkItem2.yml deleted file mode 100644 index 5d5182cdb7b..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/drinkItem2.yml +++ /dev/null @@ -1,25 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: drink item - action: - name: editNewLineBefore - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: | - values: { foo: bar } - selections: - - anchor: {line: 0, character: 10} - active: {line: 0, character: 10} - marks: {} -finalState: - documentContents: | - values: { , foo: bar } - selections: - - anchor: {line: 0, character: 10} - active: {line: 0, character: 10} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/drinkItem3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/drinkItem3.yml deleted file mode 100644 index eb4decd944f..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/drinkItem3.yml +++ /dev/null @@ -1,28 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: drink item - action: - name: editNewLineBefore - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - foo: 0 - bar: 1 - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} - marks: {} -finalState: - documentContents: |- - foo: 0 - - bar: 1 - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/pourItem.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/pourItem.yml deleted file mode 100644 index 728d038baa8..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/pourItem.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: pour item - action: - name: editNewLineAfter - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: "values: [0]" - selections: - - anchor: {line: 0, character: 9} - active: {line: 0, character: 9} - marks: {} -finalState: - documentContents: "values: [0, ]" - selections: - - anchor: {line: 0, character: 12} - active: {line: 0, character: 12} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/pourItem2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/pourItem2.yml deleted file mode 100644 index df8b0c27f29..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/pourItem2.yml +++ /dev/null @@ -1,25 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: pour item - action: - name: editNewLineAfter - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: | - values: [0] - selections: - - anchor: {line: 0, character: 10} - active: {line: 0, character: 10} - marks: {} -finalState: - documentContents: | - values: [0, ] - selections: - - anchor: {line: 0, character: 12} - active: {line: 0, character: 12} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/pourItem3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/pourItem3.yml deleted file mode 100644 index 984c318ac36..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/pourItem3.yml +++ /dev/null @@ -1,25 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: pour item - action: - name: editNewLineAfter - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: | - values: { foo: bar } - selections: - - anchor: {line: 0, character: 10} - active: {line: 0, character: 10} - marks: {} -finalState: - documentContents: | - values: { foo: bar, } - selections: - - anchor: {line: 0, character: 20} - active: {line: 0, character: 20} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/pourItem4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/pourItem4.yml deleted file mode 100644 index 701649b0ae8..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/languages/yaml/pourItem4.yml +++ /dev/null @@ -1,28 +0,0 @@ -languageId: yaml -command: - version: 6 - spokenForm: pour item - action: - name: editNewLineAfter - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: collectionItem} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - foo: 0 - bar: 1 - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: |- - foo: 0 - - bar: 1 - selections: - - anchor: {line: 1, character: 0} - active: {line: 1, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible.yml deleted file mode 100644 index 8f827d6216a..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/changeVisible.yml +++ /dev/null @@ -1,29 +0,0 @@ -languageId: typescript -command: - version: 6 - spokenForm: change visible - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - {type: visible} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - // Hello - - function helloWorld() { - // Hello - } - - // Hello - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: "" - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/everyScope/clearEveryLine.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/everyScope/clearEveryLine.yml index 59902feb8a1..c19c71f88be 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/everyScope/clearEveryLine.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/everyScope/clearEveryLine.yml @@ -1,14 +1,12 @@ languageId: plaintext command: - spokenForm: change every line file + spokenForm: change every line version: 3 targets: - type: primitive modifiers: - type: everyScope scopeType: {type: line} - - type: containingScope - scopeType: {type: document} usePrePhraseSnapshot: true action: {name: clearAndSetSelection} initialState: diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/instance/clearTwoInstancesLastWordAir.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/instance/clearTwoInstancesLastWordAir.yml index ef5a9bdc20f..5f69cb2990a 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/instance/clearTwoInstancesLastWordAir.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/modifiers/instance/clearTwoInstancesLastWordAir.yml @@ -1,7 +1,7 @@ languageId: plaintext command: version: 5 - spokenForm: change two instances last sub air + spokenForm: change two instances last word air action: {name: clearAndSetSelection} targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/ordinalScopes/clearFirstPaint.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/ordinalScopes/clearFirstPaint.yml index d8a196cda6e..0b74d1458c5 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/ordinalScopes/clearFirstPaint.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/ordinalScopes/clearFirstPaint.yml @@ -11,9 +11,7 @@ command: length: 1 usePrePhraseSnapshot: true action: {name: clearAndSetSelection} -spokenFormError: >- - custom regex with id [^\s"'`]+; please see - https://www.cursorless.org/docs/user/customization/ for more information +spokenFormError: Scope type 'customRegex' initialState: documentContents: aaa-bbb ccc-ddd eee-fff ggg-hhh selections: diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/ordinalScopes/clearFirstPaint2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/ordinalScopes/clearFirstPaint2.yml index a60149376b0..bfb63aa1e64 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/ordinalScopes/clearFirstPaint2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/ordinalScopes/clearFirstPaint2.yml @@ -11,9 +11,7 @@ command: length: 1 usePrePhraseSnapshot: true action: {name: clearAndSetSelection} -spokenFormError: >- - custom regex with id [^\s"'`]+; please see - https://www.cursorless.org/docs/user/customization/ for more information +spokenFormError: Scope type 'customRegex' initialState: documentContents: aaa-bbb ccc-ddd eee-fff ggg-hhh selections: diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/ordinalScopes/clearLastPaint.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/ordinalScopes/clearLastPaint.yml index d8c3cbe502d..879c9da17ff 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/ordinalScopes/clearLastPaint.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/ordinalScopes/clearLastPaint.yml @@ -11,9 +11,7 @@ command: length: 1 usePrePhraseSnapshot: true action: {name: clearAndSetSelection} -spokenFormError: >- - custom regex with id [^\s"'`]+; please see - https://www.cursorless.org/docs/user/customization/ for more information +spokenFormError: Scope type 'customRegex' initialState: documentContents: aaa-bbb ccc-ddd eee-fff ggg-hhh selections: diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/ordinalScopes/clearLastPaint2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/ordinalScopes/clearLastPaint2.yml index cd4a8df92b9..f46e7fc1e23 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/ordinalScopes/clearLastPaint2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/ordinalScopes/clearLastPaint2.yml @@ -11,9 +11,7 @@ command: length: 1 usePrePhraseSnapshot: true action: {name: clearAndSetSelection} -spokenFormError: >- - custom regex with id [^\s"'`]+; please see - https://www.cursorless.org/docs/user/customization/ for more information +spokenFormError: Scope type 'customRegex' initialState: documentContents: aaa-bbb ccc-ddd eee-fff ggg-hhh selections: diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scope/glyph/clearEveryGlyphAir.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scope/glyph/clearEveryGlyphAir.yml deleted file mode 100644 index c79ff8bef03..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scope/glyph/clearEveryGlyphAir.yml +++ /dev/null @@ -1,25 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: change every glyph air - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: everyScope - scopeType: {type: glyph, character: a} - usePrePhraseSnapshot: true -initialState: - documentContents: abc$!4123a - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: bc$!4123 - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - - anchor: {line: 0, character: 8} - active: {line: 0, character: 8} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scope/glyph/clearFinalGlyphAir.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scope/glyph/clearFinalGlyphAir.yml deleted file mode 100644 index 782322b77fc..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scope/glyph/clearFinalGlyphAir.yml +++ /dev/null @@ -1,25 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: change last glyph air - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: ordinalScope - scopeType: {type: glyph, character: a} - start: -1 - length: 1 - usePrePhraseSnapshot: true -initialState: - documentContents: abc$!4123a - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: abc$!4123 - selections: - - anchor: {line: 0, character: 9} - active: {line: 0, character: 9} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scope/glyph/clearGlyphAir.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scope/glyph/clearGlyphAir.yml deleted file mode 100644 index 151edb4d222..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scope/glyph/clearGlyphAir.yml +++ /dev/null @@ -1,23 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: change glyph air - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: glyph, character: a} - usePrePhraseSnapshot: true -initialState: - documentContents: abc$!4123a - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: bc$!4123a - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scope/glyph/clearNextGlyphBat.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scope/glyph/clearNextGlyphBat.yml deleted file mode 100644 index 4185b97b454..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scope/glyph/clearNextGlyphBat.yml +++ /dev/null @@ -1,26 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: change next glyph bat - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: relativeScope - scopeType: {type: glyph, character: b} - offset: 1 - length: 1 - direction: forward - usePrePhraseSnapshot: true -initialState: - documentContents: aB - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: a - selections: - - anchor: {line: 0, character: 1} - active: {line: 0, character: 1} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scope/glyph/clearNextGlyphDollar.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scope/glyph/clearNextGlyphDollar.yml deleted file mode 100644 index b6fdc326d91..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scope/glyph/clearNextGlyphDollar.yml +++ /dev/null @@ -1,26 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: change next glyph dollar - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: relativeScope - scopeType: {type: glyph, character: $} - offset: 1 - length: 1 - direction: forward - usePrePhraseSnapshot: true -initialState: - documentContents: abc$!4123a - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: abc!4123a - selections: - - anchor: {line: 0, character: 3} - active: {line: 0, character: 3} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scope/glyph/clearNextGlyphOnyx.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scope/glyph/clearNextGlyphOnyx.yml deleted file mode 100644 index 84e35bc89df..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scope/glyph/clearNextGlyphOnyx.yml +++ /dev/null @@ -1,27 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: clear next glyph onyx - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: relativeScope - scopeType: {type: glyph, character: å} - offset: 1 - length: 1 - direction: forward - usePrePhraseSnapshot: true -spokenFormError: Unknown character 'å' -initialState: - documentContents: abå - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: ab - selections: - - anchor: {line: 0, character: 2} - active: {line: 0, character: 2} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scopes/character/changeChar.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scopes/character/changeChar.yml deleted file mode 100644 index 7a2f20f5dd0..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scopes/character/changeChar.yml +++ /dev/null @@ -1,49 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: change char - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: character} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - $. - .$ - $a - a$ - $$ - selections: - - anchor: {line: 4, character: 1} - active: {line: 4, character: 1} - - anchor: {line: 3, character: 1} - active: {line: 3, character: 1} - - anchor: {line: 2, character: 1} - active: {line: 2, character: 1} - - anchor: {line: 1, character: 1} - active: {line: 1, character: 1} - - anchor: {line: 0, character: 1} - active: {line: 0, character: 1} - marks: {} -finalState: - documentContents: |- - . - . - $ - $ - $ - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - - anchor: {line: 1, character: 1} - active: {line: 1, character: 1} - - anchor: {line: 2, character: 1} - active: {line: 2, character: 1} - - anchor: {line: 3, character: 0} - active: {line: 3, character: 0} - - anchor: {line: 4, character: 1} - active: {line: 4, character: 1} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scopes/token/changeToken.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scopes/token/changeToken.yml deleted file mode 100644 index 75b224194dd..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/scopes/token/changeToken.yml +++ /dev/null @@ -1,49 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: change token - action: - name: clearAndSetSelection - target: - type: primitive - modifiers: - - type: containingScope - scopeType: {type: token} - usePrePhraseSnapshot: true -initialState: - documentContents: |- - $. - .$ - $a - a$ - $$ - selections: - - anchor: {line: 4, character: 1} - active: {line: 4, character: 1} - - anchor: {line: 3, character: 1} - active: {line: 3, character: 1} - - anchor: {line: 2, character: 1} - active: {line: 2, character: 1} - - anchor: {line: 1, character: 1} - active: {line: 1, character: 1} - - anchor: {line: 0, character: 1} - active: {line: 0, character: 1} - marks: {} -finalState: - documentContents: |- - . - . - $ - $ - $ - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - - anchor: {line: 1, character: 1} - active: {line: 1, character: 1} - - anchor: {line: 2, character: 1} - active: {line: 2, character: 1} - - anchor: {line: 3, character: 0} - active: {line: 3, character: 0} - - anchor: {line: 4, character: 1} - active: {line: 4, character: 1} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/chuckWord.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/chuckWord.yml index e26f5928c87..5a5df0d2039 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/chuckWord.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/chuckWord.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: chuck sub + spokenForm: chuck word version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/chuckWord2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/chuckWord2.yml index 43b7b10eb5d..25dc7b1db4f 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/chuckWord2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/chuckWord2.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: chuck sub + spokenForm: chuck word version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearCustomRegex.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearCustomRegex.yml index a192da5d1a7..24d99bc00c8 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearCustomRegex.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearCustomRegex.yml @@ -9,9 +9,7 @@ command: scopeType: {type: customRegex, regex: '[\w/_.]+'} usePrePhraseSnapshot: true action: {name: clearAndSetSelection} -spokenFormError: >- - custom regex with id [\w/_.]+; please see - https://www.cursorless.org/docs/user/customization/ for more information +spokenFormError: Scope type 'customRegex' initialState: documentContents: aa.bb/cc_dd123( ) selections: diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearEveryCustomRegex.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearEveryCustomRegex.yml index 4ef31c9dbd7..abe8c17b056 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearEveryCustomRegex.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearEveryCustomRegex.yml @@ -9,9 +9,7 @@ command: scopeType: {type: customRegex, regex: '[\w/_.]+'} usePrePhraseSnapshot: true action: {name: clearAndSetSelection} -spokenFormError: >- - custom regex with id [\w/_.]+; please see - https://www.cursorless.org/docs/user/customization/ for more information +spokenFormError: Scope type 'customRegex' initialState: documentContents: aa.bb/cc_dd123 aa.bb/cc_dd123( ) selections: diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearNextWord.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearNextWord.yml index 19ac9f0d01b..2cda1d619f5 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearNextWord.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearNextWord.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: change next sub + spokenForm: change next word version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearNextWord2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearNextWord2.yml index 8a1b3ce29d9..43611c3416e 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearNextWord2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearNextWord2.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: change next sub + spokenForm: change next word version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearNextWord3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearNextWord3.yml index 012250920b3..2ad91d5baa7 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearNextWord3.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearNextWord3.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: change next sub + spokenForm: change next word version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearPreviousWord.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearPreviousWord.yml index c9eb8622768..bf4201b662e 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearPreviousWord.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearPreviousWord.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: change previous sub + spokenForm: change previous word version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearPreviousWord2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearPreviousWord2.yml index 46afbe7d8a8..49412e22906 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearPreviousWord2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearPreviousWord2.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: change previous sub + spokenForm: change previous word version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearPreviousWord3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearPreviousWord3.yml index 157394502b7..3a55a9b4c85 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearPreviousWord3.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearPreviousWord3.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: change previous sub + spokenForm: change previous word version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearSecondLastWord.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearSecondLastWord.yml index 694d5af6d6f..1a8c902125b 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearSecondLastWord.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearSecondLastWord.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: change second last sub + spokenForm: change second last word version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearSecondNextWord.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearSecondNextWord.yml index cc3985c6baa..763e3007fc3 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearSecondNextWord.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearSecondNextWord.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: change second next sub + spokenForm: change second next word version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord.yml index 948dcb881eb..a0cf659fc9a 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: change sub + spokenForm: change word version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord2.yml index 448b8749dc9..cb9001bf96e 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord2.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: change sub + spokenForm: change word version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord3.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord3.yml index f6140b222bb..794b2eb762e 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord3.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord3.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: change sub + spokenForm: change word version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord4.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord4.yml index 1c335d45a8a..e5cd1f13119 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord4.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord4.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: change sub + spokenForm: change word version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord5.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord5.yml index a0c52e5073d..3a4ca76b1a0 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord5.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord5.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: change sub + spokenForm: change word version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord6.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord6.yml index 972f160e111..211fb203bc2 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord6.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord6.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: change sub + spokenForm: change word version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord7.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord7.yml index 5e720cd2172..f697ec29efa 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord7.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/clearWord7.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: change sub + spokenForm: change word version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/takeEveryLine.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/takeEveryLine.yml index bf845d386fd..21870b59c20 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/takeEveryLine.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/takeEveryLine.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: take every line file + spokenForm: take every line version: 2 action: {name: setSelection} targets: @@ -8,8 +8,6 @@ command: modifiers: - type: everyScope scopeType: {type: line} - - type: containingScope - scopeType: {type: document} usePrePhraseSnapshot: true initialState: documentContents: | diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/takeEveryWord.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/takeEveryWord.yml index 06cba555935..491ed28f9d3 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/takeEveryWord.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/selectionTypes/takeEveryWord.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: take every sub + spokenForm: take every word version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckFinalTwoWords.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckFinalTwoWords.yml index 2a35696d0f6..3246fbc6650 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckFinalTwoWords.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckFinalTwoWords.yml @@ -1,7 +1,7 @@ languageId: plaintext command: version: 5 - spokenForm: chuck last two subs + spokenForm: chuck last two words action: {name: remove} targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckFirstTwoWords.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckFirstTwoWords.yml index 1c7e878d9ce..5ea99839ad7 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckFirstTwoWords.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckFirstTwoWords.yml @@ -1,7 +1,7 @@ languageId: plaintext command: version: 5 - spokenForm: chuck first two subs + spokenForm: chuck first two words action: {name: remove} targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckFirstWordVest.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckFirstWordVest.yml index 3403901f5de..aa5496a43b2 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckFirstWordVest.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckFirstWordVest.yml @@ -1,7 +1,7 @@ languageId: typescript command: version: 1 - spokenForm: chuck first sub vest + spokenForm: chuck first word vest action: remove targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckLastWord.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckLastWord.yml index f389f9e03a7..71dabf76415 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckLastWord.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckLastWord.yml @@ -1,6 +1,6 @@ languageId: scss command: - spokenForm: chuck last sub + spokenForm: chuck last word version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckLastWordVest.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckLastWordVest.yml index 73778be3f99..a6d920af6ec 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckLastWordVest.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckLastWordVest.yml @@ -1,7 +1,7 @@ languageId: typescript command: version: 1 - spokenForm: chuck last sub vest + spokenForm: chuck last word vest action: remove targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckSecondUntilFourthWord.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckSecondUntilFourthWord.yml deleted file mode 100644 index cc6294be84c..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckSecondUntilFourthWord.yml +++ /dev/null @@ -1,34 +0,0 @@ -languageId: plaintext -command: - version: 6 - spokenForm: chuck second until fourth sub - action: - name: remove - target: - type: primitive - modifiers: - - type: range - anchor: - type: ordinalScope - scopeType: {type: word} - start: 1 - length: 1 - active: - type: ordinalScope - scopeType: {type: word} - start: 3 - length: 1 - excludeAnchor: false - excludeActive: true - usePrePhraseSnapshot: true -initialState: - documentContents: aaa_bbb_ccc_ddd_eee - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} - marks: {} -finalState: - documentContents: aaa_ddd_eee - selections: - - anchor: {line: 0, character: 0} - active: {line: 0, character: 0} diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckSecondWordVest.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckSecondWordVest.yml index 9bbe483a725..09d948e1be2 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckSecondWordVest.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/chuckSecondWordVest.yml @@ -1,7 +1,7 @@ languageId: typescript command: version: 1 - spokenForm: chuck second sub vest + spokenForm: chuck second word vest action: remove targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/clearFirstWordVest.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/clearFirstWordVest.yml index 1a39ee7f35b..1ad63f46aa9 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/clearFirstWordVest.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/clearFirstWordVest.yml @@ -1,7 +1,7 @@ languageId: typescript command: version: 1 - spokenForm: change first sub vest + spokenForm: change first word vest action: clearAndSetSelection targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/clearLastWordVest.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/clearLastWordVest.yml index fdec406e6fc..067fdbd46ba 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/clearLastWordVest.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/clearLastWordVest.yml @@ -1,7 +1,7 @@ languageId: typescript command: version: 1 - spokenForm: change last sub vest + spokenForm: change last word vest action: clearAndSetSelection targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/clearNextWord.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/clearNextWord.yml index a407a62dec8..2083021a33d 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/clearNextWord.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/clearNextWord.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: change next sub + spokenForm: change next word version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/clearSecondWordVest.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/clearSecondWordVest.yml index fa0538fd327..f092a04426d 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/clearSecondWordVest.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/clearSecondWordVest.yml @@ -1,7 +1,7 @@ languageId: typescript command: version: 1 - spokenForm: change second sub vest + spokenForm: change second word vest action: clearAndSetSelection targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/clearSixthNextWord.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/clearSixthNextWord.yml index c96533da5e7..b53b54cf592 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/clearSixthNextWord.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/clearSixthNextWord.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: change sixth next sub + spokenForm: change sixth next word version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/ditchFourthWordLine.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/ditchFourthWordLine.yml index 4e2853ab907..6b528bfdc3d 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/ditchFourthWordLine.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/ditchFourthWordLine.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: chuck fourth sub line + spokenForm: chuck fourth word line version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/ditchLastWordLine.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/ditchLastWordLine.yml index 329cb1d3697..fc7b43b573c 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/ditchLastWordLine.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/ditchLastWordLine.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: chuck last sub line + spokenForm: chuck last word line version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/ditchThirdWordLine.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/ditchThirdWordLine.yml index 0749ff36b0b..0450298a41c 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/ditchThirdWordLine.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/ditchThirdWordLine.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: chuck third sub line + spokenForm: chuck third word line version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/pourWord.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/pourWord.yml index 2663ccbf057..4614061fa5c 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/pourWord.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/pourWord.yml @@ -1,7 +1,7 @@ languageId: plaintext command: version: 5 - spokenForm: pour sub + spokenForm: pour word action: {name: editNewLineAfter} targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/pourWordAir.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/pourWordAir.yml index 234944a452a..b97d7671de8 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/pourWordAir.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/pourWordAir.yml @@ -1,7 +1,7 @@ languageId: plaintext command: version: 5 - spokenForm: pour sub air + spokenForm: pour word air action: {name: editNewLineAfter} targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeEveryWordLine.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeEveryWordLine.yml index de22a5c5787..b4e04f96956 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeEveryWordLine.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeEveryWordLine.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: take every sub line + spokenForm: take every word line version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeEveryWordLine2.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeEveryWordLine2.yml index 6b185ca04d3..7b68b342069 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeEveryWordLine2.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeEveryWordLine2.yml @@ -1,6 +1,6 @@ languageId: plaintext command: - spokenForm: take every sub line + spokenForm: take every word line version: 3 targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeFirstPastLastWordHarp.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeFirstPastLastWordHarp.yml index 226063859ea..eef4fdfe298 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeFirstPastLastWordHarp.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeFirstPastLastWordHarp.yml @@ -1,7 +1,7 @@ languageId: typescript command: version: 1 - spokenForm: take first past last sub harp + spokenForm: take first past last word harp action: setSelection targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeFirstPastSecondWordHarp.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeFirstPastSecondWordHarp.yml index a108e17c538..1119d12210b 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeFirstPastSecondWordHarp.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeFirstPastSecondWordHarp.yml @@ -1,7 +1,7 @@ languageId: typescript command: version: 3 - spokenForm: take first past second sub harp + spokenForm: take first past second word harp action: {name: setSelection} targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeFirstTwoWordHarp.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeFirstTwoWordHarp.yml index 15f387b4dc9..bae6a95e0f8 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeFirstTwoWordHarp.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeFirstTwoWordHarp.yml @@ -1,7 +1,7 @@ languageId: typescript command: version: 1 - spokenForm: take first two subs harp + spokenForm: take first two words harp action: setSelection targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeFirstWord.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeFirstWord.yml index edbf4fcf1c7..edce864d84d 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeFirstWord.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeFirstWord.yml @@ -1,7 +1,7 @@ languageId: typescript command: version: 1 - spokenForm: take first sub + spokenForm: take first word action: setSelection targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeLastPastFirstWordHarp.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeLastPastFirstWordHarp.yml index 413b4726726..e38f7780a46 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeLastPastFirstWordHarp.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeLastPastFirstWordHarp.yml @@ -1,7 +1,7 @@ languageId: typescript command: version: 1 - spokenForm: take last past first sub harp + spokenForm: take last past first word harp action: setSelection targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeLastTwoWordHarp.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeLastTwoWordHarp.yml index 1c68bb68ffa..8a4f985a2d3 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeLastTwoWordHarp.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeLastTwoWordHarp.yml @@ -1,7 +1,7 @@ languageId: typescript command: version: 1 - spokenForm: take last two subs harp + spokenForm: take last two words harp action: setSelection targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeSecondWord.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeSecondWord.yml index 57a629043e1..04f841e05da 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeSecondWord.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeSecondWord.yml @@ -1,7 +1,7 @@ languageId: typescript command: version: 1 - spokenForm: take second sub + spokenForm: take second word action: setSelection targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeThirdPastSecondWordHarp.yml b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeThirdPastSecondWordHarp.yml index 23749334d0f..e5b5b9e8521 100644 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeThirdPastSecondWordHarp.yml +++ b/packages/cursorless-vscode-e2e/src/suite/fixtures/recorded/subtoken/takeThirdPastSecondWordHarp.yml @@ -1,7 +1,7 @@ languageId: typescript command: version: 1 - spokenForm: take third past second sub harp + spokenForm: take third past second word harp action: setSelection targets: - type: primitive diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/attribute.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/attribute.scope deleted file mode 100644 index ad4db478095..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/attribute.scope +++ /dev/null @@ -1,17 +0,0 @@ -
    ---- - -[Content] = -[Domain] = 0:5-0:14 - >---------< -0|
    - -[Removal] = 0:4-0:14 - >----------< -0|
    - -[Leading delimiter] = 0:4-0:5 - >-< -0|
    - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/comment.block.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/comment.block.scope deleted file mode 100644 index 5bbed642b34..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/comment.block.scope +++ /dev/null @@ -1,15 +0,0 @@ - ---- - -[Content] = -[Removal] = -[Domain] = 0:0-2:3 - >---- -0| - ---< - -[Insertion delimiter] = "\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/element.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/element.scope deleted file mode 100644 index 23ebb426947..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/element.scope +++ /dev/null @@ -1,14 +0,0 @@ -
    ---- - -[Content] = -[Removal] = -[Domain] = 0:0-0:21 - >---------------------< -0|
    - -[Interior] = 0:15-0:15 - >< -0|
    - -[Insertion delimiter] = "\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/endTag.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/endTag.scope deleted file mode 100644 index 61c4e46bcd5..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/endTag.scope +++ /dev/null @@ -1,13 +0,0 @@ -
    ---- - -[Content] = -[Removal] = 0:15-0:21 - >------< -0|
    - -[Domain] = 0:0-0:21 - >---------------------< -0|
    - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/key.attribute.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/key.attribute.scope deleted file mode 100644 index aae05371b99..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/key.attribute.scope +++ /dev/null @@ -1,20 +0,0 @@ -
    ---- - -[Content] = 0:5-0:7 - >--< -0|
    - -[Removal] = 0:5-0:8 - >---< -0|
    - -[Trailing delimiter] = 0:7-0:8 - >-< -0|
    - -[Domain] = 0:5-0:14 - >---------< -0|
    - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/key.attribute2.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/key.attribute2.scope deleted file mode 100644 index bb8051a0666..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/key.attribute2.scope +++ /dev/null @@ -1,17 +0,0 @@ -
    ---- - -[Content] = -[Domain] = 0:5-0:13 - >--------< -0|
    - -[Removal] = 0:4-0:13 - >---------< -0|
    - -[Leading delimiter] = 0:4-0:5 - >-< -0|
    - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/startTag.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/startTag.scope deleted file mode 100644 index d3f5ce5ef83..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/startTag.scope +++ /dev/null @@ -1,13 +0,0 @@ -
    ---- - -[Content] = -[Removal] = 0:0-0:15 - >---------------< -0|
    - -[Domain] = 0:0-0:21 - >---------------------< -0|
    - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/tags.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/tags.scope deleted file mode 100644 index 680eb20ef9f..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/tags.scope +++ /dev/null @@ -1,20 +0,0 @@ -
    hello
    ---- - -[.1 Content] = -[.1 Removal] = 0:0-0:5 - >-----< -0|
    hello
    - -[.1 Insertion delimiter] = " " - -[.2 Content] = -[.2 Removal] = 0:10-0:16 - >------< -0|
    hello
    - -[.2 Insertion delimiter] = " " - -[Domain] = 0:0-0:16 - >----------------< -0|
    hello
    diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/value.attribute.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/value.attribute.scope deleted file mode 100644 index c9b9bfb687b..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/html/value.attribute.scope +++ /dev/null @@ -1,20 +0,0 @@ -
    ---- - -[Content] = 0:8-0:14 - >------< -0|
    - -[Removal] = 0:7-0:14 - >-------< -0|
    - -[Leading delimiter] = 0:7-0:8 - >-< -0|
    - -[Domain] = 0:5-0:14 - >---------< -0|
    - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/java/name.foreach.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/java/name.foreach.scope deleted file mode 100644 index 82b3a98f98e..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/java/name.foreach.scope +++ /dev/null @@ -1,29 +0,0 @@ -for (final Item item : items) { - -} ---- - -[Content] = 0:16-0:20 - >----< -0| for (final Item item : items) { - -[Removal] = 0:16-0:21 - >-----< -0| for (final Item item : items) { - -[Leading delimiter] = 0:15-0:16 - >-< -0| for (final Item item : items) { - -[Trailing delimiter] = 0:20-0:21 - >-< -0| for (final Item item : items) { - -[Domain] = 0:0-2:1 - >------------------------------- -0| for (final Item item : items) { -1| -2| } - -< - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/java/type.foreach.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/java/type.foreach.scope deleted file mode 100644 index 8d68f3643eb..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/java/type.foreach.scope +++ /dev/null @@ -1,29 +0,0 @@ -for (final Item item : items) { - -} ---- - -[Content] = 0:11-0:15 - >----< -0| for (final Item item : items) { - -[Removal] = 0:11-0:16 - >-----< -0| for (final Item item : items) { - -[Leading delimiter] = 0:10-0:11 - >-< -0| for (final Item item : items) { - -[Trailing delimiter] = 0:15-0:16 - >-< -0| for (final Item item : items) { - -[Domain] = 0:0-2:1 - >------------------------------- -0| for (final Item item : items) { -1| -2| } - -< - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/java/value.foreach.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/java/value.foreach.scope deleted file mode 100644 index 9ab4bd49c14..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/java/value.foreach.scope +++ /dev/null @@ -1,25 +0,0 @@ -for (final Item item : items) { - -} ---- - -[Content] = 0:23-0:28 - >-----< -0| for (final Item item : items) { - -[Removal] = 0:22-0:28 - >------< -0| for (final Item item : items) { - -[Leading delimiter] = 0:22-0:23 - >-< -0| for (final Item item : items) { - -[Domain] = 0:0-2:1 - >------------------------------- -0| for (final Item item : items) { -1| -2| } - -< - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/anonymousFunction.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/anonymousFunction.scope deleted file mode 100644 index 515220a3318..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/anonymousFunction.scope +++ /dev/null @@ -1,15 +0,0 @@ -function() { - -} ---- - -[Content] = -[Removal] = -[Domain] = 0:0-2:1 - >------------ -0| function() { -1| -2| } - -< - -[Insertion delimiter] = "\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/anonymousFunction2.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/anonymousFunction2.scope deleted file mode 100644 index f669347db45..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/anonymousFunction2.scope +++ /dev/null @@ -1,15 +0,0 @@ -() => { - -} ---- - -[Content] = -[Removal] = -[Domain] = 0:0-2:1 - >------- -0| () => { -1| -2| } - -< - -[Insertion delimiter] = "\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/anonymousFunction3.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/anonymousFunction3.scope deleted file mode 100644 index 5556d41df0c..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/anonymousFunction3.scope +++ /dev/null @@ -1,10 +0,0 @@ -() => 0 ---- - -[Content] = -[Removal] = -[Domain] = 0:0-0:7 - >-------< -0| () => 0 - -[Insertion delimiter] = "\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/argument.actual.iteration.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/argument.actual.iteration.scope deleted file mode 100644 index b05c47ed24c..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/argument.actual.iteration.scope +++ /dev/null @@ -1,10 +0,0 @@ -foo(arg1, arg2); ---- - -[Range] = 0:4-0:14 - >----------< -0| foo(arg1, arg2); - -[Domain] = 0:3-0:15 - >------------< -0| foo(arg1, arg2); diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/argument.actual.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/argument.actual.scope deleted file mode 100644 index 440d75422b5..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/argument.actual.scope +++ /dev/null @@ -1,10 +0,0 @@ -foo.bar(value); ---- - -[Content] = -[Removal] = -[Domain] = 0:8-0:13 - >-----< -0| foo.bar(value); - -[Insertion delimiter] = ", " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/argument.formal.iteration.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/argument.formal.iteration.scope deleted file mode 100644 index cf4f34c540f..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/argument.formal.iteration.scope +++ /dev/null @@ -1,15 +0,0 @@ -function myFunk(arg1, arg2) { - -} ---- - -[Range] = 0:16-0:26 - >----------< -0| function myFunk(arg1, arg2) { - -[Domain] = 0:0-2:1 - >----------------------------- -0| function myFunk(arg1, arg2) { -1| -2| } - -< diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/argument.formal.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/argument.formal.scope deleted file mode 100644 index e338841fd40..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/argument.formal.scope +++ /dev/null @@ -1,12 +0,0 @@ -function myFunk(value) { - -} ---- - -[Content] = -[Removal] = -[Domain] = 0:16-0:21 - >-----< -0| function myFunk(value) { - -[Insertion delimiter] = ", " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/attribute.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/attribute.scope deleted file mode 100644 index ad4db478095..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/attribute.scope +++ /dev/null @@ -1,17 +0,0 @@ -
    ---- - -[Content] = -[Domain] = 0:5-0:14 - >---------< -0|
    - -[Removal] = 0:4-0:14 - >----------< -0|
    - -[Leading delimiter] = 0:4-0:5 - >-< -0|
    - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/branch.if.iteration.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/branch.if.iteration.scope deleted file mode 100644 index b39fb34ecc5..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/branch.if.iteration.scope +++ /dev/null @@ -1,24 +0,0 @@ -if (true) { - -} -else if (false) { - -} -else { - -} ---- - -[Range] = -[Domain] = 0:0-8:1 - >----------- -0| if (true) { -1| -2| } -3| else if (false) { -4| -5| } -6| else { -7| -8| } - -< diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/branch.if.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/branch.if.scope deleted file mode 100644 index 6202480fc77..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/branch.if.scope +++ /dev/null @@ -1,52 +0,0 @@ -if (true) { - -} -else if (false) { - -} -else { - -} ---- - -[#1 Content] = -[#1 Domain] = 0:0-2:1 - >----------- -0| if (true) { -1| -2| } - -< - -[#1 Removal] = 0:0-3:5 - >----------- -0| if (true) { -1| -2| } -3| else if (false) { - -----< - -[#1 Insertion delimiter] = "\n" - - -[#2 Content] = -[#2 Removal] = -[#2 Domain] = 3:0-5:1 - >----------------- -3| else if (false) { -4| -5| } - -< - -[#2 Insertion delimiter] = "\n" - - -[#3 Content] = -[#3 Removal] = -[#3 Domain] = 6:0-8:1 - >------ -6| else { -7| -8| } - -< - -[#3 Insertion delimiter] = "\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/branch.switchCase.iteration.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/branch.switchCase.iteration.scope deleted file mode 100644 index e01445e1cda..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/branch.switchCase.iteration.scope +++ /dev/null @@ -1,14 +0,0 @@ -switch (value) { - case 0: { } - case 1: { } -} ---- - -[Range] = -[Domain] = 0:0-3:1 - >---------------- -0| switch (value) { -1| case 0: { } -2| case 1: { } -3| } - -< diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/branch.switchCase.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/branch.switchCase.scope deleted file mode 100644 index 9d9b6fdd4a2..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/branch.switchCase.scope +++ /dev/null @@ -1,19 +0,0 @@ -switch (value) { - case 0: { } -} ---- - -[Content] = -[Domain] = 1:2-1:13 - >-----------< -1| case 0: { } - -[Removal] = 1:0-1:13 - >-------------< -1| case 0: { } - -[Leading delimiter] = 1:0-1:2 - >--< -1| case 0: { } - -[Insertion delimiter] = "\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/branch.ternary.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/branch.ternary.scope deleted file mode 100644 index 92e00b0f685..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/branch.ternary.scope +++ /dev/null @@ -1,37 +0,0 @@ -aaa ? bbb : ccc; ---- - -[#1 Content] = -[#1 Domain] = 0:6-0:9 - >---< -0| aaa ? bbb : ccc; - -[#1 Removal] = 0:6-0:10 - >----< -0| aaa ? bbb : ccc; - -[#1 Leading delimiter] = 0:5-0:6 - >-< -0| aaa ? bbb : ccc; - -[#1 Trailing delimiter] = 0:9-0:10 - >-< -0| aaa ? bbb : ccc; - -[#1 Insertion delimiter] = "\n" - - -[#2 Content] = -[#2 Domain] = 0:12-0:15 - >---< -0| aaa ? bbb : ccc; - -[#2 Removal] = 0:11-0:15 - >----< -0| aaa ? bbb : ccc; - -[#2 Leading delimiter] = 0:11-0:12 - >-< -0| aaa ? bbb : ccc; - -[#2 Insertion delimiter] = "\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/branch.try.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/branch.try.scope deleted file mode 100644 index 95896234b18..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/branch.try.scope +++ /dev/null @@ -1,45 +0,0 @@ -try { - -} -catch(error) { - -} -finally { - -} ---- - -[#1 Content] = -[#1 Removal] = -[#1 Domain] = 0:0-2:1 - >----- -0| try { -1| -2| } - -< - -[#1 Insertion delimiter] = "\n" - - -[#2 Content] = -[#2 Removal] = -[#2 Domain] = 3:0-5:1 - >-------------- -3| catch(error) { -4| -5| } - -< - -[#2 Insertion delimiter] = "\n" - - -[#3 Content] = -[#3 Removal] = -[#3 Domain] = 6:0-8:1 - >--------- -6| finally { -7| -8| } - -< - -[#3 Insertion delimiter] = "\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/class.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/class.scope deleted file mode 100644 index 9b0eef79788..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/class.scope +++ /dev/null @@ -1,15 +0,0 @@ -class MyClass { - -} ---- - -[Content] = -[Removal] = -[Domain] = 0:0-2:1 - >--------------- -0| class MyClass { -1| -2| } - -< - -[Insertion delimiter] = "\n\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/className.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/className.scope deleted file mode 100644 index 428df96465e..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/className.scope +++ /dev/null @@ -1,29 +0,0 @@ -class MyClass { - -} ---- - -[Content] = 0:6-0:13 - >-------< -0| class MyClass { - -[Removal] = 0:6-0:14 - >--------< -0| class MyClass { - -[Leading delimiter] = 0:5-0:6 - >-< -0| class MyClass { - -[Trailing delimiter] = 0:13-0:14 - >-< -0| class MyClass { - -[Domain] = 0:0-2:1 - >--------------- -0| class MyClass { -1| -2| } - -< - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/comment.block.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/comment.block.scope deleted file mode 100644 index f8b38ca6af3..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/comment.block.scope +++ /dev/null @@ -1,15 +0,0 @@ -/* - Hello world -*/ ---- - -[Content] = -[Removal] = -[Domain] = 0:0-2:2 - >-- -0| /* -1| Hello world -2| */ - --< - -[Insertion delimiter] = "\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/comment.block2.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/comment.block2.scope deleted file mode 100644 index a0ab76da254..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/comment.block2.scope +++ /dev/null @@ -1,15 +0,0 @@ -/** -* Hello world -*/ ---- - -[Content] = -[Removal] = -[Domain] = 0:0-2:2 - >--- -0| /** -1| * Hello world -2| */ - --< - -[Insertion delimiter] = "\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/comment.line.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/comment.line.scope deleted file mode 100644 index 7d1477b8a12..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/comment.line.scope +++ /dev/null @@ -1,10 +0,0 @@ -// Hello world ---- - -[Content] = -[Removal] = -[Domain] = 0:0-0:14 - >--------------< -0| // Hello world - -[Insertion delimiter] = "\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/condition.doWhile.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/condition.doWhile.scope deleted file mode 100644 index b32c0c43867..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/condition.doWhile.scope +++ /dev/null @@ -1,18 +0,0 @@ -do { - -} while (true); ---- - -[Content] = -[Removal] = 2:9-2:13 - >----< -2| } while (true); - -[Domain] = 0:0-2:15 - >---- -0| do { -1| -2| } while (true); - ---------------< - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/condition.for.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/condition.for.scope deleted file mode 100644 index 194410b7632..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/condition.for.scope +++ /dev/null @@ -1,25 +0,0 @@ -for (let i = 0; i < 10; ++i) { - -} ---- - -[Content] = 0:16-0:22 - >------< -0| for (let i = 0; i < 10; ++i) { - -[Removal] = 0:15-0:22 - >-------< -0| for (let i = 0; i < 10; ++i) { - -[Leading delimiter] = 0:15-0:16 - >-< -0| for (let i = 0; i < 10; ++i) { - -[Domain] = 0:0-2:1 - >------------------------------ -0| for (let i = 0; i < 10; ++i) { -1| -2| } - -< - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/condition.if.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/condition.if.scope deleted file mode 100644 index 6c1a02e37fa..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/condition.if.scope +++ /dev/null @@ -1,18 +0,0 @@ -if (true) { - -} ---- - -[Content] = -[Removal] = 0:4-0:8 - >----< -0| if (true) { - -[Domain] = 0:0-2:1 - >----------- -0| if (true) { -1| -2| } - -< - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/condition.switchCase.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/condition.switchCase.scope deleted file mode 100644 index 34114d7a74f..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/condition.switchCase.scope +++ /dev/null @@ -1,22 +0,0 @@ -switch (value) { - case 0: { } -} ---- - -[Content] = 1:7-1:8 - >-< -1| case 0: { } - -[Removal] = 1:6-1:8 - >--< -1| case 0: { } - -[Leading delimiter] = 1:6-1:7 - >-< -1| case 0: { } - -[Domain] = 1:2-1:13 - >-----------< -1| case 0: { } - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/condition.ternary.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/condition.ternary.scope deleted file mode 100644 index 2b6cdb301a0..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/condition.ternary.scope +++ /dev/null @@ -1,20 +0,0 @@ -true ? 0 : 1 ---- - -[Content] = 0:0-0:4 - >----< -0| true ? 0 : 1 - -[Removal] = 0:0-0:5 - >-----< -0| true ? 0 : 1 - -[Trailing delimiter] = 0:4-0:5 - >-< -0| true ? 0 : 1 - -[Domain] = 0:0-0:12 - >------------< -0| true ? 0 : 1 - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/condition.while.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/condition.while.scope deleted file mode 100644 index ff4a0f87c7b..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/condition.while.scope +++ /dev/null @@ -1,18 +0,0 @@ -while (true) { - -} ---- - -[Content] = -[Removal] = 0:7-0:11 - >----< -0| while (true) { - -[Domain] = 0:0-2:1 - >-------------- -0| while (true) { -1| -2| } - -< - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/element.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/element.scope deleted file mode 100644 index 23ebb426947..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/element.scope +++ /dev/null @@ -1,14 +0,0 @@ -
    ---- - -[Content] = -[Removal] = -[Domain] = 0:0-0:21 - >---------------------< -0|
    - -[Interior] = 0:15-0:15 - >< -0|
    - -[Insertion delimiter] = "\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/endTag.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/endTag.scope deleted file mode 100644 index 61c4e46bcd5..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/endTag.scope +++ /dev/null @@ -1,13 +0,0 @@ -
    ---- - -[Content] = -[Removal] = 0:15-0:21 - >------< -0|
    - -[Domain] = 0:0-0:21 - >---------------------< -0|
    - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/fieldAccess.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/fieldAccess.scope deleted file mode 100644 index e9cd772e413..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/fieldAccess.scope +++ /dev/null @@ -1,19 +0,0 @@ -foo.bar(0); ---- - -[#1 Content] = -[#1 Removal] = -[#1 Domain] = 0:0-0:3 - >---< -0| foo.bar(0); - -[#1 Insertion delimiter] = " " - - -[#2 Content] = -[#2 Removal] = -[#2 Domain] = 0:3-0:10 - >-------< -0| foo.bar(0); - -[#2 Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/functionCall.constructor.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/functionCall.constructor.scope deleted file mode 100644 index 5ef02ad32bd..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/functionCall.constructor.scope +++ /dev/null @@ -1,10 +0,0 @@ -new Foo.bar(0); ---- - -[Content] = -[Removal] = -[Domain] = 0:0-0:14 - >--------------< -0| new Foo.bar(0); - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/functionCall.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/functionCall.scope deleted file mode 100644 index 102bc158719..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/functionCall.scope +++ /dev/null @@ -1,10 +0,0 @@ -foo.bar(0); ---- - -[Content] = -[Removal] = -[Domain] = 0:0-0:10 - >----------< -0| foo.bar(0); - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/functionCallee.constructor.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/functionCallee.constructor.scope deleted file mode 100644 index 7b6abd009ad..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/functionCallee.constructor.scope +++ /dev/null @@ -1,13 +0,0 @@ -new Foo.bar(0); ---- - -[Content] = -[Removal] = 0:0-0:11 - >-----------< -0| new Foo.bar(0); - -[Domain] = 0:0-0:14 - >--------------< -0| new Foo.bar(0); - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/functionCallee.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/functionCallee.scope deleted file mode 100644 index 1b831132c69..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/functionCallee.scope +++ /dev/null @@ -1,13 +0,0 @@ -foo.bar(0); ---- - -[Content] = -[Removal] = 0:0-0:7 - >-------< -0| foo.bar(0); - -[Domain] = 0:0-0:10 - >----------< -0| foo.bar(0); - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/functionName.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/functionName.scope deleted file mode 100644 index 92194c85e2e..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/functionName.scope +++ /dev/null @@ -1,22 +0,0 @@ -function myFunk() { - -} ---- - -[Content] = -[Removal] = 0:9-0:15 - >------< -0| function myFunk() { - -[Leading delimiter] = 0:8-0:9 - >-< -0| function myFunk() { - -[Domain] = 0:0-2:1 - >------------------- -0| function myFunk() { -1| -2| } - -< - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/ifStatement.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/ifStatement.scope deleted file mode 100644 index d01f5e842d3..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/ifStatement.scope +++ /dev/null @@ -1,15 +0,0 @@ -if (true) { - -} ---- - -[Content] = -[Removal] = -[Domain] = 0:0-2:1 - >----------- -0| if (true) { -1| -2| } - -< - -[Insertion delimiter] = "\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/key.attribute.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/key.attribute.scope deleted file mode 100644 index aae05371b99..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/key.attribute.scope +++ /dev/null @@ -1,20 +0,0 @@ -
    ---- - -[Content] = 0:5-0:7 - >--< -0|
    - -[Removal] = 0:5-0:8 - >---< -0|
    - -[Trailing delimiter] = 0:7-0:8 - >-< -0|
    - -[Domain] = 0:5-0:14 - >---------< -0|
    - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/key.attribute2.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/key.attribute2.scope deleted file mode 100644 index bb8051a0666..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/key.attribute2.scope +++ /dev/null @@ -1,17 +0,0 @@ -
    ---- - -[Content] = -[Domain] = 0:5-0:13 - >--------< -0|
    - -[Removal] = 0:4-0:13 - >---------< -0|
    - -[Leading delimiter] = 0:4-0:5 - >-< -0|
    - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/key.mapPair.iteration.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/key.mapPair.iteration.scope deleted file mode 100644 index 80af86055cf..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/key.mapPair.iteration.scope +++ /dev/null @@ -1,7 +0,0 @@ -{ value: 123 } ---- - -[Range] = -[Domain] = 0:1-0:13 - >------------< -0| { value: 123 } diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/key.mapPair.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/key.mapPair.scope deleted file mode 100644 index efe7fbfce36..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/key.mapPair.scope +++ /dev/null @@ -1,20 +0,0 @@ -{ value: 123 } ---- - -[Content] = 0:2-0:7 - >-----< -0| { value: 123 } - -[Removal] = 0:2-0:9 - >-------< -0| { value: 123 } - -[Trailing delimiter] = 0:7-0:9 - >--< -0| { value: 123 } - -[Domain] = 0:2-0:12 - >----------< -0| { value: 123 } - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/list.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/list.scope deleted file mode 100644 index 54a5d795c22..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/list.scope +++ /dev/null @@ -1,10 +0,0 @@ -[1, 2, 3] ---- - -[Content] = -[Removal] = -[Domain] = 0:0-0:9 - >---------< -0| [1, 2, 3] - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/map.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/map.scope deleted file mode 100644 index 7ae60ad3a8e..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/map.scope +++ /dev/null @@ -1,10 +0,0 @@ -{ value: 123 } ---- - -[Content] = -[Removal] = -[Domain] = 0:0-0:14 - >--------------< -0| { value: 123 } - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.assignment.pattern.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.assignment.pattern.scope deleted file mode 100644 index c4a2ae9f7f3..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.assignment.pattern.scope +++ /dev/null @@ -1,20 +0,0 @@ -{ aaa: bbb } = ccc; ---- - -[Content] = 0:0-0:12 - >------------< -0| { aaa: bbb } = ccc; - -[Removal] = 0:0-0:15 - >---------------< -0| { aaa: bbb } = ccc; - -[Trailing delimiter] = 0:12-0:15 - >---< -0| { aaa: bbb } = ccc; - -[Domain] = 0:0-0:19 - >-------------------< -0| { aaa: bbb } = ccc; - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.assignment.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.assignment.scope deleted file mode 100644 index 6cf46c5ce81..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.assignment.scope +++ /dev/null @@ -1,20 +0,0 @@ -aaa = bbb; ---- - -[Content] = 0:0-0:3 - >---< -0| aaa = bbb; - -[Removal] = 0:0-0:6 - >------< -0| aaa = bbb; - -[Trailing delimiter] = 0:3-0:6 - >---< -0| aaa = bbb; - -[Domain] = 0:0-0:10 - >----------< -0| aaa = bbb; - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.class.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.class.scope deleted file mode 100644 index 428df96465e..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.class.scope +++ /dev/null @@ -1,29 +0,0 @@ -class MyClass { - -} ---- - -[Content] = 0:6-0:13 - >-------< -0| class MyClass { - -[Removal] = 0:6-0:14 - >--------< -0| class MyClass { - -[Leading delimiter] = 0:5-0:6 - >-< -0| class MyClass { - -[Trailing delimiter] = 0:13-0:14 - >-< -0| class MyClass { - -[Domain] = 0:0-2:1 - >--------------- -0| class MyClass { -1| -2| } - -< - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.field.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.field.scope deleted file mode 100644 index c913e7d6ec7..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.field.scope +++ /dev/null @@ -1,48 +0,0 @@ -class MyClass { - value = 0; -} ---- - -[#1 Content] = 0:6-0:13 - >-------< -0| class MyClass { - -[#1 Removal] = 0:6-0:14 - >--------< -0| class MyClass { - -[#1 Leading delimiter] = 0:5-0:6 - >-< -0| class MyClass { - -[#1 Trailing delimiter] = 0:13-0:14 - >-< -0| class MyClass { - -[#1 Domain] = 0:0-2:1 - >--------------- -0| class MyClass { -1| value = 0; -2| } - -< - -[#1 Insertion delimiter] = " " - - -[#2 Content] = 1:2-1:7 - >-----< -1| value = 0; - -[#2 Removal] = 1:2-1:10 - >--------< -1| value = 0; - -[#2 Trailing delimiter] = 1:7-1:10 - >---< -1| value = 0; - -[#2 Domain] = 1:2-1:12 - >----------< -1| value = 0; - -[#2 Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.foreach.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.foreach.scope deleted file mode 100644 index 331df7f4dee..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.foreach.scope +++ /dev/null @@ -1,29 +0,0 @@ -for (const item of items) { - -} ---- - -[Content] = 0:11-0:15 - >----< -0| for (const item of items) { - -[Removal] = 0:11-0:16 - >-----< -0| for (const item of items) { - -[Leading delimiter] = 0:10-0:11 - >-< -0| for (const item of items) { - -[Trailing delimiter] = 0:15-0:16 - >-< -0| for (const item of items) { - -[Domain] = 0:0-2:1 - >--------------------------- -0| for (const item of items) { -1| -2| } - -< - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.function.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.function.scope deleted file mode 100644 index 92194c85e2e..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.function.scope +++ /dev/null @@ -1,22 +0,0 @@ -function myFunk() { - -} ---- - -[Content] = -[Removal] = 0:9-0:15 - >------< -0| function myFunk() { - -[Leading delimiter] = 0:8-0:9 - >-< -0| function myFunk() { - -[Domain] = 0:0-2:1 - >------------------- -0| function myFunk() { -1| -2| } - -< - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.variable.pattern.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.variable.pattern.scope deleted file mode 100644 index 5b6f02cfa7e..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.variable.pattern.scope +++ /dev/null @@ -1,24 +0,0 @@ -const {aaa: bbb} = ccc; ---- - -[Content] = 0:6-0:16 - >----------< -0| const {aaa: bbb} = ccc; - -[Removal] = 0:0-0:19 - >-------------------< -0| const {aaa: bbb} = ccc; - -[Leading delimiter] = 0:5-0:6 - >-< -0| const {aaa: bbb} = ccc; - -[Trailing delimiter] = 0:16-0:17 - >-< -0| const {aaa: bbb} = ccc; - -[Domain] = 0:0-0:23 - >-----------------------< -0| const {aaa: bbb} = ccc; - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.variable.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.variable.scope deleted file mode 100644 index c9aed7af122..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/name.variable.scope +++ /dev/null @@ -1,24 +0,0 @@ -const name = "Hello world"; ---- - -[Content] = 0:6-0:10 - >----< -0| const name = "Hello world"; - -[Removal] = 0:0-0:13 - >-------------< -0| const name = "Hello world"; - -[Leading delimiter] = 0:5-0:6 - >-< -0| const name = "Hello world"; - -[Trailing delimiter] = 0:10-0:11 - >-< -0| const name = "Hello world"; - -[Domain] = 0:0-0:27 - >---------------------------< -0| const name = "Hello world"; - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/namedFunction.method.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/namedFunction.method.scope deleted file mode 100644 index 88b4fbcd67c..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/namedFunction.method.scope +++ /dev/null @@ -1,27 +0,0 @@ -class MyClass { - myFunk() { - - } -} ---- - -[Content] = -[Domain] = 1:2-3:3 - >---------- -1| myFunk() { -2| -3| } - ---< - -[Removal] = 1:0-3:3 - >------------ -1| myFunk() { -2| -3| } - ---< - -[Leading delimiter] = 1:0-1:2 - >--< -1| myFunk() { - -[Insertion delimiter] = "\n\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/namedFunction.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/namedFunction.scope deleted file mode 100644 index ec504028c3e..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/namedFunction.scope +++ /dev/null @@ -1,15 +0,0 @@ -function myFunk() { - -} ---- - -[Content] = -[Removal] = -[Domain] = 0:0-2:1 - >------------------- -0| function myFunk() { -1| -2| } - -< - -[Insertion delimiter] = "\n\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/namedFunction2.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/namedFunction2.scope deleted file mode 100644 index 816799f2de5..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/namedFunction2.scope +++ /dev/null @@ -1,15 +0,0 @@ -const myFunk = function() { - -} ---- - -[Content] = -[Removal] = -[Domain] = 0:0-2:1 - >--------------------------- -0| const myFunk = function() { -1| -2| } - -< - -[Insertion delimiter] = "\n\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/regularExpression.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/regularExpression.scope deleted file mode 100644 index 3e65ffe6fdd..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/regularExpression.scope +++ /dev/null @@ -1,10 +0,0 @@ -/^\w+$/g ---- - -[Content] = -[Removal] = -[Domain] = 0:0-0:8 - >--------< -0| /^\w+$/g - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/startTag.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/startTag.scope deleted file mode 100644 index d3f5ce5ef83..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/startTag.scope +++ /dev/null @@ -1,13 +0,0 @@ -
    ---- - -[Content] = -[Removal] = 0:0-0:15 - >---------------< -0|
    - -[Domain] = 0:0-0:21 - >---------------------< -0|
    - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/statement.iteration.block.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/statement.iteration.block.scope deleted file mode 100644 index 5cde5b4e3f9..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/statement.iteration.block.scope +++ /dev/null @@ -1,21 +0,0 @@ -function foo() { - -} ---- - -[#1 Range] = -[#1 Domain] = 0:0-2:1 - >---------------- -0| function foo() { -1| -2| } - -< - - -[#2 Range] = -[#2 Domain] = 0:16-2:0 - > -0| function foo() { -1| -2| } - < diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/statement.iteration.document.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/statement.iteration.document.scope deleted file mode 100644 index 118c616ecf5..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/statement.iteration.document.scope +++ /dev/null @@ -1,25 +0,0 @@ -// Start - -function foo() { - -} ---- - -[#1 Range] = -[#1 Domain] = 0:0-4:1 - >-------- -0| // Start -1| -2| function foo() { -3| -4| } - -< - - -[#2 Range] = -[#2 Domain] = 2:16-4:0 - > -2| function foo() { -3| -4| } - < diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/statement.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/statement.scope deleted file mode 100644 index 8e3c576f0cf..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/statement.scope +++ /dev/null @@ -1,10 +0,0 @@ -const value = 0; ---- - -[Content] = -[Removal] = -[Domain] = 0:0-0:16 - >----------------< -0| const value = 0; - -[Insertion delimiter] = "\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/string.multiLine.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/string.multiLine.scope deleted file mode 100644 index 7ff38166b5c..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/string.multiLine.scope +++ /dev/null @@ -1,13 +0,0 @@ -`Hello -world` ---- - -[Content] = -[Removal] = -[Domain] = 0:0-1:6 - >------ -0| `Hello -1| world` - ------< - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/string.singleLine.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/string.singleLine.scope deleted file mode 100644 index 4b26cf31b3c..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/string.singleLine.scope +++ /dev/null @@ -1,10 +0,0 @@ -"Hello world" ---- - -[Content] = -[Removal] = -[Domain] = 0:0-0:13 - >-------------< -0| "Hello world" - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/switchStatementSubject.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/switchStatementSubject.scope deleted file mode 100644 index 5098b692ac7..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/switchStatementSubject.scope +++ /dev/null @@ -1,18 +0,0 @@ -switch (value) { - -} ---- - -[Content] = -[Removal] = 0:8-0:13 - >-----< -0| switch (value) { - -[Domain] = 0:0-2:1 - >---------------- -0| switch (value) { -1| -2| } - -< - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/tags.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/tags.scope deleted file mode 100644 index 680eb20ef9f..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/tags.scope +++ /dev/null @@ -1,20 +0,0 @@ -
    hello
    ---- - -[.1 Content] = -[.1 Removal] = 0:0-0:5 - >-----< -0|
    hello
    - -[.1 Insertion delimiter] = " " - -[.2 Content] = -[.2 Removal] = 0:10-0:16 - >------< -0|
    hello
    - -[.2 Insertion delimiter] = " " - -[Domain] = 0:0-0:16 - >----------------< -0|
    hello
    diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.assignment.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.assignment.scope deleted file mode 100644 index 47eb8c0f751..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.assignment.scope +++ /dev/null @@ -1,20 +0,0 @@ -aaa = bbb; ---- - -[Content] = 0:6-0:9 - >---< -0| aaa = bbb; - -[Removal] = 0:3-0:9 - >------< -0| aaa = bbb; - -[Leading delimiter] = 0:3-0:6 - >---< -0| aaa = bbb; - -[Domain] = 0:0-0:10 - >----------< -0| aaa = bbb; - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.attribute.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.attribute.scope deleted file mode 100644 index c9b9bfb687b..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.attribute.scope +++ /dev/null @@ -1,20 +0,0 @@ -
    ---- - -[Content] = 0:8-0:14 - >------< -0|
    - -[Removal] = 0:7-0:14 - >-------< -0|
    - -[Leading delimiter] = 0:7-0:8 - >-< -0|
    - -[Domain] = 0:5-0:14 - >---------< -0|
    - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.field.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.field.scope deleted file mode 100644 index 3c396b9d74e..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.field.scope +++ /dev/null @@ -1,22 +0,0 @@ -class MyClass { - value = 0; -} ---- - -[Content] = 1:10-1:11 - >-< -1| value = 0; - -[Removal] = 1:7-1:11 - >----< -1| value = 0; - -[Leading delimiter] = 1:7-1:10 - >---< -1| value = 0; - -[Domain] = 1:2-1:12 - >----------< -1| value = 0; - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.foreach.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.foreach.scope deleted file mode 100644 index 534e095b627..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.foreach.scope +++ /dev/null @@ -1,25 +0,0 @@ -for (const item of items) { - -} ---- - -[Content] = 0:19-0:24 - >-----< -0| for (const item of items) { - -[Removal] = 0:18-0:24 - >------< -0| for (const item of items) { - -[Leading delimiter] = 0:18-0:19 - >-< -0| for (const item of items) { - -[Domain] = 0:0-2:1 - >--------------------------- -0| for (const item of items) { -1| -2| } - -< - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.mapPair.iteration.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.mapPair.iteration.scope deleted file mode 100644 index 53deac1c0bb..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.mapPair.iteration.scope +++ /dev/null @@ -1,13 +0,0 @@ -{ value: 123 } ---- - -[#1 Range] = -[#1 Domain] = 0:0-0:14 - >--------------< -0| { value: 123 } - - -[#2 Range] = -[#2 Domain] = 0:1-0:13 - >------------< -0| { value: 123 } diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.mapPair.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.mapPair.scope deleted file mode 100644 index 80ac508b045..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.mapPair.scope +++ /dev/null @@ -1,20 +0,0 @@ -{ value: 123 } ---- - -[Content] = 0:9-0:12 - >---< -0| { value: 123 } - -[Removal] = 0:7-0:12 - >-----< -0| { value: 123 } - -[Leading delimiter] = 0:7-0:9 - >--< -0| { value: 123 } - -[Domain] = 0:2-0:12 - >----------< -0| { value: 123 } - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.return.lambda.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.return.lambda.scope deleted file mode 100644 index 8033661ff4c..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.return.lambda.scope +++ /dev/null @@ -1,20 +0,0 @@ -() => 0 ---- - -[Content] = 0:6-0:7 - >-< -0| () => 0 - -[Removal] = 0:5-0:7 - >--< -0| () => 0 - -[Leading delimiter] = 0:5-0:6 - >-< -0| () => 0 - -[Domain] = 0:0-0:7 - >-------< -0| () => 0 - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.return.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.return.scope deleted file mode 100644 index ff89cb727b3..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.return.scope +++ /dev/null @@ -1,22 +0,0 @@ -function myFunk() { - return 0; -} ---- - -[Content] = 1:9-1:10 - >-< -1| return 0; - -[Removal] = 1:8-1:10 - >--< -1| return 0; - -[Leading delimiter] = 1:8-1:9 - >-< -1| return 0; - -[Domain] = 1:2-1:11 - >---------< -1| return 0; - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.variable.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.variable.scope deleted file mode 100644 index ff12557f655..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/javascript/value.variable.scope +++ /dev/null @@ -1,20 +0,0 @@ -const name = "Hello world"; ---- - -[Content] = 0:13-0:26 - >-------------< -0| const name = "Hello world"; - -[Removal] = 0:10-0:26 - >----------------< -0| const name = "Hello world"; - -[Leading delimiter] = 0:10-0:13 - >---< -0| const name = "Hello world"; - -[Domain] = 0:0-0:27 - >---------------------------< -0| const name = "Hello world"; - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/json/comment.block.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/json/comment.block.scope deleted file mode 100644 index f8b38ca6af3..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/json/comment.block.scope +++ /dev/null @@ -1,15 +0,0 @@ -/* - Hello world -*/ ---- - -[Content] = -[Removal] = -[Domain] = 0:0-2:2 - >-- -0| /* -1| Hello world -2| */ - --< - -[Insertion delimiter] = "\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/json/comment.line.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/json/comment.line.scope deleted file mode 100644 index 7d1477b8a12..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/json/comment.line.scope +++ /dev/null @@ -1,10 +0,0 @@ -// Hello world ---- - -[Content] = -[Removal] = -[Domain] = 0:0-0:14 - >--------------< -0| // Hello world - -[Insertion delimiter] = "\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/name.foreach.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/name.foreach.scope deleted file mode 100644 index 6fe7a12c1a6..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/name.foreach.scope +++ /dev/null @@ -1,27 +0,0 @@ -for item in items: - pass ---- - -[Content] = 0:4-0:8 - >----< -0| for item in items: - -[Removal] = 0:4-0:9 - >-----< -0| for item in items: - -[Leading delimiter] = 0:3-0:4 - >-< -0| for item in items: - -[Trailing delimiter] = 0:8-0:9 - >-< -0| for item in items: - -[Domain] = 0:0-1:8 - >------------------ -0| for item in items: -1| pass - --------< - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/name.resource.iteration.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/name.resource.iteration.scope deleted file mode 100644 index 47cb57159cf..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/name.resource.iteration.scope +++ /dev/null @@ -1,19 +0,0 @@ -with aaa, bbb as ccc: - pass ---- - -[#1 Range] = 0:5-0:20 - >---------------< -0| with aaa, bbb as ccc: - -[#1 Domain] = 0:0-1:8 - >--------------------- -0| with aaa, bbb as ccc: -1| pass - --------< - - -[#2 Range] = -[#2 Domain] = 1:4-1:8 - >----< -1| pass diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/name.resource.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/name.resource.scope deleted file mode 100644 index c8f1c1a3117..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/name.resource.scope +++ /dev/null @@ -1,23 +0,0 @@ -with aaa as bbb: - pass ---- - -[Content] = 0:12-0:15 - >---< -0| with aaa as bbb: - -[Removal] = 0:8-0:15 - >-------< -0| with aaa as bbb: - -[Leading delimiter] = 0:8-0:12 - >----< -0| with aaa as bbb: - -[Domain] = 0:0-1:8 - >---------------- -0| with aaa as bbb: -1| pass - --------< - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/name.resource2.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/name.resource2.scope deleted file mode 100644 index c4dc614bf02..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/name.resource2.scope +++ /dev/null @@ -1,72 +0,0 @@ -with aaa, bbb as ccc: - pass ---- - -[#1.1 Content] = 0:5-0:8 - >---< -0| with aaa, bbb as ccc: - -[#1.1 Removal] = 0:5-0:10 - >-----< -0| with aaa, bbb as ccc: - -[#1.1 Trailing delimiter] = 0:8-0:10 - >--< -0| with aaa, bbb as ccc: - -[#1.1 Insertion delimiter] = " " - -[#1.2 Content] = 0:17-0:20 - >---< -0| with aaa, bbb as ccc: - -[#1.2 Removal] = 0:13-0:20 - >-------< -0| with aaa, bbb as ccc: - -[#1.2 Leading delimiter] = 0:13-0:17 - >----< -0| with aaa, bbb as ccc: - -[#1.2 Insertion delimiter] = " " - -[#1 Domain] = 0:0-1:8 - >--------------------- -0| with aaa, bbb as ccc: -1| pass - --------< - - -[#2 Content] = -[#2 Domain] = 0:5-0:8 - >---< -0| with aaa, bbb as ccc: - -[#2 Removal] = 0:5-0:10 - >-----< -0| with aaa, bbb as ccc: - -[#2 Trailing delimiter] = 0:8-0:10 - >--< -0| with aaa, bbb as ccc: - -[#2 Insertion delimiter] = " " - - -[#3 Content] = 0:17-0:20 - >---< -0| with aaa, bbb as ccc: - -[#3 Removal] = 0:13-0:20 - >-------< -0| with aaa, bbb as ccc: - -[#3 Leading delimiter] = 0:13-0:17 - >----< -0| with aaa, bbb as ccc: - -[#3 Domain] = 0:10-0:20 - >----------< -0| with aaa, bbb as ccc: - -[#3 Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/name.resource3.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/name.resource3.scope deleted file mode 100644 index 944b7196b32..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/name.resource3.scope +++ /dev/null @@ -1,75 +0,0 @@ -with aaa as bbb, ccc as ddd: - pass ---- - -[#1.1 Content] = 0:12-0:15 - >---< -0| with aaa as bbb, ccc as ddd: - -[#1.1 Removal] = 0:8-0:15 - >-------< -0| with aaa as bbb, ccc as ddd: - -[#1.1 Leading delimiter] = 0:8-0:12 - >----< -0| with aaa as bbb, ccc as ddd: - -[#1.1 Insertion delimiter] = " " - -[#1.2 Content] = 0:24-0:27 - >---< -0| with aaa as bbb, ccc as ddd: - -[#1.2 Removal] = 0:20-0:27 - >-------< -0| with aaa as bbb, ccc as ddd: - -[#1.2 Leading delimiter] = 0:20-0:24 - >----< -0| with aaa as bbb, ccc as ddd: - -[#1.2 Insertion delimiter] = " " - -[#1 Domain] = 0:0-1:8 - >---------------------------- -0| with aaa as bbb, ccc as ddd: -1| pass - --------< - - -[#2 Content] = 0:12-0:15 - >---< -0| with aaa as bbb, ccc as ddd: - -[#2 Removal] = 0:8-0:15 - >-------< -0| with aaa as bbb, ccc as ddd: - -[#2 Leading delimiter] = 0:8-0:12 - >----< -0| with aaa as bbb, ccc as ddd: - -[#2 Domain] = 0:5-0:15 - >----------< -0| with aaa as bbb, ccc as ddd: - -[#2 Insertion delimiter] = " " - - -[#3 Content] = 0:24-0:27 - >---< -0| with aaa as bbb, ccc as ddd: - -[#3 Removal] = 0:20-0:27 - >-------< -0| with aaa as bbb, ccc as ddd: - -[#3 Leading delimiter] = 0:20-0:24 - >----< -0| with aaa as bbb, ccc as ddd: - -[#3 Domain] = 0:17-0:27 - >----------< -0| with aaa as bbb, ccc as ddd: - -[#3 Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.foreach.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.foreach.scope deleted file mode 100644 index 2438c8f7745..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.foreach.scope +++ /dev/null @@ -1,23 +0,0 @@ -for item in items: - pass ---- - -[Content] = 0:12-0:17 - >-----< -0| for item in items: - -[Removal] = 0:11-0:17 - >------< -0| for item in items: - -[Leading delimiter] = 0:11-0:12 - >-< -0| for item in items: - -[Domain] = 0:0-1:8 - >------------------ -0| for item in items: -1| pass - --------< - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource.iteration.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource.iteration.scope deleted file mode 100644 index 47cb57159cf..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource.iteration.scope +++ /dev/null @@ -1,19 +0,0 @@ -with aaa, bbb as ccc: - pass ---- - -[#1 Range] = 0:5-0:20 - >---------------< -0| with aaa, bbb as ccc: - -[#1 Domain] = 0:0-1:8 - >--------------------- -0| with aaa, bbb as ccc: -1| pass - --------< - - -[#2 Range] = -[#2 Domain] = 1:4-1:8 - >----< -1| pass diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource.iteration2.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource.iteration2.scope deleted file mode 100644 index 0be71b66d9a..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource.iteration2.scope +++ /dev/null @@ -1,33 +0,0 @@ -with aaa: - pass - -bbb = ccc -ddd = eee ---- - -[#1 Range] = 0:5-0:8 - >---< -0| with aaa: - -[#1 Domain] = 0:0-1:8 - >--------- -0| with aaa: -1| pass - --------< - - -[#2 Range] = -[#2 Domain] = 0:0-4:9 - >--------- -0| with aaa: -1| pass -2| -3| bbb = ccc -4| ddd = eee - ---------< - - -[#3 Range] = -[#3 Domain] = 1:4-1:8 - >----< -1| pass diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource.scope deleted file mode 100644 index 03500511eae..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource.scope +++ /dev/null @@ -1,23 +0,0 @@ -with aaa: - pass ---- - -[Content] = 0:5-0:8 - >---< -0| with aaa: - -[Removal] = 0:4-0:8 - >----< -0| with aaa: - -[Leading delimiter] = 0:4-0:5 - >-< -0| with aaa: - -[Domain] = 0:0-1:8 - >--------- -0| with aaa: -1| pass - --------< - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource2.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource2.scope deleted file mode 100644 index 0e17a381252..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource2.scope +++ /dev/null @@ -1,69 +0,0 @@ -with aaa, bbb: - pass ---- - -[#1.1 Content] = 0:5-0:8 - >---< -0| with aaa, bbb: - -[#1.1 Removal] = 0:5-0:10 - >-----< -0| with aaa, bbb: - -[#1.1 Trailing delimiter] = 0:8-0:10 - >--< -0| with aaa, bbb: - -[#1.1 Insertion delimiter] = " " - -[#1.2 Content] = 0:10-0:13 - >---< -0| with aaa, bbb: - -[#1.2 Removal] = 0:8-0:13 - >-----< -0| with aaa, bbb: - -[#1.2 Leading delimiter] = 0:8-0:10 - >--< -0| with aaa, bbb: - -[#1.2 Insertion delimiter] = " " - -[#1 Domain] = 0:0-1:8 - >-------------- -0| with aaa, bbb: -1| pass - --------< - - -[#2 Content] = -[#2 Domain] = 0:5-0:8 - >---< -0| with aaa, bbb: - -[#2 Removal] = 0:5-0:10 - >-----< -0| with aaa, bbb: - -[#2 Trailing delimiter] = 0:8-0:10 - >--< -0| with aaa, bbb: - -[#2 Insertion delimiter] = " " - - -[#3 Content] = -[#3 Domain] = 0:10-0:13 - >---< -0| with aaa, bbb: - -[#3 Removal] = 0:8-0:13 - >-----< -0| with aaa, bbb: - -[#3 Leading delimiter] = 0:8-0:10 - >--< -0| with aaa, bbb: - -[#3 Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource3.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource3.scope deleted file mode 100644 index e8a7708759b..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource3.scope +++ /dev/null @@ -1,23 +0,0 @@ -with aaa as bbb: - pass ---- - -[Content] = 0:5-0:8 - >---< -0| with aaa as bbb: - -[Removal] = 0:5-0:12 - >-------< -0| with aaa as bbb: - -[Trailing delimiter] = 0:8-0:12 - >----< -0| with aaa as bbb: - -[Domain] = 0:0-1:8 - >---------------- -0| with aaa as bbb: -1| pass - --------< - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource4.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource4.scope deleted file mode 100644 index 467cfef917c..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource4.scope +++ /dev/null @@ -1,72 +0,0 @@ -with aaa, bbb as ccc: - pass ---- - -[#1.1 Content] = 0:5-0:8 - >---< -0| with aaa, bbb as ccc: - -[#1.1 Removal] = 0:5-0:10 - >-----< -0| with aaa, bbb as ccc: - -[#1.1 Trailing delimiter] = 0:8-0:10 - >--< -0| with aaa, bbb as ccc: - -[#1.1 Insertion delimiter] = " " - -[#1.2 Content] = 0:10-0:13 - >---< -0| with aaa, bbb as ccc: - -[#1.2 Removal] = 0:10-0:17 - >-------< -0| with aaa, bbb as ccc: - -[#1.2 Trailing delimiter] = 0:13-0:17 - >----< -0| with aaa, bbb as ccc: - -[#1.2 Insertion delimiter] = " " - -[#1 Domain] = 0:0-1:8 - >--------------------- -0| with aaa, bbb as ccc: -1| pass - --------< - - -[#2 Content] = -[#2 Domain] = 0:5-0:8 - >---< -0| with aaa, bbb as ccc: - -[#2 Removal] = 0:5-0:10 - >-----< -0| with aaa, bbb as ccc: - -[#2 Trailing delimiter] = 0:8-0:10 - >--< -0| with aaa, bbb as ccc: - -[#2 Insertion delimiter] = " " - - -[#3 Content] = 0:10-0:13 - >---< -0| with aaa, bbb as ccc: - -[#3 Removal] = 0:10-0:17 - >-------< -0| with aaa, bbb as ccc: - -[#3 Trailing delimiter] = 0:13-0:17 - >----< -0| with aaa, bbb as ccc: - -[#3 Domain] = 0:10-0:20 - >----------< -0| with aaa, bbb as ccc: - -[#3 Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource5.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource5.scope deleted file mode 100644 index 435ff6a5011..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.resource5.scope +++ /dev/null @@ -1,75 +0,0 @@ -with aaa as bbb, ccc as ddd: - pass ---- - -[#1.1 Content] = 0:5-0:8 - >---< -0| with aaa as bbb, ccc as ddd: - -[#1.1 Removal] = 0:5-0:12 - >-------< -0| with aaa as bbb, ccc as ddd: - -[#1.1 Trailing delimiter] = 0:8-0:12 - >----< -0| with aaa as bbb, ccc as ddd: - -[#1.1 Insertion delimiter] = " " - -[#1.2 Content] = 0:17-0:20 - >---< -0| with aaa as bbb, ccc as ddd: - -[#1.2 Removal] = 0:17-0:24 - >-------< -0| with aaa as bbb, ccc as ddd: - -[#1.2 Trailing delimiter] = 0:20-0:24 - >----< -0| with aaa as bbb, ccc as ddd: - -[#1.2 Insertion delimiter] = " " - -[#1 Domain] = 0:0-1:8 - >---------------------------- -0| with aaa as bbb, ccc as ddd: -1| pass - --------< - - -[#2 Content] = 0:5-0:8 - >---< -0| with aaa as bbb, ccc as ddd: - -[#2 Removal] = 0:5-0:12 - >-------< -0| with aaa as bbb, ccc as ddd: - -[#2 Trailing delimiter] = 0:8-0:12 - >----< -0| with aaa as bbb, ccc as ddd: - -[#2 Domain] = 0:5-0:15 - >----------< -0| with aaa as bbb, ccc as ddd: - -[#2 Insertion delimiter] = " " - - -[#3 Content] = 0:17-0:20 - >---< -0| with aaa as bbb, ccc as ddd: - -[#3 Removal] = 0:17-0:24 - >-------< -0| with aaa as bbb, ccc as ddd: - -[#3 Trailing delimiter] = 0:20-0:24 - >----< -0| with aaa as bbb, ccc as ddd: - -[#3 Domain] = 0:17-0:27 - >----------< -0| with aaa as bbb, ccc as ddd: - -[#3 Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.yield.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.yield.scope deleted file mode 100644 index bcf06f46cef..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/python/value.yield.scope +++ /dev/null @@ -1,21 +0,0 @@ -def aaa(): - yield bbb ---- - -[Content] = 1:10-1:13 - >---< -1| yield bbb - -[Removal] = 1:9-1:13 - >----< -1| yield bbb - -[Leading delimiter] = 1:9-1:10 - >-< -1| yield bbb - -[Domain] = 1:4-1:13 - >---------< -1| yield bbb - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/talon/command.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/talon/command.scope deleted file mode 100644 index a9db1a7118c..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/talon/command.scope +++ /dev/null @@ -1,17 +0,0 @@ -press {user.key}: - key(key) ---- - -[Content] = -[Removal] = -[Domain] = 0:0-1:12 - >----------------- -0| press {user.key}: -1| key(key) - ------------< - -[Interior] = 1:4-1:12 - >--------< -1| key(key) - -[Insertion delimiter] = "\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/character.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/character.scope deleted file mode 100644 index ce61df103a1..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/character.scope +++ /dev/null @@ -1,28 +0,0 @@ -aaa ---- - -[#1 Content] = -[#1 Removal] = -[#1 Domain] = 0:0-0:1 - >-< -0| aaa - -[#1 Insertion delimiter] = "" - - -[#2 Content] = -[#2 Removal] = -[#2 Domain] = 0:1-0:2 - >-< -0| aaa - -[#2 Insertion delimiter] = "" - - -[#3 Content] = -[#3 Removal] = -[#3 Domain] = 0:2-0:3 - >-< -0| aaa - -[#3 Insertion delimiter] = "" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/document.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/document.scope deleted file mode 100644 index 32a27791d8a..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/document.scope +++ /dev/null @@ -1,32 +0,0 @@ - - aaa - -bbb - -ccc - ---- - -[Content] = -[Removal] = -[Domain] = 0:0-6:0 - > -0| -1| aaa -2| -3| bbb -4| -5| ccc -6| - < - -[Interior] = 1:2-5:3 - >--- -1| aaa -2| -3| bbb -4| -5| ccc - ---< - -[Insertion delimiter] = "\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/identifier.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/identifier.scope deleted file mode 100644 index 8d3c33198ba..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/identifier.scope +++ /dev/null @@ -1,10 +0,0 @@ -(foo) ---- - -[Content] = -[Removal] = -[Domain] = 0:1-0:4 - >---< -0| (foo) - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/line.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/line.scope deleted file mode 100644 index 5dabe4ab1b6..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/line.scope +++ /dev/null @@ -1,10 +0,0 @@ -aaa ---- - -[Content] = -[Removal] = -[Domain] = 0:0-0:3 - >---< -0| aaa - -[Insertion delimiter] = "\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/line2.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/line2.scope deleted file mode 100644 index dfee2c52883..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/line2.scope +++ /dev/null @@ -1,69 +0,0 @@ - -aaa - ---- - -[#1 Content] = -[#1 Domain] = 0:0-0:0 - >< -0| - -[#1 Removal] = 0:0-1:0 - > -0| -1| aaa - < - -[#1 Trailing delimiter] = 0:0-1:0 - > -0| -1| aaa - < - -[#1 Insertion delimiter] = "\n" - - -[#2 Content] = -[#2 Domain] = 1:0-1:3 - >---< -1| aaa - -[#2 Removal] = 1:0-2:0 - >--- -1| aaa -2| - < - -[#2 Leading delimiter] = 0:0-1:0 - > -0| -1| aaa - < - -[#2 Trailing delimiter] = 1:3-2:0 - > -1| aaa -2| - < - -[#2 Insertion delimiter] = "\n" - - -[#3 Content] = -[#3 Domain] = 2:0-2:0 - >< -2| - -[#3 Removal] = 1:3-2:0 - > -1| aaa -2| - < - -[#3 Leading delimiter] = 1:3-2:0 - > -1| aaa -2| - < - -[#3 Insertion delimiter] = "\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/nonWhitespaceSequence.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/nonWhitespaceSequence.scope deleted file mode 100644 index f0dd953e12e..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/nonWhitespaceSequence.scope +++ /dev/null @@ -1,17 +0,0 @@ - b.c(?!å_*/\)|d4 ---- - -[Content] = -[Domain] = 0:1-0:16 - >---------------< -0| b.c(?!å_*/\)|d4 - -[Removal] = 0:0-0:16 - >----------------< -0| b.c(?!å_*/\)|d4 - -[Leading delimiter] = 0:0-0:1 - >-< -0| b.c(?!å_*/\)|d4 - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/paragraph.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/paragraph.scope deleted file mode 100644 index 629d5796cef..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/paragraph.scope +++ /dev/null @@ -1,40 +0,0 @@ - -aaa -bbb - ---- - -[Content] = -[Domain] = 1:0-2:3 - >--- -1| aaa -2| bbb - ---< - -[Removal] = 0:0-3:0 - > -0| -1| aaa -2| bbb -3| - < - -[Leading delimiter: Content] = 0:0-0:0 - >< -0| -[Leading delimiter: Removal] = 0:0-1:0 - > -0| -1| aaa - < - -[Trailing delimiter: Content] = 3:0-3:0 - >< -3| -[Trailing delimiter: Removal] = 2:3-3:0 - > -2| bbb -3| - < - -[Insertion delimiter] = "\n\n" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/sentence.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/sentence.scope deleted file mode 100644 index 4db45fece0b..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/sentence.scope +++ /dev/null @@ -1,10 +0,0 @@ -This is a sentence. ---- - -[Content] = -[Removal] = -[Domain] = 0:0-0:19 - >-------------------< -0| This is a sentence. - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/token.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/token.scope deleted file mode 100644 index a889537b1e2..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/token.scope +++ /dev/null @@ -1,21 +0,0 @@ - aaa ---- - -[Content] = -[Domain] = 0:2-0:5 - >---< -0| aaa - -[Removal] = 0:0-0:7 - >-------< -0| aaa - -[Leading delimiter] = 0:0-0:2 - >--< -0| aaa - -[Trailing delimiter] = 0:5-0:7 - >--< -0| aaa - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/url.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/url.scope deleted file mode 100644 index fe5c6beffdd..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/url.scope +++ /dev/null @@ -1,10 +0,0 @@ -https://www.cursorless.org ---- - -[Content] = -[Removal] = -[Domain] = 0:0-0:26 - >--------------------------< -0| https://www.cursorless.org - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/word.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/word.scope deleted file mode 100644 index fc08b5125c0..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/word.scope +++ /dev/null @@ -1,33 +0,0 @@ -aaa_bbb ---- - -[#1 Content] = -[#1 Domain] = 0:0-0:3 - >---< -0| aaa_bbb - -[#1 Removal] = 0:0-0:4 - >----< -0| aaa_bbb - -[#1 Trailing delimiter] = 0:3-0:4 - >-< -0| aaa_bbb - -[#1 Insertion delimiter] = "_" - - -[#2 Content] = -[#2 Domain] = 0:4-0:7 - >---< -0| aaa_bbb - -[#2 Removal] = 0:3-0:7 - >----< -0| aaa_bbb - -[#2 Leading delimiter] = 0:3-0:4 - >-< -0| aaa_bbb - -[#2 Insertion delimiter] = "_" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/word2.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/word2.scope deleted file mode 100644 index 713a90d7845..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/textual/word2.scope +++ /dev/null @@ -1,19 +0,0 @@ -aaaBbb ---- - -[#1 Content] = -[#1 Removal] = -[#1 Domain] = 0:0-0:3 - >---< -0| aaaBbb - -[#1 Insertion delimiter] = "" - - -[#2 Content] = -[#2 Removal] = -[#2 Domain] = 0:3-0:6 - >---< -0| aaaBbb - -[#2 Insertion delimiter] = "" diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/name.field.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/name.field.scope deleted file mode 100644 index 608eebdd4bc..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/name.field.scope +++ /dev/null @@ -1,109 +0,0 @@ -class Aaa { - bbb!: string = undefined; - ccc: string = undefined; - ddd = undefined; - private eee!: string = undefined; -} ---- - -[#1 Content] = 0:6-0:9 - >---< -0| class Aaa { - -[#1 Removal] = 0:6-0:10 - >----< -0| class Aaa { - -[#1 Leading delimiter] = 0:5-0:6 - >-< -0| class Aaa { - -[#1 Trailing delimiter] = 0:9-0:10 - >-< -0| class Aaa { - -[#1 Domain] = 0:0-5:1 - >----------- -0| class Aaa { -1| bbb!: string = undefined; -2| ccc: string = undefined; -3| ddd = undefined; -4| private eee!: string = undefined; -5| } - -< - -[#1 Insertion delimiter] = " " - - -[#2 Content] = -[#2 Removal] = 1:4-1:7 - >---< -1| bbb!: string = undefined; - -[#2 Leading delimiter] = 1:0-1:4 - >----< -1| bbb!: string = undefined; - -[#2 Domain] = 1:4-1:29 - >-------------------------< -1| bbb!: string = undefined; - -[#2 Insertion delimiter] = " " - - -[#3 Content] = 2:4-2:7 - >---< -2| ccc: string = undefined; - -[#3 Removal] = 2:0-2:7 - >-------< -2| ccc: string = undefined; - -[#3 Leading delimiter] = 2:0-2:4 - >----< -2| ccc: string = undefined; - -[#3 Domain] = 2:4-2:28 - >------------------------< -2| ccc: string = undefined; - -[#3 Insertion delimiter] = " " - - -[#4 Content] = 3:4-3:7 - >---< -3| ddd = undefined; - -[#4 Removal] = 3:4-3:8 - >----< -3| ddd = undefined; - -[#4 Leading delimiter] = 3:0-3:4 - >----< -3| ddd = undefined; - -[#4 Trailing delimiter] = 3:7-3:8 - >-< -3| ddd = undefined; - -[#4 Domain] = 3:4-3:20 - >----------------< -3| ddd = undefined; - -[#4 Insertion delimiter] = " " - - -[#5 Content] = -[#5 Removal] = 4:12-4:15 - >---< -4| private eee!: string = undefined; - -[#5 Leading delimiter] = 4:11-4:12 - >-< -4| private eee!: string = undefined; - -[#5 Domain] = 4:4-4:37 - >---------------------------------< -4| private eee!: string = undefined; - -[#5 Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.alias.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.alias.scope deleted file mode 100644 index 8fe8c37785b..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.alias.scope +++ /dev/null @@ -1,10 +0,0 @@ -type Aaa = Bbb; ---- - -[Content] = -[Removal] = -[Domain] = 0:0-0:15 - >---------------< -0| type Aaa = Bbb; - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.alias2.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.alias2.scope deleted file mode 100644 index 9dbeaf95ede..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.alias2.scope +++ /dev/null @@ -1,10 +0,0 @@ -export type Aaa = Bbb; ---- - -[Content] = -[Removal] = -[Domain] = 0:0-0:22 - >----------------------< -0| export type Aaa = Bbb; - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.field.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.field.scope deleted file mode 100644 index e2ec66651e1..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.field.scope +++ /dev/null @@ -1,102 +0,0 @@ -class Aaa { - bbb!: string = undefined; - ccc: string = undefined; - private eee!: string = undefined; - eee: string; - fff!: string; -} ---- - -[#1 Content] = 1:10-1:16 - >------< -1| bbb!: string = undefined; - -[#1 Removal] = 1:7-1:16 - >---------< -1| bbb!: string = undefined; - -[#1 Leading delimiter] = 1:7-1:10 - >---< -1| bbb!: string = undefined; - -[#1 Domain] = 1:4-1:29 - >-------------------------< -1| bbb!: string = undefined; - -[#1 Insertion delimiter] = " " - - -[#2 Content] = 2:9-2:15 - >------< -2| ccc: string = undefined; - -[#2 Removal] = 2:7-2:15 - >--------< -2| ccc: string = undefined; - -[#2 Leading delimiter] = 2:7-2:9 - >--< -2| ccc: string = undefined; - -[#2 Domain] = 2:4-2:28 - >------------------------< -2| ccc: string = undefined; - -[#2 Insertion delimiter] = " " - - -[#3 Content] = 3:18-3:24 - >------< -3| private eee!: string = undefined; - -[#3 Removal] = 3:15-3:24 - >---------< -3| private eee!: string = undefined; - -[#3 Leading delimiter] = 3:15-3:18 - >---< -3| private eee!: string = undefined; - -[#3 Domain] = 3:4-3:37 - >---------------------------------< -3| private eee!: string = undefined; - -[#3 Insertion delimiter] = " " - - -[#4 Content] = 4:9-4:15 - >------< -4| eee: string; - -[#4 Removal] = 4:7-4:15 - >--------< -4| eee: string; - -[#4 Leading delimiter] = 4:7-4:9 - >--< -4| eee: string; - -[#4 Domain] = 4:4-4:16 - >------------< -4| eee: string; - -[#4 Insertion delimiter] = " " - - -[#5 Content] = 5:10-5:16 - >------< -5| fff!: string; - -[#5 Removal] = 5:7-5:16 - >---------< -5| fff!: string; - -[#5 Leading delimiter] = 5:7-5:10 - >---< -5| fff!: string; - -[#5 Domain] = 5:4-5:17 - >-------------< -5| fff!: string; - -[#5 Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.formalParameter.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.formalParameter.scope deleted file mode 100644 index b315a23c1b6..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.formalParameter.scope +++ /dev/null @@ -1,22 +0,0 @@ -function myFunk(value: number) { - -} ---- - -[Content] = 0:23-0:29 - >------< -0| function myFunk(value: number) { - -[Removal] = 0:21-0:29 - >--------< -0| function myFunk(value: number) { - -[Leading delimiter] = 0:21-0:23 - >--< -0| function myFunk(value: number) { - -[Domain] = 0:16-0:29 - >-------------< -0| function myFunk(value: number) { - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.interface.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.interface.scope deleted file mode 100644 index 53c582acfa1..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.interface.scope +++ /dev/null @@ -1,15 +0,0 @@ -interface MyType { - -} ---- - -[Content] = -[Removal] = -[Domain] = 0:0-2:1 - >------------------ -0| interface MyType { -1| -2| } - -< - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.return.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.return.scope deleted file mode 100644 index 3070660e156..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.return.scope +++ /dev/null @@ -1,25 +0,0 @@ -function myFunk(): number { - return 0; -} ---- - -[Content] = 0:19-0:25 - >------< -0| function myFunk(): number { - -[Removal] = 0:17-0:25 - >--------< -0| function myFunk(): number { - -[Leading delimiter] = 0:17-0:19 - >--< -0| function myFunk(): number { - -[Domain] = 0:0-2:1 - >--------------------------- -0| function myFunk(): number { -1| return 0; -2| } - -< - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.variable.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.variable.scope deleted file mode 100644 index 92b70889923..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/type.variable.scope +++ /dev/null @@ -1,24 +0,0 @@ -const value: number = 0; ---- - -[Content] = 0:13-0:19 - >------< -0| const value: number = 0; - -[Removal] = 0:11-0:19 - >--------< -0| const value: number = 0; - -[Leading delimiter] = 0:12-0:13 - >-< -0| const value: number = 0; - -[Trailing delimiter] = 0:19-0:20 - >-< -0| const value: number = 0; - -[Domain] = 0:0-0:24 - >------------------------< -0| const value: number = 0; - -[Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/value.field.scope b/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/value.field.scope deleted file mode 100644 index 85c26dd9466..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/fixtures/scopes/typescript/value.field.scope +++ /dev/null @@ -1,82 +0,0 @@ -class Aaa { - bbb!: string = undefined; - ccc: string = undefined; - ddd = undefined; - private eee!: string = undefined; -} ---- - -[#1 Content] = 1:19-1:28 - >---------< -1| bbb!: string = undefined; - -[#1 Removal] = 1:16-1:28 - >------------< -1| bbb!: string = undefined; - -[#1 Leading delimiter] = 1:16-1:19 - >---< -1| bbb!: string = undefined; - -[#1 Domain] = 1:4-1:29 - >-------------------------< -1| bbb!: string = undefined; - -[#1 Insertion delimiter] = " " - - -[#2 Content] = 2:18-2:27 - >---------< -2| ccc: string = undefined; - -[#2 Removal] = 2:15-2:27 - >------------< -2| ccc: string = undefined; - -[#2 Leading delimiter] = 2:15-2:18 - >---< -2| ccc: string = undefined; - -[#2 Domain] = 2:4-2:28 - >------------------------< -2| ccc: string = undefined; - -[#2 Insertion delimiter] = " " - - -[#3 Content] = 3:10-3:19 - >---------< -3| ddd = undefined; - -[#3 Removal] = 3:7-3:19 - >------------< -3| ddd = undefined; - -[#3 Leading delimiter] = 3:7-3:10 - >---< -3| ddd = undefined; - -[#3 Domain] = 3:4-3:20 - >----------------< -3| ddd = undefined; - -[#3 Insertion delimiter] = " " - - -[#4 Content] = 4:27-4:36 - >---------< -4| private eee!: string = undefined; - -[#4 Removal] = 4:24-4:36 - >------------< -4| private eee!: string = undefined; - -[#4 Leading delimiter] = 4:24-4:27 - >---< -4| private eee!: string = undefined; - -[#4 Domain] = 4:4-4:37 - >---------------------------------< -4| private eee!: string = undefined; - -[#4 Insertion delimiter] = " " diff --git a/packages/cursorless-vscode-e2e/src/suite/followLink.vscode.test.ts b/packages/cursorless-vscode-e2e/src/suite/followLink.vscode.test.ts index 52a80e60d03..a66add112b2 100644 --- a/packages/cursorless-vscode-e2e/src/suite/followLink.vscode.test.ts +++ b/packages/cursorless-vscode-e2e/src/suite/followLink.vscode.test.ts @@ -23,8 +23,7 @@ async function followDefinition() { }); editor.selections = [new vscode.Selection(1, 12, 1, 15)]; - // FIXME: Disabled to work around CI failure; see #2243 - // assert.equal(editor.visibleRanges[0].start.line, 1); + assert.equal(editor.visibleRanges[0].start.line, 1); await runCursorlessCommand({ version: 1, @@ -39,8 +38,7 @@ async function followDefinition() { ], }); - // FIXME: Disabled to work around CI failure; see #2243 - // assert.equal(editor.visibleRanges[0].start.line, 0); + assert.equal(editor.visibleRanges[0].start.line, 0); } async function followLink() { diff --git a/packages/cursorless-vscode-e2e/src/suite/instanceAcrossSplit.vscode.test.ts b/packages/cursorless-vscode-e2e/src/suite/instanceAcrossSplit.vscode.test.ts deleted file mode 100644 index 54b0be801d6..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/instanceAcrossSplit.vscode.test.ts +++ /dev/null @@ -1,165 +0,0 @@ -import { - HatStability, - Modifier, - Range, - SpyIDE, - asyncSafety, -} from "@cursorless/common"; -import { - getCursorlessApi, - openNewEditor, - runCursorlessCommand, -} from "@cursorless/vscode-common"; -import * as assert from "assert"; -import { Selection } from "vscode"; -import { endToEndTestSetup } from "../endToEndTestSetup"; -import { setupFake } from "./setupFake"; - -// Ensure that the "from" / "instance" work properly when "from" -// is run in a different editor from "instance" -suite("Instance across split", async function () { - const { getSpy } = endToEndTestSetup(this); - - suiteSetup(async () => { - const { ide } = (await getCursorlessApi()).testHelpers!; - setupFake(ide, HatStability.stable); - }); - - test( - "Every instance", - asyncSafety(() => - runTest( - getSpy()!, - { - type: "everyScope", - scopeType: { type: "instance" }, - }, - true, - " bbb ", - ), - ), - ); - test( - "Next instance", - asyncSafety(() => - runTest( - getSpy()!, - { - type: "relativeScope", - scopeType: { type: "instance" }, - direction: "forward", - length: 1, - offset: 1, - }, - false, - " bbb aaa aaa", - ), - ), - ); - test( - "Two instances", - asyncSafety(() => - runTest( - getSpy()!, - { - type: "relativeScope", - scopeType: { type: "instance" }, - direction: "forward", - length: 2, - offset: 0, - }, - false, - " bbb aaa", - ), - ), - ); - test( - "Second instance", - asyncSafety(() => - runTest( - getSpy()!, - { - type: "ordinalScope", - scopeType: { type: "instance" }, - length: 1, - start: 1, - }, - true, - " aaa bbb aaa", - ), - ), - ); -}); - -async function runTest( - spyIde: SpyIDE, - modifier: Modifier, - useWholeFile: boolean, - expectedContents: string, -) { - const { hatTokenMap } = (await getCursorlessApi()).testHelpers!; - - const { document: instanceDocument } = await openNewEditor("aaa"); - /** The editor containing the "instance" */ - const instanceEditor = spyIde.activeTextEditor!; - /** The editor in which "from" is run */ - const fromEditor = await openNewEditor(" aaa bbb aaa aaa", { - openBeside: true, - }); - const { document: fromDocument } = fromEditor; - fromEditor.selections = [new Selection(0, 0, 0, 0)]; - - await hatTokenMap.allocateHats([ - { - grapheme: "a", - hatStyle: "default", - hatRange: new Range(0, 0, 0, 1), - token: { - editor: instanceEditor, - offsets: { start: 0, end: 3 }, - range: new Range(0, 0, 0, 3), - text: "aaa", - }, - }, - ]); - - // "from this" / "from file this", depending on the value of `useWholeFile` - await runCursorlessCommand({ - version: 6, - action: { - name: "experimental.setInstanceReference", - target: { - type: "primitive", - mark: { - type: "cursor", - }, - modifiers: useWholeFile - ? [{ type: "containingScope", scopeType: { type: "document" } }] - : [], - }, - }, - usePrePhraseSnapshot: false, - }); - - // "change air", where is some kind of "instance" - // modifier - await runCursorlessCommand({ - version: 6, - action: { - name: "clearAndSetSelection", - target: { - type: "primitive", - mark: { - type: "decoratedSymbol", - symbolColor: "default", - character: "a", - }, - modifiers: [modifier], - }, - }, - usePrePhraseSnapshot: false, - }); - - assert.deepStrictEqual(instanceDocument.getText(), "aaa"); - assert.deepStrictEqual(fromDocument.getText(), expectedContents); -} diff --git a/packages/cursorless-vscode-e2e/src/suite/intraCellSetSelection.vscode.test.ts b/packages/cursorless-vscode-e2e/src/suite/intraCellSetSelection.vscode.test.ts index c14ccc717c9..a2fa980a34b 100644 --- a/packages/cursorless-vscode-e2e/src/suite/intraCellSetSelection.vscode.test.ts +++ b/packages/cursorless-vscode-e2e/src/suite/intraCellSetSelection.vscode.test.ts @@ -2,13 +2,16 @@ import { getCursorlessApi, openNewNotebookEditor, } from "@cursorless/vscode-common"; -import assert from "assert"; +import * as assert from "assert"; import { window } from "vscode"; import { endToEndTestSetup, sleepWithBackoff } from "../endToEndTestSetup"; import { runCursorlessCommand } from "@cursorless/vscode-common"; +import { skipIfWindowsCi } from "./skipIfWindowsCi"; // Check that setSelection is able to focus the correct cell suite("Within cell set selection", async function () { + // Skipped for now; see #1260 + skipIfWindowsCi(); endToEndTestSetup(this); test("Within cell set selection", runTest); diff --git a/packages/cursorless-vscode-e2e/src/suite/keyboard/basic.vscode.test.ts b/packages/cursorless-vscode-e2e/src/suite/keyboard/basic.vscode.test.ts index c2163160197..4409c2b6188 100644 --- a/packages/cursorless-vscode-e2e/src/suite/keyboard/basic.vscode.test.ts +++ b/packages/cursorless-vscode-e2e/src/suite/keyboard/basic.vscode.test.ts @@ -2,100 +2,16 @@ import { getCursorlessApi, openNewEditor } from "@cursorless/vscode-common"; import { assert } from "chai"; import * as vscode from "vscode"; import { endToEndTestSetup, sleepWithBackoff } from "../../endToEndTestSetup"; -import sinon from "sinon"; -import path from "path"; -import { getCursorlessRepoRoot } from "@cursorless/common"; -import { readFile } from "node:fs/promises"; - -interface TestCase { - name: string; - initialContent: string; - /** - * The sequence of keypresses that will be sent. The list of strings will simply - * be concatenated before sending. We could just represent this as a single string - * but it is more readable if each "token" is a separate string. - */ - keySequence: string[]; - finalContent: string; -} - -const testCases: TestCase[] = [ - { - name: "and", - initialContent: "x T y\n", - // change plex and yank - keySequence: ["dx", "fa", "dy", "c"], - finalContent: " T \n", - }, - { - name: "every", - initialContent: "a a\nb b\n", - // change every token air - keySequence: ["da", "*", "st", "c"], - finalContent: " \nb b\n", - }, - { - name: "three", - initialContent: "a b c d e\n", - // change three tokens bat - keySequence: ["db", "3", "st", "c"], - finalContent: "a e\n", - }, - { - name: "three backwards", - initialContent: "a b c d e\n", - // change three tokens backwards drum - keySequence: ["dd", "-3", "st", "c"], - finalContent: "a e\n", - }, - { - name: "pair parens", - initialContent: "a + (b + c) + d", - // change parens bat - keySequence: ["db", "wp", "c"], - finalContent: "a + + d", - }, - { - name: "pair string", - initialContent: 'a + "w" + b', - // change parens bat - keySequence: ["dw", "wj", "c"], - finalContent: "a + + b", - }, - { - name: "wrap", - initialContent: "a", - // round wrap air - keySequence: ["da", "aw", "wp"], - finalContent: "(a)", - }, - { - name: "preserve keyboard target", - initialContent: "a\n", - // round wrap air; round wrap - keySequence: ["da", "aw", "wp", "aw", "wp"], - finalContent: "((a))\n", - }, -]; suite("Basic keyboard test", async function () { endToEndTestSetup(this); - this.beforeEach(async () => { - await injectFakes(); - }); - this.afterEach(async () => { await vscode.commands.executeCommand("cursorless.keyboard.modal.modeOff"); }); test("Don't take keyboard control on startup", () => checkKeyboardStartup()); test("Basic keyboard test", () => basic()); - test("No automatic token expansion", () => noAutomaticTokenExpansion()); - test("Run vscode command", () => vscodeCommand()); - for (const t of testCases) { - test("Sequence " + t.name, () => sequence(t)); - } test("Check that entering and leaving mode is no-op", () => enterAndLeaveIsNoOp()); }); @@ -129,7 +45,7 @@ async function basic() { await typeText("sf"); // Select target - await typeText("at"); + await typeText("t"); assert.isTrue(editor.selection.isEqual(new vscode.Selection(0, 0, 0, 17))); @@ -140,69 +56,6 @@ async function basic() { assert.equal(editor.document.getText().trim(), "a"); } -async function noAutomaticTokenExpansion() { - const { hatTokenMap } = (await getCursorlessApi()).testHelpers!; - - const editor = await openNewEditor("aaa"); - await hatTokenMap.allocateHats(); - - editor.selection = new vscode.Selection(0, 3, 0, 3); - - await vscode.commands.executeCommand("cursorless.keyboard.modal.modeOn"); - - // "pour" - await typeText("ao"); - - assert.isTrue(editor.selection.isEqual(new vscode.Selection(1, 0, 1, 0))); -} - -/** - * sequence runs a test keyboard sequences. - */ -async function sequence(t: TestCase) { - const { hatTokenMap } = (await getCursorlessApi()).testHelpers!; - - const editor = await openNewEditor(t.initialContent, { - languageId: "typescript", - }); - await hatTokenMap.allocateHats(); - editor.selection = new vscode.Selection(1, 0, 1, 0); - await vscode.commands.executeCommand("cursorless.keyboard.modal.modeOn"); - await typeText(t.keySequence.join("")); - assert.equal(editor.document.getText(), t.finalContent); -} - -async function vscodeCommand() { - const { hatTokenMap } = (await getCursorlessApi()).testHelpers!; - - const editor = await openNewEditor("aaa;\nbbb;\nccc;\n", { - languageId: "typescript", - }); - await hatTokenMap.allocateHats(); - - editor.selection = new vscode.Selection(0, 0, 0, 0); - - await vscode.commands.executeCommand("cursorless.keyboard.modal.modeOn"); - - // Target default b - await typeText("db"); - - // Comment line containing *selection* - await typeText("va"); - assert.equal(editor.document.getText(), "// aaa;\nbbb;\nccc;\n"); - - // Comment line containing *target* - await typeText("vb"); - assert.equal(editor.document.getText(), "// aaa;\n// bbb;\nccc;\n"); - - // Comment line containing *target*, keeping changed selection and exiting - // cursorless mode - await typeText("dcvca"); - assert.equal(editor.document.getText(), "// aaa;\n// bbb;\n// a;\n"); - - await vscode.commands.executeCommand("cursorless.keyboard.modal.modeOff"); -} - async function enterAndLeaveIsNoOp() { const editor = await openNewEditor("hello"); @@ -226,38 +79,3 @@ async function typeText(text: string) { await sleepWithBackoff(100); } } - -async function injectFakes(): Promise { - const { vscodeApi } = (await getCursorlessApi()).testHelpers!; - - const keyboardConfigPath = path.join( - getCursorlessRepoRoot(), - "packages/cursorless-vscode/src/keyboard/keyboard-config.fixture.json", - ); - - const keyboardConfig = JSON.parse(await readFile(keyboardConfigPath, "utf8")); - - const getConfigurationValue = sinon.fake((sectionName) => { - return keyboardConfig[ - `cursorless.experimental.keyboard.modal.keybindings.${sectionName}` - ]; - }); - - sinon.replace( - vscodeApi.workspace, - "getConfiguration", - sinon.fake((section) => { - if ( - !section?.startsWith( - "cursorless.experimental.keyboard.modal.keybindings", - ) - ) { - return vscode.workspace.getConfiguration(section); - } - - return { - get: getConfigurationValue, - } as unknown as vscode.WorkspaceConfiguration; - }), - ); -} diff --git a/packages/cursorless-vscode-e2e/src/suite/recorded.vscode.test.ts b/packages/cursorless-vscode-e2e/src/suite/recorded.vscode.test.ts index 83bae63d402..db2f0658e34 100644 --- a/packages/cursorless-vscode-e2e/src/suite/recorded.vscode.test.ts +++ b/packages/cursorless-vscode-e2e/src/suite/recorded.vscode.test.ts @@ -18,7 +18,6 @@ import { splitKey, SpyIDE, spyIDERecordedValuesToPlainObject, - storedTargetKeys, TestCaseFixtureLegacy, TextEditor, TokenHat, @@ -69,7 +68,7 @@ async function runTest(file: string, spyIde: SpyIDE) { const fixture = yaml.load(buffer.toString()) as TestCaseFixtureLegacy; const excludeFields: ExcludableSnapshotField[] = []; - // FIXME The snapshot gets messed up with timing issues when running the recorded tests + // TODO The snapshot gets messed up with timing issues when running the recorded tests // "Couldn't find token default.a" const usePrePhraseSnapshot = false; @@ -90,9 +89,20 @@ async function runTest(file: string, spyIde: SpyIDE) { editor.selections = fixture.initialState.selections.map(createSelection); - for (const storedTargetKey of storedTargetKeys) { - const key = `${storedTargetKey}Mark` as const; - setStoredTarget(editor, storedTargetKey, fixture.initialState[key]); + if (fixture.initialState.thatMark) { + setStoredTarget(editor, "that", fixture.initialState.thatMark); + } + + if (fixture.initialState.sourceMark) { + setStoredTarget(editor, "source", fixture.initialState.sourceMark); + } + + if (fixture.initialState.instanceReferenceMark) { + setStoredTarget( + editor, + "instanceReference", + fixture.initialState.instanceReferenceMark, + ); } if (fixture.initialState.clipboard) { @@ -149,7 +159,7 @@ async function runTest(file: string, spyIde: SpyIDE) { ? undefined : marksToPlainObject( extractTargetedMarks( - Object.keys(fixture.finalState.marks), + Object.keys(fixture.finalState.marks) as string[], readableHatMap, ), ); @@ -158,14 +168,19 @@ async function runTest(file: string, spyIde: SpyIDE) { excludeFields.push("clipboard"); } - for (const storedTargetKey of storedTargetKeys) { - const key = `${storedTargetKey}Mark` as const; - if (fixture.finalState?.[key] == null) { - excludeFields.push(key); - } + if (fixture.finalState?.thatMark == null) { + excludeFields.push("thatMark"); + } + + if (fixture.finalState?.sourceMark == null) { + excludeFields.push("sourceMark"); + } + + if (fixture.finalState?.instanceReferenceMark == null) { + excludeFields.push("instanceReferenceMark"); } - // FIXME Visible ranges are not asserted, see: + // TODO Visible ranges are not asserted, see: // https://github.com/cursorless-dev/cursorless/issues/160 const { visibleRanges, ...resultState } = await takeSnapshot( excludeFields, diff --git a/packages/cursorless-vscode-e2e/src/suite/scopeProvider/assertCalledWithScopeInfo.ts b/packages/cursorless-vscode-e2e/src/suite/scopeProvider/assertCalledWithScopeInfo.ts deleted file mode 100644 index 06972988806..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/scopeProvider/assertCalledWithScopeInfo.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { ScopeType, ScopeTypeInfo } from "@cursorless/common"; -import * as sinon from "sinon"; -import { assert } from "chai"; -import { sleepWithBackoff } from "../../endToEndTestSetup"; -import { isEqual } from "lodash"; - -export async function assertCalledWithScopeInfo( - fake: sinon.SinonSpy<[scopeInfos: T[]], void>, - ...expectedScopeInfos: T[] -) { - await sleepWithBackoff(25); - sinon.assert.called(fake); - - for (const expectedScopeInfo of expectedScopeInfos) { - const actualScopeInfo = fake.lastCall.args[0].find((scopeInfo) => - isEqual(scopeInfo.scopeType, expectedScopeInfo.scopeType), - ); - assert.isDefined(actualScopeInfo); - assert.deepEqual(actualScopeInfo, expectedScopeInfo); - } - - fake.resetHistory(); -} - -export async function assertCalledWithoutScopeInfo( - fake: sinon.SinonSpy<[scopeInfos: T[]], void>, - ...scopeTypes: ScopeType[] -) { - await sleepWithBackoff(25); - sinon.assert.called(fake); - - for (const scopeType of scopeTypes) { - assert.isUndefined( - fake.lastCall.args[0].find((scopeInfo) => - isEqual(scopeInfo.scopeType, scopeType), - ), - ); - } - - fake.resetHistory(); -} diff --git a/packages/cursorless-vscode-e2e/src/suite/scopeProvider/runBasicScopeInfoTest.ts b/packages/cursorless-vscode-e2e/src/suite/scopeProvider/runBasicScopeInfoTest.ts deleted file mode 100644 index d26dc3ef792..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/scopeProvider/runBasicScopeInfoTest.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { ScopeSupport, ScopeSupportInfo } from "@cursorless/common"; -import { getCursorlessApi, openNewEditor } from "@cursorless/vscode-common"; -import * as sinon from "sinon"; -import { Position, Range, TextDocument, commands } from "vscode"; -import { assertCalledWithScopeInfo } from "./assertCalledWithScopeInfo"; - -/** - * Tests that the scope provider correctly reports the scope support for a - * simple named function. - */ -export async function runBasicScopeInfoTest() { - const { scopeProvider } = (await getCursorlessApi()).testHelpers!; - const fake = sinon.fake<[scopeInfos: ScopeSupportInfo[]], void>(); - - await commands.executeCommand("workbench.action.closeAllEditors"); - - const disposable = scopeProvider.onDidChangeScopeSupport(fake); - - try { - await assertCalledWithScopeInfo(fake, unsupported); - - const editor = await openNewEditor("", { - languageId: "typescript", - }); - await assertCalledWithScopeInfo(fake, supported); - - await editor.edit((editBuilder) => { - editBuilder.insert(new Position(0, 0), contents); - }); - await assertCalledWithScopeInfo(fake, present); - - await editor.edit((editBuilder) => { - editBuilder.delete(getDocumentRange(editor.document)); - }); - await assertCalledWithScopeInfo(fake, supported); - - await commands.executeCommand("workbench.action.closeAllEditors"); - await assertCalledWithScopeInfo(fake, unsupported); - } finally { - disposable.dispose(); - } -} - -function getDocumentRange(textDocument: TextDocument) { - const { end } = textDocument.lineAt(textDocument.lineCount - 1).range; - return new Range(0, 0, end.line, end.character); -} - -const contents = ` -function helloWorld() { - -} -`; - -function getExpectedScope(scopeSupport: ScopeSupport): ScopeSupportInfo { - return { - humanReadableName: "named function", - isLanguageSpecific: true, - iterationScopeSupport: scopeSupport, - scopeType: { - type: "namedFunction", - }, - spokenForm: { - spokenForms: ["funk"], - type: "success", - }, - support: scopeSupport, - }; -} - -const unsupported = getExpectedScope(ScopeSupport.unsupported); -const supported = getExpectedScope(ScopeSupport.supportedButNotPresentInEditor); -const present = getExpectedScope(ScopeSupport.supportedAndPresentInEditor); diff --git a/packages/cursorless-vscode-e2e/src/suite/scopeProvider/runCustomRegexScopeInfoTest.ts b/packages/cursorless-vscode-e2e/src/suite/scopeProvider/runCustomRegexScopeInfoTest.ts deleted file mode 100644 index 55b598b9c9e..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/scopeProvider/runCustomRegexScopeInfoTest.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { - ScopeSupport, - ScopeSupportInfo, - ScopeType, - sleep, -} from "@cursorless/common"; -import { getCursorlessApi, openNewEditor } from "@cursorless/vscode-common"; -import { stat, unlink, writeFile } from "fs/promises"; -import * as sinon from "sinon"; -import { commands } from "vscode"; -import { sleepWithBackoff } from "../../endToEndTestSetup"; -import { - assertCalledWithScopeInfo, - assertCalledWithoutScopeInfo, -} from "./assertCalledWithScopeInfo"; - -/** - * Tests that the scope provider correctly reports custom spoken forms for - * custom regex scopes. - */ -export async function runCustomRegexScopeInfoTest() { - const { scopeProvider, cursorlessTalonStateJsonPath } = ( - await getCursorlessApi() - ).testHelpers!; - const fake = sinon.fake<[scopeInfos: ScopeSupportInfo[]], void>(); - - await commands.executeCommand("workbench.action.closeAllEditors"); - - const disposable = scopeProvider.onDidChangeScopeSupport(fake); - - try { - await assertCalledWithoutScopeInfo(fake, scopeType); - - await writeFile( - cursorlessTalonStateJsonPath, - JSON.stringify(spokenFormJsonContents), - ); - await sleepWithBackoff(50); - await assertCalledWithScopeInfo(fake, unsupported); - - await openNewEditor(contents); - await assertCalledWithScopeInfo(fake, present); - - await unlink(cursorlessTalonStateJsonPath); - await sleepWithBackoff(100); - await assertCalledWithoutScopeInfo(fake, scopeType); - } finally { - disposable.dispose(); - - // Delete cursorlessTalonStateJsonPath if it exists - try { - await stat(cursorlessTalonStateJsonPath); - await unlink(cursorlessTalonStateJsonPath); - // Sleep to ensure that the scope support provider has time to update - // before the next test starts - await sleep(250); - } catch (e) { - // Do nothing - } - } -} - -const contents = ` -hello world -`; - -const regex = "[a-zA-Z]+"; - -const spokenFormJsonContents = { - version: 0, - spokenForms: [ - { - type: "customRegex", - id: regex, - spokenForms: ["spaghetti"], - }, - ], -}; - -const scopeType: ScopeType = { - type: "customRegex", - regex, -}; - -function getExpectedScope(scopeSupport: ScopeSupport): ScopeSupportInfo { - return { - humanReadableName: "Regex `[a-zA-Z]+`", - isLanguageSpecific: false, - iterationScopeSupport: - scopeSupport === ScopeSupport.unsupported - ? ScopeSupport.unsupported - : ScopeSupport.supportedAndPresentInEditor, - scopeType, - spokenForm: { - spokenForms: ["spaghetti"], - type: "success", - }, - support: scopeSupport, - }; -} - -const unsupported = getExpectedScope(ScopeSupport.unsupported); -const present = getExpectedScope(ScopeSupport.supportedAndPresentInEditor); diff --git a/packages/cursorless-vscode-e2e/src/suite/scopeProvider/runCustomSpokenFormScopeInfoTest.ts b/packages/cursorless-vscode-e2e/src/suite/scopeProvider/runCustomSpokenFormScopeInfoTest.ts deleted file mode 100644 index 0a0195ccff7..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/scopeProvider/runCustomSpokenFormScopeInfoTest.ts +++ /dev/null @@ -1,228 +0,0 @@ -import { getCursorlessApi } from "@cursorless/vscode-common"; -import { ScopeTypeInfo, sleep } from "@cursorless/common"; -import * as sinon from "sinon"; -import { assertCalledWithScopeInfo } from "./assertCalledWithScopeInfo"; -import { stat, unlink, writeFile } from "fs/promises"; -import { sleepWithBackoff } from "../../endToEndTestSetup"; - -/** - * Tests that the scope provider correctly reports custom spoken forms - */ -export async function runCustomSpokenFormScopeInfoTest() { - const { scopeProvider, cursorlessTalonStateJsonPath } = ( - await getCursorlessApi() - ).testHelpers!; - const fake = sinon.fake<[scopeInfos: ScopeTypeInfo[]], void>(); - - const disposable = scopeProvider.onDidChangeScopeInfo(fake); - - try { - await assertCalledWithScopeInfo( - fake, - roundStandard, - namedFunctionStandard, - lambdaStandard, - statementStandard, - squareStandard, - subjectStandard, - ); - - await writeFile( - cursorlessTalonStateJsonPath, - JSON.stringify(spokenFormJsonContents), - ); - await sleepWithBackoff(50); - await assertCalledWithScopeInfo( - fake, - subjectCustom, - roundCustom, - namedFunctionCustom, - lambdaCustom, - statementMissing, - squareMissing, - ); - - await unlink(cursorlessTalonStateJsonPath); - await sleepWithBackoff(100); - await assertCalledWithScopeInfo( - fake, - roundStandard, - namedFunctionStandard, - lambdaStandard, - statementStandard, - squareStandard, - subjectStandard, - ); - } finally { - disposable.dispose(); - - // Delete cursorlessTalonStateJsonPath if it exists - try { - await stat(cursorlessTalonStateJsonPath); - await unlink(cursorlessTalonStateJsonPath); - // Sleep to ensure that the scope support provider has time to update - // before the next test starts - await sleep(250); - } catch (e) { - // Do nothing - } - } -} - -const spokenFormJsonContents = { - version: 0, - spokenForms: [ - { - type: "pairedDelimiter", - id: "parentheses", - spokenForms: ["custom round", "alternate custom round"], - }, - { - type: "simpleScopeTypeType", - id: "private.switchStatementSubject", - spokenForms: ["custom subject"], - }, - { - type: "simpleScopeTypeType", - id: "namedFunction", - spokenForms: ["custom funk"], - }, - { - type: "simpleScopeTypeType", - id: "anonymousFunction", - spokenForms: [], - }, - ], -}; - -const subjectStandard: ScopeTypeInfo = { - humanReadableName: "private switch statement subject", - isLanguageSpecific: true, - scopeType: { type: "private.switchStatementSubject" }, - spokenForm: { - isPrivate: true, - reason: - "simple scope type type with id private.switchStatementSubject; this is a private spoken form currently only for internal experimentation", - requiresTalonUpdate: false, - type: "error", - }, -}; - -const subjectCustom: ScopeTypeInfo = { - humanReadableName: "private switch statement subject", - isLanguageSpecific: true, - scopeType: { type: "private.switchStatementSubject" }, - spokenForm: { - spokenForms: ["custom subject"], - type: "success", - }, -}; - -const roundStandard: ScopeTypeInfo = { - humanReadableName: "Matching pair of parentheses", - isLanguageSpecific: false, - scopeType: { type: "surroundingPair", delimiter: "parentheses" }, - spokenForm: { - spokenForms: ["round"], - type: "success", - }, -}; - -const roundCustom: ScopeTypeInfo = { - humanReadableName: "Matching pair of parentheses", - isLanguageSpecific: false, - scopeType: { type: "surroundingPair", delimiter: "parentheses" }, - spokenForm: { - spokenForms: ["custom round", "alternate custom round"], - type: "success", - }, -}; - -const squareStandard: ScopeTypeInfo = { - humanReadableName: "Matching pair of square brackets", - isLanguageSpecific: false, - scopeType: { type: "surroundingPair", delimiter: "squareBrackets" }, - spokenForm: { - spokenForms: ["box"], - type: "success", - }, -}; - -const squareMissing: ScopeTypeInfo = { - humanReadableName: "Matching pair of square brackets", - isLanguageSpecific: false, - scopeType: { type: "surroundingPair", delimiter: "squareBrackets" }, - spokenForm: { - isPrivate: false, - reason: - "paired delimiter with id squareBrackets; please update talon to the latest version (see https://www.cursorless.org/docs/user/updating/)", - requiresTalonUpdate: true, - type: "error", - }, -}; - -const namedFunctionStandard: ScopeTypeInfo = { - humanReadableName: "named function", - isLanguageSpecific: true, - scopeType: { type: "namedFunction" }, - spokenForm: { - spokenForms: ["funk"], - type: "success", - }, -}; - -const namedFunctionCustom: ScopeTypeInfo = { - humanReadableName: "named function", - isLanguageSpecific: true, - scopeType: { type: "namedFunction" }, - spokenForm: { - spokenForms: ["custom funk"], - type: "success", - }, -}; - -const lambdaStandard: ScopeTypeInfo = { - humanReadableName: "anonymous function", - isLanguageSpecific: true, - scopeType: { type: "anonymousFunction" }, - spokenForm: { - spokenForms: ["lambda"], - type: "success", - }, -}; - -const lambdaCustom: ScopeTypeInfo = { - humanReadableName: "anonymous function", - isLanguageSpecific: true, - scopeType: { type: "anonymousFunction" }, - spokenForm: { - isPrivate: false, - reason: - "simple scope type type with id anonymousFunction; please see https://www.cursorless.org/docs/user/customization/ for more information", - requiresTalonUpdate: false, - type: "error", - }, -}; - -const statementStandard: ScopeTypeInfo = { - humanReadableName: "statement", - isLanguageSpecific: true, - scopeType: { type: "statement" }, - spokenForm: { - spokenForms: ["state"], - type: "success", - }, -}; - -const statementMissing: ScopeTypeInfo = { - humanReadableName: "statement", - isLanguageSpecific: true, - scopeType: { type: "statement" }, - spokenForm: { - isPrivate: false, - reason: - "simple scope type type with id statement; please update talon to the latest version (see https://www.cursorless.org/docs/user/updating/)", - requiresTalonUpdate: true, - type: "error", - }, -}; diff --git a/packages/cursorless-vscode-e2e/src/suite/scopeProvider/runSurroundingPairScopeInfoTest.ts b/packages/cursorless-vscode-e2e/src/suite/scopeProvider/runSurroundingPairScopeInfoTest.ts deleted file mode 100644 index 07024fe6055..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/scopeProvider/runSurroundingPairScopeInfoTest.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { ScopeSupport, ScopeSupportInfo } from "@cursorless/common"; -import { getCursorlessApi, openNewEditor } from "@cursorless/vscode-common"; -import * as sinon from "sinon"; -import { commands } from "vscode"; -import { assertCalledWithScopeInfo } from "./assertCalledWithScopeInfo"; - -/** - * Tests that the scope provider correctly reports the scope support for a - * simple surrounding pair. - */ -export async function runSurroundingPairScopeInfoTest() { - const { scopeProvider } = (await getCursorlessApi()).testHelpers!; - const fake = sinon.fake<[scopeInfos: ScopeSupportInfo[]], void>(); - - await commands.executeCommand("workbench.action.closeAllEditors"); - - const disposable = scopeProvider.onDidChangeScopeSupport(fake); - - try { - await assertCalledWithScopeInfo(fake, unsupported); - - await openNewEditor(""); - await assertCalledWithScopeInfo(fake, legacy); - - await commands.executeCommand("workbench.action.closeAllEditors"); - await assertCalledWithScopeInfo(fake, unsupported); - } finally { - disposable.dispose(); - } -} - -function getExpectedScope(scopeSupport: ScopeSupport): ScopeSupportInfo { - return { - humanReadableName: "Matching pair of parentheses", - isLanguageSpecific: false, - iterationScopeSupport: - scopeSupport === ScopeSupport.unsupported - ? ScopeSupport.unsupported - : ScopeSupport.supportedLegacy, - scopeType: { type: "surroundingPair", delimiter: "parentheses" }, - spokenForm: { - spokenForms: ["round"], - type: "success", - }, - support: scopeSupport, - }; -} - -const unsupported = getExpectedScope(ScopeSupport.unsupported); -const legacy = getExpectedScope(ScopeSupport.supportedLegacy); diff --git a/packages/cursorless-vscode-e2e/src/suite/scopeProvider/scopeProvider.vscode.test.ts b/packages/cursorless-vscode-e2e/src/suite/scopeProvider/scopeProvider.vscode.test.ts deleted file mode 100644 index dd0a5ed94e0..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/scopeProvider/scopeProvider.vscode.test.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { asyncSafety } from "@cursorless/common"; -import { endToEndTestSetup } from "../../endToEndTestSetup"; -import { runBasicScopeInfoTest } from "./runBasicScopeInfoTest"; -import { runCustomRegexScopeInfoTest } from "./runCustomRegexScopeInfoTest"; -import { runCustomSpokenFormScopeInfoTest } from "./runCustomSpokenFormScopeInfoTest"; -import { runSurroundingPairScopeInfoTest } from "./runSurroundingPairScopeInfoTest"; - -suite("scope provider", async function () { - endToEndTestSetup(this); - - test( - "basic", - asyncSafety(() => runBasicScopeInfoTest()), - ); - test( - "surrounding pair", - asyncSafety(() => runSurroundingPairScopeInfoTest()), - ); - test( - "custom spoken form", - asyncSafety(() => runCustomSpokenFormScopeInfoTest()), - ); - test( - "custom regex", - asyncSafety(() => runCustomRegexScopeInfoTest()), - ); -}); diff --git a/packages/cursorless-vscode-e2e/src/suite/scopes.vscode.test.ts b/packages/cursorless-vscode-e2e/src/suite/scopes.vscode.test.ts deleted file mode 100644 index c53ba5d8379..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/scopes.vscode.test.ts +++ /dev/null @@ -1,163 +0,0 @@ -import { - asyncSafety, - getLanguageScopeSupport, - getScopeTestPaths, - ScopeSupportFacet, - scopeSupportFacetInfos, - ScopeSupportFacetLevel, - ScopeType, - shouldUpdateFixtures, - TextualScopeSupportFacet, - textualScopeSupportFacetInfos, -} from "@cursorless/common"; -import { getCursorlessApi, openNewEditor } from "@cursorless/vscode-common"; -import { assert } from "chai"; -import { groupBy, uniq } from "lodash"; -import { promises as fsp } from "node:fs"; -import { endToEndTestSetup } from "../endToEndTestSetup"; -import { - serializeIterationScopeFixture, - serializeScopeFixture, -} from "./serializeScopeFixture"; - -suite("Scope test cases", async function () { - endToEndTestSetup(this); - - const testPaths = getScopeTestPaths(); - const languages = groupBy(testPaths, (test) => test.languageId); - - if (!shouldUpdateFixtures()) { - Object.entries(languages).forEach(([languageId, testPaths]) => - test( - `${languageId} facet coverage`, - asyncSafety(() => - testLanguageSupport( - languageId, - testPaths.map((test) => test.facet), - ), - ), - ), - ); - } - - testPaths.forEach(({ path, name, languageId, facet }) => - test( - name, - asyncSafety(() => runTest(path, languageId, facet)), - ), - ); -}); - -/** - * Ensures that all supported facets for a language are tested, and that all - * tested facets are listed as supported in {@link getLanguageScopeSupport} - * @param languageId The language to test - * @param testedFacets The facets for {@link languageId} that are tested - */ -async function testLanguageSupport(languageId: string, testedFacets: string[]) { - const supportedFacets = (() => { - if (languageId === "textual") { - return Object.keys(textualScopeSupportFacetInfos); - } - - const scopeSupport = getLanguageScopeSupport(languageId); - - return Object.keys(scopeSupport).filter( - (facet) => - scopeSupport[facet as ScopeSupportFacet] === - ScopeSupportFacetLevel.supported, - ); - })(); - - // Assert that all tested facets are supported by the language - const unsupportedFacets = testedFacets.filter( - (testedFacet) => !supportedFacets.includes(testedFacet), - ); - if (unsupportedFacets.length > 0) { - const values = uniq(unsupportedFacets).join(", "); - assert.fail( - `Facets [${values}] are tested but not listed in getLanguageScopeSupport`, - ); - } - - // Assert that all supported facets are tested - const untestedFacets = supportedFacets.filter( - (supportedFacet) => !testedFacets.includes(supportedFacet), - ); - if (untestedFacets.length > 0) { - const values = untestedFacets.join(", "); - assert.fail(`Missing test for scope support facets [${values}]`); - } -} - -async function runTest(file: string, languageId: string, facetId: string) { - const { ide, scopeProvider } = (await getCursorlessApi()).testHelpers!; - const { scopeType, isIteration } = getScopeType(languageId, facetId); - const fixture = (await fsp.readFile(file, "utf8")) - .toString() - .replaceAll("\r\n", "\n"); - const delimiterIndex = fixture.match(/^---$/m)?.index; - - assert.isNotNull( - delimiterIndex, - "Can't find delimiter '---' in scope fixture", - ); - - const code = fixture.slice(0, delimiterIndex! - 1); - - await openNewEditor(code, { languageId }); - - const editor = ide.activeTextEditor!; - - const outputFixture = ((): string => { - const config = { - visibleOnly: false, - scopeType, - }; - - if (isIteration) { - const iterationScopes = scopeProvider.provideIterationScopeRanges( - editor, - { - ...config, - includeNestedTargets: false, - }, - ); - return serializeIterationScopeFixture(code, iterationScopes); - } - - const scopes = scopeProvider.provideScopeRanges(editor, config); - - return serializeScopeFixture(code, scopes); - })(); - - if (shouldUpdateFixtures()) { - await fsp.writeFile(file, outputFixture); - } else { - assert.equal(outputFixture, fixture); - } -} - -function getScopeType( - languageId: string, - facetId: string, -): { - scopeType: ScopeType; - isIteration: boolean; -} { - if (languageId === "textual") { - const { scopeType, isIteration } = - textualScopeSupportFacetInfos[facetId as TextualScopeSupportFacet]; - return { - scopeType: { type: scopeType }, - isIteration: isIteration ?? false, - }; - } - - const { scopeType, isIteration } = - scopeSupportFacetInfos[facetId as ScopeSupportFacet]; - return { - scopeType: { type: scopeType }, - isIteration: isIteration ?? false, - }; -} diff --git a/packages/cursorless-vscode-e2e/src/suite/scroll.vscode.test.ts b/packages/cursorless-vscode-e2e/src/suite/scroll.vscode.test.ts index da9f1232750..0ae2b8d350f 100644 --- a/packages/cursorless-vscode-e2e/src/suite/scroll.vscode.test.ts +++ b/packages/cursorless-vscode-e2e/src/suite/scroll.vscode.test.ts @@ -1,4 +1,5 @@ import { openNewEditor } from "@cursorless/vscode-common"; +import * as assert from "assert"; import * as vscode from "vscode"; import { endToEndTestSetup } from "../endToEndTestSetup"; import { runCursorlessCommand } from "@cursorless/vscode-common"; @@ -27,9 +28,8 @@ async function topWhale() { ], }); - // FIXME: Disabled to work around CI failure; see #2243 - // assert.equal(editor.visibleRanges.length, 1); - // assert.equal(editor.visibleRanges[0].start.line, 1); + assert.equal(editor.visibleRanges.length, 1); + assert.equal(editor.visibleRanges[0].start.line, 1); } async function bottomWhale() { @@ -40,8 +40,7 @@ async function bottomWhale() { }); editor.selections = [new vscode.Selection(1, 0, 1, 0)]; - // FIXME: Disabled to work around CI failure; see #2243 - // assert.equal(editor.visibleRanges[0].start.line, 1); + assert.equal(editor.visibleRanges[0].start.line, 1); await runCursorlessCommand({ version: 1, @@ -56,7 +55,6 @@ async function bottomWhale() { ], }); - // FIXME: Disabled to work around CI failure; see #2243 - // assert.equal(editor.visibleRanges.length, 1); - // assert.equal(editor.visibleRanges[0].start.line, 0); + assert.equal(editor.visibleRanges.length, 1); + assert.equal(editor.visibleRanges[0].start.line, 0); } diff --git a/packages/cursorless-vscode-e2e/src/suite/serializeHeader.ts b/packages/cursorless-vscode-e2e/src/suite/serializeHeader.ts deleted file mode 100644 index ec54ee08765..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/serializeHeader.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { Range } from "@cursorless/common"; - -interface SerializeHeaderArg { - prefix?: string; - header: string | undefined; - scopeNumber: number | undefined; - targetNumber: number | undefined; - range?: Range; -} - -/** - * Constructs a header string from a configuration object. For example: - * - * ``` - * serializeHeader({ - * prefix: "Leading delimiter", - * header: "Content", - * scopeNumber: 1, - * targetNumber: 2, - * range: new Range(new Position(1, 2), new Position(3, 4)), - * }) === "[#1.2 Leading delimiter: Content] = 1:2-3:4" - * ``` - * - * @param param A configuration object - * @returns A string representing the header - */ -export function serializeHeader({ - prefix, - header, - scopeNumber, - targetNumber, - range, -}: SerializeHeaderArg): string { - const parts: string[] = []; - if (scopeNumber != null || targetNumber != null) { - const numberParts: string[] = []; - if (scopeNumber != null) { - numberParts.push(`#${scopeNumber}`); - } - if (targetNumber != null) { - numberParts.push(`.${targetNumber}`); - } - parts.push(numberParts.join("")); - } - - if (prefix != null) { - if (header != null) { - parts.push(prefix + ":"); - } else { - parts.push(prefix); - } - } - - if (header != null) { - parts.push(header); - } - - const suffix = range != null ? ` ${range}` : ""; - return `[${parts.join(" ")}] =${suffix}`; -} diff --git a/packages/cursorless-vscode-e2e/src/suite/serializeScopeFixture.ts b/packages/cursorless-vscode-e2e/src/suite/serializeScopeFixture.ts deleted file mode 100644 index fdc0c39a3bf..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/serializeScopeFixture.ts +++ /dev/null @@ -1,328 +0,0 @@ -import { - IterationScopeRanges, - Range, - ScopeRanges, - TargetRanges, -} from "@cursorless/common"; -import { serializeHeader } from "./serializeHeader"; -import { serializeTargetRange } from "./serializeTargetRange"; - -export function serializeScopeFixture( - code: string, - scopes: ScopeRanges[], -): string { - const codeLines = code.split("\n"); - - const serializedScopes = scopes.map((scope, index) => - serializeScope(codeLines, scope, scopes.length > 1 ? index + 1 : undefined), - ); - - return serializeScopeFixtureHelper(codeLines, serializedScopes); -} - -export function serializeIterationScopeFixture( - code: string, - scopes: IterationScopeRanges[], -): string { - const codeLines = code.split("\n"); - - const serializedScopes = scopes.map((scope, index) => - serializeIterationScope( - codeLines, - scope, - scopes.length > 1 ? index + 1 : undefined, - ), - ); - - return serializeScopeFixtureHelper(codeLines, serializedScopes); -} - -function serializeScopeFixtureHelper( - codeLines: string[], - scopes: string[], -): string { - const serializedScopes = scopes.join("\n\n"); - - return [...codeLines, "---", serializedScopes, ""].join("\n"); -} - -function serializeScope( - codeLines: string[], - { domain, targets }: ScopeRanges, - scopeNumber: number | undefined, -): string { - if (targets.length === 1) { - return serializeTarget({ - codeLines, - target: targets[0], - scopeNumber, - targetNumber: undefined, - domain, - }); - } - - // If we have multiple targets or the domain is not equal to the content range: add domain last - return [ - ...targets.map((target, index) => - serializeTarget({ - codeLines, - target, - scopeNumber, - targetNumber: index + 1, - }), - ), - "", - serializeHeader({ - header: "Domain", - scopeNumber, - targetNumber: undefined, - range: domain, - }), - serializeTargetRange(codeLines, domain), - ].join("\n"); -} - -function serializeIterationScope( - codeLines: string[], - { domain, ranges }: IterationScopeRanges, - scopeNumber: number | undefined, -): string { - const lines: string[] = [""]; - - const groupHeaders = !ranges.some( - (range) => !domain.isRangeEqual(range.range), - ); - - ranges.forEach((range, index) => { - if (!groupHeaders && index > 0) { - lines.push(""); - } - - lines.push( - serializeHeader({ - header: "Range", - scopeNumber, - targetNumber: ranges.length > 1 ? index + 1 : undefined, - range: groupHeaders ? undefined : range.range, - }), - ); - - if (!groupHeaders) { - lines.push(serializeTargetRange(codeLines, range.range)); - } - }); - - if (!groupHeaders) { - lines.push(""); - } - - lines.push( - serializeHeader({ - header: "Domain", - scopeNumber, - targetNumber: undefined, - range: domain, - }), - serializeTargetRange(codeLines, domain), - ); - - return lines.join("\n"); -} - -interface SerializeTargetArg { - codeLines: string[]; - target: TargetRanges; - scopeNumber: number | undefined; - targetNumber: number | undefined; - domain?: Range; -} - -function serializeTarget({ - codeLines, - target, - scopeNumber, - targetNumber, - domain, -}: SerializeTargetArg): string { - const lines: string[] = [""]; - - const headers = ["Content"]; - - // Add removal and domain headers below content header if their ranges are equal - if (target.contentRange.isRangeEqual(target.removalRange)) { - headers.push("Removal"); - } - if (domain != null && target.contentRange.isRangeEqual(domain)) { - headers.push("Domain"); - } - - lines.push( - ...headers.map((header, index) => - serializeHeader({ - header, - scopeNumber, - targetNumber, - range: index === headers.length - 1 ? target.contentRange : undefined, - }), - ), - serializeTargetRange(codeLines, target.contentRange), - ); - - // Add separate removal header below content if their ranges are not equal - if (!target.contentRange.isRangeEqual(target.removalRange)) { - lines.push( - "", - serializeHeader({ - header: "Removal", - scopeNumber, - targetNumber, - range: target.removalRange, - }), - serializeTargetRange(codeLines, target.removalRange), - ); - } - - if (target.leadingDelimiter != null) { - lines.push( - serializeTargetCompact({ - codeLines, - target: target.leadingDelimiter, - prefix: "Leading delimiter", - scopeNumber, - targetNumber, - }), - ); - } - - if (target.trailingDelimiter != null) { - lines.push( - serializeTargetCompact({ - codeLines, - target: target.trailingDelimiter, - prefix: "Trailing delimiter", - scopeNumber, - targetNumber, - }), - ); - } - - if (target.interior != null) { - lines.push( - ...target.interior.map((interior) => - serializeTargetCompact({ - codeLines, - target: interior, - prefix: "Interior", - scopeNumber, - targetNumber, - }), - ), - ); - } - - if (target.boundary != null) { - lines.push( - ...target.boundary.map((interior) => - serializeTargetCompact({ - codeLines, - target: interior, - prefix: "Boundary", - scopeNumber, - targetNumber, - }), - ), - ); - } - - if (domain != null && !target.contentRange.isRangeEqual(domain)) { - lines.push( - "", - serializeHeader({ - header: "Domain", - scopeNumber, - targetNumber, - range: domain, - }), - serializeTargetRange(codeLines, domain), - ); - } - - lines.push( - serializeTargetInsertionDelimiter(target, scopeNumber, targetNumber), - ); - - return lines.join("\n"); -} - -function serializeTargetInsertionDelimiter( - target: TargetRanges, - scopeNumber: number | undefined, - targetNumber: number | undefined, -): string { - const header = serializeHeader({ - header: "Insertion delimiter", - scopeNumber, - targetNumber, - }); - - return `\n${header} ${JSON.stringify(target.insertionDelimiter)}`; -} - -interface SerializeTargetCompactArg { - codeLines: string[]; - target: TargetRanges; - prefix: string | undefined; - scopeNumber: number | undefined; - targetNumber: number | undefined; -} - -/** - * Given a target, serialize it compactly, including only the content and - * removal ranges. We use this for auxiliary targets like delimiters and - * interior/boundary targets of a target that we're serializing. - * @param arg Configuration object - * @returns A string representing the target - */ -function serializeTargetCompact({ - codeLines, - target, - prefix, - scopeNumber, - targetNumber, -}: SerializeTargetCompactArg): string { - const lines: string[] = [""]; - - if (target.contentRange.isRangeEqual(target.removalRange)) { - lines.push( - serializeHeader({ - prefix, - header: undefined, - scopeNumber, - targetNumber, - range: target.contentRange, - }), - serializeTargetRange(codeLines, target.contentRange), - ); - } else { - lines.push( - serializeHeader({ - prefix, - header: "Content", - scopeNumber, - targetNumber, - range: target.contentRange, - }), - serializeTargetRange(codeLines, target.contentRange), - serializeHeader({ - prefix, - header: "Removal", - scopeNumber, - targetNumber, - range: target.removalRange, - }), - serializeTargetRange(codeLines, target.removalRange), - ); - } - - return lines.join("\n"); -} diff --git a/packages/cursorless-vscode-e2e/src/suite/serializeTargetRange.ts b/packages/cursorless-vscode-e2e/src/suite/serializeTargetRange.ts deleted file mode 100644 index 20b05af54b1..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/serializeTargetRange.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { Range } from "@cursorless/common"; - -/** - * Given the code of a fixture and a range, return a string that annotates the - * range in the code. For example, given the code: - * - * ``` - * aaa bbb - * ccc - * - * ddd eee - * ``` - * - * and the range (0, 4)-(3, 3), this function will return: - * - * ``` - * 0| aaa bbb - * >--- - * 1| ccc - * --- - * 2| - * - * 3| ddd eee - * ---< - * ``` - * - * @param codeLines The code of the fixture, split into lines - * @param range The range to represent - * @returns A string that annotates {@link range} in {@link codeLines} - */ -export function serializeTargetRange( - codeLines: string[], - range: Range, -): string { - const { start, end } = range; - const lines: string[] = []; - - // Add start of range marker above the first code line - const prefix = fill(" ", start.character + 2) + ">"; - if (range.isSingleLine) { - lines.push(prefix + fill("-", end.character - start.character) + "<"); - } else { - lines.push( - prefix + fill("-", codeLines[start.line].length - start.character), - ); - } - - // Output the range with each line prefixed by `n| `, eg: - // `3| const foo = // "bar"` - for (let lineNumber = start.line; lineNumber <= end.line; ++lineNumber) { - const codeLine = codeLines[lineNumber]!; - - lines.push( - codeLine.length > 0 ? `${lineNumber}| ${codeLine}` : `${lineNumber}|`, - ); - } - - // Add end of range marker below the last code line (if this was a multiline - // range) - if (!range.isSingleLine) { - lines.push(" " + fill("-", end.character) + "<"); - } - - return lines.join("\n"); -} -function fill(character: string, count: number): string { - return new Array(count + 1).join(character); -} diff --git a/packages/cursorless-vscode-e2e/src/suite/skipIfWindowsCi.ts b/packages/cursorless-vscode-e2e/src/suite/skipIfWindowsCi.ts new file mode 100644 index 00000000000..c897b829839 --- /dev/null +++ b/packages/cursorless-vscode-e2e/src/suite/skipIfWindowsCi.ts @@ -0,0 +1,7 @@ +export function skipIfWindowsCi() { + suiteSetup(function () { + if (process.env.RUNNER_OS === "Windows" && process.env.CI === "true") { + this.skip(); + } + }); +} diff --git a/packages/cursorless-vscode-e2e/src/suite/toggleDecorations.vscode.test.ts b/packages/cursorless-vscode-e2e/src/suite/toggleDecorations.vscode.test.ts index ad4fd155c59..7ba46f04365 100644 --- a/packages/cursorless-vscode-e2e/src/suite/toggleDecorations.vscode.test.ts +++ b/packages/cursorless-vscode-e2e/src/suite/toggleDecorations.vscode.test.ts @@ -1,5 +1,5 @@ import { getCursorlessApi, openNewEditor } from "@cursorless/vscode-common"; -import assert from "assert"; +import * as assert from "assert"; import * as vscode from "vscode"; import { endToEndTestSetup } from "../endToEndTestSetup"; diff --git a/packages/cursorless-vscode-e2e/src/suite/visible.vscode.test.ts b/packages/cursorless-vscode-e2e/src/suite/visible.vscode.test.ts deleted file mode 100644 index 0567aa49365..00000000000 --- a/packages/cursorless-vscode-e2e/src/suite/visible.vscode.test.ts +++ /dev/null @@ -1,66 +0,0 @@ -import * as assert from "assert"; -import * as vscode from "vscode"; -import { openNewEditor } from "@cursorless/vscode-common"; -import { endToEndTestSetup } from "../endToEndTestSetup"; -import { runCursorlessCommand } from "@cursorless/vscode-common"; - -suite("visible", async function () { - endToEndTestSetup(this); - - test("visible multiple regions", testMultipleRegions); -}); - -async function testMultipleRegions() { - const editor = await openEditor(); - - await foldRegion(); - - assert.equal(editor.visibleRanges.length, 2); - - await clearVisible(); - - assert.equal(editor.selections.length, 2); - - assert.equal(editor.document.getText(), "\n // 2\n"); -} - -const content = ` -// 1 - -function myFunk() { - // 2 -} - -// 3 -`; - -function openEditor() { - return openNewEditor(content, { - languageId: "typescript", - }); -} - -function foldRegion() { - return vscode.commands.executeCommand("editor.fold", { - levels: 1, - direction: "down", - selectionLines: [3], - }); -} - -function clearVisible() { - return runCursorlessCommand({ - version: 6, - usePrePhraseSnapshot: false, - action: { - name: "clearAndSetSelection", - target: { - type: "primitive", - mark: { - type: "cursor", - }, - modifiers: [{ type: "visible" }], - }, - }, - }); -} diff --git a/packages/cursorless-vscode/images/logo.png b/packages/cursorless-vscode/images/logo.png deleted file mode 100644 index c001e4a4f2f8ef0eede6cb13ade09f7d88256e8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6157 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 diff --git a/packages/cursorless-vscode/package.json b/packages/cursorless-vscode/package.json index 8d20bf0ee12..584de90030c 100644 --- a/packages/cursorless-vscode/package.json +++ b/packages/cursorless-vscode/package.json @@ -3,7 +3,7 @@ "displayName": "Cursorless", "description": "Structural voice coding at the speed of thought", "private": true, - "icon": "images/logo.png", + "icon": "images/icon.png", "galleryBanner": { "color": "#00001A", "theme": "dark" @@ -29,7 +29,7 @@ }, "homepage": "https://www.cursorless.org/", "engines": { - "vscode": "^1.66.0" + "vscode": "^1.61.0" }, "extensionKind": [ "ui", @@ -46,10 +46,8 @@ ], "activationEvents": [ "onLanguage", - "onView:cursorless.scopes", "onCommand:cursorless.command", "onCommand:cursorless.internal.updateCheatsheetDefaults", - "onCommand:cursorless.private.logQuickActions", "onCommand:cursorless.keyboard.escape", "onCommand:cursorless.keyboard.modal.modeOff", "onCommand:cursorless.keyboard.modal.modeOn", @@ -70,24 +68,15 @@ "onCommand:cursorless.takeSnapshot", "onCommand:cursorless.toggleDecorations", "onCommand:cursorless.showScopeVisualizer", - "onCommand:cursorless.hideScopeVisualizer", - "onCommand:cursorless.analyzeCommandHistory" + "onCommand:cursorless.hideScopeVisualizer" ], - "main": "./extension.cjs", + "main": "./extension.js", "capabilities": { "untrustedWorkspaces": { "supported": true } }, "contributes": { - "views": { - "cursorless": [ - { - "id": "cursorless.scopes", - "name": "Scopes" - } - ] - }, "commands": [ { "command": "cursorless.toggleDecorations", @@ -117,18 +106,6 @@ "command": "cursorless.showDocumentation", "title": "Cursorless: Show documentation" }, - { - "command": "cursorless.showScopeVisualizer", - "title": "Cursorless: Show the scope visualizer" - }, - { - "command": "cursorless.hideScopeVisualizer", - "title": "Cursorless: Hide the scope visualizer" - }, - { - "command": "cursorless.analyzeCommandHistory", - "title": "Cursorless: Analyze collected command history" - }, { "command": "cursorless.command", "title": "Cursorless: The core cursorless command", @@ -146,12 +123,7 @@ }, { "command": "cursorless.internal.updateCheatsheetDefaults", - "title": "Cursorless: Update the default values of the cheatsheet payload used on the website and for local development. Be sure to run this on stock community and cursorless.", - "enablement": "false" - }, - { - "command": "cursorless.private.logQuickActions", - "title": "Cursorless: Log the quick actions available at the current cursor position", + "title": "Cursorless: Update the default values of the cheatsheet payload used on the website and for local development. Be sure to run this on stock knausj and cursorless.", "enablement": "false" }, { @@ -203,6 +175,16 @@ "command": "cursorless.keyboard.modal.modeToggle", "title": "Cursorless: Toggle the cursorless modal mode", "enablement": "false" + }, + { + "command": "cursorless.showScopeVisualizer", + "title": "Cursorless: Show the scope visualizer", + "enablement": "false" + }, + { + "command": "cursorless.hideScopeVisualizer", + "title": "Cursorless: Hide the scope visualizer", + "enablement": "false" } ], "colors": [ @@ -290,12 +272,6 @@ "default": true, "description": "Whether to show decorations on vscode start." }, - "cursorless.commandHistory": { - "type": "boolean", - "default": false, - "order": 2, - "description": "Keep a local, sanitized command history. This history is never sent to our servers, and any commands that may contain text will be sanitized. These statistics can be used in the future for doing local analyses to determine ways you can improve your Cursorless efficiency. We may also support a way for you to send your statistics to us for analysis in the future, but this will be opt-in only." - }, "cursorless.tokenHatSplittingMode.preserveCase": { "type": "boolean", "default": false, @@ -387,7 +363,7 @@ } }, "default": { - "default": "#B9B6CD", + "default": "#aaa7bb", "blue": "#089ad3", "green": "#36B33F", "red": "#E02D28", @@ -675,48 +651,48 @@ "type": "object", "order": 3, "properties": { - "bolt": { + "ex": { "type": "boolean" }, - "curve": { + "fox": { "type": "boolean" }, - "fox": { + "wing": { "type": "boolean" }, - "frame": { + "hole": { "type": "boolean" }, - "play": { + "frame": { "type": "boolean" }, - "wing": { + "curve": { "type": "boolean" }, - "hole": { + "eye": { "type": "boolean" }, - "ex": { + "play": { "type": "boolean" }, - "crosshairs": { + "bolt": { "type": "boolean" }, - "eye": { + "crosshairs": { "type": "boolean" } }, "default": { - "bolt": false, - "curve": false, + "ex": false, "fox": false, - "frame": false, - "play": false, "wing": false, "hole": false, - "ex": false, - "crosshairs": false, - "eye": false + "frame": false, + "curve": false, + "eye": false, + "play": false, + "bolt": false, + "crosshairs": false }, "additionalProperties": false }, @@ -766,48 +742,48 @@ "description": "How much to penalize each hat shape. Number of syllables is a good default", "type": "object", "properties": { - "bolt": { + "ex": { "type": "number" }, - "curve": { + "fox": { "type": "number" }, - "fox": { + "wing": { "type": "number" }, - "frame": { + "hole": { "type": "number" }, - "play": { + "frame": { "type": "number" }, - "wing": { + "curve": { "type": "number" }, - "hole": { + "eye": { "type": "number" }, - "ex": { + "play": { "type": "number" }, - "crosshairs": { + "bolt": { "type": "number" }, - "eye": { + "crosshairs": { "type": "number" } }, "default": { - "bolt": 1, - "curve": 1, + "ex": 1, "fox": 1, - "frame": 1, - "play": 1, "wing": 1, "hole": 1, - "ex": 1, - "crosshairs": 1, - "eye": 1 + "frame": 1, + "curve": 1, + "eye": 1, + "play": 1, + "bolt": 1, + "crosshairs": 1 }, "additionalProperties": false }, @@ -819,43 +795,43 @@ "sizeAdjustment": 0, "verticalOffset": 0 }, - "bolt": { + "ex": { "sizeAdjustment": 0, "verticalOffset": 0 }, - "curve": { + "fox": { "sizeAdjustment": 0, "verticalOffset": 0 }, - "fox": { + "wing": { "sizeAdjustment": 0, "verticalOffset": 0 }, - "frame": { + "hole": { "sizeAdjustment": 0, "verticalOffset": 0 }, - "play": { + "frame": { "sizeAdjustment": 0, "verticalOffset": 0 }, - "wing": { + "curve": { "sizeAdjustment": 0, "verticalOffset": 0 }, - "hole": { + "eye": { "sizeAdjustment": 0, "verticalOffset": 0 }, - "ex": { + "play": { "sizeAdjustment": 0, "verticalOffset": 0 }, - "crosshairs": { + "bolt": { "sizeAdjustment": 0, "verticalOffset": 0 }, - "eye": { + "crosshairs": { "sizeAdjustment": 0, "verticalOffset": 0 } @@ -865,177 +841,68 @@ "description": "Directory containing snippets for use in Cursorless", "type": "string" }, - "cursorless.experimental.keyboard.modal.keybindings.action": { + "cursorless.experimental.keyboard.modal.keybindings.actions": { "description": "Define modal keybindings for actions", "type": "object", "additionalProperties": { - "anyOf": [ - { - "type": "string", - "enum": [ - "callAsFunction", - "clearAndSetSelection", - "copyToClipboard", - "cutToClipboard", - "deselect", - "editNew", - "editNewLineAfter", - "editNewLineBefore", - "executeCommand", - "extractVariable", - "findInDocument", - "findInWorkspace", - "foldRegion", - "followLink", - "generateSnippet", - "getText", - "highlight", - "indentLine", - "insertCopyAfter", - "insertCopyBefore", - "insertEmptyLineAfter", - "insertEmptyLineBefore", - "insertEmptyLinesAround", - "insertSnippet", - "moveToTarget", - "outdentLine", - "pasteFromClipboard", - "randomizeTargets", - "remove", - "rename", - "replace", - "replaceWithTarget", - "revealDefinition", - "revealTypeDefinition", - "reverseTargets", - "rewrapWithPairedDelimiter", - "scrollToBottom", - "scrollToCenter", - "scrollToTop", - "setSelection", - "setSelectionAfter", - "setSelectionBefore", - "showDebugHover", - "showHover", - "showQuickFix", - "showReferences", - "sortTargets", - "swapTargets", - "toggleLineBreakpoint", - "toggleLineComment", - "unfoldRegion", - "wrap" - ] - }, - { - "type": "object", - "properties": { - "actionId": { - "type": "string", - "enum": [ - "callAsFunction", - "clearAndSetSelection", - "copyToClipboard", - "cutToClipboard", - "deselect", - "editNew", - "editNewLineAfter", - "editNewLineBefore", - "executeCommand", - "extractVariable", - "findInDocument", - "findInWorkspace", - "foldRegion", - "followLink", - "generateSnippet", - "getText", - "highlight", - "indentLine", - "insertCopyAfter", - "insertCopyBefore", - "insertEmptyLineAfter", - "insertEmptyLineBefore", - "insertEmptyLinesAround", - "insertSnippet", - "moveToTarget", - "outdentLine", - "pasteFromClipboard", - "randomizeTargets", - "remove", - "rename", - "replace", - "replaceWithTarget", - "revealDefinition", - "revealTypeDefinition", - "reverseTargets", - "rewrapWithPairedDelimiter", - "scrollToBottom", - "scrollToCenter", - "scrollToTop", - "setSelection", - "setSelectionAfter", - "setSelectionBefore", - "showDebugHover", - "showHover", - "showQuickFix", - "showReferences", - "sortTargets", - "swapTargets", - "toggleLineBreakpoint", - "toggleLineComment", - "unfoldRegion", - "wrap" - ], - "description": "The cursorless command to run" - }, - "exitCursorlessMode": { - "type": "boolean", - "description": "Indicates whether the command should exit cursorless mode after it is run, defaults false." - } - }, - "required": [ - "actionId" - ] - } - ] - } - }, - "cursorless.experimental.keyboard.modal.keybindings.vscodeCommand": { - "description": "Define modal keybindings for running vscode commands", - "type": "object", - "additionalProperties": { - "type": [ - "string", - "object" - ], - "properties": { - "commandId": { - "type": "string", - "description": "The vscode command to run" - }, - "args": { - "type": "array", - "description": "The arguments to pass to the command" - }, - "executeAtTarget": { - "type": "boolean", - "description": "If `true`, indicates that the command should be executed at the target by moving the cursor there first, running the command, and then moving the cursor back to the original position" - }, - "keepChangedSelection": { - "type": "boolean", - "description": "If `true`, the selection will be retained after the command is run, rather than being restored to its original position. This setting only applies when `executeAtTarget` is `true`." - }, - "exitCursorlessMode": { - "type": "boolean", - "description": "If `true`, indicates that the command should exit cursorless mode after it is run." - } - }, - "required": [ - "commandId" + "type": "string", + "enum": [ + "callAsFunction", + "clearAndSetSelection", + "copyToClipboard", + "cutToClipboard", + "deselect", + "editNew", + "editNewLineAfter", + "editNewLineBefore", + "executeCommand", + "extractVariable", + "findInWorkspace", + "foldRegion", + "followLink", + "generateSnippet", + "getText", + "highlight", + "indentLine", + "insertCopyAfter", + "insertCopyBefore", + "insertEmptyLineAfter", + "insertEmptyLineBefore", + "insertEmptyLinesAround", + "insertSnippet", + "moveToTarget", + "outdentLine", + "pasteFromClipboard", + "randomizeTargets", + "remove", + "rename", + "replace", + "replaceWithTarget", + "revealDefinition", + "revealTypeDefinition", + "reverseTargets", + "rewrapWithPairedDelimiter", + "scrollToBottom", + "scrollToCenter", + "scrollToTop", + "setSelection", + "setSelectionAfter", + "setSelectionBefore", + "showDebugHover", + "showHover", + "showQuickFix", + "showReferences", + "sortTargets", + "swapTargets", + "toggleLineBreakpoint", + "toggleLineComment", + "unfoldRegion", + "wrapWithPairedDelimiter", + "wrapWithSnippet" ] } }, - "cursorless.experimental.keyboard.modal.keybindings.color": { + "cursorless.experimental.keyboard.modal.keybindings.colors": { "description": "Define modal keybindings for colors", "type": "object", "additionalProperties": { @@ -1052,26 +919,26 @@ ] } }, - "cursorless.experimental.keyboard.modal.keybindings.shape": { + "cursorless.experimental.keyboard.modal.keybindings.shapes": { "description": "Define modal keybindings for shapes", "type": "object", "additionalProperties": { "type": "string", "enum": [ - "bolt", - "curve", + "ex", "fox", - "frame", - "play", "wing", "hole", - "ex", - "crosshairs", - "eye" + "frame", + "curve", + "eye", + "play", + "bolt", + "crosshairs" ] } }, - "cursorless.experimental.keyboard.modal.keybindings.scope": { + "cursorless.experimental.keyboard.modal.keybindings.scopes": { "description": "Define modal keybindings for scopes", "type": "object", "additionalProperties": { @@ -1165,15 +1032,6 @@ "fontCharacter": "\\E900" } } - }, - "viewsContainers": { - "activitybar": [ - { - "id": "cursorless", - "title": "Cursorless", - "icon": "images/logo.svg" - } - ] } }, "sponsor": { @@ -1182,27 +1040,22 @@ "funding": "https://github.com/sponsors/pokey", "scripts": { "build": "pnpm run esbuild:prod && pnpm -F cheatsheet-local build:prod && pnpm run populate-dist", - "build:dev": "pnpm generate-grammar && pnpm run esbuild && pnpm -F cheatsheet-local build && pnpm run populate-dist", - "esbuild:base": "esbuild ./src/extension.ts --conditions=cursorless:bundler --bundle --outfile=dist/extension.cjs --external:vscode --format=cjs --platform=node", + "build:dev": "pnpm run esbuild && pnpm -F cheatsheet-local build && pnpm run populate-dist", + "esbuild:base": "esbuild ./src/extension.ts --conditions=cursorless:bundler --bundle --outfile=dist/extension.js --external:vscode --format=cjs --platform=node", "install-local": "bash ./scripts/install-local.sh", "install-from-pr": "bash ./scripts/install-from-pr.sh", "uninstall-local": "bash ./scripts/uninstall-local.sh", "esbuild": "pnpm run esbuild:base --sourcemap", "esbuild:watch": "pnpm run esbuild:base --sourcemap --watch", "esbuild:prod": "pnpm run esbuild:base --minify", - "populate-dist": "my-ts-node ./src/scripts/populateDist/index.ts", - "init-launch-sandbox": "my-ts-node src/scripts/initLaunchSandbox.ts", - "preprocess-svg-hats": "my-ts-node src/scripts/preprocessSvgHats.ts", - "hat-adjustment-add": "my-ts-node src/scripts/hatAdjustments/add.ts", - "hat-adjustment-average": "my-ts-node src/scripts/hatAdjustments/average.ts", - "generate-grammar:base": "nearleyc src/keyboard/grammar/grammar.ne", - "ensure-grammar-up-to-date": "pnpm -s generate-grammar:base | diff -u src/keyboard/grammar/generated/grammar.ts -", - "generate-grammar": "pnpm generate-grammar:base -o src/keyboard/grammar/generated/grammar.ts", - "generate-railroad": "nearley-railroad src/keyboard/grammar/grammar.ne -o out/railroad.html", - "test": "pnpm ensure-grammar-up-to-date", + "populate-dist": "tsx --conditions=cursorless:bundler ./src/scripts/populateDist/index.ts", + "init-launch-sandbox": "tsx --conditions=cursorless:bundler src/scripts/initLaunchSandbox.ts", + "preprocess-svg-hats": "tsx --conditions=cursorless:bundler src/scripts/preprocessSvgHats.ts", + "hat-adjustment-add": "tsx --conditions=cursorless:bundler src/scripts/hatAssignments/add.ts", + "hat-adjustment-average": "tsx --conditions=cursorless:bundler src/scripts/hatAssignments/add.ts", "compile": "tsc --build", "watch": "tsc --build --watch", - "clean": "rm -rf ./out tsconfig.tsbuildinfo ./dist ./build" + "clean": "rm -rf ./out tsconfig.tsbuildinfo ./dist" }, "devDependencies": { "@types/chai": "^4.3.3", @@ -1210,14 +1063,12 @@ "@types/glob": "^7.1.3", "@types/js-yaml": "^4.0.2", "@types/lodash": "4.14.181", - "@types/mocha": "^10.0.3", - "@types/nearley": "2.11.5", - "@types/node": "^18.18.2", + "@types/mocha": "^8.0.4", + "@types/node": "^16.11.3", "@types/semver": "^7.3.9", "@types/sinon": "^10.0.2", - "@types/tinycolor2": "1.4.3", "@types/uuid": "^8.3.4", - "@types/vscode": "~1.66.0", + "@types/vscode": "~1.61.0", "chai": "^4.3.6", "esbuild": "^0.17.11", "fast-xml-parser": "^4.2.5", @@ -1230,15 +1081,12 @@ "@cursorless/common": "workspace:*", "@cursorless/cursorless-engine": "workspace:*", "@cursorless/vscode-common": "workspace:*", - "immer": "^9.0.15", + "@types/tinycolor2": "1.4.3", "itertools": "^2.1.1", "lodash": "^4.17.21", - "nearley": "2.20.1", "semver": "^7.5.2", "tinycolor2": "1.6.0", - "trie-search": "2.0.0", "uuid": "^9.0.0", "vscode-uri": "^3.0.6" - }, - "type": "module" + } } diff --git a/packages/cursorless-vscode/scripts/install-from-pr.sh b/packages/cursorless-vscode/scripts/install-from-pr.sh index 097baa4ef55..3424fd06ce2 100755 --- a/packages/cursorless-vscode/scripts/install-from-pr.sh +++ b/packages/cursorless-vscode/scripts/install-from-pr.sh @@ -16,12 +16,6 @@ if ! command -v gh &>/dev/null; then exit 1 fi -# Ensure VSCode 'code' command is installed -if ! command -v code &>/dev/null; then - echo "VSCode 'code' command not found; see https://code.visualstudio.com/docs/editor/command-line#_launching-from-command-line" - exit 1 -fi - pr_number="$1" repo="cursorless-dev/cursorless" @@ -33,8 +27,8 @@ if [[ $checks == *still-running ]]; then fi # 2. Get desired check run (ubuntu-latest, stable) -check_number=$(echo "$checks" | grep -F 'Test (ubuntu-latest, stable)' | cut -d / -f8) -echo "Downloading vsix for PR $pr_number from check $check_number" +check_number=$(echo "$checks" | fgrep 'Test (ubuntu-latest, stable)' | cut -d / -f8) +echo "Downloading vsix for PR $pr_number From check $check_number" # Temp directory to put downloaded extension tmpdir=$(mktemp -d 2>/dev/null || mktemp -d -t 'cursorless-vsix') @@ -44,7 +38,7 @@ function finish { trap finish EXIT # 3. Download extension vsix -gh run download "$check_number" --repo "$repo" --name vsix --dir "$tmpdir" +gh run download $check_number --repo "$repo" --name vsix --dir "$tmpdir" # 4. Uninstall production cursorless code --uninstall-extension pokey.cursorless || echo "Cursorless not currently installed" diff --git a/packages/cursorless-vscode/src/ScopeTreeProvider.ts b/packages/cursorless-vscode/src/ScopeTreeProvider.ts deleted file mode 100644 index e0cf1a8a9e3..00000000000 --- a/packages/cursorless-vscode/src/ScopeTreeProvider.ts +++ /dev/null @@ -1,346 +0,0 @@ -import { - CURSORLESS_SCOPE_TREE_VIEW_ID, - CursorlessCommandId, - ScopeProvider, - ScopeSupport, - ScopeSupportInfo, - ScopeTypeInfo, - disposableFrom, -} from "@cursorless/common"; -import { CustomSpokenFormGenerator } from "@cursorless/cursorless-engine"; -import { VscodeApi } from "@cursorless/vscode-common"; -import { isEqual } from "lodash"; -import type { - Disposable, - Event, - ExtensionContext, - TreeDataProvider, - TreeItemLabel, - TreeView, - TreeViewVisibilityChangeEvent, -} from "vscode"; -import { - EventEmitter, - MarkdownString, - ThemeIcon, - TreeItem, - TreeItemCollapsibleState, - extensions, - window, -} from "vscode"; -import { URI } from "vscode-uri"; -import { - ScopeVisualizer, - VisualizationType, -} from "./ScopeVisualizerCommandApi"; - -export const DONT_SHOW_TALON_UPDATE_MESSAGE_KEY = "dontShowUpdateTalonMessage"; - -export class ScopeTreeProvider implements TreeDataProvider { - private visibleDisposable: Disposable | undefined; - private treeView: TreeView; - private supportLevels: ScopeSupportInfo[] = []; - private shownUpdateTalonMessage = false; - - private _onDidChangeTreeData: EventEmitter< - MyTreeItem | undefined | null | void - > = new EventEmitter(); - readonly onDidChangeTreeData: Event = - this._onDidChangeTreeData.event; - - constructor( - private vscodeApi: VscodeApi, - private context: ExtensionContext, - private scopeProvider: ScopeProvider, - private scopeVisualizer: ScopeVisualizer, - private customSpokenFormGenerator: CustomSpokenFormGenerator, - private hasCommandServer: boolean, - ) { - this.treeView = vscodeApi.window.createTreeView( - CURSORLESS_SCOPE_TREE_VIEW_ID, - { - treeDataProvider: this, - }, - ); - - this.context.subscriptions.push( - this.treeView, - this.treeView.onDidChangeVisibility(this.onDidChangeVisible, this), - this, - ); - - if (this.treeView.visible) { - this.registerScopeSupportListener(); - } - } - - onDidChangeVisible(e: TreeViewVisibilityChangeEvent) { - if (e.visible) { - if (this.visibleDisposable != null) { - return; - } - - this.registerScopeSupportListener(); - } else { - if (this.visibleDisposable == null) { - return; - } - - this.visibleDisposable.dispose(); - this.visibleDisposable = undefined; - } - } - - private registerScopeSupportListener() { - this.visibleDisposable = disposableFrom( - this.scopeProvider.onDidChangeScopeSupport((supportLevels) => { - this.supportLevels = supportLevels; - this._onDidChangeTreeData.fire(); - }), - this.scopeVisualizer.onDidChangeScopeType(() => { - this._onDidChangeTreeData.fire(); - }), - ); - } - - getTreeItem(element: MyTreeItem): MyTreeItem { - return element; - } - - getChildren(element?: MyTreeItem): MyTreeItem[] { - if (element == null) { - this.possiblyShowUpdateTalonMessage(); - return getSupportCategories(); - } - - if (element instanceof SupportCategoryTreeItem) { - return this.getScopeTypesWithSupport(element.scopeSupport); - } - - throw new Error("Unexpected element"); - } - - private async possiblyShowUpdateTalonMessage() { - if ( - !this.customSpokenFormGenerator.needsInitialTalonUpdate || - this.shownUpdateTalonMessage || - !this.hasCommandServer || - (await this.context.globalState.get(DONT_SHOW_TALON_UPDATE_MESSAGE_KEY)) - ) { - return; - } - - this.shownUpdateTalonMessage = true; - - const HOW_BUTTON_TEXT = "How?"; - const DONT_SHOW_AGAIN_BUTTON_TEXT = "Don't show again"; - const result = await this.vscodeApi.window.showInformationMessage( - "In order to see your custom spoken forms in the sidebar, you'll need to update your Cursorless Talon files.", - HOW_BUTTON_TEXT, - DONT_SHOW_AGAIN_BUTTON_TEXT, - ); - - if (result === HOW_BUTTON_TEXT) { - await this.vscodeApi.env.openExternal( - URI.parse( - "https://www.cursorless.org/docs/user/updating/#updating-the-talon-side", - ), - ); - } else if (result === DONT_SHOW_AGAIN_BUTTON_TEXT) { - await this.context.globalState.update( - DONT_SHOW_TALON_UPDATE_MESSAGE_KEY, - true, - ); - } - } - - getScopeTypesWithSupport(scopeSupport: ScopeSupport): ScopeSupportTreeItem[] { - return this.supportLevels - .filter( - (supportLevel) => - supportLevel.support === scopeSupport && - // Skip scope if it doesn't have a spoken form and it's private. That - // is the default state for scopes that are private; we don't want to - // show these to the user. - !( - supportLevel.spokenForm.type === "error" && - supportLevel.spokenForm.isPrivate - ), - ) - .map( - (supportLevel) => - new ScopeSupportTreeItem( - supportLevel, - isEqual(supportLevel.scopeType, this.scopeVisualizer.scopeType), - ), - ) - .sort((a, b) => { - if ( - a.scopeTypeInfo.spokenForm.type !== b.scopeTypeInfo.spokenForm.type - ) { - // Scopes with no spoken form are sorted to the bottom - return a.scopeTypeInfo.spokenForm.type === "error" ? 1 : -1; - } - - if ( - a.scopeTypeInfo.isLanguageSpecific !== - b.scopeTypeInfo.isLanguageSpecific - ) { - // Then language-specific scopes are sorted to the top - return a.scopeTypeInfo.isLanguageSpecific ? -1 : 1; - } - - // Then alphabetical by label - return a.label.label.localeCompare(b.label.label); - }); - } - - dispose() { - this.visibleDisposable?.dispose(); - } -} - -function getSupportCategories(): SupportCategoryTreeItem[] { - return [ - new SupportCategoryTreeItem(ScopeSupport.supportedAndPresentInEditor), - new SupportCategoryTreeItem(ScopeSupport.supportedButNotPresentInEditor), - new SupportCategoryTreeItem(ScopeSupport.supportedLegacy), - new SupportCategoryTreeItem(ScopeSupport.unsupported), - ]; -} - -class ScopeSupportTreeItem extends TreeItem { - public readonly label!: TreeItemLabel; - - /** - * @param scopeTypeInfo The scope type info - * @param isVisualized Whether the scope type is currently being visualized - with the scope visualizer - */ - constructor( - public readonly scopeTypeInfo: ScopeTypeInfo, - isVisualized: boolean, - ) { - let label: string; - let tooltip: string; - - if (scopeTypeInfo.spokenForm.type === "success") { - label = scopeTypeInfo.spokenForm.spokenForms - .map((spokenForm) => `"${spokenForm}"`) - .join(" | "); - tooltip = label; - } else { - label = "-"; - tooltip = scopeTypeInfo.spokenForm.requiresTalonUpdate - ? "Requires Talon update; see [update instructions](https://www.cursorless.org/docs/user/updating/#updating-the-talon-side)" - : "Spoken form disabled; see [customization docs](https://www.cursorless.org/docs/user/customization/#talon-side-settings)"; - } - - super( - { - label, - highlights: isVisualized ? [[0, label.length]] : [], - }, - TreeItemCollapsibleState.None, - ); - - this.tooltip = tooltip == null ? tooltip : new MarkdownString(tooltip); - this.description = scopeTypeInfo.humanReadableName; - - this.command = isVisualized - ? { - command: - "cursorless.hideScopeVisualizer" satisfies CursorlessCommandId, - title: "Hide the scope visualizer", - } - : { - command: - "cursorless.showScopeVisualizer" satisfies CursorlessCommandId, - arguments: [ - scopeTypeInfo.scopeType, - "content" satisfies VisualizationType, - ], - title: `Visualize ${scopeTypeInfo.humanReadableName}`, - }; - - if (scopeTypeInfo.isLanguageSpecific) { - const languageId = window.activeTextEditor?.document.languageId; - if (languageId != null) { - const fileExtension = getLanguageExtensionSampleFromLanguageId( - window.activeTextEditor!.document.languageId, - ); - if (fileExtension != null) { - this.resourceUri = URI.parse( - "cursorless-dummy://dummy/dummy" + fileExtension, - ); - } - } - - if (this.resourceUri == null) { - // Fall back to a generic icon - this.iconPath = new ThemeIcon("code"); - } - } - } -} - -class SupportCategoryTreeItem extends TreeItem { - constructor(public readonly scopeSupport: ScopeSupport) { - let label: string; - let description: string; - let collapsibleState: TreeItemCollapsibleState; - switch (scopeSupport) { - case ScopeSupport.supportedAndPresentInEditor: - label = "Present"; - description = "in active editor"; - collapsibleState = TreeItemCollapsibleState.Expanded; - break; - case ScopeSupport.supportedButNotPresentInEditor: - label = "Supported"; - description = "but not present in active editor"; - collapsibleState = TreeItemCollapsibleState.Expanded; - break; - case ScopeSupport.supportedLegacy: - label = "Legacy"; - description = "may or may not be present in active editor"; - collapsibleState = TreeItemCollapsibleState.Expanded; - break; - case ScopeSupport.unsupported: - label = "Unsupported"; - description = "unsupported in language of active editor"; - collapsibleState = TreeItemCollapsibleState.Collapsed; - break; - } - - super(label, collapsibleState); - this.description = description; - } -} - -type MyTreeItem = ScopeSupportTreeItem | SupportCategoryTreeItem; - -/** - * Get file extension example from vscode [Language Id](https://code.visualstudio.com/docs/languages/identifiers) - * Would've been easier with https://github.com/microsoft/vscode/issues/109919 - * Example: - * - 'typescript' => '.ts' - * FIXME: Maybe memoise? - */ -export function getLanguageExtensionSampleFromLanguageId( - languageId: string, -): string | undefined { - for (const extension of extensions.all) { - const languages: { id: string; extensions: string[] }[] | undefined = - extension.packageJSON?.contributes?.languages; - - if (!languages) { - continue; - } - - for (const contributedLanguage of languages) { - if (contributedLanguage.id === languageId) { - return contributedLanguage.extensions[0]; - } - } - } -} diff --git a/packages/cursorless-vscode/src/ScopeVisualizerCommandApi.ts b/packages/cursorless-vscode/src/ScopeVisualizerCommandApi.ts index 561776fe8f2..77dcc80c6a6 100644 --- a/packages/cursorless-vscode/src/ScopeVisualizerCommandApi.ts +++ b/packages/cursorless-vscode/src/ScopeVisualizerCommandApi.ts @@ -1,15 +1,8 @@ -import { Disposable, ScopeType } from "@cursorless/common"; +import { ScopeType } from "@cursorless/common"; -export type ScopeVisualizerListener = ( - scopeType: ScopeType | undefined, - visualizationType: VisualizationType | undefined, -) => void; - -export interface ScopeVisualizer { +export interface ScopeVisualizerCommandApi { start(scopeType: ScopeType, visualizationType: VisualizationType): void; stop(): void; - readonly scopeType: ScopeType | undefined; - onDidChangeScopeType(listener: ScopeVisualizerListener): Disposable; } export type VisualizationType = "content" | "removal" | "iteration"; diff --git a/packages/cursorless-vscode/src/constructTestHelpers.ts b/packages/cursorless-vscode/src/constructTestHelpers.ts index 8543e642c39..a68539edb05 100644 --- a/packages/cursorless-vscode/src/constructTestHelpers.ts +++ b/packages/cursorless-vscode/src/constructTestHelpers.ts @@ -5,14 +5,13 @@ import { HatTokenMap, IDE, NormalizedIDE, - ScopeProvider, SerializedMarks, - StoredTargetKey, TargetPlainObject, TestCaseSnapshot, TextEditor, } from "@cursorless/common"; import { + StoredTargetKey, StoredTargetMap, plainObjectToTarget, takeSnapshot, @@ -22,7 +21,6 @@ import * as vscode from "vscode"; import { VscodeIDE } from "./ide/vscode/VscodeIDE"; import { toVscodeEditor } from "./ide/vscode/toVscodeEditor"; import { vscodeApi } from "./vscodeApi"; -import { VscodeFileSystem } from "./ide/vscode/VscodeFileSystem"; export function constructTestHelpers( commandServerApi: CommandServerApi | null, @@ -30,8 +28,6 @@ export function constructTestHelpers( hatTokenMap: HatTokenMap, vscodeIDE: VscodeIDE, normalizedIde: NormalizedIDE, - fileSystem: VscodeFileSystem, - scopeProvider: ScopeProvider, injectIde: (ide: IDE) => void, runIntegrationTests: () => Promise, ): TestHelpers | undefined { @@ -39,7 +35,6 @@ export function constructTestHelpers( commandServerApi: commandServerApi!, ide: normalizedIde, injectIde, - scopeProvider, toVscodeEditor, @@ -66,9 +61,6 @@ export function constructTestHelpers( ); }, - cursorlessTalonStateJsonPath: fileSystem.cursorlessTalonStateJsonPath, - cursorlessCommandHistoryDirPath: fileSystem.cursorlessCommandHistoryDirPath, - setStoredTarget( editor: vscode.TextEditor, key: StoredTargetKey, diff --git a/packages/cursorless-vscode/src/extension.ts b/packages/cursorless-vscode/src/extension.ts index 9b51839c86c..941817b47d8 100644 --- a/packages/cursorless-vscode/src/extension.ts +++ b/packages/cursorless-vscode/src/extension.ts @@ -1,19 +1,16 @@ import { - Disposable, FakeIDE, getFakeCommandServerApi, IDE, isTesting, NormalizedIDE, Range, - ScopeProvider, ScopeType, TextDocument, } from "@cursorless/common"; import { - CommandHistory, createCursorlessEngine, - TestCaseRecorder, + ScopeProvider, TreeSitter, } from "@cursorless/cursorless-engine"; import { @@ -23,9 +20,6 @@ import { ParseTreeApi, toVscodeRange, } from "@cursorless/vscode-common"; -import * as crypto from "crypto"; -import * as os from "os"; -import * as path from "path"; import * as vscode from "vscode"; import { constructTestHelpers } from "./constructTestHelpers"; import { FakeFontMeasurements } from "./ide/vscode/hats/FakeFontMeasurements"; @@ -40,16 +34,12 @@ import { import { KeyboardCommands } from "./keyboard/KeyboardCommands"; import { registerCommands } from "./registerCommands"; import { ReleaseNotes } from "./ReleaseNotes"; -import { revisualizeOnCustomRegexChange } from "./revisualizeOnCustomRegexChange"; -import { ScopeTreeProvider } from "./ScopeTreeProvider"; import { - ScopeVisualizer, - ScopeVisualizerListener, + ScopeVisualizerCommandApi, VisualizationType, } from "./ScopeVisualizerCommandApi"; import { StatusBarItem } from "./StatusBarItem"; import { vscodeApi } from "./vscodeApi"; -import { storedTargetHighlighter } from "./storedTargetHighlighter"; /** * Extension entrypoint called by VSCode on Cursorless startup. @@ -84,14 +74,13 @@ export async function activate( const { commandApi, + testCaseRecorder, storedTargets, hatTokenMap, scopeProvider, snippets, injectIde, runIntegrationTests, - addCommandRunnerDecorator, - customSpokenFormGenerator, } = createCursorlessEngine( treeSitter, normalizedIde, @@ -100,42 +89,15 @@ export async function activate( fileSystem, ); - addCommandRunnerDecorator( - new CommandHistory(normalizedIde, commandServerApi, fileSystem), - ); - - const testCaseRecorder = new TestCaseRecorder(hatTokenMap, storedTargets); - addCommandRunnerDecorator(testCaseRecorder); - const statusBarItem = StatusBarItem.create("cursorless.showQuickPick"); - const keyboardCommands = KeyboardCommands.create( - context, - vscodeApi, - statusBarItem, - ); - const scopeVisualizer = createScopeVisualizer(normalizedIde, scopeProvider); - context.subscriptions.push( - revisualizeOnCustomRegexChange(scopeVisualizer, scopeProvider), - ); - - new ScopeTreeProvider( - vscodeApi, - context, - scopeProvider, - scopeVisualizer, - customSpokenFormGenerator, - commandServerApi != null, - ); - - context.subscriptions.push(storedTargetHighlighter(vscodeIDE, storedTargets)); + const keyboardCommands = KeyboardCommands.create(context, statusBarItem); registerCommands( context, vscodeIDE, commandApi, - fileSystem, testCaseRecorder, - scopeVisualizer, + createScopeVisualizerCommandApi(normalizedIde, scopeProvider), keyboardCommands, hats, ); @@ -150,8 +112,6 @@ export async function activate( hatTokenMap, vscodeIDE, normalizedIde as NormalizedIDE, - fileSystem, - scopeProvider, injectIde, runIntegrationTests, ) @@ -168,7 +128,6 @@ async function createVscodeIde(context: vscode.ExtensionContext) { const hats = new VscodeHats( vscodeIDE, - vscodeApi, context, vscodeIDE.runMode === "test" ? new FakeFontMeasurements() @@ -176,22 +135,7 @@ async function createVscodeIde(context: vscode.ExtensionContext) { ); await hats.init(); - // FIXME: Inject this from test harness. Would need to arrange to delay - // extension initialization, probably by returning a function from extension - // init that has parameters consisting of test configuration, and have that - // function do the actual initialization. - const cursorlessDir = isTesting() - ? path.join(os.tmpdir(), crypto.randomBytes(16).toString("hex")) - : path.join(os.homedir(), ".cursorless"); - - const fileSystem = new VscodeFileSystem( - context, - vscodeIDE.runMode, - cursorlessDir, - ); - await fileSystem.initialize(); - - return { vscodeIDE, hats, fileSystem }; + return { vscodeIDE, hats, fileSystem: new VscodeFileSystem() }; } function createTreeSitter(parseTreeApi: ParseTreeApi): TreeSitter { @@ -211,14 +155,11 @@ function createTreeSitter(parseTreeApi: ParseTreeApi): TreeSitter { }; } -function createScopeVisualizer( +function createScopeVisualizerCommandApi( ide: IDE, scopeProvider: ScopeProvider, -): ScopeVisualizer { +): ScopeVisualizerCommandApi { let scopeVisualizer: VscodeScopeVisualizer | undefined; - let currentScopeType: ScopeType | undefined; - - const listeners: ScopeVisualizerListener[] = []; return { start(scopeType: ScopeType, visualizationType: VisualizationType) { @@ -230,29 +171,11 @@ function createScopeVisualizer( visualizationType, ); scopeVisualizer.start(); - currentScopeType = scopeType; - listeners.forEach((listener) => listener(scopeType, visualizationType)); }, stop() { scopeVisualizer?.dispose(); scopeVisualizer = undefined; - currentScopeType = undefined; - listeners.forEach((listener) => listener(undefined, undefined)); - }, - - get scopeType() { - return currentScopeType; - }, - - onDidChangeScopeType(listener: ScopeVisualizerListener): Disposable { - listeners.push(listener); - - return { - dispose() { - listeners.splice(listeners.indexOf(listener), 1); - }, - }; }, }; } diff --git a/packages/cursorless-vscode/src/ide/vscode/VSCodeScopeVisualizer/VscodeFancyRangeHighlighter/generateDecorationsForCharacterRange/handleMultipleLines.test.ts b/packages/cursorless-vscode/src/ide/vscode/VSCodeScopeVisualizer/VscodeFancyRangeHighlighter/generateDecorationsForCharacterRange/handleMultipleLines.test.ts index b3677e14823..a482068c42a 100644 --- a/packages/cursorless-vscode/src/ide/vscode/VSCodeScopeVisualizer/VscodeFancyRangeHighlighter/generateDecorationsForCharacterRange/handleMultipleLines.test.ts +++ b/packages/cursorless-vscode/src/ide/vscode/VSCodeScopeVisualizer/VscodeFancyRangeHighlighter/generateDecorationsForCharacterRange/handleMultipleLines.test.ts @@ -1,4 +1,4 @@ -import assert from "assert"; +import assert = require("assert"); import { BorderStyle } from "../decorationStyle.types"; import { handleMultipleLines } from "./handleMultipleLines"; import { Range } from "@cursorless/common"; diff --git a/packages/cursorless-vscode/src/ide/vscode/VSCodeScopeVisualizer/VscodeIterationScopeVisualizer.ts b/packages/cursorless-vscode/src/ide/vscode/VSCodeScopeVisualizer/VscodeIterationScopeVisualizer.ts index da3dca3fefd..b160f8631c6 100644 --- a/packages/cursorless-vscode/src/ide/vscode/VSCodeScopeVisualizer/VscodeIterationScopeVisualizer.ts +++ b/packages/cursorless-vscode/src/ide/vscode/VSCodeScopeVisualizer/VscodeIterationScopeVisualizer.ts @@ -1,11 +1,7 @@ -import { - Disposable, - ScopeSupport, - TextEditor, - toCharacterRange, -} from "@cursorless/common"; +import { Disposable, TextEditor, toCharacterRange } from "@cursorless/common"; import { VscodeTextEditorImpl } from "../VscodeTextEditorImpl"; import { VscodeScopeVisualizer } from "./VscodeScopeVisualizer"; +import { ScopeSupport } from "@cursorless/cursorless-engine"; export class VscodeIterationScopeVisualizer extends VscodeScopeVisualizer { protected getScopeSupport(editor: TextEditor): ScopeSupport { diff --git a/packages/cursorless-vscode/src/ide/vscode/VSCodeScopeVisualizer/VscodeScopeTargetVisualizer.ts b/packages/cursorless-vscode/src/ide/vscode/VSCodeScopeVisualizer/VscodeScopeTargetVisualizer.ts index ae5c4eb2160..6303d6ee3cb 100644 --- a/packages/cursorless-vscode/src/ide/vscode/VSCodeScopeVisualizer/VscodeScopeTargetVisualizer.ts +++ b/packages/cursorless-vscode/src/ide/vscode/VSCodeScopeVisualizer/VscodeScopeTargetVisualizer.ts @@ -1,12 +1,11 @@ import { Disposable, GeneralizedRange, - ScopeSupport, - TargetRanges, TextEditor, toCharacterRange, } from "@cursorless/common"; -import { VscodeScopeVisualizer } from "./VscodeScopeVisualizer"; +import { ScopeSupport, TargetRanges } from "@cursorless/cursorless-engine"; +import { VscodeScopeVisualizer } from "."; import { VscodeTextEditorImpl } from "../VscodeTextEditorImpl"; abstract class VscodeScopeTargetVisualizer extends VscodeScopeVisualizer { diff --git a/packages/cursorless-vscode/src/ide/vscode/VSCodeScopeVisualizer/VscodeScopeVisualizer.ts b/packages/cursorless-vscode/src/ide/vscode/VSCodeScopeVisualizer/VscodeScopeVisualizer.ts index a5e9c69e586..862a75e41b0 100644 --- a/packages/cursorless-vscode/src/ide/vscode/VSCodeScopeVisualizer/VscodeScopeVisualizer.ts +++ b/packages/cursorless-vscode/src/ide/vscode/VSCodeScopeVisualizer/VscodeScopeVisualizer.ts @@ -1,12 +1,11 @@ import { Disposable, IDE, - ScopeProvider, - ScopeSupport, ScopeType, TextEditor, showError, } from "@cursorless/common"; +import { ScopeProvider, ScopeSupport } from "@cursorless/cursorless-engine"; import { ScopeRangeType, ScopeVisualizerColorConfig, diff --git a/packages/cursorless-vscode/src/ide/vscode/VSCodeScopeVisualizer/blendRangeTypeColors.ts b/packages/cursorless-vscode/src/ide/vscode/VSCodeScopeVisualizer/blendRangeTypeColors.ts index 6d1683710af..c884a49d360 100644 --- a/packages/cursorless-vscode/src/ide/vscode/VSCodeScopeVisualizer/blendRangeTypeColors.ts +++ b/packages/cursorless-vscode/src/ide/vscode/VSCodeScopeVisualizer/blendRangeTypeColors.ts @@ -1,4 +1,4 @@ -import tinycolor from "tinycolor2"; +import tinycolor = require("tinycolor2"); import { RangeTypeColors } from "./RangeTypeColors"; /** diff --git a/packages/cursorless-vscode/src/ide/vscode/VSCodeScopeVisualizer/createVscodeScopeVisualizer.ts b/packages/cursorless-vscode/src/ide/vscode/VSCodeScopeVisualizer/createVscodeScopeVisualizer.ts index aad6cd3ec90..4abd4b65150 100644 --- a/packages/cursorless-vscode/src/ide/vscode/VSCodeScopeVisualizer/createVscodeScopeVisualizer.ts +++ b/packages/cursorless-vscode/src/ide/vscode/VSCodeScopeVisualizer/createVscodeScopeVisualizer.ts @@ -1,4 +1,5 @@ -import { IDE, ScopeProvider, ScopeType } from "@cursorless/common"; +import { IDE, ScopeType } from "@cursorless/common"; +import { ScopeProvider } from "@cursorless/cursorless-engine"; import { VisualizationType } from "../../../ScopeVisualizerCommandApi"; import { VscodeIterationScopeVisualizer } from "./VscodeIterationScopeVisualizer"; import { diff --git a/packages/cursorless-vscode/src/ide/vscode/VscodeConfiguration.ts b/packages/cursorless-vscode/src/ide/vscode/VscodeConfiguration.ts index 96711b74c32..9a00993e5ec 100644 --- a/packages/cursorless-vscode/src/ide/vscode/VscodeConfiguration.ts +++ b/packages/cursorless-vscode/src/ide/vscode/VscodeConfiguration.ts @@ -1,4 +1,3 @@ -import * as os from "node:os"; import { HatStability } from "@cursorless/common"; import { get } from "lodash"; import * as vscode from "vscode"; @@ -16,9 +15,6 @@ const translators = { hatStability(value: string) { return HatStability[value as keyof typeof HatStability]; }, - snippetsDir: (value?: string) => { - return value != null ? evaluateStringVariables(value) : undefined; - }, }, }; @@ -46,32 +42,3 @@ export default class VscodeConfiguration implements Configuration { onDidChangeConfiguration = this.notifier.registerListener; } - -/** - * Gets a configuration value from vscode, with supported variables expanded. - * For example, `${userHome}` will be expanded to the user's home directory. - * - * We currently only support `${userHome}`. - * - * @param path The path to the configuration value, eg `cursorless.snippetsDir` - * @returns The configuration value, with variables expanded, or undefined if - * the value is not set - */ -export function vscodeGetConfigurationString(path: string): string | undefined { - const index = path.lastIndexOf("."); - const section = path.substring(0, index); - const field = path.substring(index + 1); - const value = vscode.workspace.getConfiguration(section).get(field); - return value != null ? evaluateStringVariables(value) : undefined; -} - -function evaluateStringVariables(value: string): string { - return value.replace(/\${(\w+)}/g, (match, variable) => { - switch (variable) { - case "userHome": - return os.homedir(); - default: - throw Error(`Unknown vscode configuration variable '${variable}'`); - } - }); -} diff --git a/packages/cursorless-vscode/src/ide/vscode/VscodeFileSystem.ts b/packages/cursorless-vscode/src/ide/vscode/VscodeFileSystem.ts index a18ef95bc8a..49da4f00179 100644 --- a/packages/cursorless-vscode/src/ide/vscode/VscodeFileSystem.ts +++ b/packages/cursorless-vscode/src/ide/vscode/VscodeFileSystem.ts @@ -2,92 +2,51 @@ import { Disposable, FileSystem, PathChangeListener, - RunMode, + walkFiles, } from "@cursorless/common"; -import { isAbsolute, join } from "path"; -import * as vscode from "vscode"; +import { stat } from "fs/promises"; +import { max } from "lodash"; export class VscodeFileSystem implements FileSystem { - public readonly cursorlessTalonStateJsonPath: string; - public readonly cursorlessCommandHistoryDirPath: string; + watchDir(path: string, onDidChange: PathChangeListener): Disposable { + // Just poll for now; we can take advantage of VSCode's sophisticated + // watcher later. Note that we would need to do a version check, as VSCode + // file watcher is only available in more recent versions of VSCode. + return new PollingFileSystemWatcher(path, onDidChange); + } +} + +const CHECK_INTERVAL_MS = 1000; - private decoder = new TextDecoder("utf-8"); +class PollingFileSystemWatcher implements Disposable { + private maxMtimeMs: number = -1; + private timer: NodeJS.Timer; constructor( - private readonly extensionContext: vscode.ExtensionContext, - private readonly runMode: RunMode, - private readonly cursorlessDir: string, + private readonly path: string, + private readonly onDidChange: PathChangeListener, ) { - this.cursorlessTalonStateJsonPath = join(this.cursorlessDir, "state.json"); - this.cursorlessCommandHistoryDirPath = join( - this.cursorlessDir, - "commandHistory", - ); + this.checkForChanges = this.checkForChanges.bind(this); + this.timer = setInterval(this.checkForChanges, CHECK_INTERVAL_MS); } - public async initialize(): Promise { - try { - await vscode.workspace.fs.createDirectory( - vscode.Uri.file(this.cursorlessDir), - ); - } catch (err) { - console.log("Cannot create cursorlessDir", this.cursorlessDir, err); - } - } + private async checkForChanges() { + const paths = await walkFiles(this.path); - /** - * Reads a file that comes bundled with Cursorless, with the utf-8 encoding. - * {@link path} is expected to be relative to the root of the extension - * bundle. If the file doesn't exist, returns `undefined`. - * - * Note that in development mode, it is possible to supply an absolute path to - * a file on the local filesystem, for things like hot-reloading. - * - * @param path The path of the file to read - * @returns The contents of path, decoded as UTF-8 - */ - public async readBundledFile(path: string): Promise { - try { - return this.decoder.decode( - await vscode.workspace.fs.readFile(this.resolveBundledPath(path)), - ); - } catch (err) { - if ( - err instanceof Error && - "code" in err && - err.code === "FileNotFound" - ) { - return undefined; - } - throw err; - } - } - - private resolveBundledPath(path: string) { - if (isAbsolute(path)) { - if (this.runMode !== "development") { - throw new Error( - "Absolute paths are not supported outside of development mode", - ); - } + const maxMtime = + max( + (await Promise.all(paths.map((file) => stat(file)))).map( + (stat) => stat.mtimeMs, + ), + ) ?? 0; - return vscode.Uri.file(path); + if (maxMtime > this.maxMtimeMs) { + this.maxMtimeMs = maxMtime; + this.onDidChange(); } - - return vscode.Uri.joinPath(this.extensionContext.extensionUri, path); } - public watchDir(path: string, onDidChange: PathChangeListener): Disposable { - // return { dispose: () => {} }; - // FIXME: Support globs? - const watcher = vscode.workspace.createFileSystemWatcher( - new vscode.RelativePattern(path, "**"), - ); - - watcher.onDidChange(onDidChange); - watcher.onDidCreate(onDidChange); - watcher.onDidDelete(onDidChange); - - return watcher; + dispose() { + clearInterval(this.timer); } } diff --git a/packages/cursorless-vscode/src/ide/vscode/VscodeFocusEditor.ts b/packages/cursorless-vscode/src/ide/vscode/VscodeFocusEditor.ts index 3507a5ce2b2..e336a0fbde2 100644 --- a/packages/cursorless-vscode/src/ide/vscode/VscodeFocusEditor.ts +++ b/packages/cursorless-vscode/src/ide/vscode/VscodeFocusEditor.ts @@ -9,8 +9,10 @@ import { } from "vscode"; import { getCellIndex } from "@cursorless/vscode-common"; import { getNotebookFromCellDocument } from "./notebook/notebook"; -import { focusNotebookCellLegacy } from "./notebook/notebookLegacy"; -import { isVscodeLegacyNotebookVersion } from "./notebook/notebook"; +import { + focusNotebookCellLegacy, + isVscodeLegacyNotebookVersion, +} from "./notebook/notebookLegacy"; import type { VscodeIDE } from "./VscodeIDE"; import { VscodeTextEditorImpl } from "./VscodeTextEditorImpl"; @@ -32,15 +34,6 @@ export default async function vscodeFocusEditor( ide: VscodeIDE, editor: VscodeTextEditorImpl, ) { - // Focusing the search editor brings focus back to the input field. - // FIXME: This is a hack. There is no way to focus the search editor. If we - // could figure out if the editor was not focused, we could issue - // `search.action.focusNextSearchResult`. - // Issue: https://github.com/cursorless-dev/cursorless/issues/1722 - if (editor.document.uri.scheme === "search-editor") { - return; - } - const viewColumn = getViewColumn(editor.vscodeEditor); if (viewColumn != null) { await commands.executeCommand(columnFocusCommands[viewColumn]); @@ -60,7 +53,7 @@ function getViewColumn(editor: TextEditor): ViewColumn | undefined { if (editor.viewColumn != null) { return editor.viewColumn; } - // FIXME: tabGroups is not available on older versions of vscode we still support. + // TODO: tabGroups is not available on older versions of vscode we still support. // Remove any cast as soon as version is updated. if (semver.lt(version, "1.67.0")) { return undefined; diff --git a/packages/cursorless-vscode/src/ide/vscode/VscodeGlobalState.ts b/packages/cursorless-vscode/src/ide/vscode/VscodeGlobalState.ts index 20e60d38fc9..760524d893a 100644 --- a/packages/cursorless-vscode/src/ide/vscode/VscodeGlobalState.ts +++ b/packages/cursorless-vscode/src/ide/vscode/VscodeGlobalState.ts @@ -1,9 +1,7 @@ +import type { ExtensionContext } from "vscode"; import type { State, StateData, StateKey } from "@cursorless/common"; import { STATE_DEFAULTS } from "@cursorless/common"; -import type { ExtensionContext } from "vscode"; import { VERSION_KEY } from "../../ReleaseNotes"; -import { DONT_SHOW_TALON_UPDATE_MESSAGE_KEY } from "../../ScopeTreeProvider"; -import { PERFORMED_PR_1868_SHAPE_UPDATE_INIT_KEY } from "./hats/performPr1868ShapeUpdateInit"; export default class VscodeGlobalState implements State { constructor(private extensionContext: ExtensionContext) { @@ -11,8 +9,6 @@ export default class VscodeGlobalState implements State { extensionContext.globalState.setKeysForSync([ ...Object.keys(STATE_DEFAULTS), VERSION_KEY, - PERFORMED_PR_1868_SHAPE_UPDATE_INIT_KEY, - DONT_SHOW_TALON_UPDATE_MESSAGE_KEY, ]); } diff --git a/packages/cursorless-vscode/src/ide/vscode/VscodeIDE.ts b/packages/cursorless-vscode/src/ide/vscode/VscodeIDE.ts index 9709cf4b57f..761bfb5fd9c 100644 --- a/packages/cursorless-vscode/src/ide/vscode/VscodeIDE.ts +++ b/packages/cursorless-vscode/src/ide/vscode/VscodeIDE.ts @@ -6,7 +6,6 @@ import { HighlightId, IDE, InputBoxOptions, - OpenUntitledTextDocumentOptions, OutdatedExtensionError, QuickPickOptions, RunMode, @@ -20,7 +19,7 @@ import { import { pull } from "lodash"; import { v4 as uuid } from "uuid"; import * as vscode from "vscode"; -import { ExtensionContext, WorkspaceFolder, window, workspace } from "vscode"; +import { ExtensionContext, window, workspace, WorkspaceFolder } from "vscode"; import { VscodeCapabilities } from "./VscodeCapabilities"; import VscodeClipboard from "./VscodeClipboard"; import VscodeConfiguration from "./VscodeConfiguration"; @@ -30,9 +29,9 @@ import VscodeGlobalState from "./VscodeGlobalState"; import VscodeHighlights, { HighlightStyle } from "./VscodeHighlights"; import VscodeMessages from "./VscodeMessages"; import { vscodeRunMode } from "./VscodeRunMode"; +import { vscodeShowQuickPick } from "./vscodeShowQuickPick"; import { VscodeTextDocumentImpl } from "./VscodeTextDocumentImpl"; import { VscodeTextEditorImpl } from "./VscodeTextEditorImpl"; -import { vscodeShowQuickPick } from "./vscodeShowQuickPick"; export class VscodeIDE implements IDE { readonly configuration: VscodeConfiguration; @@ -86,10 +85,6 @@ export class VscodeIDE implements IDE { return this.extensionContext.extensionPath; } - get cursorlessVersion(): string { - return this.extensionContext.extension.packageJSON.version; - } - get runMode(): RunMode { return vscodeRunMode(this.extensionContext); } @@ -120,18 +115,6 @@ export class VscodeIDE implements IDE { return editor as EditableTextEditor; } - public async findInDocument( - query: string, - editor?: TextEditor, - ): Promise { - if (editor != null && !editor.isActive) { - await this.getEditableTextEditor(editor).focus(); - } - await vscode.commands.executeCommand("editor.actions.findWithArgs", { - searchString: query, - }); - } - public async findInWorkspace(query: string): Promise { await vscode.commands.executeCommand("workbench.action.findInFiles", { query, @@ -143,13 +126,6 @@ export class VscodeIDE implements IDE { return this.fromVscodeEditor(await window.showTextDocument(textDocument)); } - public async openUntitledTextDocument( - options?: OpenUntitledTextDocumentOptions, - ): Promise { - const textDocument = await workspace.openTextDocument(options); - return this.fromVscodeEditor(await window.showTextDocument(textDocument)); - } - public async showInputBox( options?: InputBoxOptions, ): Promise { diff --git a/packages/cursorless-vscode/src/ide/vscode/hatStyles.types.ts b/packages/cursorless-vscode/src/ide/vscode/hatStyles.types.ts index b8a7021e92b..fcc81bc8a33 100644 --- a/packages/cursorless-vscode/src/ide/vscode/hatStyles.types.ts +++ b/packages/cursorless-vscode/src/ide/vscode/hatStyles.types.ts @@ -10,16 +10,16 @@ export const HAT_COLORS = [ ] as const; export const HAT_NON_DEFAULT_SHAPES = [ - "bolt", - "curve", + "ex", "fox", - "frame", - "play", "wing", "hole", - "ex", - "crosshairs", + "frame", + "curve", "eye", + "play", + "bolt", + "crosshairs", ] as const; export const HAT_SHAPES = ["default", ...HAT_NON_DEFAULT_SHAPES] as const; diff --git a/packages/cursorless-vscode/src/ide/vscode/hats/VscodeHatRenderer.ts b/packages/cursorless-vscode/src/ide/vscode/hats/VscodeHatRenderer.ts index 9ad15544cdb..9159998e648 100644 --- a/packages/cursorless-vscode/src/ide/vscode/hats/VscodeHatRenderer.ts +++ b/packages/cursorless-vscode/src/ide/vscode/hats/VscodeHatRenderer.ts @@ -1,16 +1,13 @@ import { Listener, - Messages, Notifier, PathChangeListener, walkFiles, } from "@cursorless/common"; -import { VscodeApi } from "@cursorless/vscode-common"; import { cloneDeep, isEqual } from "lodash"; -import * as fs from "fs/promises"; +import * as fs from "node:fs"; import * as path from "node:path"; import * as vscode from "vscode"; -import { vscodeGetConfigurationString } from "../VscodeConfiguration"; import VscodeEnabledHatStyleManager, { ExtendedHatStyleMap, } from "../VscodeEnabledHatStyleManager"; @@ -23,7 +20,6 @@ import { IndividualHatAdjustmentMap, defaultShapeAdjustments, } from "./shapeAdjustments"; -import { performPr1868ShapeUpdateInit } from "./performPr1868ShapeUpdateInit"; const CURSORLESS_HAT_SHAPES_SUFFIX = ".svg"; @@ -44,34 +40,33 @@ const hatConfigSections = [ "cursorless.individualHatAdjustments", ]; -const hatShapesDirSettingId = "cursorless.private.hatShapesDir"; +/** + * Maintains the VSCode decoration type objects corresponding to each hat style. + * This class is responsible for the actual svgs / colors used to render the + * hats. The decision about which hat styles should be available is up to + * {@link VscodeEnabledHatStyles} + */ + +const SETTING_SECTION_HAT_SHAPES_DIR = "cursorless.private"; +const SETTING_NAME_HAT_SHAPES_DIR = "hatShapesDir"; +const hatShapesDirSettingId = `${SETTING_SECTION_HAT_SHAPES_DIR}.${SETTING_NAME_HAT_SHAPES_DIR}`; interface SvgInfo { svg: string; svgHeightPx: number; svgWidthPx: number; - strokeWidth: number; } -/** - * Maintains the VSCode decoration type objects corresponding to each hat style. - * This class is responsible for the actual svgs / colors used to render the - * hats. The decision about which hat styles should be available is up to - * {@link VscodeEnabledHatStyles} - */ export default class VscodeHatRenderer { private decorationMap!: HatDecorationMap; private disposables: vscode.Disposable[] = []; private notifier: Notifier<[]> = new Notifier(); private lastSeenEnabledHatStyles: ExtendedHatStyleMap = {}; private hatsDirWatcherDisposable?: vscode.Disposable; - private hatShapeOverrides: Record = {}; - private decoder = new TextDecoder("utf-8"); + private hatShapeOverrides: Record = {}; constructor( - private vscodeApi: VscodeApi, private extensionContext: vscode.ExtensionContext, - private messages: Messages, private enabledHatStyles: VscodeEnabledHatStyleManager, private fontMeasurements: FontMeasurements, ) { @@ -129,18 +124,18 @@ export default class VscodeHatRenderer { private async updateHatsDirWatcher() { this.hatsDirWatcherDisposable?.dispose(); - const hatsDir = vscodeGetConfigurationString(hatShapesDirSettingId); + + const hatsDir = vscode.workspace + .getConfiguration(SETTING_SECTION_HAT_SHAPES_DIR) + .get(SETTING_NAME_HAT_SHAPES_DIR)!; if (hatsDir) { await this.updateShapeOverrides(hatsDir); - try { - await fs.access(hatsDir); + if (fs.existsSync(hatsDir)) { this.hatsDirWatcherDisposable = watchDir(hatsDir, () => this.updateShapeOverrides(hatsDir), ); - } catch (e) { - console.error("cannot watch hatsDir", hatsDir, e); } } else { this.hatShapeOverrides = {}; @@ -154,10 +149,7 @@ export default class VscodeHatRenderer { for (const file of files) { const name = path.basename(file, CURSORLESS_HAT_SHAPES_SUFFIX); - this.hatShapeOverrides[name] = vscode.Uri.from({ - scheme: "file", - path: file, - }); + this.hatShapeOverrides[name] = file; } await this.recomputeDecorations(); @@ -203,52 +195,35 @@ export default class VscodeHatRenderer { .getConfiguration("cursorless") .get("individualHatAdjustments")!; - performPr1868ShapeUpdateInit( - this.extensionContext, - this.vscodeApi, - this.messages, - this.enabledHatStyles.hatStyleMap, - userSizeAdjustment, - userVerticalOffset, - userIndividualAdjustments, - ); - const hatSvgMap = Object.fromEntries( - await Promise.all( - HAT_SHAPES.map(async (shape) => { - const { sizeAdjustment = 0, verticalOffset = 0 } = - defaultShapeAdjustments[shape]; - - const { - sizeAdjustment: userIndividualSizeAdjustment = 0, - verticalOffset: userIndividualVerticalOffset = 0, - } = userIndividualAdjustments[shape] ?? {}; - - const scaleFactor = - 1 + - (sizeAdjustment + - userSizeAdjustment + - userIndividualSizeAdjustment) / - 100; - - const finalVerticalOffsetEm = - (verticalOffset + - userVerticalOffset + - userIndividualVerticalOffset) / + HAT_SHAPES.map((shape) => { + const { sizeAdjustment = 0, verticalOffset = 0 } = + defaultShapeAdjustments[shape]; + + const { + sizeAdjustment: userIndividualSizeAdjustment = 0, + verticalOffset: userIndividualVerticalOffset = 0, + } = userIndividualAdjustments[shape] ?? {}; + + const scaleFactor = + 1 + + (sizeAdjustment + userSizeAdjustment + userIndividualSizeAdjustment) / 100; - return [ + const finalVerticalOffsetEm = + (verticalOffset + userVerticalOffset + userIndividualVerticalOffset) / + 100; + + return [ + shape, + this.processSvg( + this.fontMeasurements, shape, - await this.processSvg( - this.fontMeasurements, - shape, - scaleFactor, - defaultShapeAdjustments[shape].strokeFactor ?? 1, - finalVerticalOffsetEm, - ), - ]; - }), - ), + scaleFactor, + finalVerticalOffsetEm, + ), + ]; + }), ); this.decorationMap = Object.fromEntries( @@ -263,7 +238,7 @@ export default class VscodeHatRenderer { ]; } - const { svgWidthPx, svgHeightPx } = svgInfo; + const { svg, svgWidthPx, svgHeightPx } = svgInfo; const { light, dark } = getHatThemeColors(color); @@ -273,18 +248,12 @@ export default class VscodeHatRenderer { rangeBehavior: vscode.DecorationRangeBehavior.ClosedClosed, light: { before: { - contentIconPath: this.constructColoredSvgDataUri( - svgInfo, - light, - ), + contentIconPath: this.constructColoredSvgDataUri(svg, light), }, }, dark: { before: { - contentIconPath: this.constructColoredSvgDataUri( - svgInfo, - dark, - ), + contentIconPath: this.constructColoredSvgDataUri(svg, dark), }, }, before: { @@ -328,52 +297,17 @@ export default class VscodeHatRenderer { return isOk; } - private constructColoredSvgDataUri(svgInfo: SvgInfo, color: string) { - const { svg: originalSvg } = svgInfo; - // If color contains a dash, the second part is a stroke. - // If you are code spelunking and have found this undocumented (and thus potentially transient) feature, - // please subscribe to https://github.com/cursorless-dev/cursorless/pull/1810 - // so that you can be notified if/when it changes or is removed. - const [fill, stroke] = color.split("-"); - let svg = originalSvg - .replace(/fill="(?!none)[^"]+"/g, `fill="${fill}"`) - .replace(/fill:(?!none)[^;]+;/g, `fill:${fill};`) + private constructColoredSvgDataUri(originalSvg: string, color: string) { + const svg = originalSvg + .replace(/fill="(?!none)[^"]+"/g, `fill="${color}"`) + .replace(/fill:(?!none)[^;]+;/g, `fill:${color};`) .replace(/\r?\n/g, " "); - if (stroke !== undefined) { - svg = this.addInnerStrokeToSvg(svgInfo, svg, stroke); - } const encoded = encodeURIComponent(svg); return vscode.Uri.parse(`data:image/svg+xml;utf8,${encoded}`); } - private addInnerStrokeToSvg( - svgInfo: SvgInfo, - svg: string, - stroke: string, - ): string { - // All hat svgs have exactly one path element. Extract it. - const pathRegex = /]*d="([^"]+)"[^>]*\/>/; - const pathMatch = pathRegex.exec(svg); - if (!pathMatch) { - console.error(`Could not find path in svg: ${svg}`); - return svg; - } - const pathData = pathMatch[1]; - const pathEnd = pathMatch.index! + pathMatch[0].length; - - // Construct the stroke path and clipPath elements - const clipPathElem = ``; - const strokePathElem = ``; - - // Insert the elements into the SVG after the original path. - - return ( - svg.slice(0, pathEnd) + clipPathElem + strokePathElem + svg.slice(pathEnd) - ); - } - /** * Creates an SVG from the hat SVG that pads, offsets and scales it to end up * in the right size / place relative to the character it will be placed over. @@ -382,28 +316,24 @@ export default class VscodeHatRenderer { * @param fontMeasurements Info about the user's font * @param shape The hat shape to process * @param scaleFactor How much to scale the hat - * @param strokeFactor How much to scale the width of the stroke * @param hatVerticalOffsetEm How far off top of characters should hats be * @returns An object with the new SVG and its measurements */ - private async processSvg( + private processSvg( fontMeasurements: FontMeasurements, shape: HatShape, scaleFactor: number, - strokeFactor: number, hatVerticalOffsetEm: number, - ): Promise { + ): SvgInfo | null { const iconPath = this.hatShapeOverrides[shape] ?? - vscode.Uri.joinPath( - this.extensionContext.extensionUri, + path.join( + this.extensionContext.extensionPath, "images", "hats", `${shape}.svg`, ); - const rawSvg = this.decoder.decode( - await vscode.workspace.fs.readFile(iconPath), - ); + const rawSvg = fs.readFileSync(iconPath, "utf8"); const { characterWidth, characterHeight, fontSize } = fontMeasurements; if (!this.checkSvg(shape, rawSvg)) { @@ -454,14 +384,10 @@ export default class VscodeHatRenderer { `height="${svgHeightPx}px">` + `${innerSvg}`; - const strokeWidth = - (1.4 * strokeFactor * originalViewBoxWidth) / svgWidthPx; - return { svg, svgHeightPx, svgWidthPx, - strokeWidth, }; } @@ -493,9 +419,10 @@ function watchDir( new vscode.RelativePattern(path, `**/*${CURSORLESS_HAT_SHAPES_SUFFIX}`), ); - hatsDirWatcher.onDidChange(onDidChange); - hatsDirWatcher.onDidCreate(onDidChange); - hatsDirWatcher.onDidDelete(onDidChange); - - return hatsDirWatcher; + return vscode.Disposable.from( + hatsDirWatcher, + hatsDirWatcher.onDidChange(onDidChange), + hatsDirWatcher.onDidCreate(onDidChange), + hatsDirWatcher.onDidDelete(onDidChange), + ); } diff --git a/packages/cursorless-vscode/src/ide/vscode/hats/VscodeHats.ts b/packages/cursorless-vscode/src/ide/vscode/hats/VscodeHats.ts index c672c29634c..255a7ab3c73 100644 --- a/packages/cursorless-vscode/src/ide/vscode/hats/VscodeHats.ts +++ b/packages/cursorless-vscode/src/ide/vscode/hats/VscodeHats.ts @@ -8,7 +8,7 @@ import { Range, TextEditor, } from "@cursorless/common"; -import { toVscodeRange, VscodeApi } from "@cursorless/vscode-common"; +import { toVscodeRange } from "@cursorless/vscode-common"; import * as vscode from "vscode"; import { Disposable } from "vscode"; import { VscodeHatStyleName } from "../hatStyles.types"; @@ -27,7 +27,6 @@ export class VscodeHats implements Hats { constructor( private ide: VscodeIDE, - vscodeApi: VscodeApi, extensionContext: vscode.ExtensionContext, fontMeasurements: FontMeasurements, ) { @@ -35,9 +34,7 @@ export class VscodeHats implements Hats { extensionContext, ); this.hatRenderer = new VscodeHatRenderer( - vscodeApi, extensionContext, - ide.messages, this.enabledHatStyleManager, fontMeasurements, ); diff --git a/packages/cursorless-vscode/src/ide/vscode/hats/performPr1868ShapeUpdateInit.ts b/packages/cursorless-vscode/src/ide/vscode/hats/performPr1868ShapeUpdateInit.ts deleted file mode 100644 index dbcd4d388ac..00000000000 --- a/packages/cursorless-vscode/src/ide/vscode/hats/performPr1868ShapeUpdateInit.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { Messages, showInfo } from "@cursorless/common"; -import { VscodeApi } from "@cursorless/vscode-common"; -import * as vscode from "vscode"; -import { ExtendedHatStyleMap } from "../VscodeEnabledHatStyleManager"; -import { IndividualHatAdjustmentMap } from "./shapeAdjustments"; - -/** - * We set this key in global state the first time they user gets the new shapes from #1868. We use this to - * determine whether or not to show them messages about resetting their hat adjustments. - */ -export const PERFORMED_PR_1868_SHAPE_UPDATE_INIT_KEY = - "performedPr1868ShapeUpdateInit"; - -/** - * If this is the first time the user has gotten the new shapes from #1868, we - * show them a message about resetting their hat adjustments if they have done - * any customization. - * - * We can probably remove this after a while. - */ -export async function performPr1868ShapeUpdateInit( - extensionContext: vscode.ExtensionContext, - vscodeApi: VscodeApi, - messages: Messages, - hatStyleMap: ExtendedHatStyleMap, - userSizeAdjustment: number, - userVerticalOffset: number, - userIndividualAdjustments: IndividualHatAdjustmentMap, -) { - if ( - // Only show in focused window - !vscodeApi.window.state.focused || - // Only run on initial update to new hat shapes - extensionContext.globalState.get( - PERFORMED_PR_1868_SHAPE_UPDATE_INIT_KEY, - ) - ) { - return; - } - - // Whether or not we end up showing anything, we don't want to show this - // message after the first time they get the new hats. If they make adjustments - // in the future, they've done so with the new hats in mind. - await extensionContext.globalState.update( - PERFORMED_PR_1868_SHAPE_UPDATE_INIT_KEY, - true, - ); - - let shownMessage = false; - - // If they have any individual adjustments, we should tell them to reset them - if ( - Object.values(userIndividualAdjustments) - .flatMap((entry) => Object.values(entry)) - .some((value) => value != null && value !== 0) - ) { - shownMessage = true; - const PERFORM_RESET = "Perform reset"; - const TAKE_ME_THERE = "Take me there"; - const result = await showInfo( - messages, - "maybeUpdateIndividualHatSettings", - "The hat shapes have been updated; you probably want to reset your individual hat adjustments.", - PERFORM_RESET, - TAKE_ME_THERE, - ); - - if (result === TAKE_ME_THERE) { - await vscode.commands.executeCommand( - "workbench.action.openSettingsJson", - { - revealSetting: { key: "cursorless.individualHatAdjustments" }, - }, - ); - } else if (result === PERFORM_RESET) { - await vscode.workspace - .getConfiguration("cursorless") - .update("individualHatAdjustments", undefined, true); - } - } - - // If they have any global adjustments, they may want to tweak them - if ( - (userSizeAdjustment !== 0 || userVerticalOffset !== 0) && - // Don't bother if they have no shapes enabled, as the default shape - // is similar enough in size / offset to the old default shape - hasAnyShapesEnabled(hatStyleMap) - ) { - const TAKE_ME_THERE = "Take me there"; - const message = shownMessage - ? "You may also want to tweak your global hat settings." - : "The hat shapes have been updated; you may want to tweak your hat settings."; - - const result = await showInfo( - messages, - "maybeUpdateGlobalHatSettings", - message, - TAKE_ME_THERE, - ); - - if (result === TAKE_ME_THERE) { - await vscode.commands.executeCommand( - "workbench.action.openSettings", - `@ext:${extensionContext.extension.id}`, - ); - } - } -} - -function hasAnyShapesEnabled(hatStyleMap: ExtendedHatStyleMap) { - // A bit of a hack, but if they have any shapes enabled, they'll have keys - // like `blue-fox`, which contain a `-`. If they don't have any shapes - // enabled, they'll only have keys like `blue`, `default, etc. - return Object.keys(hatStyleMap).some((key) => key.includes("-")); -} diff --git a/packages/cursorless-vscode/src/ide/vscode/hats/shapeAdjustments.ts b/packages/cursorless-vscode/src/ide/vscode/hats/shapeAdjustments.ts index 042341f16ec..8d0e28bfa37 100644 --- a/packages/cursorless-vscode/src/ide/vscode/hats/shapeAdjustments.ts +++ b/packages/cursorless-vscode/src/ide/vscode/hats/shapeAdjustments.ts @@ -2,39 +2,54 @@ import { HatShape } from "../hatStyles.types"; export interface HatAdjustments { sizeAdjustment?: number; - strokeFactor?: number; verticalOffset?: number; } export type IndividualHatAdjustmentMap = Record; -export const DEFAULT_HAT_HEIGHT_EM = 0.36; -export const DEFAULT_VERTICAL_OFFSET_EM = 0.05; +export const DEFAULT_HAT_HEIGHT_EM = 0.29; +export const DEFAULT_VERTICAL_OFFSET_EM = 0.032; export const defaultShapeAdjustments: IndividualHatAdjustmentMap = { default: { - sizeAdjustment: -30, + sizeAdjustment: -14, + verticalOffset: -0.35, }, ex: { - sizeAdjustment: -12.5, + sizeAdjustment: 10, }, fox: { - sizeAdjustment: -5, + sizeAdjustment: 10, }, wing: { - sizeAdjustment: -2.5, + sizeAdjustment: 15.5, + verticalOffset: 1.1, }, hole: { - strokeFactor: 0.7, + sizeAdjustment: 32.5, + verticalOffset: -2, }, frame: { - sizeAdjustment: -20, + sizeAdjustment: -15, + verticalOffset: -2.25, }, curve: { - verticalOffset: -5, + sizeAdjustment: -21, + verticalOffset: -3.15, + }, + eye: { + sizeAdjustment: -6.5, + verticalOffset: -1, + }, + play: { + sizeAdjustment: -8, + verticalOffset: -0.5, + }, + bolt: { + sizeAdjustment: 22.5, + }, + crosshairs: { + sizeAdjustment: 29.5, + verticalOffset: -1, }, - eye: {}, - play: {}, - bolt: {}, - crosshairs: {}, }; diff --git a/packages/cursorless-vscode/src/ide/vscode/notebook/notebook.ts b/packages/cursorless-vscode/src/ide/vscode/notebook/notebook.ts index 8ebbb01664a..ddb0563682d 100644 --- a/packages/cursorless-vscode/src/ide/vscode/notebook/notebook.ts +++ b/packages/cursorless-vscode/src/ide/vscode/notebook/notebook.ts @@ -1,12 +1,8 @@ -import * as semver from "semver"; -import { version } from "vscode"; -import { TextDocument } from "vscode"; -import { getNotebookFromCellDocumentLegacy } from "./notebookLegacy"; -import { getNotebookFromCellDocumentCurrent } from "./notebookCurrent"; - -export function isVscodeLegacyNotebookVersion() { - return semver.lt(version, "1.68.0"); -} +import { NotebookCell, TextDocument, window } from "vscode"; +import { + getNotebookFromCellDocumentLegacy, + isVscodeLegacyNotebookVersion, +} from "./notebookLegacy"; /** * Given a document corresponding to a single cell, retrieve the notebook @@ -18,7 +14,25 @@ export function isVscodeLegacyNotebookVersion() { export function getNotebookFromCellDocument(document: TextDocument) { if (isVscodeLegacyNotebookVersion()) { return getNotebookFromCellDocumentLegacy(document); - } else { - return getNotebookFromCellDocumentCurrent(document); } + + // FIXME: All these type casts are necessary because we've pinned VSCode + // version type defs. Can remove them once we are using more recent type defs + const { notebookEditor } = + ((window as any).visibleNotebookEditors as any[]) + .flatMap((notebookEditor: any) => + ( + ( + notebookEditor.document ?? notebookEditor.notebook + ).getCells() as NotebookCell[] + ).map((cell) => ({ + notebookEditor, + cell, + })), + ) + .find( + ({ cell }) => cell.document.uri.toString() === document.uri.toString(), + ) ?? {}; + + return notebookEditor; } diff --git a/packages/cursorless-vscode/src/ide/vscode/notebook/notebookCurrent.ts b/packages/cursorless-vscode/src/ide/vscode/notebook/notebookCurrent.ts deleted file mode 100644 index fb4e7d3edf5..00000000000 --- a/packages/cursorless-vscode/src/ide/vscode/notebook/notebookCurrent.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { NotebookCell, TextDocument, window } from "vscode"; - -/** Gets the notebook containing a text document using >=1.68.0 VSCode notebook api **/ -export function getNotebookFromCellDocumentCurrent(document: TextDocument) { - // FIXME: All these type casts are necessary because we've pinned VSCode - // version type defs. Can remove them once we are using more recent type defs - const { notebookEditor } = - ((window as any).visibleNotebookEditors as any[]) - .flatMap((notebookEditor: any) => - ( - ( - notebookEditor.document ?? notebookEditor.notebook - ).getCells() as NotebookCell[] - ).map((cell) => ({ - notebookEditor, - cell, - })), - ) - .find( - ({ cell }) => cell.document.uri.toString() === document.uri.toString(), - ) ?? {}; - - return notebookEditor; -} diff --git a/packages/cursorless-vscode/src/ide/vscode/notebook/notebookLegacy.ts b/packages/cursorless-vscode/src/ide/vscode/notebook/notebookLegacy.ts index a33115a9112..610c13b2692 100644 --- a/packages/cursorless-vscode/src/ide/vscode/notebook/notebookLegacy.ts +++ b/packages/cursorless-vscode/src/ide/vscode/notebook/notebookLegacy.ts @@ -1,9 +1,15 @@ import { getCellIndex } from "@cursorless/vscode-common"; import { range } from "lodash"; -import { commands, NotebookDocument, TextDocument } from "vscode"; +import * as semver from "semver"; +import { commands, NotebookDocument, TextDocument, version } from "vscode"; import { toVscodeEditor } from "../toVscodeEditor"; import type { VscodeIDE } from "../VscodeIDE"; import type { VscodeTextEditorImpl } from "../VscodeTextEditorImpl"; +import { getNotebookFromCellDocument } from "./notebook"; + +export function isVscodeLegacyNotebookVersion() { + return semver.lt(version, "1.68.0"); +} export async function focusNotebookCellLegacy( ide: VscodeIDE, @@ -17,10 +23,10 @@ export async function focusNotebookCellLegacy( const vscodeActiveEditor = toVscodeEditor(activeTextEditor); - const editorNotebook = getNotebookFromCellDocumentLegacy( + const editorNotebook = getNotebookFromCellDocument( editor.vscodeEditor.document, ); - const activeEditorNotebook = getNotebookFromCellDocumentLegacy( + const activeEditorNotebook = getNotebookFromCellDocument( vscodeActiveEditor.document, ); diff --git a/packages/cursorless-vscode/src/keyboard/KeyboardActionType.ts b/packages/cursorless-vscode/src/keyboard/KeyboardActionType.ts deleted file mode 100644 index 6cd7bbaf409..00000000000 --- a/packages/cursorless-vscode/src/keyboard/KeyboardActionType.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { ActionType, actionNames } from "@cursorless/common"; - -// This file contains types defining the allowable identifiers for actions in -// user keyboard config settings. It is a modified version of the default action -// identifiers from @cursorless/common, with the addition of the "wrap" action -// that is designed to function like the "wrap" spoken form (ie use the same spoken -// form for both snippet and delimiter wrapping). - -const extraKeyboardActionNames = ["wrap"] as const; -const excludedKeyboardActionNames = [ - "wrapWithPairedDelimiter", - "wrapWithSnippet", -] as const; -const complexKeyboardActionTypes = ["wrap"] as const; - -type ExtraKeyboardActionType = (typeof extraKeyboardActionNames)[number]; -type ExcludedKeyboardActionType = (typeof excludedKeyboardActionNames)[number]; -type ComplexKeyboardActionType = (typeof complexKeyboardActionTypes)[number]; -export type SimpleKeyboardActionType = Exclude< - KeyboardActionType, - ComplexKeyboardActionType ->; - -export type SpecificKeyboardActionDescriptor = { - actionId: T; - exitCursorlessMode: boolean; -}; - -export type PolymorphicKeyboardActionDescriptor = - | KeyboardActionType - | SpecificKeyboardActionDescriptor; - -export type SimpleKeyboardActionDescriptor = - SpecificKeyboardActionDescriptor; - -export type KeyboardActionType = - | Exclude - | ExtraKeyboardActionType; - -const keyboardActionNames: KeyboardActionType[] = [ - ...actionNames.filter( - ( - actionName, - ): actionName is Exclude => - !excludedKeyboardActionNames.includes(actionName as any), - ), - ...extraKeyboardActionNames, -]; - -export const simpleKeyboardActionNames = keyboardActionNames.filter( - (actionName): actionName is SimpleKeyboardActionType => - !complexKeyboardActionTypes.includes( - actionName as ComplexKeyboardActionType, - ), -); diff --git a/packages/cursorless-vscode/src/keyboard/KeyboardCommandHandler.ts b/packages/cursorless-vscode/src/keyboard/KeyboardCommandHandler.ts deleted file mode 100644 index 0d4114f9efa..00000000000 --- a/packages/cursorless-vscode/src/keyboard/KeyboardCommandHandler.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { Modifier, SurroundingPairName } from "@cursorless/common"; -import * as vscode from "vscode"; -import { HatColor, HatShape } from "../ide/vscode/hatStyles.types"; -import { - SimpleKeyboardActionDescriptor, - SpecificKeyboardActionDescriptor, -} from "./KeyboardActionType"; -import KeyboardCommandsTargeted from "./KeyboardCommandsTargeted"; -import { ModalVscodeCommandDescriptor } from "./TokenTypes"; -import { surroundingPairsDelimiters } from "@cursorless/cursorless-engine"; -import { isString } from "lodash"; - -/** - * This class defines the keyboard commands available to our modal keyboard - * mode. - * - * Each method in this class corresponds to a top-level rule in the grammar. The - * method name is the name of the rule, and the method's argument is the rule's - * `arg` output. - * - * We try to keep all logic out of the grammar and use this class instead - * because: - * - * 1. The grammar has no type information, autocomplete, or autoformatting - * 2. If the grammar is defined by just a list of keys, as it is today, we can - * actually detect partial arguments as they're being constructed and display - * them to the user - * - * Thus, we use this class as a simple layer where we have strong types and can - * do some simple logic. - */ -export class KeyboardCommandHandler { - constructor(private targeted: KeyboardCommandsTargeted) {} - - targetDecoratedMark({ decoratedMark, mode }: DecoratedMarkArg) { - this.targeted.targetDecoratedMark({ ...decoratedMark, mode }); - } - - async vscodeCommand({ - command: commandInfo, - }: { - command: ModalVscodeCommandDescriptor; - }) { - // plain ol' string command id - if (isString(commandInfo)) { - await vscode.commands.executeCommand(commandInfo); - return; - } - - // structured command - const { - commandId, - args, - executeAtTarget, - keepChangedSelection, - exitCursorlessMode, - } = commandInfo; - - if (executeAtTarget) { - await this.targeted.performVscodeCommandOnTarget(commandId, { - args, - keepChangedSelection, - exitCursorlessMode, - }); - return; - } - - await vscode.commands.executeCommand(commandId, ...(args ?? [])); - } - - performSimpleActionOnTarget({ - actionDescriptor, - }: { - actionDescriptor: SimpleKeyboardActionDescriptor; - }) { - this.targeted.performSimpleActionOnTarget(actionDescriptor); - } - - performWrapActionOnTarget({ actionDescriptor, delimiter }: WrapActionArg) { - const [left, right] = surroundingPairsDelimiters[delimiter]!; - this.targeted.performActionOnTarget( - (target) => ({ - name: "wrapWithPairedDelimiter", - target, - left, - right, - }), - actionDescriptor, - ); - } - - modifyTarget({ modifier }: { modifier: Modifier }) { - this.targeted.targetModifier(modifier); - } -} - -interface DecoratedMarkArg { - decoratedMark: { - color?: HatColor; - shape?: HatShape; - }; - mode: "replace" | "extend" | "append"; -} - -interface WrapActionArg { - actionDescriptor: SpecificKeyboardActionDescriptor<"wrap">; - delimiter: SurroundingPairName; -} diff --git a/packages/cursorless-vscode/src/keyboard/KeyboardCommandTypeHelpers.ts b/packages/cursorless-vscode/src/keyboard/KeyboardCommandTypeHelpers.ts deleted file mode 100644 index 2091dfa3f2e..00000000000 --- a/packages/cursorless-vscode/src/keyboard/KeyboardCommandTypeHelpers.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { KeyboardCommandHandler } from "./KeyboardCommandHandler"; - -/** - * Maps from the name of a method in KeyboardCommandHandler to the type of its - * argument. - */ -export type KeyboardCommandArgTypes = { - [K in keyof KeyboardCommandHandler]: KeyboardCommandHandler[K] extends ( - arg: infer T, - ) => void - ? T - : never; -}; - -export type KeyboardCommandTypeMap = { - [K in keyof KeyboardCommandHandler]: { - type: K; - arg: KeyboardCommandArgTypes[K]; - }; -}; - -export type KeyboardCommand = { - type: T; - arg: KeyboardCommandArgTypes[T]; -}; - -// Ensure that all methods in KeyboardCommandHandler take an object as their -// first argument, and return void or Promise. Note that the first check -// may look backwards, because the arg type is contravariant, so the 'extends' -// needs to be flipped. -// eslint-disable-next-line @typescript-eslint/no-unused-vars -function assertExtends
    () {} -assertExtends< - Record never>, - Pick ->; -assertExtends< - Pick, - Record void | Promise> ->; diff --git a/packages/cursorless-vscode/src/keyboard/KeyboardCommands.ts b/packages/cursorless-vscode/src/keyboard/KeyboardCommands.ts index e24a77eaef0..445e5be4e25 100644 --- a/packages/cursorless-vscode/src/keyboard/KeyboardCommands.ts +++ b/packages/cursorless-vscode/src/keyboard/KeyboardCommands.ts @@ -3,7 +3,6 @@ import KeyboardCommandsModal from "./KeyboardCommandsModal"; import KeyboardCommandsTargeted from "./KeyboardCommandsTargeted"; import KeyboardHandler from "./KeyboardHandler"; import { StatusBarItem } from "../StatusBarItem"; -import { VscodeApi } from "@cursorless/vscode-common"; export class KeyboardCommands { targeted: KeyboardCommandsTargeted; @@ -11,8 +10,7 @@ export class KeyboardCommands { keyboardHandler: KeyboardHandler; private constructor( - context: ExtensionContext, - vscodeApi: VscodeApi, + private context: ExtensionContext, statusBarItem: StatusBarItem, ) { this.keyboardHandler = new KeyboardHandler(context, statusBarItem); @@ -21,20 +19,11 @@ export class KeyboardCommands { context, this.targeted, this.keyboardHandler, - vscodeApi, ); } - static create( - context: ExtensionContext, - vscodeApi: VscodeApi, - statusBarItem: StatusBarItem, - ) { - const keyboardCommands = new KeyboardCommands( - context, - vscodeApi, - statusBarItem, - ); + static create(context: ExtensionContext, statusBarItem: StatusBarItem) { + const keyboardCommands = new KeyboardCommands(context, statusBarItem); keyboardCommands.init(); return keyboardCommands; } diff --git a/packages/cursorless-vscode/src/keyboard/KeyboardCommandsModal.ts b/packages/cursorless-vscode/src/keyboard/KeyboardCommandsModal.ts index 53a0fe1e2b9..e08f12f7160 100644 --- a/packages/cursorless-vscode/src/keyboard/KeyboardCommandsModal.ts +++ b/packages/cursorless-vscode/src/keyboard/KeyboardCommandsModal.ts @@ -1,18 +1,22 @@ -import { pick, sortedUniq, toPairs } from "lodash"; -import { Grammar, Parser } from "nearley"; +import { keys, merge, toPairs } from "lodash"; import * as vscode from "vscode"; -import { KeyboardCommandsModalLayer } from "./KeyboardCommandsModalLayer"; +import { + DEFAULT_ACTION_KEYMAP, + DEFAULT_COLOR_KEYMAP, + Keymap, + DEFAULT_SCOPE_KEYMAP, + DEFAULT_SHAPE_KEYMAP, +} from "./defaultKeymaps"; import KeyboardCommandsTargeted from "./KeyboardCommandsTargeted"; -import { KeyDescriptor } from "./TokenTypeHelpers"; -import { TokenTypeKeyMapMap } from "./TokenTypeHelpers"; import KeyboardHandler from "./KeyboardHandler"; -import grammar from "./grammar/generated/grammar"; -import { getAcceptableTokenTypes } from "./grammar/getAcceptableTokenTypes"; -import { KeyboardCommandHandler } from "./KeyboardCommandHandler"; -import { getTokenTypeKeyMaps } from "./getTokenTypeKeyMaps"; -import { VscodeApi } from "@cursorless/vscode-common"; -import { KeyboardConfig } from "./KeyboardConfig"; -import { CompositeKeyMap } from "@cursorless/common"; + +type SectionName = "actions" | "scopes" | "colors" | "shapes"; + +interface KeyHandler { + sectionName: SectionName; + value: T; + handleValue(): Promise; +} /** * Defines a mode to use with a modal version of Cursorless keyboard. @@ -29,29 +33,18 @@ export default class KeyboardCommandsModal { * Merged map from all the different sections of the key map (eg actions, * colors, etc). */ - private currentLayer!: KeyboardCommandsModalLayer; - private layerCache = new CompositeKeyMap< - string[], - KeyboardCommandsModalLayer - >((keys) => keys); - private parser!: Parser; - private sections!: TokenTypeKeyMapMap; - private keyboardCommandHandler: KeyboardCommandHandler; - private compiledGrammar = Grammar.fromCompiled(grammar); - private keyboardConfig: KeyboardConfig; + private mergedKeymap!: Record>; constructor( private extensionContext: vscode.ExtensionContext, private targeted: KeyboardCommandsTargeted, private keyboardHandler: KeyboardHandler, - vscodeApi: VscodeApi, ) { this.modeOn = this.modeOn.bind(this); this.modeOff = this.modeOff.bind(this); this.handleInput = this.handleInput.bind(this); - this.keyboardConfig = new KeyboardConfig(vscodeApi); - this.keyboardCommandHandler = new KeyboardCommandHandler(targeted); + this.constructMergedKeymap(); } init() { @@ -62,48 +55,74 @@ export default class KeyboardCommandsModal { "cursorless.experimental.keyboard.modal.keybindings", ) ) { - if (this.isModeOn()) { - this.modeOff(); - this.modeOn(); - } - this.layerCache.clear(); - this.processKeyMap(); + this.constructMergedKeymap(); } }), ); } - private processKeyMap() { - this.sections = getTokenTypeKeyMaps(this.keyboardConfig); - this.resetParser(); - } + private constructMergedKeymap() { + this.mergedKeymap = {}; - private resetParser() { - this.parser = new Parser(this.compiledGrammar); - this.computeLayer(); + this.handleSection("actions", DEFAULT_ACTION_KEYMAP, (value) => + this.targeted.performActionOnTarget(value), + ); + this.handleSection("scopes", DEFAULT_SCOPE_KEYMAP, (value) => + this.targeted.targetScopeType({ + scopeType: value, + }), + ); + this.handleSection("colors", DEFAULT_COLOR_KEYMAP, (value) => + this.targeted.targetDecoratedMark({ + color: value, + }), + ); + this.handleSection("shapes", DEFAULT_SHAPE_KEYMAP, (value) => + this.targeted.targetDecoratedMark({ + shape: value, + }), + ); } /** - * Given the current state of the parser, computes a keyboard layer containing - * only the keys that are currently valid. + * Adds a section (eg actions, scopes, etc) to the merged keymap. + * + * @param sectionName The name of the section (eg `"actions"`, `"scopes"`, etc) + * @param defaultKeyMap The default values for this keymap + * @param handleValue The function to call when the user presses the given key */ - private computeLayer() { - const acceptableTokenTypeInfos = getAcceptableTokenTypes(this.parser); - // FIXME: Here's where we'd update sidebar - const acceptableTokenTypes = sortedUniq( - acceptableTokenTypeInfos.map(({ type }) => type).sort(), - ); - let layer = this.layerCache.get(acceptableTokenTypes); - if (layer == null) { - layer = new KeyboardCommandsModalLayer( - this.keyboardHandler, - Object.values(pick(this.sections, acceptableTokenTypes)).flatMap( - toPairs, - ), - ); - this.layerCache.set(acceptableTokenTypes, layer); + private handleSection( + sectionName: SectionName, + defaultKeyMap: Keymap, + handleValue: (value: T) => Promise, + ) { + const userOverrides: Keymap = + vscode.workspace + .getConfiguration("cursorless.experimental.keyboard.modal.keybindings") + .get>(sectionName) ?? {}; + const keyMap = merge({}, defaultKeyMap, userOverrides); + + for (const [key, value] of toPairs(keyMap)) { + const conflictingEntry = this.getConflictingKeyMapEntry(key); + if (conflictingEntry != null) { + const { sectionName: conflictingSection, value: conflictingValue } = + conflictingEntry; + + vscode.window.showErrorMessage( + `Conflicting keybindings: \`${sectionName}.${value}\` and \`${conflictingSection}.${conflictingValue}\` both want key '${key}'`, + ); + + continue; + } + + const entry: KeyHandler = { + sectionName, + value, + handleValue: () => handleValue(value), + }; + + this.mergedKeymap[key] = entry; } - this.currentLayer = layer; } modeOn = async () => { @@ -111,12 +130,6 @@ export default class KeyboardCommandsModal { return; } - if (this.currentLayer == null) { - // Construct keymap lazily for ease of mocking and to save performance - // when the mode is never used - this.processKeyMap(); - } - this.inputDisposable = this.keyboardHandler.pushListener({ handleInput: this.handleInput, displayOptions: { @@ -131,71 +144,6 @@ export default class KeyboardCommandsModal { await this.targeted.targetSelection(); }; - async handleInput(text: string) { - try { - /** - * The text to feed to the layer. This will be a single character - * initially, when we're called by {@link KeyboardHandler}. We pass it to - * the layer, which will ask for more characters if necessary to complete - * the key sequence for a single parser token. - * - * If the parser wants more tokens, we set this to "" so that the layer - * can ask for characters for the next token from scratch. - */ - let currentText = text; - let previousKeys = ""; - while (true) { - const layerOutput = await this.currentLayer.handleInput(currentText, { - previousKeys, - }); - if (layerOutput == null) { - throw new KeySequenceCancelledError(); - } - - this.parser.feed([layerOutput.value]); - - if (this.parser.results.length > 0) { - // We've found a valid parse - break; - } - - currentText = ""; - previousKeys += layerOutput.keysPressed; - this.computeLayer(); - } - - if (this.parser.results.length > 1) { - console.error("Ambiguous parse:"); - console.error(JSON.stringify(this.parser.results, null, 2)); - throw new Error("Ambiguous parse; see console output"); - } - - const nextTokenTypes = getAcceptableTokenTypes(this.parser); - if (nextTokenTypes.length > 0) { - // Because we stop as soon as a valid parse is found, there shouldn't - // be any way to continue - console.error( - "Ambiguous whether parsing is complete. Possible following tokens:", - ); - console.error(JSON.stringify(nextTokenTypes, null, 2)); - throw new Error("Ambiguous parse; see console output"); - } - - const [{ type, arg }] = this.parser.results; - - // Run the command - this.keyboardCommandHandler[type as keyof KeyboardCommandHandler](arg); - } catch (err) { - if (!(err instanceof KeySequenceCancelledError)) { - vscode.window.showErrorMessage((err as Error).message); - throw err; - } - } finally { - // Always reset the parser when we're done - this.resetParser(); - } - } - modeOff = async () => { if (!this.isModeOn()) { return; @@ -219,10 +167,54 @@ export default class KeyboardCommandsModal { private isModeOn() { return this.inputDisposable != null; } -} -class KeySequenceCancelledError extends Error { - constructor() { - super("Key sequence cancelled"); + async handleInput(text: string) { + let sequence = text; + let keyHandler: KeyHandler | undefined = this.mergedKeymap[sequence]; + + // We handle multi-key sequences by repeatedly awaiting a single keypress + // until they've pressed something in the map. + while (keyHandler == null) { + if (!this.isPrefixOfKey(sequence)) { + const errorMessage = `Unknown key sequence "${sequence}"`; + vscode.window.showErrorMessage(errorMessage); + throw Error(errorMessage); + } + + const nextKey = await this.keyboardHandler.awaitSingleKeypress({ + cursorStyle: vscode.TextEditorCursorStyle.Underline, + whenClauseContext: "cursorless.keyboard.targeted.awaitingKeys", + statusBarText: "Finish sequence...", + }); + + if (nextKey == null) { + return; + } + + sequence += nextKey; + keyHandler = this.mergedKeymap[sequence]; + } + + keyHandler.handleValue(); + } + + isPrefixOfKey(text: string): boolean { + return keys(this.mergedKeymap).some((key) => key.startsWith(text)); + } + + /** + * This function can be used to deterct if a proposed map entry conflicts with + * one in the map. Used to detect if the user tries to use two map entries, + * one of which is a prefix of the other. + * @param text The proposed new map entry + * @returns The first map entry that conflicts with {@link text}, if one + * exists + */ + getConflictingKeyMapEntry(text: string): KeyHandler | undefined { + const conflictingPair = toPairs(this.mergedKeymap).find( + ([key]) => text.startsWith(key) || key.startsWith(text), + ); + + return conflictingPair == null ? undefined : conflictingPair[1]; } } diff --git a/packages/cursorless-vscode/src/keyboard/KeyboardCommandsModalLayer.ts b/packages/cursorless-vscode/src/keyboard/KeyboardCommandsModalLayer.ts deleted file mode 100644 index c6fbb87e989..00000000000 --- a/packages/cursorless-vscode/src/keyboard/KeyboardCommandsModalLayer.ts +++ /dev/null @@ -1,87 +0,0 @@ -import * as vscode from "vscode"; -import KeyboardHandler from "./KeyboardHandler"; -import TrieSearch from "trie-search"; -import { buildSuffixTrie, KeyValuePair } from "./buildSuffixTrie"; - -/** - * Defines a single keyboard layer to use with a modal version of Cursorless - * keyboard. We construct one of these every time the parser changes state, - * based on the allowable tokens at the given state. - */ -export class KeyboardCommandsModalLayer { - /** - * Merged map from all the different sections of the key map (eg actions, - * colors, etc). - */ - private trie: TrieSearch<{ - key: string; - value: Param; - }>; - - constructor( - private keyboardHandler: KeyboardHandler, - entries: [string, Param][], - ) { - this.handleInput = this.handleInput.bind(this); - if (entries.length === 0) { - vscode.window.showErrorMessage("No keybindings found for current layer"); - } - const { trie, conflicts } = buildSuffixTrie(entries); - - for (const conflict of conflicts) { - const conflictStr = conflict - .map(({ key, value: { type } }) => `\`${type}.${key}\``) - .join(" and "); - vscode.window.showErrorMessage(`Conflicting keybindings: ${conflictStr}`); - } - - this.trie = trie; - } - - async handleInput(text: string, { previousKeys }: { previousKeys: string }) { - let values: KeyValuePair[]; - - if (text === "") { - values = []; - } else { - values = this.trie.search(text); - - if (values.length === 0) { - // If we haven't consumed any input yet, then it means the first - // character was a false start so we should cancel the whole thing. - const errorMessage = `Invalid key '${text}'`; - vscode.window.showErrorMessage(errorMessage); - throw Error(errorMessage); - } - } - - let sequence = text; - - // We handle multi-key sequences by repeatedly awaiting a single keypress - // until they've pressed something in the map. - while (values.length !== 1) { - const nextKey = await this.keyboardHandler.awaitSingleKeypress({ - cursorStyle: vscode.TextEditorCursorStyle.Underline, - whenClauseContext: "cursorless.keyboard.targeted.awaitingKeys", - statusBarText: `${previousKeys + sequence}...`, - }); - - if (nextKey == null) { - return undefined; - } - - const possibleNextSequence = sequence + nextKey; - const possibleNextValues = this.trie.search(possibleNextSequence); - if (possibleNextValues.length === 0) { - const errorMessage = `Invalid key '${nextKey}'`; - vscode.window.showErrorMessage(errorMessage); - continue; - } - - sequence = possibleNextSequence; - values = possibleNextValues; - } - - return { keysPressed: sequence, value: values[0].value }; - } -} diff --git a/packages/cursorless-vscode/src/keyboard/KeyboardCommandsTargeted.ts b/packages/cursorless-vscode/src/keyboard/KeyboardCommandsTargeted.ts index 48e72ef4ffe..80d44036c28 100644 --- a/packages/cursorless-vscode/src/keyboard/KeyboardCommandsTargeted.ts +++ b/packages/cursorless-vscode/src/keyboard/KeyboardCommandsTargeted.ts @@ -1,10 +1,10 @@ import { ActionDescriptor, + ActionType, LATEST_VERSION, - Modifier, PartialPrimitiveTargetDescriptor, PartialTargetDescriptor, - ScopeType, + SimpleScopeTypeType, } from "@cursorless/common"; import { runCursorlessCommand } from "@cursorless/vscode-common"; import * as vscode from "vscode"; @@ -12,7 +12,6 @@ import type { HatColor, HatShape } from "../ide/vscode/hatStyles.types"; import { getStyleName } from "../ide/vscode/hats/getStyleName"; import KeyboardCommandsModal from "./KeyboardCommandsModal"; import KeyboardHandler from "./KeyboardHandler"; -import { SimpleKeyboardActionDescriptor } from "./KeyboardActionType"; type TargetingMode = "replace" | "extend" | "append"; @@ -27,15 +26,11 @@ interface TargetDecoratedMarkArgument { mode?: TargetingMode; } -interface ModifyTargetContainingScopeArgument { - scopeType: ScopeType; +interface TargetScopeTypeArgument { + scopeType: SimpleScopeTypeType; type?: "containingScope" | "everyScope"; } -interface PerformActionOpts { - exitCursorlessMode: boolean; -} - /** * Defines a set of commands which are designed to work together for designing a * keyboard interface. The commands set highlights and allow you to perform @@ -47,10 +42,7 @@ export default class KeyboardCommandsTargeted { constructor(private keyboardHandler: KeyboardHandler) { this.targetDecoratedMark = this.targetDecoratedMark.bind(this); this.performActionOnTarget = this.performActionOnTarget.bind(this); - this.performVscodeCommandOnTarget = - this.performVscodeCommandOnTarget.bind(this); - this.modifyTargetContainingScope = - this.modifyTargetContainingScope.bind(this); + this.targetScopeType = this.targetScopeType.bind(this); this.targetSelection = this.targetSelection.bind(this); this.clearTarget = this.clearTarget.bind(this); } @@ -127,7 +119,7 @@ export default class KeyboardCommandsTargeted { } return await executeCursorlessCommand({ - name: "private.setKeyboardTarget", + name: "highlight", target, }); }; @@ -137,39 +129,35 @@ export default class KeyboardCommandsTargeted { * @param param0 Describes the desired scope type * @returns A promise that resolves to the result of the cursorless command */ - modifyTargetContainingScope = async ({ + targetScopeType = async ({ scopeType, type = "containingScope", - }: ModifyTargetContainingScopeArgument) => + }: TargetScopeTypeArgument) => await executeCursorlessCommand({ - name: "private.setKeyboardTarget", + name: "highlight", target: { type: "primitive", modifiers: [ { type, - scopeType, + scopeType: { + type: scopeType, + }, }, ], mark: { - type: "keyboard", + type: "that", }, }, }); - /** - * Applies {@link modifier} to the current target - * @param param0 Describes the desired modifier - * @returns A promise that resolves to the result of the cursorless command - */ - targetModifier = async (modifier: Modifier) => - await executeCursorlessCommand({ - name: "private.setKeyboardTarget", + private highlightTarget = () => + executeCursorlessCommand({ + name: "highlight", target: { type: "primitive", - modifiers: [modifier], mark: { - type: "keyboard", + type: "that", }, }, }); @@ -179,141 +167,75 @@ export default class KeyboardCommandsTargeted { * @param name The action to run * @returns A promise that resolves to the result of the cursorless command */ - performSimpleActionOnTarget = async ({ - actionId: name, - exitCursorlessMode, - }: SimpleKeyboardActionDescriptor) => { - return this.performActionOnTarget( - (target) => { - switch (name) { - case "rewrapWithPairedDelimiter": - case "insertSnippet": - case "executeCommand": - case "replace": - case "editNew": - case "getText": - throw Error(`Unsupported keyboard action: ${name}`); - case "replaceWithTarget": - case "moveToTarget": - return { - name, - source: target, - destination: { type: "implicit" }, - }; - case "swapTargets": - return { - name, - target1: target, - target2: { type: "implicit" }, - }; - case "callAsFunction": - return { - name, - callee: target, - argument: { type: "implicit" }, - }; - case "pasteFromClipboard": - return { - name, - destination: { - type: "primitive", - insertionMode: "to", - target, - }, - }; - case "generateSnippet": - case "highlight": - return { - name, - target, - }; - default: - return { - name, - target, - }; - } - }, - { exitCursorlessMode }, - ); - }; - - /** - * Performs action {@link name} on the current target - * @param name The action to run - * @returns A promise that resolves to the result of the cursorless command - */ - performActionOnTarget = async ( - constructActionPayload: ( - target: PartialPrimitiveTargetDescriptor, - ) => ActionDescriptor, - { exitCursorlessMode }: PerformActionOpts, - ) => { - const action = constructActionPayload({ + performActionOnTarget = async (name: ActionType) => { + const target: PartialPrimitiveTargetDescriptor = { type: "primitive", mark: { - type: "keyboard", + type: "that", }, - }); - const returnValue = await executeCursorlessCommand(action); + }; - if (exitCursorlessMode) { - // For some Cursorless actions, it is more convenient if we automatically - // exit modal mode - await this.modal.modeOff(); - } else { - // If we're not exiting cursorless mode, preserve the keyboard mark - // FIXME: Better to just not clobber the keyboard mark on each action? - await executeCursorlessCommand({ - name: "private.setKeyboardTarget", - target: { - type: "primitive", - mark: { - type: "that", + let returnValue: unknown; + + switch (name) { + case "wrapWithPairedDelimiter": + case "rewrapWithPairedDelimiter": + case "insertSnippet": + case "wrapWithSnippet": + case "executeCommand": + case "replace": + case "editNew": + case "getText": + throw Error(`Unsupported keyboard action: ${name}`); + case "replaceWithTarget": + case "moveToTarget": + returnValue = await executeCursorlessCommand({ + name, + source: target, + destination: { type: "implicit" }, + }); + break; + case "swapTargets": + returnValue = await executeCursorlessCommand({ + name, + target1: target, + target2: { type: "implicit" }, + }); + break; + case "callAsFunction": + returnValue = await executeCursorlessCommand({ + name, + callee: target, + argument: { type: "implicit" }, + }); + break; + case "pasteFromClipboard": + returnValue = await executeCursorlessCommand({ + name, + destination: { + type: "primitive", + insertionMode: "to", + target, }, - }, - }); + }); + break; + case "generateSnippet": + case "highlight": + returnValue = await executeCursorlessCommand({ + name, + target, + }); + break; + default: + returnValue = await executeCursorlessCommand({ + name, + target, + }); } - return returnValue; - }; + await this.highlightTarget(); - /** - * Performs the given VSCode command on the current target. If - * {@link keepChangedSelection} is true, then the selection will not be - * restored after the command is run. - * - * @param commandId The command to run - * @param options Additional options - * @returns A promise that resolves to the result of the VSCode command - */ - performVscodeCommandOnTarget = async ( - commandId: string, - { - args, - keepChangedSelection, - exitCursorlessMode, - }: VscodeCommandOnTargetOptions = {}, - ) => { - const target: PartialPrimitiveTargetDescriptor = { - type: "primitive", - mark: { - type: "keyboard", - }, - }; - - const returnValue = await executeCursorlessCommand({ - name: "executeCommand", - target, - commandId, - options: { - restoreSelection: !keepChangedSelection, - showDecorations: true, - commandArgs: args, - }, - }); - - if (exitCursorlessMode) { + if (EXIT_CURSORLESS_MODE_ACTIONS.includes(name)) { // For some Cursorless actions, it is more convenient if we automatically // exit modal mode await this.modal.modeOff(); @@ -328,45 +250,32 @@ export default class KeyboardCommandsTargeted { */ targetSelection = () => executeCursorlessCommand({ - name: "private.setKeyboardTarget", + name: "highlight", target: { type: "primitive", mark: { type: "cursor", }, + modifiers: [{ type: "toRawSelection" }], }, }); /** * Unsets the current target, causing any highlights to disappear - * FIXME: This is a hack relying on the fact that running any command - * will clobber all special targets * @returns A promise that resolves to the result of the cursorless command */ clearTarget = () => executeCursorlessCommand({ - name: "setSelection", + name: "highlight", target: { type: "primitive", mark: { - type: "cursor", + type: "nothing", }, - modifiers: [{ type: "toRawSelection" }], }, }); } -interface VscodeCommandOnTargetOptions { - /** The arguments to pass to the command */ - args?: unknown[]; - - /** If `true`, the selection will not be restored after the command is run */ - keepChangedSelection?: boolean; - - /** If `true`, exit Cursorless mode after running command */ - exitCursorlessMode?: boolean; -} - function executeCursorlessCommand(action: ActionDescriptor) { return runCursorlessCommand({ action, @@ -374,3 +283,11 @@ function executeCursorlessCommand(action: ActionDescriptor) { usePrePhraseSnapshot: false, }); } + +const EXIT_CURSORLESS_MODE_ACTIONS: ActionType[] = [ + "setSelectionBefore", + "setSelectionAfter", + "editNewLineBefore", + "editNewLineAfter", + "clearAndSetSelection", +]; diff --git a/packages/cursorless-vscode/src/keyboard/KeyboardConfig.ts b/packages/cursorless-vscode/src/keyboard/KeyboardConfig.ts deleted file mode 100644 index 381ccb51c3e..00000000000 --- a/packages/cursorless-vscode/src/keyboard/KeyboardConfig.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { mapValues, pickBy } from "lodash"; -import { KeyMap, SectionName, TokenType } from "./TokenTypeHelpers"; -import { SectionTypes, TokenTypeValueMap } from "./TokenTypes"; -import { VscodeApi } from "@cursorless/vscode-common"; - -const LEGACY_PLURAL_SECTION_NAMES: Record = { - action: "actions", - color: "colors", - shape: "shapes", - vscodeCommand: "vscodeCommands", - scope: "scopes", -}; - -export class KeyboardConfig { - constructor(private vscodeApi: VscodeApi) {} - - /** - * Returns a keymap for a given config section that is intended to be further - * processed by eg {@link getSectionEntries} or {@link getSingularSectionEntry}. - * @param sectionName The name of the config section - * @returns A keymap for a given config section - */ - private getSectionKeyMapRaw( - sectionName: S, - ): KeyMap { - const getSection = ( - sectionName: string, - ): KeyMap | undefined => - this.vscodeApi.workspace - .getConfiguration("cursorless.experimental.keyboard.modal.keybindings") - .get>(sectionName); - - let section = getSection(sectionName); - - if (section == null || Object.keys(section).length === 0) { - const legacySectionName = LEGACY_PLURAL_SECTION_NAMES[sectionName]; - - if (legacySectionName != null) { - section = getSection(legacySectionName); - if (section != null && Object.keys(section).length > 0) { - this.vscodeApi.window.showWarningMessage( - `The config section "cursorless.experimental.keyboard.modal.keybindings.${legacySectionName}" is deprecated. Please rename it to "cursorless.experimental.keyboard.modal.keybindings.${sectionName}".`, - ); - } - } - } - - return section ?? {}; - } - - /** - * Returns a keymap mapping from key sequences to tokens for use in our key - * sequence parser. If `sectionName` is omitted, it defaults to `type`. If - * {@link transform} is provided, it's used to transform each entry, dropping - * the ones for which {@link transform} returns `undefined`. - * - * Example: - * - * ```ts - * assert.equal( - * getTokenKeyMap("direction", "misc", only("forward", "backward")), - * { - * "f": { type: "direction", value: "forward" }, - * "b": { type: "direction", value: "backward" }, - * }, - * ); - * ``` - * - * @param tokenType The type of the token - * @param sectionName The name of the config section - * @param transform If provided, a function that transforms each entry, - * returning `undefined` for entries to be dropped - * @returns A keymap with transformed entries for the given config section, - * without entries for which {@link transform} returns `undefined` - */ - getTokenKeyMap( - tokenType: T, - ): KeyMap<{ type: T; value: SectionTypes[T] }>; - getTokenKeyMap( - tokenType: T, - sectionName: K, - ): KeyMap<{ type: T; value: SectionTypes[K] }>; - getTokenKeyMap< - T extends TokenType, - K extends keyof SectionTypes, - V extends TokenTypeValueMap[T] = TokenTypeValueMap[T], - >( - tokenType: T, - sectionName: K, - transform: (value: SectionTypes[K]) => V | undefined, - ): KeyMap<{ type: T; value: V }>; - getTokenKeyMap< - T extends TokenType, - K extends keyof SectionTypes, - V extends TokenTypeValueMap[T] = TokenTypeValueMap[T], - >( - tokenType: T, - sectionName: K = tokenType as unknown as K, - transform?: (value: SectionTypes[K]) => V | undefined, - ): KeyMap<{ type: T; value: V | SectionTypes[K] }> { - const section = this.getSectionKeyMapRaw(sectionName); - - if (transform == null) { - return mapValues< - KeyMap, - { - type: T; - value: SectionTypes[K]; - } - >(section, (value) => ({ - type: tokenType, - value: value, - })); - } - - return pickBy< - { - type: T; - value: V | undefined; - }, - { - type: T; - value: V; - } - >( - mapValues(section, (value) => ({ - type: tokenType, - value: transform(value), - })), - (value): value is { type: T; value: V } => value.value != null, - ); - } -} - -/** - * Creates a transform function that leaves only the values that are included in - * {@link values}. - * - * @param values Values to include - * @returns A filter function suitable for use with getTokenKeyMap - */ -export function only( - ...values: V[] -): (value: T) => V | undefined { - return (value: T) => (values.includes(value as V) ? (value as V) : undefined); -} diff --git a/packages/cursorless-vscode/src/keyboard/KeyboardHandler.ts b/packages/cursorless-vscode/src/keyboard/KeyboardHandler.ts index ae18da46e28..80e161fd9c9 100644 --- a/packages/cursorless-vscode/src/keyboard/KeyboardHandler.ts +++ b/packages/cursorless-vscode/src/keyboard/KeyboardHandler.ts @@ -145,15 +145,7 @@ export default class KeyboardHandler { } isDisposed = true; - const index = this.listeners.indexOf(listenerEntry); - // Call handleCancelled on all listeners that were pushed after this - // one. Eg if you're in the middle of typing a command and we turn off - // the modal mode, we want to cancel the command - this.listeners - .slice(index + 1) - .reverse() - .forEach(({ listener }) => listener.handleCancelled()); - this.listeners.splice(index); + pull(this.listeners, listenerEntry); this.ensureState(); }, }; diff --git a/packages/cursorless-vscode/src/keyboard/TokenTypeHelpers.ts b/packages/cursorless-vscode/src/keyboard/TokenTypeHelpers.ts deleted file mode 100644 index ac35d89ac9c..00000000000 --- a/packages/cursorless-vscode/src/keyboard/TokenTypeHelpers.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { SectionTypes, TokenTypeValueMap } from "./TokenTypes"; - -export type SectionName = keyof SectionTypes; - -export type TokenType = keyof TokenTypeValueMap; - -type TokenTypeKeyDescriptorMap = { - [K in keyof TokenTypeValueMap]: { type: K; value: TokenTypeValueMap[K] }; -}; - -export type TokenTypeKeyMapMap = { - readonly [K in keyof TokenTypeValueMap]: KeyMap; -}; - -export type KeyDescriptor = - TokenTypeKeyDescriptorMap[keyof TokenTypeKeyDescriptorMap]; - -export type KeyMap = Record; diff --git a/packages/cursorless-vscode/src/keyboard/TokenTypes.ts b/packages/cursorless-vscode/src/keyboard/TokenTypes.ts deleted file mode 100644 index 7355e34132d..00000000000 --- a/packages/cursorless-vscode/src/keyboard/TokenTypes.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { SimpleScopeTypeType, SurroundingPairName } from "@cursorless/common"; -import { HatColor, HatShape } from "../ide/vscode/hatStyles.types"; -import { - PolymorphicKeyboardActionDescriptor, - SimpleKeyboardActionDescriptor, - SpecificKeyboardActionDescriptor, -} from "./KeyboardActionType"; - -/** - * Maps from modal keyboard config section name to the type of entry expected in - * that section. - */ -export interface SectionTypes { - action: PolymorphicKeyboardActionDescriptor; - color: HatColor; - misc: MiscValue; - scope: SimpleScopeTypeType; - pairedDelimiter: SurroundingPairName; - shape: HatShape; - vscodeCommand: ModalVscodeCommandDescriptor; - modifier: ModifierType; -} -type ModifierType = "nextPrev" | "every"; -export type MiscValue = - | "combineColorAndShape" - | "makeRange" - | "makeList" - | "forward" - | "backward"; - -/** - * Maps from token type used in parser to the type of values that the token type - * can have. There are a few kinds of token types: - * - * 1. Those directly corresponding to a section in the config. These will have - * the same name and type as the corresponding section in - * {@link SectionTypes}. For example, {@link color} - * 2. Those corresponding to subset of entries in a config section. For example, - * {@link simpleAction} - * 3. Those corresponding to a single entry in a config section. These are - * tokens that need some special grammatical treatment. They will have a type - * which is a constant string equal to the key name. For example, - * {@link makeRange} - * 4. Others. These are tokens that are not directly related to the config. For - * example, {@link digit} - */ -export interface TokenTypeValueMap { - // tokens corresponding exactly to config sections - simpleScopeTypeType: SimpleScopeTypeType; - color: HatColor; - shape: HatShape; - vscodeCommand: ModalVscodeCommandDescriptor; - pairedDelimiter: SurroundingPairName; - - // action config section - simpleAction: SimpleKeyboardActionDescriptor; - wrap: SpecificKeyboardActionDescriptor<"wrap">; - - // misc config section - makeRange: "makeRange"; - makeList: "makeList"; - combineColorAndShape: "combineColorAndShape"; - direction: "forward" | "backward"; - - // modifier config section - nextPrev: "nextPrev"; - every: "every"; - - digit: number; -} - -export type ModalVscodeCommandDescriptor = - | string - | { - commandId: string; - args?: unknown[]; - executeAtTarget?: boolean; - keepChangedSelection?: boolean; - exitCursorlessMode?: boolean; - }; diff --git a/packages/cursorless-vscode/src/keyboard/buildSuffixTrie.test.ts b/packages/cursorless-vscode/src/keyboard/buildSuffixTrie.test.ts deleted file mode 100644 index 1e65c5f6fc1..00000000000 --- a/packages/cursorless-vscode/src/keyboard/buildSuffixTrie.test.ts +++ /dev/null @@ -1,145 +0,0 @@ -import assert from "node:assert"; -import { KeyValuePair, buildSuffixTrie } from "./buildSuffixTrie"; -import { isEqual, sortBy, uniq, uniqWith } from "lodash"; - -interface TestCase { - input: string[]; - expected: KeyValuePair[]; - expectedConflicts?: KeyValuePair[][]; -} - -const testCases: TestCase[] = [ - { - input: ["a", "b", "c"], - expected: [ - { key: "a", value: "a" }, - { key: "b", value: "b" }, - { key: "c", value: "c" }, - ], - }, - { - input: ["ab", "c"], - expected: [ - { key: "ab", value: "ab" }, - { key: "b", value: "ab" }, - { key: "c", value: "c" }, - ], - }, - { - input: ["ab", "b"], - expected: [ - { key: "ab", value: "ab" }, - { key: "b", value: "b" }, - ], - }, - { - input: ["a", "ab"], - expected: [{ key: "b", value: "ab" }], - expectedConflicts: [ - [ - { key: "a", value: "a" }, - { key: "ab", value: "ab" }, - ], - ], - }, - { - input: ["ab", "cbd"], - expected: [ - { key: "ab", value: "ab" }, - { key: "cbd", value: "cbd" }, - { key: "d", value: "cbd" }, - ], - }, - { - input: ["a", "bac"], - expected: [ - { key: "a", value: "a" }, - { key: "bac", value: "bac" }, - { key: "c", value: "bac" }, - ], - }, - { - input: ["ab", "bc"], - expected: [ - { key: "ab", value: "ab" }, - { key: "bc", value: "bc" }, - { key: "c", value: "bc" }, - ], - }, - { - input: ["az", "bz", "c"], - expected: [ - { key: "az", value: "az" }, - { key: "bz", value: "bz" }, - { key: "c", value: "c" }, - ], - }, - { - input: ["ab", "cde", "cxe"], - expected: [ - { key: "ab", value: "ab" }, - { key: "b", value: "ab" }, - { key: "cde", value: "cde" }, - { key: "de", value: "cde" }, - { key: "cxe", value: "cxe" }, - { key: "xe", value: "cxe" }, - ], - }, - { - input: ["ab", "ac"], - expected: [ - { key: "ab", value: "ab" }, - { key: "ac", value: "ac" }, - { key: "b", value: "ab" }, - { key: "c", value: "ac" }, - ], - }, - { - input: ["aa"], - expected: [ - { key: "aa", value: "aa" }, - { key: "a", value: "aa" }, - ], - }, - { - input: ["aa", "ab"], - expected: [ - { key: "aa", value: "aa" }, - { key: "ab", value: "ab" }, - { key: "b", value: "ab" }, - ], - }, - { - input: ["a", "A"], - expected: [ - { key: "a", value: "a" }, - { key: "A", value: "A" }, - ], - }, -]; - -suite("buildSuffixTrie", () => { - testCases.forEach(({ input, expected, expectedConflicts }) => { - test(`input: ${input}`, () => { - const { trie, conflicts } = buildSuffixTrie( - input.map((key) => [key, key]), - ); - const chars = uniq(input.flatMap((key) => key.split(""))).sort(); - const actual = uniqWith( - sortEntries(chars.flatMap((char) => trie.search(char))), - isEqual, - ); - assert.deepStrictEqual(actual, sortEntries(expected)); - assert.deepStrictEqual( - sortBy(conflicts.map(sortEntries), (conflict) => - JSON.stringify(conflict), - ), - (expectedConflicts ?? []).map(sortEntries), - ); - }); - }); -}); - -function sortEntries(entries: KeyValuePair[]) { - return sortBy(entries, ["key", "value"]); -} diff --git a/packages/cursorless-vscode/src/keyboard/buildSuffixTrie.ts b/packages/cursorless-vscode/src/keyboard/buildSuffixTrie.ts deleted file mode 100644 index 964aa733264..00000000000 --- a/packages/cursorless-vscode/src/keyboard/buildSuffixTrie.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { isEqual, range, sortBy, uniqWith } from "lodash"; -import TrieSearch, { TrieSearchOptions } from "trie-search"; - -export interface KeyValuePair { - key: string; - value: T; -} - -interface BuildTrieReturn { - trie: TrieSearch>; - conflicts: KeyValuePair[][]; -} -type InternalEntryType = { - isTopLevel: boolean; - key: string; - value: T; - id: number; -}; - -/** - * Build a trie containing all the keymaps, as well as non-conflicting suffixes - * of each key. Also returns a list of all the conflicting keymaps. If any key is - * a prefix of any other key, we consider them to be conflicting. - * @param keyMaps The keymaps to build the trie from - * @returns The trie, and a list of conflicting keymaps - */ -export function buildSuffixTrie(entries: [string, T][]): BuildTrieReturn { - const options: TrieSearchOptions> & - TrieSearchOptions> = { - splitOnRegEx: undefined, - ignoreCase: false, - }; - - /** A trie containing all possible entries, including conflicting */ - const candidateTrie = new TrieSearch>("key", options); - - let id = 0; - /** Includes an entry for every suffix of every entry in {@link entries}, - * including {@link entries} themselves, which have `isTopLevel: true` */ - const candidateEntries = entries.flatMap(([fullKey, value]) => - range(fullKey.length).map((i) => { - const key = fullKey.substring(i); - return { - isTopLevel: fullKey === key, - key, - value, - id: id++, - }; - }), - ); - candidateTrie.addAll(candidateEntries); - - /** This will be returned; it won't contain any conflicts */ - const finalTrie = new TrieSearch>("key", options); - - /** Top-level conflicts to report to the caller */ - const conflictList: KeyValuePair[][] = []; - - /** - * The entries with these id's have conflicts and will be removed. We don't - * report them to the user if they're not top-level, though - */ - const badEntries = new Set(); - - for (const { isTopLevel, key, value, id } of candidateEntries) { - const conflicting = candidateTrie - .search(key) - .filter((other) => other.value !== value); - - if (conflicting.length === 0) { - continue; - } - - if (isTopLevel) { - // If we're top-level, we mark every conflicting entry as bad - conflicting.forEach(({ id }) => badEntries.add(id)); - - const conflictingTopLevel = conflicting.filter( - ({ isTopLevel }) => isTopLevel, - ); - if (conflictingTopLevel.length === 0) { - // No problem if there are no top-level conflicts - continue; - } - conflictList.push( - sortBy( - [ - { key, value }, - ...conflictingTopLevel.map(({ key, value }) => ({ key, value })), - ], - ["key", "value"], - ), - ); - } else { - // If we're not top-level, we only mark other non-top-level entries as bad - conflicting - .filter(({ isTopLevel }) => !isTopLevel) - .forEach(({ id }) => badEntries.add(id)); - } - - // If we got here, we have a conflict, so we mark ourselves as bad - badEntries.add(id); - } - - for (const { key, value, id } of candidateEntries) { - if (!badEntries.has(id)) { - finalTrie.add({ key, value }); - } - } - - return { - trie: finalTrie, - conflicts: uniqWith(conflictList, isEqual), - }; -} diff --git a/packages/cursorless-vscode/src/keyboard/defaultKeymaps.ts b/packages/cursorless-vscode/src/keyboard/defaultKeymaps.ts new file mode 100644 index 00000000000..a35daad0e72 --- /dev/null +++ b/packages/cursorless-vscode/src/keyboard/defaultKeymaps.ts @@ -0,0 +1,24 @@ +import { ActionType } from "@cursorless/common"; +import { SimpleScopeTypeType } from "@cursorless/common"; +import { HatColor, HatShape } from "../ide/vscode/hatStyles.types"; +import { isTesting } from "@cursorless/common"; + +export type Keymap = Record; + +// FIXME: Switch to a better mocking setup. We don't use our built in +// configuration set up because that is probably going to live server side, and +// the keyboard setup will probably live client side + +export const DEFAULT_ACTION_KEYMAP: Keymap = isTesting() + ? { t: "setSelection" } + : {}; + +export const DEFAULT_SCOPE_KEYMAP: Keymap = isTesting() + ? { sf: "namedFunction" } + : {}; + +export const DEFAULT_COLOR_KEYMAP: Keymap = isTesting() + ? { d: "default" } + : {}; + +export const DEFAULT_SHAPE_KEYMAP: Keymap = isTesting() ? {} : {}; diff --git a/packages/cursorless-vscode/src/keyboard/getTokenTypeKeyMaps.ts b/packages/cursorless-vscode/src/keyboard/getTokenTypeKeyMaps.ts deleted file mode 100644 index 1edfc765d97..00000000000 --- a/packages/cursorless-vscode/src/keyboard/getTokenTypeKeyMaps.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { isString, range } from "lodash"; -import { - KeyboardActionType, - PolymorphicKeyboardActionDescriptor, - SpecificKeyboardActionDescriptor, - simpleKeyboardActionNames, -} from "./KeyboardActionType"; -import { KeyboardConfig, only } from "./KeyboardConfig"; -import { TokenTypeKeyMapMap } from "./TokenTypeHelpers"; - -/** - * Returns a map from token type names to a keymap for that token type. Something like: - * - * ```ts - * { - * action: { - * "c": { - * type: "action", - * value: "clearAndSetSelection", - * }, - * "t": { - * type: "action", - * value: "setSelection", - * }, - * }, - * makeRange: { - * "r": { - * type: "makeRange", - * }, - * }, - * ... - * } - * ``` - * @returns A map from token type names to a keymap for that token type. - */ -export function getTokenTypeKeyMaps( - config: KeyboardConfig, -): TokenTypeKeyMapMap { - return { - simpleScopeTypeType: config.getTokenKeyMap("simpleScopeTypeType", "scope"), - color: config.getTokenKeyMap("color"), - shape: config.getTokenKeyMap("shape"), - vscodeCommand: config.getTokenKeyMap("vscodeCommand"), - pairedDelimiter: config.getTokenKeyMap("pairedDelimiter"), - - // action config section - simpleAction: config.getTokenKeyMap("simpleAction", "action", (value) => - transformActionDescriptor(value, simpleKeyboardActionNames), - ), - wrap: config.getTokenKeyMap("wrap", "action", (value) => - transformActionDescriptor(value, ["wrap"]), - ), - - // misc config section - makeRange: config.getTokenKeyMap("makeRange", "misc", only("makeRange")), - makeList: config.getTokenKeyMap("makeList", "misc", only("makeList")), - combineColorAndShape: config.getTokenKeyMap( - "combineColorAndShape", - "misc", - only("combineColorAndShape"), - ), - direction: config.getTokenKeyMap( - "direction", - "misc", - only("forward", "backward"), - ), - - // modifier config section - every: config.getTokenKeyMap("every", "modifier", only("every")), - nextPrev: config.getTokenKeyMap("nextPrev", "modifier", only("nextPrev")), - - digit: Object.fromEntries( - range(10).map((value) => [ - value.toString(), - { - type: "digit" as const, - value, - }, - ]), - ), - }; -} - -/** - * Given an action config entry, returns a fully specified action descriptor, using default behavior. - * It also filters: it returns undefined if the action name is not included in {@link actionNames}. - * - * For example, it transforms "clearAndSetSelection" to { actionId: "clearAndSetSelection", exitCursorlessMode: false } - * and leaves { actionId: "clearAndSetSelection", exitCursorlessMode: true } unchanged. - * (Assuming that "clearAndSetSelection" is included in {@link actionNames}. If not, it returns undefined.) - * - * @param value The action descriptor to transform, or reject - * @param actionNames The names of the actions to accept - * @returns A fully specified action descriptor, or undefined if the action name - * is not included in {@link actionNames} - */ -function transformActionDescriptor( - value: PolymorphicKeyboardActionDescriptor, - actionNames: T[], -): SpecificKeyboardActionDescriptor | undefined { - if (isString(value)) { - return isIncluded(value, actionNames) - ? { - actionId: value, - exitCursorlessMode: false, - } - : undefined; - } - - return isIncluded(value.actionId, actionNames) - ? (value as SpecificKeyboardActionDescriptor) - : undefined; -} - -function isIncluded(value: string, values: T[]): value is T { - return values.includes(value as T); -} diff --git a/packages/cursorless-vscode/src/keyboard/grammar/CommandRulePostProcessor.ts b/packages/cursorless-vscode/src/keyboard/grammar/CommandRulePostProcessor.ts deleted file mode 100644 index 4e09bf242d9..00000000000 --- a/packages/cursorless-vscode/src/keyboard/grammar/CommandRulePostProcessor.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { - KeyboardCommand, - KeyboardCommandArgTypes, -} from "../KeyboardCommandTypeHelpers"; - -/** - * Represents a post-processing function for a top-level rule of our grammar. - * This is a function that takes the output of a rule and transforms it into a - * command usable by our command handler. We also keep metadata about the rule - * on the postprocess function so that we can display it to the user, eg in the - * sidebar. The reason we keep the metadata here is that the postprocess - * function is the only thing we have control over in the nearley parser. - */ -export interface CommandRulePostProcessor< - T extends keyof KeyboardCommandArgTypes = keyof KeyboardCommandArgTypes, -> { - (args: any[]): KeyboardCommand; - metadata: { - /** The command type */ - type: T; - }; -} diff --git a/packages/cursorless-vscode/src/keyboard/grammar/generated/grammar.ts b/packages/cursorless-vscode/src/keyboard/grammar/generated/grammar.ts deleted file mode 100644 index 49a73c3ed0e..00000000000 --- a/packages/cursorless-vscode/src/keyboard/grammar/generated/grammar.ts +++ /dev/null @@ -1,119 +0,0 @@ -// Generated automatically by nearley, version 2.20.1 -// http://github.com/Hardmath123/nearley -// Bypasses TS6133. Allow declared but unused functions. -// @ts-ignore -function id(d: any[]): any { return d[0]; } -declare var makeRange: any; -declare var makeList: any; -declare var simpleAction: any; -declare var wrap: any; -declare var pairedDelimiter: any; -declare var vscodeCommand: any; -declare var every: any; -declare var nextPrev: any; -declare var simpleScopeTypeType: any; -declare var color: any; -declare var shape: any; -declare var combineColorAndShape: any; -declare var direction: any; -declare var digit: any; - -import { capture, command, UNUSED as _, argPositions } from "../grammarHelpers" -import { keyboardLexer } from "../keyboardLexer"; - -const { $0, $1, $2 } = argPositions; - -interface NearleyToken { - value: any; - [key: string]: any; -}; - -interface NearleyLexer { - reset: (chunk: any, info: any) => void; - next: () => NearleyToken | undefined; - save: () => any; - formatError: (token: any, message: string) => string; - has: (tokenType: any) => boolean; -}; - -interface NearleyRule { - name: string; - symbols: NearleySymbol[]; - postprocess?: (d: any[], loc?: number, reject?: {}) => any; -}; - -type NearleySymbol = string | { literal: any } | { test: (token: any) => boolean }; - -interface Grammar { - Lexer: NearleyLexer | undefined; - ParserRules: NearleyRule[]; - ParserStart: string; -}; - -const grammar: Grammar = { - Lexer: keyboardLexer, - ParserRules: [ - {"name": "main", "symbols": ["decoratedMark"], "postprocess": - command("targetDecoratedMark", { decoratedMark: $0, mode: "replace" }) - }, - {"name": "main", "symbols": [(keyboardLexer.has("makeRange") ? {type: "makeRange"} : makeRange), "decoratedMark"], "postprocess": - command("targetDecoratedMark", { decoratedMark: $1, mode: "extend" }) - }, - {"name": "main", "symbols": [(keyboardLexer.has("makeList") ? {type: "makeList"} : makeList), "decoratedMark"], "postprocess": - command("targetDecoratedMark", { decoratedMark: $1, mode: "append" }) - }, - {"name": "main", "symbols": ["modifier"], "postprocess": command("modifyTarget", { modifier: $0 })}, - {"name": "main", "symbols": [(keyboardLexer.has("simpleAction") ? {type: "simpleAction"} : simpleAction)], "postprocess": command("performSimpleActionOnTarget", ["actionDescriptor"])}, - {"name": "main", "symbols": [(keyboardLexer.has("wrap") ? {type: "wrap"} : wrap), (keyboardLexer.has("pairedDelimiter") ? {type: "pairedDelimiter"} : pairedDelimiter)], "postprocess": - command("performWrapActionOnTarget", ["actionDescriptor", "delimiter"]) - }, - {"name": "main", "symbols": [(keyboardLexer.has("vscodeCommand") ? {type: "vscodeCommand"} : vscodeCommand)], "postprocess": command("vscodeCommand", ["command"])}, - {"name": "modifier", "symbols": ["scopeType"], "postprocess": capture({ type: "containingScope", scopeType: $0 })}, - {"name": "modifier", "symbols": [(keyboardLexer.has("every") ? {type: "every"} : every), "scopeType"], "postprocess": capture({ type: "everyScope", scopeType: $1 })}, - {"name": "modifier$ebnf$1", "symbols": ["offset"], "postprocess": id}, - {"name": "modifier$ebnf$1", "symbols": [], "postprocess": () => null}, - {"name": "modifier$ebnf$2", "symbols": ["number"], "postprocess": id}, - {"name": "modifier$ebnf$2", "symbols": [], "postprocess": () => null}, - {"name": "modifier", "symbols": ["modifier$ebnf$1", (keyboardLexer.has("nextPrev") ? {type: "nextPrev"} : nextPrev), "modifier$ebnf$2", "scopeType"], "postprocess": - ([offset, _, length, scopeType]) => ({ - type: "relativeScope", - offset: offset?.number ?? 1, - direction: offset?.direction ?? "forward", - length: length ?? 1, - scopeType, - }) - }, - {"name": "modifier", "symbols": ["offset", "scopeType"], "postprocess": - ([offset, scopeType]) => ({ - type: "relativeScope", - offset: 0, - direction: offset?.direction ?? "forward", - length: offset?.number ?? 1, - scopeType, - }) - }, - {"name": "scopeType", "symbols": [(keyboardLexer.has("simpleScopeTypeType") ? {type: "simpleScopeTypeType"} : simpleScopeTypeType)], "postprocess": capture("type")}, - {"name": "scopeType", "symbols": [(keyboardLexer.has("pairedDelimiter") ? {type: "pairedDelimiter"} : pairedDelimiter)], "postprocess": - ([delimiter]) => ({ type: "surroundingPair", delimiter }) - }, - {"name": "decoratedMark", "symbols": [(keyboardLexer.has("color") ? {type: "color"} : color)], "postprocess": capture("color")}, - {"name": "decoratedMark", "symbols": [(keyboardLexer.has("shape") ? {type: "shape"} : shape)], "postprocess": capture("shape")}, - {"name": "decoratedMark", "symbols": [(keyboardLexer.has("combineColorAndShape") ? {type: "combineColorAndShape"} : combineColorAndShape), (keyboardLexer.has("color") ? {type: "color"} : color), (keyboardLexer.has("shape") ? {type: "shape"} : shape)], "postprocess": capture(_, "color", "shape")}, - {"name": "decoratedMark", "symbols": [(keyboardLexer.has("combineColorAndShape") ? {type: "combineColorAndShape"} : combineColorAndShape), (keyboardLexer.has("shape") ? {type: "shape"} : shape), (keyboardLexer.has("color") ? {type: "color"} : color)], "postprocess": capture(_, "shape", "color")}, - {"name": "offset$ebnf$1", "symbols": [(keyboardLexer.has("direction") ? {type: "direction"} : direction)], "postprocess": id}, - {"name": "offset$ebnf$1", "symbols": [], "postprocess": () => null}, - {"name": "offset", "symbols": ["offset$ebnf$1", "number"], "postprocess": capture("direction", "number")}, - {"name": "offset$ebnf$2", "symbols": ["number"], "postprocess": id}, - {"name": "offset$ebnf$2", "symbols": [], "postprocess": () => null}, - {"name": "offset", "symbols": ["offset$ebnf$2", (keyboardLexer.has("direction") ? {type: "direction"} : direction)], "postprocess": capture("number", "direction")}, - {"name": "number$ebnf$1", "symbols": [(keyboardLexer.has("digit") ? {type: "digit"} : digit)]}, - {"name": "number$ebnf$1", "symbols": ["number$ebnf$1", (keyboardLexer.has("digit") ? {type: "digit"} : digit)], "postprocess": (d) => d[0].concat([d[1]])}, - {"name": "number", "symbols": ["number$ebnf$1"], "postprocess": - ([digits]) => - digits.reduce((total: number, digit: number) => total * 10 + digit, 0) - } - ], - ParserStart: "main", -}; - -export default grammar; diff --git a/packages/cursorless-vscode/src/keyboard/grammar/getAcceptableTokenTypes.test.ts b/packages/cursorless-vscode/src/keyboard/grammar/getAcceptableTokenTypes.test.ts deleted file mode 100644 index 2ef64fa0aaa..00000000000 --- a/packages/cursorless-vscode/src/keyboard/grammar/getAcceptableTokenTypes.test.ts +++ /dev/null @@ -1,159 +0,0 @@ -import assert from "assert"; -import { Grammar, Parser } from "nearley"; -import { KeyDescriptor } from "../TokenTypeHelpers"; -import grammar from "./generated/grammar"; -import { - AcceptableTokenType, - MISSING, - NEXT, - getAcceptableTokenTypes, -} from "./getAcceptableTokenTypes"; -import { isEqual } from "lodash"; -import { stringifyTokens } from "./stringifyTokens"; - -interface TestCase { - /** - * The tokens to feed to the parser before checking for acceptable token types - */ - tokens: KeyDescriptor[]; - - /** - * Expect these token types to be acceptable; note that this list doesn't need - * to include all acceptable token types, just the ones that we want to test - * for. - */ - expected: AcceptableTokenType[]; -} - -const testCases: TestCase[] = [ - { - tokens: [], - expected: [ - { - type: "shape", - command: "targetDecoratedMark", - partialArg: { - decoratedMark: { - shape: NEXT, - }, - mode: "replace", - }, - }, - { - type: "combineColorAndShape", - command: "targetDecoratedMark", - partialArg: { - decoratedMark: { - color: MISSING, - shape: MISSING, - }, - mode: "replace", - }, - }, - { - type: "digit", - command: "modifyTarget", - partialArg: { - modifier: { - type: "relativeScope", - length: MISSING, - offset: 0, - direction: "forward", - scopeType: MISSING, - }, - }, - }, - { - type: "digit", - command: "modifyTarget", - partialArg: { - modifier: { - type: "relativeScope", - length: MISSING, - offset: MISSING, - direction: "forward", - scopeType: MISSING, - }, - }, - }, - { - type: "nextPrev", - command: "modifyTarget", - partialArg: { - modifier: { - type: "relativeScope", - length: MISSING, - offset: 1, - direction: "forward", - scopeType: MISSING, - }, - }, - }, - ], - }, - { - tokens: [{ type: "digit", value: 3 }], - expected: [ - { - type: "simpleScopeTypeType", - command: "modifyTarget", - partialArg: { - modifier: { - type: "relativeScope", - length: 3, - offset: 0, - direction: "forward", - scopeType: { - type: NEXT, - }, - }, - }, - }, - { - type: "nextPrev", - command: "modifyTarget", - partialArg: { - modifier: { - type: "relativeScope", - length: MISSING, - offset: 3, - direction: "forward", - scopeType: MISSING, - }, - }, - }, - ], - }, -]; - -suite("keyboard.getAcceptableTokenTypes", () => { - let parser: Parser; - setup(() => { - parser = new Parser(Grammar.fromCompiled(grammar)); - }); - - testCases.forEach(({ tokens, expected }) => { - test(`after \`${stringifyTokens(tokens)}\``, () => { - parser.feed(tokens); - for (const value of expected) { - // filter by type first for shorter error messages - const candidates = getAcceptableTokenTypes(parser).filter( - ({ type }) => type === value.type, - ); - const fullValue = { - type: value.type, - command: value.command, - partialArg: { - type: value.command, - arg: value.partialArg, - }, - }; - assert( - candidates.some((result) => isEqual(result, fullValue)), - "Relevant candidates (note that symbols will be missing):\n" + - JSON.stringify(candidates, null, 2), - ); - } - }); - }); -}); diff --git a/packages/cursorless-vscode/src/keyboard/grammar/getAcceptableTokenTypes.ts b/packages/cursorless-vscode/src/keyboard/grammar/getAcceptableTokenTypes.ts deleted file mode 100644 index 90e03ec2899..00000000000 --- a/packages/cursorless-vscode/src/keyboard/grammar/getAcceptableTokenTypes.ts +++ /dev/null @@ -1,151 +0,0 @@ -import nearley, { State } from "nearley"; -import { isEqual, times } from "lodash"; -import { CommandRulePostProcessor } from "./CommandRulePostProcessor"; -import { DefaultMap, uniqWithHash } from "@cursorless/common"; -import { KeyboardCommandHandler } from "../KeyboardCommandHandler"; -import { TokenType } from "../TokenTypeHelpers"; - -export interface AcceptableTokenType { - /** - * The token type, eg "color". - */ - type: TokenType; - - /** - * The command that wants the token type - */ - command: keyof KeyboardCommandHandler; - - /** - * A partial argument for the command that wants the token type, where - * {@link NEXT} indicates where the next token would go and {@link MISSING} - * indicates arguments that haven't been typed yet. - */ - partialArg: any; -} - -/** - * Given a parser, returns a list of acceptable token types at the current state - * of the parser. We use this to display a list of possible next tokens to the - * user. We include information about which top-level rules want each token type - * so that we can display the command name in the list. We also include a partial - * argument for the command that wants the token type, which we could use to - * provide even more information to the user. - * - * @param parser The parser to get the acceptable token types of - * @returns A list of acceptable token types, along with information about which - * top-level rules want them - */ -export function getAcceptableTokenTypes( - parser: nearley.Parser, -): AcceptableTokenType[] { - return uniqWithHash( - parser.table[parser.table.length - 1].scannable.flatMap( - (scannableState) => { - /** The token type */ - const { type } = scannableState.rule.symbols[scannableState.dot]; - - return computeRootStatePartialArgs(scannableState).map( - ({ state, partialArg }) => ({ - type, - command: getMetadata(state).type, - partialArg, - }), - ); - }, - ), - isEqual, - ({ type, command }) => [type, command].join("\u0000"), - ); -} - -function getMetadata( - state: nearley.State, -): CommandRulePostProcessor["metadata"] { - return (state.rule.postprocess as unknown as CommandRulePostProcessor) - .metadata; -} - -// Prevent infinite recursion by limiting the number of times we visit a state -// to 3. Note that this is a pretty arbitrary number, and in theory we could -// need to visit the same state more than 3 times. However, in practice, we -// don't expect to need to visit the same state more than 3 times. -const MAX_VISITS = 3; - -/** Indicates that the given token hasn't been typed yet */ -export const MISSING = Symbol("missing"); - -/** The next token to be consumed */ -export const NEXT = Symbol("next"); - -/** - * Given a state, returns all root states that are reachable from it, including - * partially filled out arguments to the given rule. We use this to find out - * which top-level rules want a given token type. - * - * @param state The state to get the root states of - * @param lastSymbol The partially filled out symbol that is currently being - * constructed - * @param visitCounts A map of states to the number of times they've been - * visited. We use this to prevent infinite recursion - * @param roots The list of root states - * @returns A list of root states - */ -function computeRootStatePartialArgs( - state: nearley.State, - lastSymbol: any = NEXT, - visitCounts = new DefaultMap(() => 0), - roots: { state: State; partialArg: any }[] = [], -) { - const visitCount = visitCounts.get(state); - if (visitCount > MAX_VISITS) { - return roots; - } - visitCounts.set(state, visitCount + 1); - - let partialArg: any; - try { - const argList = [...getCompletedSymbols(state), lastSymbol]; - argList.push( - ...times(state.rule.symbols.length - argList.length, () => MISSING), - ); - partialArg = state.rule.postprocess?.(argList) ?? argList; - } catch (err) { - // If we can't construct the partial argument because the rule's postprocess - // wasn't designed to handle partial arguments, then we just replace it with - // MISSING - partialArg = MISSING; - } - - if (state.wantedBy.length === 0) { - roots.push({ state, partialArg }); - } - - for (const parent of state.wantedBy) { - // If we're not a root state, we recurse on all states that want this state, - // passing them our partial argument so that they can use it when constructing - // their partial argument - computeRootStatePartialArgs(parent, partialArg, visitCounts, roots); - } - - return roots; -} - -/** - * Given a state, returns a list of the symbols that have already been - * completed. - * - * @param state A state - * @returns A list of completed symbols - */ -function getCompletedSymbols(state: nearley.State) { - let currentState = state; - const completedSymbols: any[] = []; - - while (currentState.dot > 0) { - completedSymbols.push(currentState.right!.data); - currentState = currentState.left!; - } - - return completedSymbols; -} diff --git a/packages/cursorless-vscode/src/keyboard/grammar/grammar.ne b/packages/cursorless-vscode/src/keyboard/grammar/grammar.ne deleted file mode 100644 index 65c59eabe4d..00000000000 --- a/packages/cursorless-vscode/src/keyboard/grammar/grammar.ne +++ /dev/null @@ -1,99 +0,0 @@ -@preprocessor typescript -@{% -import { capture, command, UNUSED as _, argPositions } from "../grammarHelpers" -import { keyboardLexer } from "../keyboardLexer"; - -const { $0, $1, $2 } = argPositions; -%} -@lexer keyboardLexer - -# ===================== Top-level commands =================== - -# --------------------------- Marks -------------------------- -# "air" -main -> decoratedMark {% - command("targetDecoratedMark", { decoratedMark: $0, mode: "replace" }) -%} - -# "past air" -main -> %makeRange decoratedMark {% - command("targetDecoratedMark", { decoratedMark: $1, mode: "extend" }) -%} - -# "and air" -main -> %makeList decoratedMark {% - command("targetDecoratedMark", { decoratedMark: $1, mode: "append" }) -%} - -# --------------------------- Modifier -------------------------- - -main -> modifier {% command("modifyTarget", { modifier: $0 }) %} - -# --------------------------- Actions -------------------------- - -# "chuck" -main -> %simpleAction {% command("performSimpleActionOnTarget", ["actionDescriptor"]) %} - -# "round wrap" -main -> %wrap %pairedDelimiter {% - command("performWrapActionOnTarget", ["actionDescriptor", "delimiter"]) -%} - -# Custom vscode command -main -> %vscodeCommand {% command("vscodeCommand", ["command"]) %} - -# ========================== Captures ============================= - -# --------------------------- Modifiers --------------------------- - -# "funk" -modifier -> scopeType {% capture({ type: "containingScope", scopeType: $0 }) %} - -# "every funk" -modifier -> %every scopeType {% capture({ type: "everyScope", scopeType: $1 }) %} - -# "[third] next [two] funks" -# "[third] previous [two] funks" -modifier -> offset:? %nextPrev number:? scopeType {% - ([offset, _, length, scopeType]) => ({ - type: "relativeScope", - offset: offset?.number ?? 1, - direction: offset?.direction ?? "forward", - length: length ?? 1, - scopeType, - }) -%} - -# "three funks [backward]" -modifier -> offset scopeType {% - ([offset, scopeType]) => ({ - type: "relativeScope", - offset: 0, - direction: offset?.direction ?? "forward", - length: offset?.number ?? 1, - scopeType, - }) -%} - -# --------------------------- Scope types --------------------------- -scopeType -> %simpleScopeTypeType {% capture("type") %} -scopeType -> %pairedDelimiter {% - ([delimiter]) => ({ type: "surroundingPair", delimiter }) -%} - -# --------------------------- Other --------------------------- -decoratedMark -> - %color {% capture("color") %} - | %shape {% capture("shape") %} - | %combineColorAndShape %color %shape {% capture(_, "color", "shape") %} - | %combineColorAndShape %shape %color {% capture(_, "shape", "color") %} - -# Contains a direction and a number for use with nextPrev and ordinal -offset -> - %direction:? number {% capture("direction", "number") %} - | number:? %direction {% capture("number", "direction") %} - -number -> %digit:+ {% - ([digits]) => - digits.reduce((total: number, digit: number) => total * 10 + digit, 0) -%} diff --git a/packages/cursorless-vscode/src/keyboard/grammar/grammar.test.ts b/packages/cursorless-vscode/src/keyboard/grammar/grammar.test.ts deleted file mode 100644 index 8a9a0729b12..00000000000 --- a/packages/cursorless-vscode/src/keyboard/grammar/grammar.test.ts +++ /dev/null @@ -1,161 +0,0 @@ -import { Parser, Grammar } from "nearley"; -import grammar from "./generated/grammar"; -import assert from "assert"; -import { KeyDescriptor } from "../TokenTypeHelpers"; -import { KeyboardCommandHandler } from "../KeyboardCommandHandler"; -import { KeyboardCommand } from "../KeyboardCommandTypeHelpers"; -import { stringifyTokens } from "./stringifyTokens"; - -interface TestCase { - tokens: KeyDescriptor[]; - expected: KeyboardCommand; -} - -const testCases: TestCase[] = [ - { - tokens: [{ type: "shape", value: "fox" }], - expected: { - arg: { - decoratedMark: { - shape: "fox", - }, - mode: "replace", - }, - type: "targetDecoratedMark", - }, - }, - { - tokens: [{ type: "color", value: "green" }], - expected: { - arg: { - decoratedMark: { - color: "green", - }, - mode: "replace", - }, - type: "targetDecoratedMark", - }, - }, - { - tokens: [ - { type: "combineColorAndShape", value: "combineColorAndShape" }, - { type: "color", value: "green" }, - { type: "shape", value: "fox" }, - ], - expected: { - arg: { - decoratedMark: { - color: "green", - shape: "fox", - }, - mode: "replace", - }, - type: "targetDecoratedMark", - }, - }, - { - tokens: [ - { type: "combineColorAndShape", value: "combineColorAndShape" }, - { type: "shape", value: "fox" }, - { type: "color", value: "green" }, - ], - expected: { - arg: { - decoratedMark: { - color: "green", - shape: "fox", - }, - mode: "replace", - }, - type: "targetDecoratedMark", - }, - }, - { - tokens: [ - { type: "makeRange", value: "makeRange" }, - { type: "color", value: "green" }, - ], - expected: { - arg: { - decoratedMark: { - color: "green", - }, - mode: "extend", - }, - type: "targetDecoratedMark", - }, - }, - { - tokens: [ - { type: "digit", value: 1 }, - { type: "digit", value: 2 }, - { type: "nextPrev", value: "nextPrev" }, - { type: "simpleScopeTypeType", value: "namedFunction" }, - ], - expected: { - arg: { - modifier: { - type: "relativeScope", - length: 1, - offset: 12, - direction: "forward", - scopeType: { - type: "namedFunction", - }, - }, - }, - type: "modifyTarget", - }, - }, - { - tokens: [ - { type: "direction", value: "backward" }, - { type: "nextPrev", value: "nextPrev" }, - { type: "simpleScopeTypeType", value: "namedFunction" }, - ], - expected: { - arg: { - modifier: { - type: "relativeScope", - length: 1, - offset: 1, - direction: "backward", - scopeType: { - type: "namedFunction", - }, - }, - }, - type: "modifyTarget", - }, - }, - { - tokens: [ - { - type: "vscodeCommand", - value: "workbench.action.editor.changeLanguageMode", - }, - ], - expected: { - arg: { - command: "workbench.action.editor.changeLanguageMode", - }, - type: "vscodeCommand", - }, - }, -]; - -suite("keyboard grammar", () => { - let parser: Parser; - setup(() => { - parser = new Parser(Grammar.fromCompiled(grammar)); - }); - - testCases.forEach(({ tokens, expected }) => { - test(`should parse \`${stringifyTokens(tokens)}\``, () => { - parser.feed(tokens); - - assert.equal(parser.results.length, 1); - assert.deepStrictEqual(parser.results[0], expected); - }); - }); -}); diff --git a/packages/cursorless-vscode/src/keyboard/grammar/grammarHelpers.ts b/packages/cursorless-vscode/src/keyboard/grammar/grammarHelpers.ts deleted file mode 100644 index a716da26c81..00000000000 --- a/packages/cursorless-vscode/src/keyboard/grammar/grammarHelpers.ts +++ /dev/null @@ -1,168 +0,0 @@ -import { isString } from "lodash"; -import { KeyboardCommandArgTypes } from "../KeyboardCommandTypeHelpers"; -import { CommandRulePostProcessor } from "./CommandRulePostProcessor"; - -export const UNUSED = Symbol("unused"); -export type Unused = typeof UNUSED; - -/** - * @param args The values output by the parser rule - * @param argExtractors Extractors to get values for payload - * @returns An object with the given keys mapped to the values at the same - * positions in the parser rule's output - */ -function constructPayload( - args: any[], - argExtractors: KeyboardArgExtractor, -): Record { - const arg: Partial> = {}; - for (const [key, value] of Object.entries(argExtractors)) { - if (value instanceof ArgPosition) { - arg[key as keyof K] = args[value.position]; - } else { - arg[key as keyof K] = value; - } - } - return arg as Record; -} - -class ArgPosition { - constructor(public position: number) {} -} - -export const argPositions: Record = { - $0: new ArgPosition(0), - $1: new ArgPosition(1), - $2: new ArgPosition(2), -}; - -type KeyboardArgExtractor = { - [K in keyof T]: T[K] | ArgPosition; -}; - -/** - * Creates a postprocess function for a top-level rule of our grammar. This is a - * function that takes the output of a rule and transforms it into a command - * usable by our command handler. It does so by constructing a payload object - * with `type` as provided in {@link type}, and `args` constructed by mapping - * {@link argExtractors} to the values at the same positions in the parser - * rule's output. - * - * We also keep metadata about the rule on the postprocess function so that we - * can display it to the user, eg in the sidebar. The reason we keep the - * metadata here is that the postprocess function is the only thing we have - * control over in the nearley parser. - * - * The {@link argExtractors} argument can be either: - * - * - A function that takes the output of the parser rule and returns the - * command's argument payload. For example: - * - * ```ts - * p = command("foo", (args) => ({ bar: args[0], baz: args[1] })) - * assert(p(["a", "b"]) === { type: "foo", arg: { bar: "a", baz: "b" } } - * ``` - * - An object mapping the names of the arguments to the command's argument - * payload to the positions of the values in the parser rule's output. For - * example: - * - * ```ts - * p = command("foo", { bar: $1, baz: "hello" }) - * assert(p(["a", "b"]) === { type: "foo", arg: { bar: "b", baz: "hello" } } - * ``` - * - * - An array of the names of the arguments to the command's argument payload. - * For example: - * - * ```ts - * p = command("foo", ["bar", "baz"]) - * assert(p(["a", "b"]) === { type: "foo", arg: { bar: "a", baz: "b" } } - * ``` - * - * @param type The type of the command - * @param argExtractors The extractors to use to get the command's argument (see - * above) - * @returns A postprocess function for the command - */ -export function command( - type: T, - argExtractors: - | KeyboardArgExtractor - | (keyof KeyboardCommandArgTypes[T] | Unused)[] - | ((args: any[]) => KeyboardCommandArgTypes[T]), -): CommandRulePostProcessor { - let extractArgs: (args: any[]) => KeyboardCommandArgTypes[T]; - - if (typeof argExtractors === "function") { - extractArgs = argExtractors; - } else { - const extractors = Array.isArray(argExtractors) - ? getArgExtractors(argExtractors) - : argExtractors; - extractArgs = (args: any[]) => - constructPayload(args, extractors) as KeyboardCommandArgTypes[T]; - } - - function ret(args: any[]) { - return { - type, - arg: extractArgs(args), - }; - } - ret.metadata = { type }; - return ret; -} - -function getArgExtractors(argExtractors: (keyof T | typeof UNUSED)[]): T { - return Object.fromEntries( - argExtractors - .map((arg, i) => [arg, new ArgPosition(i)]) - .filter(([arg]) => arg !== UNUSED), - ); -} - -/** - * Creates a postprocess function for a lower-level capture in our keyboard - * grammar. The output will be an object with the keys of {@link argNames} - * mapped to the values at the same positions in the parser rule's output. - * - * For example: - * - * ```ts - * const processor = capture("foo", "bar"); - * processor(["a", "b"]) === { foo: "a", bar: "b" } - * ``` - * - * When used in a parser rule, it would look like: - * - * ```nearley - * foo -> bar baz {% capture("bar", "baz") %} - * ``` - * - * Then if the rule matched with tokens 0 then 1, the output would be: - * - * ```ts - * { bar: 0, baz: 1 } - * ``` - * - * @param argExtractor The extractors to use to get the argument payload - * @returns A postprocess function that constructs a payload with the given keys - * mapped to the values at the same positions in the parser rule's output - */ -export function capture( - argExtractor: KeyboardArgExtractor>, -): (args: any[]) => Record; -export function capture( - ...argNames: (string | Unused)[] -): (args: any[]) => Record; -export function capture( - arg0: (string | Unused) | KeyboardArgExtractor>, - ...argNames: (string | Unused)[] -): (args: any[]) => Record { - const extractors = - isString(arg0) || arg0 === UNUSED - ? getArgExtractors([arg0, ...argNames]) - : arg0; - - return (args: any[]) => constructPayload(args, extractors); -} diff --git a/packages/cursorless-vscode/src/keyboard/grammar/keyboardLexer.ts b/packages/cursorless-vscode/src/keyboard/grammar/keyboardLexer.ts deleted file mode 100644 index c1b7713db83..00000000000 --- a/packages/cursorless-vscode/src/keyboard/grammar/keyboardLexer.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Lexer } from "nearley"; -import { TokenTypeKeyMapMap } from "../TokenTypeHelpers"; - -interface LexerState { - index: number; -} - -interface Token { - type: string; - value: any; -} - -/** - * A simple lexer for our keyboard grammar designed to handle a stream of tokens - * of the form {@link Token}. It passes the token along unchanged to the parser - * to use when it is checking token types, and exposes a {@link transform} - * method that the parser will then use to transform the token into the actual - * value that will be used when constructing rule outputs. - */ -class KeyboardLexer implements Lexer { - buffer: any[] = []; - bufferIndex = 0; - index = 0; - - reset(data: Token[], { index }: LexerState = { index: 0 }) { - this.buffer = data; - this.bufferIndex = 0; - this.index = index; - } - - next() { - if (this.bufferIndex < this.buffer.length) { - this.index++; - return this.buffer[this.bufferIndex++]; - } - } - - save() { - return { - index: this.index, - }; - } - - formatError(_token: any, message: string) { - return message + " at index " + (this.index - 1); - } - - has(_type: keyof TokenTypeKeyMapMap) { - return true; - } - - transform({ value }: Token) { - return value; - } -} - -export const keyboardLexer = new KeyboardLexer(); diff --git a/packages/cursorless-vscode/src/keyboard/grammar/stringifyTokens.ts b/packages/cursorless-vscode/src/keyboard/grammar/stringifyTokens.ts deleted file mode 100644 index d01ef3f307c..00000000000 --- a/packages/cursorless-vscode/src/keyboard/grammar/stringifyTokens.ts +++ /dev/null @@ -1,11 +0,0 @@ -export function stringifyTokens(tokens: any[]) { - return tokens - .map((token) => { - let ret = token.type; - if (token.value != null) { - ret += `:${JSON.stringify(token.value)}`; - } - return ret; - }) - .join(" "); -} diff --git a/packages/cursorless-vscode/src/keyboard/keyboard-config.fixture.json b/packages/cursorless-vscode/src/keyboard/keyboard-config.fixture.json deleted file mode 100644 index 2466a6f4b52..00000000000 --- a/packages/cursorless-vscode/src/keyboard/keyboard-config.fixture.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "!!NOTE!!": "This file is for internal development purposes only; these experimental features are not supported and could break at any time.", - "cursorless.experimental.keyboard.modal.keybindings.scope": { - "i": "line", - "sb": "paragraph", - ";": "statement", - ",": "collectionItem", - ".": "functionCall", - "'": "string", - "sf": "namedFunction", - "sc": "class", - "st": "token", - "sy": "type", - "sv": "value", - "sk": "collectionKey", - "sp": "nonWhitespaceSequence", - "ss": "boundedNonWhitespaceSequence", - "sa": "argumentOrParameter", - "sl": "url" - }, - "cursorless.experimental.keyboard.modal.keybindings.action": { - "at": "setSelection", - "ah": "setSelectionBefore", - "al": "setSelectionAfter", - "ai": { "actionId": "editNewLineBefore", "exitCursorlessMode": true }, - "ao": { "actionId": "editNewLineAfter", "exitCursorlessMode": true }, - "ak": "insertCopyBefore", - "aj": "insertCopyAfter", - "au": "replaceWithTarget", - "am": "moveToTarget", - "c": { "actionId": "clearAndSetSelection", "exitCursorlessMode": true }, - "as": "swapTargets", - "af": "foldRegion", - "aI": "insertEmptyLineBefore", - "aO": "insertEmptyLineAfter", - "aU": "insertEmptyLinesAround", - "ac": "copyToClipboard", - "ax": "cutToClipboard", - "ap": "pasteFromClipboard", - "ad": "followLink", - "x": "remove", - "aw": "wrap" - }, - "cursorless.experimental.keyboard.modal.keybindings.color": { - "d": "default", - "b": "blue", - "y": "yellow", - "r": "red", - "g": "green", - "p": "pink" - }, - "cursorless.experimental.keyboard.modal.keybindings.shape": { - "hx": "ex", - "hf": "fox", - "hq": "frame", - "hv": "curve", - "he": "eye", - "hy": "play", - "hz": "bolt", - "hw": "crosshairs" - }, - "cursorless.experimental.keyboard.modal.keybindings.misc": { - "fx": "combineColorAndShape", - "fk": "makeRange", - "fa": "makeList", - "-": "backward" - }, - "cursorless.experimental.keyboard.modal.keybindings.modifier": { - "n": "nextPrev", - "*": "every" - }, - "cursorless.experimental.keyboard.modal.keybindings.vscodeCommand": { - "va": "editor.action.addCommentLine", - "vb": { - "commandId": "editor.action.addCommentLine", - "executeAtTarget": true - }, - "vc": { - "commandId": "editor.action.addCommentLine", - "executeAtTarget": true, - "keepChangedSelection": true, - "exitCursorlessMode": true - } - }, - "cursorless.experimental.keyboard.modal.keybindings.pairedDelimiter": { - "wl": "angleBrackets", - "wt": "backtickQuotes", - "wb": "curlyBrackets", - "wd": "doubleQuotes", - "wwd": "escapedDoubleQuotes", - "wwp": "escapedParentheses", - "wws": "escapedSquareBrackets", - "wwq": "escapedSingleQuotes", - "wp": "parentheses", - "wq": "singleQuotes", - "ws": "squareBrackets", - "wg": "string", - "wj": "any", - "wk": "collectionBoundary" - } -} diff --git a/packages/cursorless-vscode/src/logQuickActions.ts b/packages/cursorless-vscode/src/logQuickActions.ts deleted file mode 100644 index cbd4f2afd36..00000000000 --- a/packages/cursorless-vscode/src/logQuickActions.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { CodeAction, commands, window } from "vscode"; - -/** - * Displays quick actions at the current cursor position in the active text - * editor. - * @param kind Optional parameter specifying the kind of quick actions to - * display. Note that kinds are hierarchical, so if you pass a more generic - * kind, the more specific sub-kinds will be logged. - * @returns A promise that resolves to an array of available code actions. - */ -export async function logQuickActions(kind?: string) { - const editor = window.activeTextEditor; - - if (editor == null) { - window.showErrorMessage("No active editor"); - return; - } - - const availableCodeActions = ( - await commands.executeCommand( - "vscode.executeCodeActionProvider", - editor.document.uri, - editor.selections[0], - kind, - ) - ).map(({ title, kind, isPreferred }) => ({ - title, - kind: kind?.value, - isPreferred, - })); - - availableCodeActions.forEach((availableCodeAction) => { - console.log(`${JSON.stringify(availableCodeAction, null, 2)}`); - }); - - window.showInformationMessage( - "Run command 'Developer: Toggle Developer Tools' to see available code actions", - ); - - return availableCodeActions; -} diff --git a/packages/cursorless-vscode/src/registerCommands.ts b/packages/cursorless-vscode/src/registerCommands.ts index c070e296a69..55c076ea8c7 100644 --- a/packages/cursorless-vscode/src/registerCommands.ts +++ b/packages/cursorless-vscode/src/registerCommands.ts @@ -1,31 +1,27 @@ import { CURSORLESS_COMMAND_ID, CursorlessCommandId, - FileSystem, isTesting, } from "@cursorless/common"; import { CommandApi, TestCaseRecorder, - analyzeCommandHistory, showCheatsheet, updateDefaults, } from "@cursorless/cursorless-engine"; import * as vscode from "vscode"; -import { ScopeVisualizer } from "./ScopeVisualizerCommandApi"; import { showDocumentation, showQuickPick } from "./commands"; import { VscodeIDE } from "./ide/vscode/VscodeIDE"; import { VscodeHats } from "./ide/vscode/hats/VscodeHats"; import { KeyboardCommands } from "./keyboard/KeyboardCommands"; -import { logQuickActions } from "./logQuickActions"; +import { ScopeVisualizerCommandApi } from "./ScopeVisualizerCommandApi"; export function registerCommands( extensionContext: vscode.ExtensionContext, vscodeIde: VscodeIDE, commandApi: CommandApi, - fileSystem: FileSystem, testCaseRecorder: TestCaseRecorder, - scopeVisualizer: ScopeVisualizer, + scopeVisualizer: ScopeVisualizerCommandApi, keyboardCommands: KeyboardCommands, hats: VscodeHats, ): void { @@ -60,8 +56,6 @@ export function registerCommands( ["cursorless.showQuickPick"]: showQuickPick, ["cursorless.showDocumentation"]: showDocumentation, - ["cursorless.private.logQuickActions"]: logQuickActions, - // Hats ["cursorless.toggleDecorations"]: hats.toggle, ["cursorless.recomputeDecorationStyles"]: hats.recomputeDecorationStyles, @@ -70,10 +64,6 @@ export function registerCommands( ["cursorless.showScopeVisualizer"]: scopeVisualizer.start, ["cursorless.hideScopeVisualizer"]: scopeVisualizer.stop, - // Command history - ["cursorless.analyzeCommandHistory"]: () => - analyzeCommandHistory(fileSystem.cursorlessCommandHistoryDirPath), - // General keyboard commands ["cursorless.keyboard.escape"]: keyboardCommands.keyboardHandler.cancelActiveListener, @@ -83,7 +73,7 @@ export function registerCommands( keyboardCommands.targeted.targetDecoratedMark, ["cursorless.keyboard.targeted.targetScope"]: - keyboardCommands.targeted.modifyTargetContainingScope, + keyboardCommands.targeted.targetScopeType, ["cursorless.keyboard.targeted.targetSelection"]: keyboardCommands.targeted.targetSelection, diff --git a/packages/cursorless-vscode/src/revisualizeOnCustomRegexChange.ts b/packages/cursorless-vscode/src/revisualizeOnCustomRegexChange.ts deleted file mode 100644 index ea757d894c1..00000000000 --- a/packages/cursorless-vscode/src/revisualizeOnCustomRegexChange.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { - Disposable, - ScopeProvider, - ScopeTypeInfo, - disposableFrom, -} from "@cursorless/common"; -import { isEqual } from "lodash"; -import { - ScopeVisualizer, - VisualizationType, -} from "./ScopeVisualizerCommandApi"; - -/** - * Attempts to ensure that the scope visualizer is still visualizing the same - * scope type after the user changes one of their custom regexes. Because custom - * regexes don't have a unique identifier, we have to do some guesswork to - * figure out which custom regex the user changed. This function look for a - * custom regex with the same spoken form as the one that was changed, and if it - * finds one, it starts visualizing that one instead. - * - * @param scopeVisualizer The scope visualizer to listen to - * @param scopeProvider Provides scope information - * @returns A {@link Disposable} which will stop the callback from running - */ -export function revisualizeOnCustomRegexChange( - scopeVisualizer: ScopeVisualizer, - scopeProvider: ScopeProvider, -): Disposable { - let currentRegexScopeInfo: ScopeTypeInfo | undefined; - let currentVisualizationType: VisualizationType | undefined; - - return disposableFrom( - scopeVisualizer.onDidChangeScopeType((scopeType, visualizationType) => { - currentRegexScopeInfo = - scopeType?.type === "customRegex" - ? scopeProvider.getScopeInfo(scopeType) - : undefined; - currentVisualizationType = visualizationType; - }), - - scopeProvider.onDidChangeScopeInfo((scopeInfos) => { - if ( - currentRegexScopeInfo != null && - !scopeInfos.some((scopeInfo) => - isEqual(scopeInfo.scopeType, currentRegexScopeInfo!.scopeType), - ) - ) { - const replacement = scopeInfos.find( - (scopeInfo) => - scopeInfo.scopeType.type === "customRegex" && - isEqual(scopeInfo.spokenForm, currentRegexScopeInfo!.spokenForm), - ); - if (replacement != null) { - scopeVisualizer.start( - replacement.scopeType, - currentVisualizationType!, - ); - } - } - }), - ); -} diff --git a/packages/cursorless-vscode/src/scripts/populateDist/assets.ts b/packages/cursorless-vscode/src/scripts/populateDist/assets.ts index 8331b757151..b628120496c 100644 --- a/packages/cursorless-vscode/src/scripts/populateDist/assets.ts +++ b/packages/cursorless-vscode/src/scripts/populateDist/assets.ts @@ -24,8 +24,7 @@ export const assets: Asset[] = [ destination: "fonts/cursorless.woff", }, { source: "../../images/hats", destination: "images/hats" }, - { source: "./images/logo.png", destination: "images/logo.png" }, - { source: "../../images/logo.svg", destination: "images/logo.svg" }, + { source: "../../images/icon.png", destination: "images/icon.png" }, { source: "../../schemas", destination: "schemas" }, { source: "../../third-party-licenses.csv", diff --git a/packages/cursorless-vscode/src/scripts/populateDist/populateDist.ts b/packages/cursorless-vscode/src/scripts/populateDist/populateDist.ts index e767aa3d595..88fc488ce71 100644 --- a/packages/cursorless-vscode/src/scripts/populateDist/populateDist.ts +++ b/packages/cursorless-vscode/src/scripts/populateDist/populateDist.ts @@ -1,6 +1,6 @@ // Copies files into `dist` directory for packaging import { copy, exists } from "fs-extra"; -import { lstat, mkdir, readFile, rm, writeFile } from "fs/promises"; +import { lstat, mkdir, readFile, writeFile } from "fs/promises"; import * as path from "path"; import { assets } from "./assets"; import { Context } from "./context"; @@ -75,7 +75,6 @@ export async function run() { console.log(`Copying ${fullSource} to ${fullDestination}`); // If directory, copy recursively if ((await lstat(fullSource)).isDirectory()) { - await rm(fullDestination, { recursive: true, force: true }); await mkdir(fullDestination, { recursive: true }); } await copy(fullSource, fullDestination); diff --git a/packages/cursorless-vscode/src/scripts/preprocessSvgHats.ts b/packages/cursorless-vscode/src/scripts/preprocessSvgHats.ts index 1a23fe10b2e..caeba564479 100644 --- a/packages/cursorless-vscode/src/scripts/preprocessSvgHats.ts +++ b/packages/cursorless-vscode/src/scripts/preprocessSvgHats.ts @@ -9,13 +9,9 @@ async function main() { const dumper = new parser.XMLBuilder({ ignoreAttributes: false, suppressEmptyNode: true, - format: true, }); - for (const dirent of readdirSync(directory, { withFileTypes: true })) { - if (!dirent.isFile() || !dirent.name.endsWith(".svg")) { - continue; - } + readdirSync(directory, { withFileTypes: true }).forEach(async (dirent) => { const filePath = path.join(directory, dirent.name); const rawSvg = await fsp.readFile(filePath, { encoding: "utf8" }); const svgJson = new parser.XMLParser({ ignoreAttributes: false }).parse( @@ -34,11 +30,11 @@ async function main() { const outputSvg = dumper .build(svgJson) - .replace(/fill="(?!none)[^"]+"/g, 'fill="#666666"') - .replace(/fill:(?!none)[^;]+;/g, "fill:#666666;"); + .replace(/fill="[^"]+"/, `fill="#666666"`) + .replace(/fill:[^;]+;/, `fill:#666666;`); await fsp.writeFile(filePath, outputSvg); - } + }); } main(); diff --git a/packages/cursorless-vscode/src/storedTargetHighlighter.ts b/packages/cursorless-vscode/src/storedTargetHighlighter.ts deleted file mode 100644 index 59f79c1baab..00000000000 --- a/packages/cursorless-vscode/src/storedTargetHighlighter.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { StoredTargetKey, groupBy, toCharacterRange } from "@cursorless/common"; -import { StoredTargetMap } from "@cursorless/cursorless-engine"; -import { - ScopeRangeType, - ScopeVisualizerColorConfig, -} from "@cursorless/vscode-common"; -import { VscodeIDE } from "./ide/vscode/VscodeIDE"; -import { VscodeFancyRangeHighlighter } from "./ide/vscode/VSCodeScopeVisualizer/VscodeFancyRangeHighlighter"; -import { getColorsFromConfig } from "./ide/vscode/VSCodeScopeVisualizer/getColorsFromConfig"; -import { mapValues } from "lodash"; -import { usingSetting } from "./usingSetting"; - -const targetColorMap: Partial> = { - instanceReference: "domain", - keyboard: "content", -}; - -/** - * Constructs the stored target highlighter and listens for changes to stored - * targets, highlighting them in the editor. - * @param ide The ide object - * @param storedTargets Keeps track of stored targets - * @returns A disposable that disposes of the stored target highlighter - */ -export function storedTargetHighlighter( - ide: VscodeIDE, - storedTargets: StoredTargetMap, -) { - return usingSetting( - "cursorless.scopeVisualizer", - "colors", - (colorConfig) => { - const highlighters = mapValues(targetColorMap, (type) => - type == null - ? undefined - : new VscodeFancyRangeHighlighter( - getColorsFromConfig(colorConfig, type), - ), - ); - - const storedTargetsDisposable = storedTargets.onStoredTargets( - (key, targets) => { - const highlighter = highlighters[key]; - - if (highlighter == null) { - return; - } - - const editorRangeMap = groupBy( - targets ?? [], - ({ editor }) => editor.id, - ); - - ide.visibleTextEditors.forEach((editor) => { - highlighter.setRanges( - editor, - (editorRangeMap.get(editor.id) ?? []).map(({ contentRange }) => - toCharacterRange(contentRange), - ), - ); - }); - }, - ); - - return { - dispose: () => { - for (const highlighter of Object.values(highlighters)) { - highlighter?.dispose(); - } - - storedTargetsDisposable.dispose(); - }, - }; - }, - ); -} diff --git a/packages/cursorless-vscode/src/usingSetting.ts b/packages/cursorless-vscode/src/usingSetting.ts deleted file mode 100644 index 64045bfee35..00000000000 --- a/packages/cursorless-vscode/src/usingSetting.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { vscodeApi } from "./vscodeApi"; -import { Disposable } from "@cursorless/common"; - -/** - * Watches for changes to a setting and calls a factory function whenever the - * setting changes, disposing of any disposables created by the factory. On the - * initial call, the factory function is called immediately. - * - * @param section The section of the setting - * @param setting The setting - * @param factory A function that takes the setting value and returns a disposable - * @returns A disposable that disposes of the setting listener and any disposables created by the factory - */ -export function usingSetting( - section: string, - setting: string, - factory: (value: T) => Disposable, -): Disposable { - const runFactoryWithLatestConfig = () => - factory(vscodeApi.workspace.getConfiguration(section).get(setting)!); - - let disposable = runFactoryWithLatestConfig(); - const configurationDisposable = vscodeApi.workspace.onDidChangeConfiguration( - ({ affectsConfiguration }) => { - if (affectsConfiguration(`${section}.${setting}`)) { - disposable.dispose(); - disposable = runFactoryWithLatestConfig(); - } - }, - ); - - return { - dispose: () => { - disposable.dispose(); - configurationDisposable.dispose(); - }, - }; -} diff --git a/packages/meta-updater/package.json b/packages/meta-updater/package.json index 8b99e15ba32..67566e87cb5 100644 --- a/packages/meta-updater/package.json +++ b/packages/meta-updater/package.json @@ -7,7 +7,7 @@ "build": "esbuild ./src/index.ts --conditions=cursorless:bundler --bundle --outfile=dist/index.cjs --format=cjs --platform=node", "compile": "tsc --build", "watch": "tsc --build --watch", - "clean": "rm -rf ./out tsconfig.tsbuildinfo ./dist ./build" + "clean": "rm -rf ./out tsconfig.tsbuildinfo" }, "dependencies": { "@cursorless/common": "workspace:*", @@ -34,6 +34,5 @@ "@types/js-yaml": "^4.0.2", "@types/lodash": "4.14.181", "esbuild": "^0.17.11" - }, - "type": "module" + } } diff --git a/packages/meta-updater/src/getCursorlessVscodeFields.ts b/packages/meta-updater/src/getCursorlessVscodeFields.ts index d6a16d6f0ac..2abf53d185a 100644 --- a/packages/meta-updater/src/getCursorlessVscodeFields.ts +++ b/packages/meta-updater/src/getCursorlessVscodeFields.ts @@ -1,5 +1,4 @@ import { - CURSORLESS_SCOPE_TREE_VIEW_ID, cursorlessCommandDescriptions, cursorlessCommandIds, } from "@cursorless/common"; @@ -22,10 +21,6 @@ export function getCursorlessVscodeFields(input: PackageJson) { // Causes extension to activate whenever any text editor is opened "onLanguage", - // Causes extension to activate when the Cursorless scope support side bar - // is opened - `onView:${CURSORLESS_SCOPE_TREE_VIEW_ID}`, - // Causes extension to activate when any Cursorless command is run. // Technically we don't need to do this since VSCode 1.74.0, but we support // older versions diff --git a/packages/meta-updater/src/updatePackageJson.ts b/packages/meta-updater/src/updatePackageJson.ts index acfdd77f23e..84e16dbf80f 100644 --- a/packages/meta-updater/src/updatePackageJson.ts +++ b/packages/meta-updater/src/updatePackageJson.ts @@ -1,16 +1,10 @@ -import { omitByDeep } from "@cursorless/common"; -import type { FormatPluginFnOptions } from "@pnpm/meta-updater"; -import { readFile } from "fs/promises"; import * as yaml from "js-yaml"; -import { isUndefined } from "lodash"; -import { join } from "path"; +import type { FormatPluginFnOptions } from "@pnpm/meta-updater"; import { PackageJson } from "type-fest"; import { Context } from "./Context"; import { getCursorlessVscodeFields } from "./getCursorlessVscodeFields"; - -const LIB_ENTRY_POINT = "./src/index.ts"; -const LIB_JS_OUTPUT = "./out/index.js"; -const LIB_TS_DECL_OUTPUT = "./out/index.d.ts"; +import { readFile } from "fs/promises"; +import { join } from "path"; /** * Given a package.json, update it to match our conventions. This function is @@ -44,27 +38,26 @@ export async function updatePackageJson( ? input.name : `@cursorless/${input.name}`; - const isLib = !isRoot && !input.private; - - const exportFields: Partial = !isLib - ? {} - : { - main: LIB_JS_OUTPUT, - types: LIB_TS_DECL_OUTPUT, - exports: { - ["."]: { - // We add a custom condition called `cursorless:bundler` for use with esbuild to - // ensure that it uses source .ts files when importing from another - // package in our monorepo. We use this both for esbuild and for tsx. - // See - // https://github.com/evanw/esbuild/issues/1250#issuecomment-1463826174 - // and - // https://github.com/esbuild-kit/tsx/issues/96#issuecomment-1463825643 - ["cursorless:bundler"]: LIB_ENTRY_POINT, - default: LIB_JS_OUTPUT, + const exportFields: Partial = + isRoot || input.name === "@cursorless/cursorless-vscode" + ? {} + : { + main: "./out/index.js", + types: "./out/index.d.ts", + exports: { + ["."]: { + // We add a custom condition called `cursorless:bundler` for use with esbuild to + // ensure that it uses source .ts files when importing from another + // package in our monorepo. We use this both for esbuild and for tsx. + // See + // https://github.com/evanw/esbuild/issues/1250#issuecomment-1463826174 + // and + // https://github.com/esbuild-kit/tsx/issues/96#issuecomment-1463825643 + ["cursorless:bundler"]: "./src/index.ts", + default: "./out/index.js", + }, }, - }, - }; + }; const isCursorlessVscode = input.name === "@cursorless/cursorless-vscode"; @@ -72,17 +65,19 @@ export async function updatePackageJson( ? getCursorlessVscodeFields(input) : {}; - const output = { + return { ...input, name, license: "MIT", - type: name === "@cursorless/cursorless-org-docs" ? undefined : "module", - scripts: await getScripts(input.scripts, name, packageDir, isRoot, isLib), + scripts: await getScripts( + input.scripts, + packageDir, + isRoot, + isCursorlessVscode, + ), ...exportFields, ...extraFields, - }; - - return omitByDeep(output, isUndefined) as PackageJson; + } as PackageJson; } interface PreCommitConfig { @@ -97,44 +92,33 @@ interface PreCommitConfig { async function getScripts( inputScripts: PackageJson.Scripts | undefined, - name: string | undefined, packageDir: string, isRoot: boolean, - isLib: boolean, + isCursorlessVscode: boolean, ) { const scripts: PackageJson.Scripts = { ...(inputScripts ?? {}), - ...(isLib - ? { - ["compile:tsc"]: "tsc --build", - ["compile:esbuild"]: `esbuild ${LIB_ENTRY_POINT} --sourcemap --format=esm --bundle --packages=external --outfile=${LIB_JS_OUTPUT}`, - compile: "pnpm compile:tsc && pnpm compile:esbuild", - ["watch:tsc"]: "pnpm compile:tsc --watch", - ["watch:esbuild"]: "pnpm compile:esbuild --watch", - watch: `pnpm run --filter ${name} --parallel '/^watch:.*/'`, - } - : {}), + compile: "tsc --build", + watch: "tsc --build --watch", }; if (isRoot) { // Ensure that `pnpm transform-recorded-tests` mirrors what is in pre-commit // config - scripts["transform-recorded-tests"] = - await getTransformRecordedTestsScript(packageDir); + scripts["transform-recorded-tests"] = await getTransformRecordedTestsScript( + packageDir, + ); return scripts; } - const cleanDirs = ["./out", "tsconfig.tsbuildinfo", "./dist", "./build"]; - - const clean = `rm -rf ${cleanDirs.join(" ")}`; + const cleanDirs = ["./out", "tsconfig.tsbuildinfo"]; - const cleanScripts = - name === "@cursorless/cursorless-org-docs" - ? ["pnpm clear", clean] - : [clean]; + if (isCursorlessVscode) { + cleanDirs.push("./dist"); + } - scripts.clean = cleanScripts.join(" && "); + scripts.clean = `rm -rf ${cleanDirs.join(" ")}`; return scripts; } diff --git a/packages/meta-updater/src/updateTSConfig.ts b/packages/meta-updater/src/updateTSConfig.ts index 5165fc71f10..8790b63626b 100644 --- a/packages/meta-updater/src/updateTSConfig.ts +++ b/packages/meta-updater/src/updateTSConfig.ts @@ -2,11 +2,10 @@ import type { FormatPluginFnOptions } from "@pnpm/meta-updater"; import normalizePath from "normalize-path"; import path from "path"; import exists from "path-exists"; -import { PackageJson, TsConfigJson } from "type-fest"; +import { TsConfigJson } from "type-fest"; import { toPosixPath } from "./toPosixPath"; import { Context } from "./Context"; import { uniq } from "lodash"; -import { readFile } from "fs/promises"; /** * Given a tsconfig.json, update it to match our conventions. This function is @@ -71,18 +70,7 @@ export async function updateTSConfig( } const relativePath = spec.slice(5); if (!(await exists(path.join(packageDir, relativePath, "tsconfig.json")))) { - throw new Error(`No tsconfig found for ${relativePath}`); - } - if ( - ( - JSON.parse( - await readFile(path.join(packageDir, relativePath, "package.json"), { - encoding: "utf-8", - }), - ) as PackageJson - ).private - ) { - throw new Error(`Dependency ${relativePath} is private`); + throw new Error(`No tsconfig found for ${relativePath} in ${packageDir}`); } references.push({ path: relativePath }); } diff --git a/packages/test-harness/package.json b/packages/test-harness/package.json index 5329fbc4330..3fb119f80d5 100644 --- a/packages/test-harness/package.json +++ b/packages/test-harness/package.json @@ -5,18 +5,12 @@ "private": true, "main": "./out/index.js", "scripts": { - "test": "env CURSORLESS_TEST=true my-ts-node src/scripts/runTestsCI.ts", - "build:base": "esbuild --sourcemap --conditions=cursorless:bundler --bundle --external:vscode --format=cjs --platform=node", - "build": "pnpm run build:runner && pnpm run build:tests && pnpm run build:unit && pnpm run build:talon", - "build:runner": "pnpm run build:base ./src/runners/extensionTests.ts --outfile=dist/extensionTests.cjs", - "build:unit": "pnpm run build:base ./src/scripts/runUnitTestsOnly.ts --outfile=dist/runUnitTestsOnly.cjs", - "build:talon": "pnpm run build:base ./src/scripts/runTalonTests.ts --outfile=dist/runTalonTests.cjs", - "build:tests": "bash ./scripts/build-tests.sh", + "test": "env CURSORLESS_TEST=true tsx --conditions=cursorless:bundler src/scripts/runTestsCI.ts", "compile": "tsc --build", "watch": "tsc --build --watch", - "clean": "rm -rf ./out tsconfig.tsbuildinfo ./dist ./build", - "generate-test-subset-file": "my-ts-node ./src/scripts/generateTestSubsetFile.ts --always-open", - "generate-test-subset-file-strict": "my-ts-node ./src/scripts/generateTestSubsetFile.ts --fail-if-not-exists" + "clean": "rm -rf ./out tsconfig.tsbuildinfo", + "generate-test-subset-file": "tsx --conditions=cursorless:bundler ./src/scripts/generateTestSubsetFile.ts --always-open", + "generate-test-subset-file-strict": "tsx --conditions=cursorless:bundler ./src/scripts/generateTestSubsetFile.ts --fail-if-not-exists" }, "keywords": [], "author": "", @@ -27,8 +21,8 @@ }, "devDependencies": { "@types/glob": "^7.1.3", - "@types/mocha": "^10.0.3", - "@vscode/test-electron": "^2.3.8", + "@types/mocha": "^8.0.4", + "@vscode/test-electron": "^2.1.3", "mocha": "^10.2.0" }, "types": "./out/index.d.ts", @@ -37,6 +31,5 @@ "cursorless:bundler": "./src/index.ts", "default": "./out/index.js" } - }, - "type": "module" + } } diff --git a/packages/test-harness/scripts/build-tests.sh b/packages/test-harness/scripts/build-tests.sh deleted file mode 100755 index 462955afc48..00000000000 --- a/packages/test-harness/scripts/build-tests.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -TESTS="$(find .. -name '*.test.ts')" - -pnpm run build:base --outdir=dist --out-extension:.js=.cjs $TESTS diff --git a/packages/test-harness/src/runAllTests.ts b/packages/test-harness/src/runAllTests.ts index 19820906968..888cd75509c 100644 --- a/packages/test-harness/src/runAllTests.ts +++ b/packages/test-harness/src/runAllTests.ts @@ -1,5 +1,5 @@ -import globRaw from "glob"; -import Mocha from "mocha"; +import * as globRaw from "glob"; +import * as Mocha from "mocha"; import * as path from "path"; import { getCursorlessRepoRoot } from "@cursorless/common"; import { promisify } from "util"; @@ -26,11 +26,11 @@ export function runAllTests(...types: TestType[]) { path.join(getCursorlessRepoRoot(), "packages"), (files) => files.filter((f) => { - if (f.endsWith("vscode.test.cjs")) { + if (f.endsWith("vscode.test.js")) { return types.includes(TestType.vscode); } - if (f.endsWith("talon.test.cjs")) { + if (f.endsWith("talon.test.js")) { return types.includes(TestType.talon); } @@ -50,7 +50,7 @@ async function runTestsInDir( grep: runTestSubset() ? testSubsetGrepString() : undefined, // Only run a subset of tests }); - const files = filterFiles(await glob("**/**.test.cjs", { cwd: testRoot })); + const files = filterFiles(await glob("**/**.test.js", { cwd: testRoot })); // Add files to the test suite files.forEach((f) => mocha.addFile(path.resolve(testRoot, f))); diff --git a/packages/test-harness/src/scripts/runTestsCI.ts b/packages/test-harness/src/scripts/runTestsCI.ts index 98fbc3726aa..55a07908611 100644 --- a/packages/test-harness/src/scripts/runTestsCI.ts +++ b/packages/test-harness/src/scripts/runTestsCI.ts @@ -11,7 +11,7 @@ import { launchVscodeAndRunTests } from "../launchVscodeAndRunTests"; // unit tests could be run separately. const extensionTestsPath = path.resolve( getCursorlessRepoRoot(), - "packages/test-harness/dist/extensionTests.cjs", + "packages/test-harness/out/runners/extensionTests", ); await launchVscodeAndRunTests(extensionTestsPath); diff --git a/packages/vscode-common/package.json b/packages/vscode-common/package.json index e23c459d589..e431e0318ea 100644 --- a/packages/vscode-common/package.json +++ b/packages/vscode-common/package.json @@ -4,13 +4,9 @@ "description": "Common utility functions usable anywhere that VSCode api is available", "main": "./out/index.js", "scripts": { - "clean": "rm -rf ./out tsconfig.tsbuildinfo ./dist ./build", - "compile:tsc": "tsc --build", - "compile:esbuild": "esbuild ./src/index.ts --sourcemap --format=esm --bundle --packages=external --outfile=./out/index.js", - "compile": "pnpm compile:tsc && pnpm compile:esbuild", - "watch:tsc": "pnpm compile:tsc --watch", - "watch:esbuild": "pnpm compile:esbuild --watch", - "watch": "pnpm run --filter @cursorless/vscode-common --parallel '/^watch:.*/'" + "compile": "tsc --build", + "watch": "tsc --build --watch", + "clean": "rm -rf ./out tsconfig.tsbuildinfo" }, "keywords": [], "author": "", @@ -19,7 +15,7 @@ "@cursorless/common": "workspace:*" }, "devDependencies": { - "@types/vscode": "~1.66.0" + "@types/vscode": "~1.61.0" }, "types": "./out/index.d.ts", "exports": { @@ -27,6 +23,5 @@ "cursorless:bundler": "./src/index.ts", "default": "./out/index.js" } - }, - "type": "module" + } } diff --git a/packages/vscode-common/src/TestHelpers.ts b/packages/vscode-common/src/TestHelpers.ts deleted file mode 100644 index 4028ea56730..00000000000 --- a/packages/vscode-common/src/TestHelpers.ts +++ /dev/null @@ -1,55 +0,0 @@ -import type { - CommandServerApi, - ExcludableSnapshotField, - ExtraSnapshotField, - HatTokenMap, - IDE, - NormalizedIDE, - ScopeProvider, - SerializedMarks, - TargetPlainObject, - TestCaseSnapshot, - TextEditor, -} from "@cursorless/common"; -import * as vscode from "vscode"; -import { VscodeApi } from "./VscodeApi"; - -export interface TestHelpers { - ide: NormalizedIDE; - injectIde: (ide: IDE) => void; - - scopeProvider: ScopeProvider; - - hatTokenMap: HatTokenMap; - - commandServerApi: CommandServerApi; - - toVscodeEditor(editor: TextEditor): vscode.TextEditor; - - setStoredTarget( - editor: vscode.TextEditor, - key: string, - targets: TargetPlainObject[] | undefined, - ): void; - - // FIXME: Remove this once we have a better way to get this function - // accessible from our tests - takeSnapshot( - excludeFields: ExcludableSnapshotField[], - extraFields: ExtraSnapshotField[], - editor: TextEditor, - ide: IDE, - marks: SerializedMarks | undefined, - forceRealClipboard: boolean, - ): Promise; - - runIntegrationTests(): Promise; - - cursorlessTalonStateJsonPath: string; - cursorlessCommandHistoryDirPath: string; - - /** - * A thin wrapper around the VSCode API that allows us to mock it for testing. - */ - vscodeApi: VscodeApi; -} diff --git a/packages/vscode-common/src/getExtensionApi.ts b/packages/vscode-common/src/getExtensionApi.ts index fb1ed72c433..079f85b704c 100644 --- a/packages/vscode-common/src/getExtensionApi.ts +++ b/packages/vscode-common/src/getExtensionApi.ts @@ -1,7 +1,54 @@ -import type { CommandServerApi, SnippetMap } from "@cursorless/common"; +import type { + CommandServerApi, + ExcludableSnapshotField, + ExtraSnapshotField, + HatTokenMap, + IDE, + NormalizedIDE, + SerializedMarks, + SnippetMap, + TargetPlainObject, + TestCaseSnapshot, + TextEditor, +} from "@cursorless/common"; import * as vscode from "vscode"; import type { Language, SyntaxNode, Tree } from "web-tree-sitter"; -import { TestHelpers } from "./TestHelpers"; +import { VscodeApi } from "./VscodeApi"; + +export interface TestHelpers { + ide: NormalizedIDE; + injectIde: (ide: IDE) => void; + + hatTokenMap: HatTokenMap; + + commandServerApi: CommandServerApi; + + toVscodeEditor(editor: TextEditor): vscode.TextEditor; + + setStoredTarget( + editor: vscode.TextEditor, + key: string, + targets: TargetPlainObject[] | undefined, + ): void; + + // FIXME: Remove this once we have a better way to get this function + // accessible from our tests + takeSnapshot( + excludeFields: ExcludableSnapshotField[], + extraFields: ExtraSnapshotField[], + editor: TextEditor, + ide: IDE, + marks: SerializedMarks | undefined, + forceRealClipboard: boolean, + ): Promise; + + runIntegrationTests(): Promise; + + /** + * A thin wrapper around the VSCode API that allows us to mock it for testing. + */ + vscodeApi: VscodeApi; +} export interface CursorlessApi { testHelpers: TestHelpers | undefined; @@ -37,9 +84,8 @@ export async function getExtensionApiStrict(extensionId: string) { return (await extension.activate()) as T; } -export const EXTENSION_ID = "pokey.cursorless"; export const getCursorlessApi = () => - getExtensionApiStrict(EXTENSION_ID); + getExtensionApiStrict("pokey.cursorless"); export const getParseTreeApi = () => getExtensionApiStrict("pokey.parse-tree"); diff --git a/packages/vscode-common/src/index.ts b/packages/vscode-common/src/index.ts index ca15cb6dade..c6a679e3bc0 100644 --- a/packages/vscode-common/src/index.ts +++ b/packages/vscode-common/src/index.ts @@ -1,5 +1,4 @@ export * from "./getExtensionApi"; -export * from "./TestHelpers"; export * from "./notebook"; export * from "./testUtil/openNewEditor"; export * from "./vscodeUtil"; diff --git a/packages/vscode-common/src/testUtil/openNewEditor.ts b/packages/vscode-common/src/testUtil/openNewEditor.ts index daf35b894b7..c83e9b4a1db 100644 --- a/packages/vscode-common/src/testUtil/openNewEditor.ts +++ b/packages/vscode-common/src/testUtil/openNewEditor.ts @@ -1,4 +1,4 @@ -import { getParseTreeApi } from "../getExtensionApi"; +import { getParseTreeApi } from ".."; import * as vscode from "vscode"; interface NewEditorOptions { diff --git a/patches/@docusaurus__theme-search-algolia@3.1.0.patch b/patches/@docusaurus__theme-search-algolia@2.3.1.patch similarity index 85% rename from patches/@docusaurus__theme-search-algolia@3.1.0.patch rename to patches/@docusaurus__theme-search-algolia@2.3.1.patch index d324552750f..825554dbd9b 100644 --- a/patches/@docusaurus__theme-search-algolia@3.1.0.patch +++ b/patches/@docusaurus__theme-search-algolia@2.3.1.patch @@ -1,5 +1,5 @@ diff --git a/lib/theme/SearchBar/index.js b/lib/theme/SearchBar/index.js -index 4df023cb619433b59c64b31e3fd832f833aba7c7..c63d1a23f53d7dbccd0f7667a5740e76bbe7bf73 100644 +index 013ea405ee59fae6f2cf464e6b984eb162321e7b..0dcaaafbcb7e7506cd33c3d61dec14aa8b497138 100644 --- a/lib/theme/SearchBar/index.js +++ b/lib/theme/SearchBar/index.js @@ -4,6 +4,7 @@ @@ -8,9 +8,9 @@ index 4df023cb619433b59c64b31e3fd832f833aba7c7..c63d1a23f53d7dbccd0f7667a5740e76 */ +import useIsBrowser from '@docusaurus/useIsBrowser'; import React, {useCallback, useMemo, useRef, useState} from 'react'; - import {createPortal} from 'react-dom'; import {DocSearchButton, useDocSearchKeyboardEvents} from '@docsearch/react'; -@@ -51,10 +52,28 @@ function DocSearch({contextualSearch, externalUrlRegex, ...props}) { + import Head from '@docusaurus/Head'; +@@ -49,10 +50,28 @@ function DocSearch({contextualSearch, externalUrlRegex, ...props}) { mergeFacetFilters(contextualSearchFacetFilters, configFacetFilters) : // ... or use config facetFilters configFacetFilters; @@ -38,4 +38,4 @@ index 4df023cb619433b59c64b31e3fd832f833aba7c7..c63d1a23f53d7dbccd0f7667a5740e76 + ], }; const history = useHistory(); - const searchContainer = useRef(null); + const searchContainer = useRef(null); \ No newline at end of file diff --git a/patches/@types__nearley@2.11.5.patch b/patches/@types__nearley@2.11.5.patch deleted file mode 100644 index 776a237c0d2..00000000000 --- a/patches/@types__nearley@2.11.5.patch +++ /dev/null @@ -1,50 +0,0 @@ -diff --git a/index.d.ts b/index.d.ts -index 5cca1013513217cf5ec46c04e60cbb1dc2c7b2f1..289ca02c4bf917b0f6dacfe2d60d2e91a77bcf77 100644 ---- a/index.d.ts -+++ b/index.d.ts -@@ -1,5 +1,18 @@ - export as namespace nearley; - -+export interface State { -+ rule: Rule; -+ dot: number; -+ wantedBy: State[]; -+ left?: State; -+ right?: State; -+ data: any; -+} -+ -+export interface Column { -+ scannable: State[]; -+} -+ - export class Parser { - /** - * Reserved token for indicating a parse fail. -@@ -19,6 +32,8 @@ export class Parser { - */ - results: any[]; - -+ table: Column[]; -+ - constructor(grammar: Grammar, options?: ParserOptions); - - /** -@@ -30,7 +45,7 @@ export class Parser { - * @throws If there are no possible parsings, nearley will throw an error - * whose offset property is the index of the offending token. - */ -- feed(chunk: string): this; -+ feed(chunk: string | any[]): this; - finish(): any[]; - restore(column: { [key: string]: any; lexerState: LexerState }): void; - save(): { [key: string]: any; lexerState: LexerState }; -@@ -83,7 +98,7 @@ export interface Lexer { - /** - * Sets the internal buffer to data, and restores line/col/state info taken from save(). - */ -- reset(data: string, state?: LexerState): void; -+ reset(data: string | any[], state?: LexerState): void; - /** - * Returns e.g. {type, value, line, col, …}. Only the value attribute is required. - */ \ No newline at end of file diff --git a/patches/nearley@2.20.1.patch b/patches/nearley@2.20.1.patch deleted file mode 100644 index 54ddf4962a5..00000000000 --- a/patches/nearley@2.20.1.patch +++ /dev/null @@ -1,32 +0,0 @@ -diff --git a/lib/generate.js b/lib/generate.js -index e0bd2c7bf86ed3e09fb99b792cd2d210c0c4f67a..f56765d2b6d8f5a47feaafd3e36e3e4c78fe870d 100644 ---- a/lib/generate.js -+++ b/lib/generate.js -@@ -199,11 +199,11 @@ - output += "};\n"; - output += "\n"; - output += "interface NearleyLexer {\n"; -- output += " reset: (chunk: string, info: any) => void;\n"; -+ output += " reset: (chunk: any, info: any) => void;\n"; - output += " next: () => NearleyToken | undefined;\n"; - output += " save: () => any;\n"; -- output += " formatError: (token: never) => string;\n"; -- output += " has: (tokenType: string) => boolean;\n"; -+ output += " formatError: (token: any, message: string) => string;\n"; -+ output += " has: (tokenType: any) => boolean;\n"; - output += "};\n"; - output += "\n"; - output += "interface NearleyRule {\n"; -diff --git a/lib/nearley.js b/lib/nearley.js -index b564e11e24d2bcc597d46bb01af84a1972cc6b9d..1d559ea3c96059f764bb5138a387039fe290ee26 100644 ---- a/lib/nearley.js -+++ b/lib/nearley.js -@@ -311,7 +311,7 @@ - - // Advance all tokens that expect the symbol - var literal = token.text !== undefined ? token.text : token.value; -- var value = lexer.constructor === StreamLexer ? token.value : token; -+ var value = lexer.constructor === StreamLexer ? token.value : lexer.transform?.(token) ?? token; - var scannable = column.scannable; - for (var w = scannable.length; w--; ) { - var state = scannable[w]; \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 44dbb01d842..0aabb70b61a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,15 +5,9 @@ settings: excludeLinksFromLockfile: false patchedDependencies: - '@docusaurus/theme-search-algolia@3.1.0': - hash: lazxwgumd4o5a3ibe55vftei5e - path: patches/@docusaurus__theme-search-algolia@3.1.0.patch - '@types/nearley@2.11.5': - hash: 5bomp3nnmdzdyzcgrxyr5kymae - path: patches/@types__nearley@2.11.5.patch - nearley@2.20.1: - hash: mg2fc7wgvzub3myuz6m74hllma - path: patches/nearley@2.20.1.patch + '@docusaurus/theme-search-algolia@3.0.0-alpha.0': + hash: dfty3zxmjzsb7sg6jf27rbwooe + path: patches/@docusaurus__theme-search-algolia@2.3.1.patch importers: @@ -23,47 +17,41 @@ importers: specifier: 1.0.0 version: 1.0.0 '@types/node': - specifier: ^18.18.2 - version: 18.18.9 + specifier: ^16.11.3 + version: 16.18.13 '@typescript-eslint/eslint-plugin': - specifier: ^6.10.0 - version: 6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2) + specifier: ^5.58.0 + version: 5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.38.0)(typescript@5.1.6) '@typescript-eslint/parser': - specifier: ^6.10.0 - version: 6.10.0(eslint@8.53.0)(typescript@5.2.2) - esbuild: - specifier: ^0.17.11 - version: 0.17.11 + specifier: ^5.58.0 + version: 5.58.0(eslint@8.38.0)(typescript@5.1.6) eslint: - specifier: ^8.53.0 - version: 8.53.0 + specifier: ^8.38.0 + version: 8.38.0 eslint-config-prettier: specifier: ^8.8.0 - version: 8.8.0(eslint@8.53.0) + version: 8.8.0(eslint@8.38.0) eslint-import-resolver-typescript: specifier: 3.5.5 - version: 3.5.5(@typescript-eslint/parser@6.10.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.53.0) + version: 3.5.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.38.0) eslint-plugin-import: - specifier: 2.28.1 - version: 2.28.1(@typescript-eslint/parser@6.10.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.53.0) - eslint-plugin-mocha: - specifier: 10.2.0 - version: 10.2.0(eslint@8.53.0) - eslint-plugin-unicorn: - specifier: 49.0.0 - version: 49.0.0(eslint@8.53.0) + specifier: 2.27.5 + version: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.38.0) eslint-plugin-unused-imports: - specifier: ^3.0.0 - version: 3.0.0(@typescript-eslint/eslint-plugin@6.10.0)(eslint@8.53.0) + specifier: ^2.0.0 + version: 2.0.0(@typescript-eslint/eslint-plugin@5.58.0)(eslint@8.38.0) prettier: - specifier: 3.0.3 - version: 3.0.3 + specifier: 3.0.0 + version: 3.0.0 syncpack: specifier: 9.8.4 version: 9.8.4 + tsx: + specifier: 3.12.3 + version: 3.12.3 typescript: - specifier: ^5.2.2 - version: 5.2.2 + specifier: ^5.1.6 + version: 5.1.6 packages/cheatsheet: dependencies: @@ -76,6 +64,9 @@ importers: '@fortawesome/react-fontawesome': specifier: 0.2.0 version: 0.2.0(@fortawesome/fontawesome-svg-core@6.3.0)(react@18.2.0) + jest: + specifier: 29.5.0 + version: 29.5.0(@types/node@16.18.13)(ts-node@10.9.1) react: specifier: ^18.2.0 version: 18.2.0 @@ -104,18 +95,15 @@ importers: '@types/react-helmet': specifier: 6.1.6 version: 6.1.6 - jest: - specifier: 29.7.0 - version: 29.7.0(@types/node@18.18.9)(ts-node@10.9.1) jest-environment-jsdom: specifier: 29.6.2 version: 29.6.2 ts-jest: - specifier: 29.1.1 - version: 29.1.1(@babel/core@7.23.7)(esbuild@0.17.11)(jest@29.7.0)(typescript@5.2.2) + specifier: 29.0.5 + version: 29.0.5(@babel/core@7.22.10)(jest@29.5.0)(typescript@5.1.6) typescript: - specifier: ^5.2.2 - version: 5.2.2 + specifier: ^5.1.6 + version: 5.1.6 packages/cheatsheet-local: dependencies: @@ -131,7 +119,7 @@ importers: devDependencies: '@effortlessmotion/html-webpack-inline-source-plugin': specifier: 1.0.3 - version: 1.0.3(html-webpack-plugin@5.5.0)(webpack@5.89.0) + version: 1.0.3(html-webpack-plugin@5.5.0)(webpack@5.88.2) '@testing-library/react': specifier: 14.0.0 version: 14.0.0(react-dom@18.2.0)(react@18.2.0) @@ -139,8 +127,8 @@ importers: specifier: 29.4.0 version: 29.4.0 '@types/node': - specifier: ^18.18.2 - version: 18.18.9 + specifier: ^16.11.3 + version: 16.18.13 '@types/react': specifier: 18.0.28 version: 18.0.28 @@ -149,52 +137,52 @@ importers: version: 18.0.11 '@types/webpack': specifier: 5.28.0 - version: 5.28.0(esbuild@0.17.11)(webpack-cli@5.1.4) + version: 5.28.0(webpack-cli@5.1.4) '@webpack-cli/generators': specifier: 3.0.7 - version: 3.0.7(prettier@3.0.3)(webpack-cli@5.1.4)(webpack@5.89.0) + version: 3.0.7(prettier@3.0.0)(webpack-cli@5.1.4)(webpack@5.88.2) autoprefixer: specifier: 10.4.13 - version: 10.4.13(postcss@8.4.31) + version: 10.4.13(postcss@8.4.21) css-loader: specifier: 6.7.3 - version: 6.7.3(webpack@5.89.0) + version: 6.7.3(webpack@5.88.2) html-webpack-plugin: specifier: 5.5.0 - version: 5.5.0(webpack@5.89.0) + version: 5.5.0(webpack@5.88.2) jest: - specifier: 29.7.0 - version: 29.7.0(@types/node@18.18.9)(ts-node@10.9.1) + specifier: 29.5.0 + version: 29.5.0(@types/node@16.18.13)(ts-node@10.9.1) postcss: - specifier: 8.4.31 - version: 8.4.31 + specifier: 8.4.21 + version: 8.4.21 postcss-loader: specifier: 7.0.2 - version: 7.0.2(postcss@8.4.31)(webpack@5.89.0) + version: 7.0.2(postcss@8.4.21)(webpack@5.88.2) style-loader: specifier: 3.3.1 - version: 3.3.1(webpack@5.89.0) + version: 3.3.1(webpack@5.88.2) tailwindcss: - specifier: 3.3.5 - version: 3.3.5(ts-node@10.9.1) + specifier: 3.2.7 + version: 3.2.7(postcss@8.4.21)(ts-node@10.9.1) ts-loader: specifier: 9.4.2 - version: 9.4.2(typescript@5.2.2)(webpack@5.89.0) + version: 9.4.2(typescript@5.1.6)(webpack@5.88.2) ts-node: specifier: 10.9.1 - version: 10.9.1(@types/node@18.18.9)(typescript@5.2.2) + version: 10.9.1(@types/node@16.18.13)(typescript@5.1.6) typescript: - specifier: ^5.2.2 - version: 5.2.2 + specifier: ^5.1.6 + version: 5.1.6 webpack: - specifier: 5.89.0 - version: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) + specifier: 5.88.2 + version: 5.88.2(webpack-cli@5.1.4) webpack-cli: specifier: 5.1.4 - version: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@4.11.1)(webpack@5.89.0) + version: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@4.11.1)(webpack@5.88.2) webpack-dev-server: specifier: 4.11.1 - version: 4.11.1(webpack-cli@5.1.4)(webpack@5.89.0) + version: 4.11.1(webpack-cli@5.1.4)(webpack@5.88.2) packages/common: dependencies: @@ -212,17 +200,11 @@ importers: specifier: 4.14.181 version: 4.14.181 '@types/mocha': - specifier: ^10.0.3 - version: 10.0.3 + specifier: ^8.0.4 + version: 8.2.3 '@types/sinon': specifier: ^10.0.2 version: 10.0.13 - cross-spawn: - specifier: 7.0.3 - version: 7.0.3 - fast-check: - specifier: 3.12.0 - version: 3.12.0 js-yaml: specifier: ^4.1.0 version: 4.1.0 @@ -238,12 +220,9 @@ importers: '@cursorless/common': specifier: workspace:* version: link:../common - glob: - specifier: ^7.1.7 - version: 7.2.3 immer: specifier: ^9.0.15 - version: 9.0.21 + version: 9.0.19 immutability-helper: specifier: ^3.1.1 version: 3.1.1 @@ -254,21 +233,15 @@ importers: specifier: ^4.17.21 version: 4.17.21 node-html-parser: - specifier: ^6.1.11 - version: 6.1.11 + specifier: ^5.3.3 + version: 5.4.2 sbd: specifier: ^1.0.19 version: 1.0.19 - uuid: - specifier: ^9.0.0 - version: 9.0.0 zod: - specifier: 3.22.3 - version: 3.22.3 + specifier: 3.21.4 + version: 3.21.4 devDependencies: - '@types/glob': - specifier: ^7.1.3 - version: 7.2.0 '@types/js-yaml': specifier: ^4.0.2 version: 4.0.5 @@ -276,17 +249,17 @@ importers: specifier: 4.14.181 version: 4.14.181 '@types/mocha': - specifier: ^10.0.3 - version: 10.0.3 + specifier: ^8.0.4 + version: 8.2.3 '@types/sbd': specifier: ^1.0.3 version: 1.0.3 '@types/sinon': specifier: ^10.0.2 version: 10.0.13 - '@types/uuid': - specifier: ^8.3.4 - version: 8.3.4 + fast-check: + specifier: 3.12.0 + version: 3.12.0 js-yaml: specifier: ^4.1.0 version: 4.1.0 @@ -302,18 +275,15 @@ importers: '@cursorless/cheatsheet': specifier: workspace:* version: link:../cheatsheet - '@mdx-js/loader': - specifier: 3.0.0 - version: 3.0.0(webpack@5.89.0) - '@mdx-js/react': - specifier: 3.0.0 - version: 3.0.0(@types/react@18.0.28)(react@18.2.0) - '@next/mdx': - specifier: 13.4.10 - version: 13.4.10(@mdx-js/loader@3.0.0)(@mdx-js/react@3.0.0) + eslint: + specifier: ^8.38.0 + version: 8.38.0 + eslint-config-next: + specifier: 13.2.3 + version: 13.2.3(eslint@8.38.0)(typescript@5.1.6) next: - specifier: 13.5.4 - version: 13.5.4(@babel/core@7.23.7)(react-dom@18.2.0)(react@18.2.0) + specifier: 13.2.3 + version: 13.2.3(@babel/core@7.22.10)(react-dom@18.2.0)(react@18.2.0) react: specifier: ^18.2.0 version: 18.2.0 @@ -323,19 +293,16 @@ importers: react-player: specifier: 2.12.0 version: 2.12.0(react@18.2.0) + typescript: + specifier: ^5.1.6 + version: 5.1.6 devDependencies: '@svgr/webpack': specifier: 6.5.1 version: 6.5.1 - '@types/mdx': - specifier: 2.0.5 - version: 2.0.5 - '@types/mdx-js__react': - specifier: 1.5.5 - version: 1.5.5 '@types/node': - specifier: ^18.18.2 - version: 18.18.9 + specifier: ^16.11.3 + version: 16.18.13 '@types/react': specifier: 18.0.28 version: 18.0.28 @@ -344,25 +311,16 @@ importers: version: 18.0.11 autoprefixer: specifier: 10.4.13 - version: 10.4.13(postcss@8.4.31) - eslint: - specifier: ^8.53.0 - version: 8.53.0 - eslint-config-next: - specifier: 13.5.4 - version: 13.5.4(eslint@8.53.0)(typescript@5.2.2) + version: 10.4.13(postcss@8.4.21) http-server: specifier: 14.1.1 version: 14.1.1 postcss: - specifier: 8.4.31 - version: 8.4.31 + specifier: 8.4.21 + version: 8.4.21 tailwindcss: - specifier: 3.3.5 - version: 3.3.5(ts-node@10.9.1) - typescript: - specifier: ^5.2.2 - version: 5.2.2 + specifier: 3.2.7 + version: 3.2.7(postcss@8.4.21)(ts-node@10.9.1) packages/cursorless-org-docs: dependencies: @@ -371,25 +329,25 @@ importers: version: 4.15.0 '@docsearch/react': specifier: 3.3.3 - version: 3.3.3(@algolia/client-search@4.15.0)(@types/react@18.0.28)(react-dom@18.2.0)(react@18.2.0) + version: 3.3.3(@algolia/client-search@4.15.0)(react-dom@18.2.0)(react@18.2.0) '@docusaurus/core': - specifier: 3.1.0 - version: 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + specifier: 3.0.0-alpha.0 + version: 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0)(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) '@docusaurus/preset-classic': - specifier: 3.1.0 - version: 3.1.0(@algolia/client-search@4.15.0)(@types/react@18.0.28)(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.2.2) + specifier: 3.0.0-alpha.0 + version: 3.0.0-alpha.0(@algolia/client-search@4.15.0)(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) '@docusaurus/theme-classic': - specifier: 3.1.0 - version: 3.1.0(@types/react@18.0.28)(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + specifier: 3.0.0-alpha.0 + version: 3.0.0-alpha.0(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) '@docusaurus/theme-common': - specifier: 3.1.0 - version: 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) + specifier: 3.0.0-alpha.0 + version: 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0)(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) '@docusaurus/theme-search-algolia': - specifier: 3.1.0 - version: 3.1.0(patch_hash=lazxwgumd4o5a3ibe55vftei5e)(@algolia/client-search@4.15.0)(@docusaurus/types@3.1.0)(@types/react@18.0.28)(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.2.2) + specifier: 3.0.0-alpha.0 + version: 3.0.0-alpha.0(patch_hash=dfty3zxmjzsb7sg6jf27rbwooe)(@algolia/client-search@4.15.0)(@docusaurus/types@3.0.0-alpha.0)(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) '@mdx-js/react': - specifier: 3.0.0 - version: 3.0.0(@types/react@18.0.28)(react@18.2.0) + specifier: 2.3.0 + version: 2.3.0(react@18.2.0) clsx: specifier: ^1.2.1 version: 1.2.1 @@ -397,8 +355,8 @@ importers: specifier: ^2.2.2 version: 2.2.2 prism-react-renderer: - specifier: ^2.1.0 - version: 2.3.1(react@18.2.0) + specifier: ^1.3.5 + version: 1.3.5(react@18.2.0) react: specifier: ^18.2.0 version: 18.2.0 @@ -406,27 +364,18 @@ importers: specifier: ^18.2.0 version: 18.2.0(react@18.2.0) unist-util-visit: - specifier: ^5.0.0 - version: 5.0.0 + specifier: ^4.1.2 + version: 4.1.2 devDependencies: '@docusaurus/module-type-aliases': - specifier: 3.1.0 - version: 3.1.0(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/types': - specifier: 3.1.0 - version: 3.1.0(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0) + specifier: 3.0.0-alpha.0 + version: 3.0.0-alpha.0(react-dom@18.2.0)(react@18.2.0) '@tsconfig/docusaurus': - specifier: 2.0.2 - version: 2.0.2 - '@types/mdast': - specifier: 4.0.3 - version: 4.0.3 + specifier: 2.0.0 + version: 2.0.0 typescript: - specifier: ^5.2.2 - version: 5.2.2 - unified: - specifier: 11.0.4 - version: 11.0.4 + specifier: ^5.1.6 + version: 5.1.6 packages/cursorless-vscode: dependencies: @@ -439,27 +388,21 @@ importers: '@cursorless/vscode-common': specifier: workspace:* version: link:../vscode-common - immer: - specifier: ^9.0.15 - version: 9.0.21 + '@types/tinycolor2': + specifier: 1.4.3 + version: 1.4.3 itertools: specifier: ^2.1.1 version: 2.1.1 lodash: specifier: ^4.17.21 version: 4.17.21 - nearley: - specifier: 2.20.1 - version: 2.20.1(patch_hash=mg2fc7wgvzub3myuz6m74hllma) semver: specifier: ^7.5.2 - version: 7.5.4 + version: 7.5.2 tinycolor2: specifier: 1.6.0 version: 1.6.0 - trie-search: - specifier: 2.0.0 - version: 2.0.0 uuid: specifier: ^9.0.0 version: 9.0.0 @@ -483,29 +426,23 @@ importers: specifier: 4.14.181 version: 4.14.181 '@types/mocha': - specifier: ^10.0.3 - version: 10.0.3 - '@types/nearley': - specifier: 2.11.5 - version: 2.11.5(patch_hash=5bomp3nnmdzdyzcgrxyr5kymae) + specifier: ^8.0.4 + version: 8.2.3 '@types/node': - specifier: ^18.18.2 - version: 18.18.9 + specifier: ^16.11.3 + version: 16.18.13 '@types/semver': specifier: ^7.3.9 - version: 7.5.5 + version: 7.3.13 '@types/sinon': specifier: ^10.0.2 version: 10.0.13 - '@types/tinycolor2': - specifier: 1.4.3 - version: 1.4.3 '@types/uuid': specifier: ^8.3.4 version: 8.3.4 '@types/vscode': - specifier: ~1.66.0 - version: 1.66.0 + specifier: ~1.61.0 + version: 1.61.0 chai: specifier: ^4.3.6 version: 4.3.7 @@ -520,7 +457,7 @@ importers: version: 11.1.0 glob: specifier: ^7.1.7 - version: 7.2.3 + version: 7.1.7 mocha: specifier: ^10.2.0 version: 10.2.0 @@ -536,9 +473,6 @@ importers: '@cursorless/vscode-common': specifier: workspace:* version: link:../vscode-common - immer: - specifier: ^9.0.15 - version: 9.0.21 lodash: specifier: ^4.17.21 version: 4.17.21 @@ -553,14 +487,14 @@ importers: specifier: 4.14.181 version: 4.14.181 '@types/mocha': - specifier: ^10.0.3 - version: 10.0.3 + specifier: ^8.0.4 + version: 8.2.3 '@types/sinon': specifier: ^10.0.2 version: 10.0.13 '@types/vscode': - specifier: ~1.66.0 - version: 1.66.0 + specifier: ~1.61.0 + version: 1.61.0 chai: specifier: ^4.3.6 version: 4.3.7 @@ -624,17 +558,17 @@ importers: version: link:../common glob: specifier: ^7.1.7 - version: 7.2.3 + version: 7.1.7 devDependencies: '@types/glob': specifier: ^7.1.3 version: 7.2.0 '@types/mocha': - specifier: ^10.0.3 - version: 10.0.3 + specifier: ^8.0.4 + version: 8.2.3 '@vscode/test-electron': - specifier: ^2.3.8 - version: 2.3.8 + specifier: ^2.1.3 + version: 2.2.3 mocha: specifier: ^10.2.0 version: 10.2.0 @@ -646,45 +580,18 @@ importers: version: link:../common devDependencies: '@types/vscode': - specifier: ~1.66.0 - version: 1.66.0 + specifier: ~1.61.0 + version: 1.61.0 packages: - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - /@algolia/autocomplete-core@1.7.4: resolution: {integrity: sha512-daoLpQ3ps/VTMRZDEBfU8ixXd+amZcNJ4QSP3IERGyzqnL5Ch8uSRFt/4G8pUvW9c3o6GA4vtVv4I4lmnkdXyg==} dependencies: '@algolia/autocomplete-shared': 1.7.4 dev: false - /@algolia/autocomplete-core@1.9.3(@algolia/client-search@4.15.0)(algoliasearch@4.22.1)(search-insights@2.13.0): - resolution: {integrity: sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==} - dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.9.3(@algolia/client-search@4.15.0)(algoliasearch@4.22.1)(search-insights@2.13.0) - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.15.0)(algoliasearch@4.22.1) - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - search-insights - dev: false - - /@algolia/autocomplete-plugin-algolia-insights@1.9.3(@algolia/client-search@4.15.0)(algoliasearch@4.22.1)(search-insights@2.13.0): - resolution: {integrity: sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==} - peerDependencies: - search-insights: '>= 1 < 3' - dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.15.0)(algoliasearch@4.22.1) - search-insights: 2.13.0 - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - dev: false - - /@algolia/autocomplete-preset-algolia@1.7.4(@algolia/client-search@4.15.0)(algoliasearch@4.22.1): + /@algolia/autocomplete-preset-algolia@1.7.4(@algolia/client-search@4.15.0)(algoliasearch@4.15.0): resolution: {integrity: sha512-s37hrvLEIfcmKY8VU9LsAXgm2yfmkdHT3DnA3SgHaY93yjZ2qL57wzb5QweVkYuEBZkT2PIREvRoLXC2sxTbpQ==} peerDependencies: '@algolia/client-search': '>= 4.9.1 < 6' @@ -692,69 +599,44 @@ packages: dependencies: '@algolia/autocomplete-shared': 1.7.4 '@algolia/client-search': 4.15.0 - algoliasearch: 4.22.1 - dev: false - - /@algolia/autocomplete-preset-algolia@1.9.3(@algolia/client-search@4.15.0)(algoliasearch@4.22.1): - resolution: {integrity: sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - dependencies: - '@algolia/autocomplete-shared': 1.9.3(@algolia/client-search@4.15.0)(algoliasearch@4.22.1) - '@algolia/client-search': 4.15.0 - algoliasearch: 4.22.1 + algoliasearch: 4.15.0 dev: false /@algolia/autocomplete-shared@1.7.4: resolution: {integrity: sha512-2VGCk7I9tA9Ge73Km99+Qg87w0wzW4tgUruvWAn/gfey1ZXgmxZtyIRBebk35R1O8TbK77wujVtCnpsGpRy1kg==} dev: false - /@algolia/autocomplete-shared@1.9.3(@algolia/client-search@4.15.0)(algoliasearch@4.22.1): - resolution: {integrity: sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - dependencies: - '@algolia/client-search': 4.15.0 - algoliasearch: 4.22.1 - dev: false - - /@algolia/cache-browser-local-storage@4.22.1: - resolution: {integrity: sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==} + /@algolia/cache-browser-local-storage@4.15.0: + resolution: {integrity: sha512-uxxFhTWh4JJDb2+FFSmNMfEQ8p9o2vjSpU7iW007QX3OvqljPPN68lk3bpZVaG8pwr5MU1DqpkZ71FcQdVTjgQ==} dependencies: - '@algolia/cache-common': 4.22.1 + '@algolia/cache-common': 4.15.0 dev: false /@algolia/cache-common@4.15.0: resolution: {integrity: sha512-Me3PbI4QurAM+3D+htIE0l1xt6+bl/18SG6Wc7bPQEZAtN7DTGz22HqhKNyLF2lR/cOfpaH7umXZlZEhIHf7gQ==} dev: false - /@algolia/cache-common@4.22.1: - resolution: {integrity: sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==} - dev: false - - /@algolia/cache-in-memory@4.22.1: - resolution: {integrity: sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==} + /@algolia/cache-in-memory@4.15.0: + resolution: {integrity: sha512-B9mg1wd7CKMfpkbiTQ8KlcKkH6ut/goVaI6XmDCUczOOqeuZlV34tuEi7o3Xo1j66KWr/d9pMjjGYcoVPCVeOA==} dependencies: - '@algolia/cache-common': 4.22.1 + '@algolia/cache-common': 4.15.0 dev: false - /@algolia/client-account@4.22.1: - resolution: {integrity: sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==} + /@algolia/client-account@4.15.0: + resolution: {integrity: sha512-8wqI33HRZy5ydfFt6F5vMhtkOiAUhVfSCYXx4U3Go5RALqWLgVUp6wzOo0mr1z08POCkHDpbQMQvyayb1CZ/kw==} dependencies: - '@algolia/client-common': 4.22.1 - '@algolia/client-search': 4.22.1 - '@algolia/transporter': 4.22.1 + '@algolia/client-common': 4.15.0 + '@algolia/client-search': 4.15.0 + '@algolia/transporter': 4.15.0 dev: false - /@algolia/client-analytics@4.22.1: - resolution: {integrity: sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==} + /@algolia/client-analytics@4.15.0: + resolution: {integrity: sha512-jrPjEeNEIIQKeA1XCZXx3f3aybtwF7wjYlnfHbLARuZ9AuHzimOKjX0ZwqvMmvTsHivpcZ2rqY+j1E8HoH1ELA==} dependencies: - '@algolia/client-common': 4.22.1 - '@algolia/client-search': 4.22.1 - '@algolia/requester-common': 4.22.1 - '@algolia/transporter': 4.22.1 + '@algolia/client-common': 4.15.0 + '@algolia/client-search': 4.15.0 + '@algolia/requester-common': 4.15.0 + '@algolia/transporter': 4.15.0 dev: false /@algolia/client-common@4.15.0: @@ -764,19 +646,12 @@ packages: '@algolia/transporter': 4.15.0 dev: false - /@algolia/client-common@4.22.1: - resolution: {integrity: sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==} + /@algolia/client-personalization@4.15.0: + resolution: {integrity: sha512-Bf0bhRAiNL9LWurzyHRH8UBi4fDt3VbCNkInxVngKQT1uCZWXecwoPWGhcSSpdanBqFJA/1WBt+BWx7a50Bhlg==} dependencies: - '@algolia/requester-common': 4.22.1 - '@algolia/transporter': 4.22.1 - dev: false - - /@algolia/client-personalization@4.22.1: - resolution: {integrity: sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==} - dependencies: - '@algolia/client-common': 4.22.1 - '@algolia/requester-common': 4.22.1 - '@algolia/transporter': 4.22.1 + '@algolia/client-common': 4.15.0 + '@algolia/requester-common': 4.15.0 + '@algolia/transporter': 4.15.0 dev: false /@algolia/client-search@4.15.0: @@ -787,14 +662,6 @@ packages: '@algolia/transporter': 4.15.0 dev: false - /@algolia/client-search@4.22.1: - resolution: {integrity: sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==} - dependencies: - '@algolia/client-common': 4.22.1 - '@algolia/requester-common': 4.22.1 - '@algolia/transporter': 4.22.1 - dev: false - /@algolia/events@4.0.1: resolution: {integrity: sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==} dev: false @@ -803,34 +670,26 @@ packages: resolution: {integrity: sha512-D8OFwn/HpvQz66goIcjxOKsYBMuxiruxJ3cA/bnc0EiDvSA2P2z6bNQWgS5gbstuTZIJmbhr+53NyOxFkmMNAA==} dev: false - /@algolia/logger-common@4.22.1: - resolution: {integrity: sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==} - dev: false - - /@algolia/logger-console@4.22.1: - resolution: {integrity: sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==} + /@algolia/logger-console@4.15.0: + resolution: {integrity: sha512-pQOvVaRSEJQJRXKTnxEA6nN1hipSQadJJ4einw0nIlfMOGZh/kps1ybh8vRUlUGyfEuN/3dyFs0W3Ac7hIItlg==} dependencies: - '@algolia/logger-common': 4.22.1 + '@algolia/logger-common': 4.15.0 dev: false - /@algolia/requester-browser-xhr@4.22.1: - resolution: {integrity: sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==} + /@algolia/requester-browser-xhr@4.15.0: + resolution: {integrity: sha512-va186EfALF+6msYZXaoBSxcnFCg3SoWJ+uv1yMyhQRJRe7cZSHWSVT3s40vmar90gxlBu80KMVwVlsvJhJv6ew==} dependencies: - '@algolia/requester-common': 4.22.1 + '@algolia/requester-common': 4.15.0 dev: false /@algolia/requester-common@4.15.0: resolution: {integrity: sha512-w0UUzxElbo4hrKg4QP/jiXDNbIJuAthxdlkos9nS8KAPK2XI3R9BlUjLz/ZVs4F9TDGI0mhjrNHhZ12KXcoyhg==} dev: false - /@algolia/requester-common@4.22.1: - resolution: {integrity: sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==} - dev: false - - /@algolia/requester-node-http@4.22.1: - resolution: {integrity: sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==} + /@algolia/requester-node-http@4.15.0: + resolution: {integrity: sha512-eeEOhFtgwKcgAlKAZpgBRZJ0ILSEBCXxZ9uwfVWPD24W1b6z08gVoTJ6J7lCeCnJmudg+tMElDnGzHkjup9CJA==} dependencies: - '@algolia/requester-common': 4.22.1 + '@algolia/requester-common': 4.15.0 dev: false /@algolia/transporter@4.15.0: @@ -841,52 +700,39 @@ packages: '@algolia/requester-common': 4.15.0 dev: false - /@algolia/transporter@4.22.1: - resolution: {integrity: sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==} - dependencies: - '@algolia/cache-common': 4.22.1 - '@algolia/logger-common': 4.22.1 - '@algolia/requester-common': 4.22.1 - dev: false - - /@alloc/quick-lru@5.2.0: - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} - dev: true - /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} dependencies: '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.21 + '@jridgewell/trace-mapping': 0.3.19 - /@babel/code-frame@7.23.5: - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + /@babel/code-frame@7.22.10: + resolution: {integrity: sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.23.4 + '@babel/highlight': 7.22.10 chalk: 2.4.2 - /@babel/compat-data@7.23.5: - resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + /@babel/compat-data@7.22.9: + resolution: {integrity: sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==} engines: {node: '>=6.9.0'} - /@babel/core@7.23.7: - resolution: {integrity: sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==} + /@babel/core@7.22.10: + resolution: {integrity: sha512-fTmqbbUBAwCcre6zPzNngvsI0aNrPZe77AeqvDxWM9Nm+04RrJ3CAmGHA9f7lJQY6ZMhRztNemy4uslDxTX4Qw==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) - '@babel/helpers': 7.23.8 - '@babel/parser': 7.23.6 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.7 - '@babel/types': 7.23.6 - convert-source-map: 2.0.0 + '@babel/code-frame': 7.22.10 + '@babel/generator': 7.22.10 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) + '@babel/helpers': 7.22.10 + '@babel/parser': 7.22.10 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.10 + '@babel/types': 7.22.10 + convert-source-map: 1.9.0 debug: 4.3.4(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 @@ -894,1175 +740,1156 @@ packages: transitivePeerDependencies: - supports-color - /@babel/generator@7.23.6: - resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + /@babel/generator@7.22.10: + resolution: {integrity: sha512-79KIf7YiWjjdZ81JnLujDRApWtl7BxTqWD88+FFdQEIOG8LJ0etDOM7CXuIgGJa55sGOwZVwuEsaLEm0PJ5/+A==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.22.10 '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.21 + '@jridgewell/trace-mapping': 0.3.19 jsesc: 2.5.2 - /@babel/helper-annotate-as-pure@7.22.5: - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + /@babel/helper-annotate-as-pure@7.18.6: + resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.22.10 - /@babel/helper-builder-binary-assignment-operator-visitor@7.22.15: - resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} + /@babel/helper-builder-binary-assignment-operator-visitor@7.18.9: + resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/helper-explode-assignable-expression': 7.18.6 + '@babel/types': 7.22.10 - /@babel/helper-compilation-targets@7.23.6: - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + /@babel/helper-compilation-targets@7.22.10: + resolution: {integrity: sha512-JMSwHD4J7SLod0idLq5PKgI+6g/hLD/iuWBq08ZX49xE14VpVEojJ5rHWptpirV2j020MvypRLAXAO50igCJ5Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.23.5 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.23.0 + '@babel/compat-data': 7.22.9 + '@babel/helper-validator-option': 7.22.5 + browserslist: 4.21.10 lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-create-class-features-plugin@7.23.7(@babel/core@7.23.7): - resolution: {integrity: sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==} + /@babel/helper-create-class-features-plugin@7.21.0(@babel/core@7.22.10): + resolution: {integrity: sha512-Q8wNiMIdwsv5la5SPxNYzzkPnjgC0Sy0i7jLkVOCdllu/xcVNkr3TeZzbHBJrj+XXRqzX5uCyCoV9eu6xUG7KQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.7) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-member-expression-to-functions': 7.21.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-replace-supers': 7.20.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 '@babel/helper-split-export-declaration': 7.22.6 - semver: 6.3.1 + transitivePeerDependencies: + - supports-color - /@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.23.7): - resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} + /@babel/helper-create-regexp-features-plugin@7.21.0(@babel/core@7.22.10): + resolution: {integrity: sha512-N+LaFW/auRSWdx7SHD/HiARwXQju1vXTW4fKr4u5SgBUTm51OKEjKgj+cs00ggW3kEvNqwErnlwuq7Y3xBe4eg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-annotate-as-pure': 7.18.6 regexpu-core: 5.3.2 - semver: 6.3.1 - /@babel/helper-define-polyfill-provider@0.4.4(@babel/core@7.23.7): - resolution: {integrity: sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==} + /@babel/helper-define-polyfill-provider@0.3.3(@babel/core@7.22.10): + resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/core': ^7.4.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 debug: 4.3.4(supports-color@8.1.1) lodash.debounce: 4.0.8 - resolve: 1.22.8 + resolve: 1.22.4 + semver: 6.3.1 transitivePeerDependencies: - supports-color - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + /@babel/helper-environment-visitor@7.22.5: + resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + engines: {node: '>=6.9.0'} + + /@babel/helper-explode-assignable-expression@7.18.6: + resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.10 - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + /@babel/helper-function-name@7.22.5: + resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.6 + '@babel/template': 7.22.5 + '@babel/types': 7.22.10 /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.22.10 - /@babel/helper-member-expression-to-functions@7.23.0: - resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} + /@babel/helper-member-expression-to-functions@7.21.0: + resolution: {integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.22.10 - /@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + /@babel/helper-module-imports@7.22.5: + resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.22.10 - /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + /@babel/helper-module-transforms@7.22.9(@babel/core@7.22.10): + resolution: {integrity: sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 + '@babel/core': 7.22.10 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-module-imports': 7.22.5 '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-validator-identifier': 7.22.5 - /@babel/helper-optimise-call-expression@7.22.5: - resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + /@babel/helper-optimise-call-expression@7.18.6: + resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.22.10 - /@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + /@babel/helper-plugin-utils@7.20.2: + resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} engines: {node: '>=6.9.0'} - /@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.23.7): - resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} + /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.22.10): + resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.22.20 + '@babel/core': 7.22.10 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-wrap-function': 7.20.5 + '@babel/types': 7.22.10 + transitivePeerDependencies: + - supports-color - /@babel/helper-replace-supers@7.22.20(@babel/core@7.23.7): - resolution: {integrity: sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==} + /@babel/helper-replace-supers@7.20.7: + resolution: {integrity: sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-member-expression-to-functions': 7.21.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.10 + '@babel/types': 7.22.10 + transitivePeerDependencies: + - supports-color /@babel/helper-simple-access@7.22.5: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.22.10 - /@babel/helper-skip-transparent-expression-wrappers@7.22.5: - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + /@babel/helper-skip-transparent-expression-wrappers@7.20.0: + resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.22.10 /@babel/helper-split-export-declaration@7.22.6: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.22.10 - /@babel/helper-string-parser@7.23.4: - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + /@babel/helper-validator-identifier@7.22.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option@7.23.5: - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + /@babel/helper-validator-option@7.22.5: + resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} engines: {node: '>=6.9.0'} - /@babel/helper-wrap-function@7.22.20: - resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} + /@babel/helper-wrap-function@7.20.5: + resolution: {integrity: sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-function-name': 7.23.0 - '@babel/template': 7.22.15 - '@babel/types': 7.23.6 + '@babel/helper-function-name': 7.22.5 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.10 + '@babel/types': 7.22.10 + transitivePeerDependencies: + - supports-color - /@babel/helpers@7.23.8: - resolution: {integrity: sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==} + /@babel/helpers@7.22.10: + resolution: {integrity: sha512-a41J4NW8HyZa1I1vAndrraTlPZ/eZoga2ZgS7fEr0tZJGVU4xqdE80CEm0CcNjha5EZ8fTBYLKHF0kqDUuAwQw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.7 - '@babel/types': 7.23.6 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.10 + '@babel/types': 7.22.10 transitivePeerDependencies: - supports-color - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + /@babel/highlight@7.22.10: + resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-validator-identifier': 7.22.5 chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser@7.23.6: - resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} + /@babel/parser@7.22.10: + resolution: {integrity: sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.22.10 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==} + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.22.10): + resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==} + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.20.7(@babel/core@7.22.10): + resolution: {integrity: sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.7) - - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.23.7(@babel/core@7.23.7): - resolution: {integrity: sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.7 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.22.10) - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.7): - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + /@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.22.10): + resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.22.10 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.22.10) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.10) + transitivePeerDependencies: + - supports-color - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.7): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.22.10): + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.22.10) + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.7): - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + /@babel/plugin-proposal-class-static-block@7.21.0(@babel/core@7.22.10): + resolution: {integrity: sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==} + engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 - dev: true + '@babel/core': 7.22.10 + '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.22.10) + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.10) + transitivePeerDependencies: + - supports-color - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.7): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + /@babel/plugin-proposal-dynamic-import@7.18.6(@babel/core@7.22.10): + resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.10) - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.23.7): - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + /@babel/plugin-proposal-export-namespace-from@7.18.9(@babel/core@7.22.10): + resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.10) - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.23.7): - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + /@babel/plugin-proposal-json-strings@7.18.6(@babel/core@7.22.10): + resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.10) - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.23.7): - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + /@babel/plugin-proposal-logical-assignment-operators@7.20.7(@babel/core@7.22.10): + resolution: {integrity: sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.10) - /@babel/plugin-syntax-import-assertions@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==} + /@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.22.10): + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.10) - /@babel/plugin-syntax-import-attributes@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==} + /@babel/plugin-proposal-numeric-separator@7.18.6(@babel/core@7.22.10): + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.10) - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.7): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.22.10): + resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/compat-data': 7.22.9 + '@babel/core': 7.22.10 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-transform-parameters': 7.20.7(@babel/core@7.22.10) - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.7): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + /@babel/plugin-proposal-optional-catch-binding@7.18.6(@babel/core@7.22.10): + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.10) - /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + /@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.22.10): + resolution: {integrity: sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.10) - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.7): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + /@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.22.10): + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.22.10) + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.7): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.22.10): + resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==} + engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.22.10) + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.10) + transitivePeerDependencies: + - supports-color - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.7): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.22.10): + resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} + engines: {node: '>=4'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-create-regexp-features-plugin': 7.21.0(@babel/core@7.22.10) + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.7): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.10): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.7): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.22.10): + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.7): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.10): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.23.7): - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.10): + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.7): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.10): + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} - engines: {node: '>=6.9.0'} + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.10): + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.23.7): - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.7 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7) - '@babel/helper-plugin-utils': 7.22.5 - - /@babel/plugin-transform-arrow-functions@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==} + /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.22.10): + resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-async-generator-functions@7.23.7(@babel/core@7.23.7): - resolution: {integrity: sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==} - engines: {node: '>=6.9.0'} + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.10): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.7) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.7) + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-async-to-generator@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==} - engines: {node: '>=6.9.0'} + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.10): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.23.7) + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-block-scoped-functions@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==} + /@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.22.10): + resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-block-scoping@7.23.4(@babel/core@7.23.7): - resolution: {integrity: sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==} - engines: {node: '>=6.9.0'} + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.10): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-class-properties@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==} - engines: {node: '>=6.9.0'} + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.10): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) - '@babel/helper-plugin-utils': 7.22.5 - - /@babel/plugin-transform-class-static-block@7.23.4(@babel/core@7.23.7): - resolution: {integrity: sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.23.7 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.7) + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-classes@7.23.8(@babel/core@7.23.7): - resolution: {integrity: sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==} - engines: {node: '>=6.9.0'} + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.10): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.7) - '@babel/helper-split-export-declaration': 7.22.6 - globals: 11.12.0 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-computed-properties@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==} - engines: {node: '>=6.9.0'} + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.10): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/template': 7.22.15 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-destructuring@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==} - engines: {node: '>=6.9.0'} + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.10): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-dotall-regex@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==} - engines: {node: '>=6.9.0'} + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.10): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-duplicate-keys@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==} + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.10): + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-dynamic-import@7.23.4(@babel/core@7.23.7): - resolution: {integrity: sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==} + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.10): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.7) + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-exponentiation-operator@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==} + /@babel/plugin-syntax-typescript@7.20.0(@babel/core@7.22.10): + resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-export-namespace-from@7.23.4(@babel/core@7.23.7): - resolution: {integrity: sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==} + /@babel/plugin-transform-arrow-functions@7.20.7(@babel/core@7.22.10): + resolution: {integrity: sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.7) + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-for-of@7.23.6(@babel/core@7.23.7): - resolution: {integrity: sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==} + /@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.22.10): + resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.22.10) + transitivePeerDependencies: + - supports-color - /@babel/plugin-transform-function-name@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==} + /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.22.10): + resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-json-strings@7.23.4(@babel/core@7.23.7): - resolution: {integrity: sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==} + /@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.22.10): + resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.7) + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-literals@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==} + /@babel/plugin-transform-classes@7.21.0(@babel/core@7.22.10): + resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-replace-supers': 7.20.7 + '@babel/helper-split-export-declaration': 7.22.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color - /@babel/plugin-transform-logical-assignment-operators@7.23.4(@babel/core@7.23.7): - resolution: {integrity: sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==} + /@babel/plugin-transform-computed-properties@7.20.7(@babel/core@7.22.10): + resolution: {integrity: sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.7) + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/template': 7.22.5 - /@babel/plugin-transform-member-expression-literals@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==} + /@babel/plugin-transform-destructuring@7.20.7(@babel/core@7.22.10): + resolution: {integrity: sha512-Xwg403sRrZb81IVB79ZPqNQME23yhugYVqgTxAhT99h485F4f+GMELFhhOsscDUB7HCswepKeCKLn/GZvUKoBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-modules-amd@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==} + /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.22.10): + resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-create-regexp-features-plugin': 7.21.0(@babel/core@7.22.10) + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-modules-commonjs@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==} + /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.22.10): + resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-simple-access': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-modules-systemjs@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==} + /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.22.10): + resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/core': 7.22.10 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-modules-umd@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==} + /@babel/plugin-transform-for-of@7.21.0(@babel/core@7.22.10): + resolution: {integrity: sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.7) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.23.7): - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} + /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.22.10): + resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-new-target@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==} + /@babel/plugin-transform-literals@7.18.9(@babel/core@7.22.10): + resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-nullish-coalescing-operator@7.23.4(@babel/core@7.23.7): - resolution: {integrity: sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==} + /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.22.10): + resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.7) + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-numeric-separator@7.23.4(@babel/core@7.23.7): - resolution: {integrity: sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==} + /@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.22.10): + resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.7) + '@babel/core': 7.22.10 + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-object-rest-spread@7.23.4(@babel/core@7.23.7): - resolution: {integrity: sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==} + /@babel/plugin-transform-modules-commonjs@7.21.2(@babel/core@7.22.10): + resolution: {integrity: sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.23.5 - '@babel/core': 7.23.7 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.7) + '@babel/core': 7.22.10 + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-simple-access': 7.22.5 - /@babel/plugin-transform-object-super@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==} + /@babel/plugin-transform-modules-systemjs@7.20.11(@babel/core@7.22.10): + resolution: {integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-replace-supers': 7.22.20(@babel/core@7.23.7) + '@babel/core': 7.22.10 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-validator-identifier': 7.22.5 - /@babel/plugin-transform-optional-catch-binding@7.23.4(@babel/core@7.23.7): - resolution: {integrity: sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==} + /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.22.10): + resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.7) + '@babel/core': 7.22.10 + '@babel/helper-module-transforms': 7.22.9(@babel/core@7.22.10) + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-optional-chaining@7.23.4(@babel/core@7.23.7): - resolution: {integrity: sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==} + /@babel/plugin-transform-named-capturing-groups-regex@7.20.5(@babel/core@7.22.10): + resolution: {integrity: sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.7) + '@babel/core': 7.22.10 + '@babel/helper-create-regexp-features-plugin': 7.21.0(@babel/core@7.22.10) + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-parameters@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==} + /@babel/plugin-transform-new-target@7.18.6(@babel/core@7.22.10): + resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-private-methods@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==} + /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.22.10): + resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-replace-supers': 7.20.7 + transitivePeerDependencies: + - supports-color - /@babel/plugin-transform-private-property-in-object@7.23.4(@babel/core@7.23.7): - resolution: {integrity: sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==} + /@babel/plugin-transform-parameters@7.20.7(@babel/core@7.22.10): + resolution: {integrity: sha512-WiWBIkeHKVOSYPO0pWkxGPfKeWrCJyD3NJ53+Lrp/QMSZbsVPovrVl2aWZ19D/LTVnaDv5Ap7GJ/B2CTOZdrfA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.7) + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-property-literals@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==} + /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.22.10): + resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-react-constant-elements@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-zP0QKq/p6O42OL94udMgSfKXyse4RyJ0JqbQ34zDAONWjyrEsghYEyTSK5FIpmXmCpB55SHokL1cRRKHv8L2Qw==} + /@babel/plugin-transform-react-constant-elements@7.20.2(@babel/core@7.22.10): + resolution: {integrity: sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-react-display-name@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==} + /@babel/plugin-transform-react-display-name@7.18.6(@babel/core@7.22.10): + resolution: {integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.23.7): - resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} + /@babel/plugin-transform-react-jsx-development@7.18.6(@babel/core@7.22.10): + resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.7) + '@babel/core': 7.22.10 + '@babel/plugin-transform-react-jsx': 7.21.0(@babel/core@7.22.10) - /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.23.7): - resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} + /@babel/plugin-transform-react-jsx@7.21.0(@babel/core@7.22.10): + resolution: {integrity: sha512-6OAWljMvQrZjR2DaNhVfRz6dkCAVV+ymcLUmaf8bccGOHn2v5rHJK3tTpij0BuhdYWP4LLaqj5lwcdlpAAPuvg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.7) - '@babel/types': 7.23.6 + '@babel/core': 7.22.10 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.22.10) + '@babel/types': 7.22.10 - /@babel/plugin-transform-react-pure-annotations@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==} + /@babel/plugin-transform-react-pure-annotations@7.18.6(@babel/core@7.22.10): + resolution: {integrity: sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-regenerator@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==} + /@babel/plugin-transform-regenerator@7.20.5(@babel/core@7.22.10): + resolution: {integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 - regenerator-transform: 0.15.2 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 + regenerator-transform: 0.15.1 - /@babel/plugin-transform-reserved-words@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==} + /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.22.10): + resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-runtime@7.23.7(@babel/core@7.23.7): - resolution: {integrity: sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw==} + /@babel/plugin-transform-runtime@7.21.0(@babel/core@7.22.10): + resolution: {integrity: sha512-ReY6pxwSzEU0b3r2/T/VhqMKg/AkceBT19X0UptA3/tYi5Pe2eXgEUH+NNMC5nok6c6XQz5tyVTUpuezRfSMSg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-plugin-utils': 7.22.5 - babel-plugin-polyfill-corejs2: 0.4.7(@babel/core@7.23.7) - babel-plugin-polyfill-corejs3: 0.8.7(@babel/core@7.23.7) - babel-plugin-polyfill-regenerator: 0.5.4(@babel/core@7.23.7) + '@babel/core': 7.22.10 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-plugin-utils': 7.20.2 + babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.22.10) + babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.22.10) + babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.22.10) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: false - /@babel/plugin-transform-shorthand-properties@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==} + /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.22.10): + resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-spread@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==} + /@babel/plugin-transform-spread@7.20.7(@babel/core@7.22.10): + resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.20.0 - /@babel/plugin-transform-sticky-regex@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==} + /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.22.10): + resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-template-literals@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==} + /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.22.10): + resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-typeof-symbol@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==} + /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.22.10): + resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-typescript@7.23.6(@babel/core@7.23.7): - resolution: {integrity: sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==} + /@babel/plugin-transform-typescript@7.21.0(@babel/core@7.22.10): + resolution: {integrity: sha512-xo///XTPp3mDzTtrqXoBlK9eiAYW3wv9JXglcn/u1bi60RW11dEUxIgA8cbnDhutS1zacjMRmAwxE0gMklLnZg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.23.7(@babel/core@7.23.7) - '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.7) + '@babel/core': 7.22.10 + '@babel/helper-create-class-features-plugin': 7.21.0(@babel/core@7.22.10) + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.22.10) + transitivePeerDependencies: + - supports-color - /@babel/plugin-transform-unicode-escapes@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==} + /@babel/plugin-transform-unicode-escapes@7.18.10(@babel/core@7.22.10): + resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-unicode-property-regex@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==} + /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.22.10): + resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7) - '@babel/helper-plugin-utils': 7.22.5 + '@babel/core': 7.22.10 + '@babel/helper-create-regexp-features-plugin': 7.21.0(@babel/core@7.22.10) + '@babel/helper-plugin-utils': 7.20.2 - /@babel/plugin-transform-unicode-regex@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==} + /@babel/preset-env@7.20.2(@babel/core@7.22.10): + resolution: {integrity: sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7) - '@babel/helper-plugin-utils': 7.22.5 - - /@babel/plugin-transform-unicode-sets-regex@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.7 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.23.7) - '@babel/helper-plugin-utils': 7.22.5 - - /@babel/preset-env@7.23.8(@babel/core@7.23.7): - resolution: {integrity: sha512-lFlpmkApLkEP6woIKprO6DO60RImpatTQKtz4sUcDjVcK8M8mQ4sZsuxaTMNOZf0sqAq/ReYW1ZBHnOQwKpLWA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.23.5 - '@babel/core': 7.23.7 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.23.7(@babel/core@7.23.7) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.23.7) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.7) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.7) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.23.7) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-syntax-import-assertions': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-syntax-import-attributes': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.7) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.7) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.7) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.23.7) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.7) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.23.7) - '@babel/plugin-transform-arrow-functions': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-async-generator-functions': 7.23.7(@babel/core@7.23.7) - '@babel/plugin-transform-async-to-generator': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-block-scoped-functions': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-block-scoping': 7.23.4(@babel/core@7.23.7) - '@babel/plugin-transform-class-properties': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-class-static-block': 7.23.4(@babel/core@7.23.7) - '@babel/plugin-transform-classes': 7.23.8(@babel/core@7.23.7) - '@babel/plugin-transform-computed-properties': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-destructuring': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-dotall-regex': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-duplicate-keys': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-dynamic-import': 7.23.4(@babel/core@7.23.7) - '@babel/plugin-transform-exponentiation-operator': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-export-namespace-from': 7.23.4(@babel/core@7.23.7) - '@babel/plugin-transform-for-of': 7.23.6(@babel/core@7.23.7) - '@babel/plugin-transform-function-name': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-json-strings': 7.23.4(@babel/core@7.23.7) - '@babel/plugin-transform-literals': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-logical-assignment-operators': 7.23.4(@babel/core@7.23.7) - '@babel/plugin-transform-member-expression-literals': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-modules-amd': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-modules-systemjs': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-modules-umd': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.23.7) - '@babel/plugin-transform-new-target': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-nullish-coalescing-operator': 7.23.4(@babel/core@7.23.7) - '@babel/plugin-transform-numeric-separator': 7.23.4(@babel/core@7.23.7) - '@babel/plugin-transform-object-rest-spread': 7.23.4(@babel/core@7.23.7) - '@babel/plugin-transform-object-super': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-optional-catch-binding': 7.23.4(@babel/core@7.23.7) - '@babel/plugin-transform-optional-chaining': 7.23.4(@babel/core@7.23.7) - '@babel/plugin-transform-parameters': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-private-methods': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-private-property-in-object': 7.23.4(@babel/core@7.23.7) - '@babel/plugin-transform-property-literals': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-regenerator': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-reserved-words': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-shorthand-properties': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-spread': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-sticky-regex': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-template-literals': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-typeof-symbol': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-unicode-escapes': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-unicode-property-regex': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-unicode-regex': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-unicode-sets-regex': 7.23.3(@babel/core@7.23.7) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.23.7) - babel-plugin-polyfill-corejs2: 0.4.7(@babel/core@7.23.7) - babel-plugin-polyfill-corejs3: 0.8.7(@babel/core@7.23.7) - babel-plugin-polyfill-regenerator: 0.5.4(@babel/core@7.23.7) - core-js-compat: 3.35.0 + '@babel/compat-data': 7.22.9 + '@babel/core': 7.22.10 + '@babel/helper-compilation-targets': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-validator-option': 7.22.5 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.20.7(@babel/core@7.22.10) + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.22.10) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-proposal-class-static-block': 7.21.0(@babel/core@7.22.10) + '@babel/plugin-proposal-dynamic-import': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-proposal-export-namespace-from': 7.18.9(@babel/core@7.22.10) + '@babel/plugin-proposal-json-strings': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-proposal-logical-assignment-operators': 7.20.7(@babel/core@7.22.10) + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-proposal-numeric-separator': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.22.10) + '@babel/plugin-proposal-optional-catch-binding': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.22.10) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-proposal-private-property-in-object': 7.21.0(@babel/core@7.22.10) + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.10) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.10) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.10) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.22.10) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.10) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.10) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.10) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.10) + '@babel/plugin-transform-arrow-functions': 7.20.7(@babel/core@7.22.10) + '@babel/plugin-transform-async-to-generator': 7.20.7(@babel/core@7.22.10) + '@babel/plugin-transform-block-scoped-functions': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-transform-block-scoping': 7.21.0(@babel/core@7.22.10) + '@babel/plugin-transform-classes': 7.21.0(@babel/core@7.22.10) + '@babel/plugin-transform-computed-properties': 7.20.7(@babel/core@7.22.10) + '@babel/plugin-transform-destructuring': 7.20.7(@babel/core@7.22.10) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-transform-duplicate-keys': 7.18.9(@babel/core@7.22.10) + '@babel/plugin-transform-exponentiation-operator': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-transform-for-of': 7.21.0(@babel/core@7.22.10) + '@babel/plugin-transform-function-name': 7.18.9(@babel/core@7.22.10) + '@babel/plugin-transform-literals': 7.18.9(@babel/core@7.22.10) + '@babel/plugin-transform-member-expression-literals': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-transform-modules-amd': 7.20.11(@babel/core@7.22.10) + '@babel/plugin-transform-modules-commonjs': 7.21.2(@babel/core@7.22.10) + '@babel/plugin-transform-modules-systemjs': 7.20.11(@babel/core@7.22.10) + '@babel/plugin-transform-modules-umd': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-transform-named-capturing-groups-regex': 7.20.5(@babel/core@7.22.10) + '@babel/plugin-transform-new-target': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-transform-object-super': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-transform-parameters': 7.20.7(@babel/core@7.22.10) + '@babel/plugin-transform-property-literals': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-transform-regenerator': 7.20.5(@babel/core@7.22.10) + '@babel/plugin-transform-reserved-words': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-transform-spread': 7.20.7(@babel/core@7.22.10) + '@babel/plugin-transform-sticky-regex': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.22.10) + '@babel/plugin-transform-typeof-symbol': 7.18.9(@babel/core@7.22.10) + '@babel/plugin-transform-unicode-escapes': 7.18.10(@babel/core@7.22.10) + '@babel/plugin-transform-unicode-regex': 7.18.6(@babel/core@7.22.10) + '@babel/preset-modules': 0.1.5(@babel/core@7.22.10) + '@babel/types': 7.22.10 + babel-plugin-polyfill-corejs2: 0.3.3(@babel/core@7.22.10) + babel-plugin-polyfill-corejs3: 0.6.0(@babel/core@7.22.10) + babel-plugin-polyfill-regenerator: 0.4.1(@babel/core@7.22.10) + core-js-compat: 3.29.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.23.7): - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + /@babel/preset-modules@0.1.5(@babel/core@7.22.10): + resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/types': 7.23.6 + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.22.10) + '@babel/types': 7.22.10 esutils: 2.0.3 - /@babel/preset-react@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==} + /@babel/preset-react@7.18.6(@babel/core@7.22.10): + resolution: {integrity: sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-transform-react-display-name': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.7) - '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.23.7) - '@babel/plugin-transform-react-pure-annotations': 7.23.3(@babel/core@7.23.7) + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-validator-option': 7.22.5 + '@babel/plugin-transform-react-display-name': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-transform-react-jsx': 7.21.0(@babel/core@7.22.10) + '@babel/plugin-transform-react-jsx-development': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-transform-react-pure-annotations': 7.18.6(@babel/core@7.22.10) - /@babel/preset-typescript@7.23.3(@babel/core@7.23.7): - resolution: {integrity: sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ==} + /@babel/preset-typescript@7.21.0(@babel/core@7.22.10): + resolution: {integrity: sha512-myc9mpoVA5m1rF8K8DgLEatOYFDpwC+RkMkjZ0Du6uI62YvDe8uxIEYVs/VCdSJ097nlALiU/yBC7//3nI+hNg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-plugin-utils': 7.22.5 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-modules-commonjs': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-transform-typescript': 7.23.6(@babel/core@7.23.7) + '@babel/core': 7.22.10 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-validator-option': 7.22.5 + '@babel/plugin-transform-typescript': 7.21.0(@babel/core@7.22.10) + transitivePeerDependencies: + - supports-color /@babel/regjsgen@0.8.0: resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - /@babel/runtime-corejs3@7.23.8: - resolution: {integrity: sha512-2ZzmcDugdm0/YQKFVYsXiwUN7USPX8PM7cytpb4PFl87fM+qYPSvTZX//8tyeJB1j0YDmafBJEbl5f8NfLyuKw==} + /@babel/runtime-corejs3@7.21.0: + resolution: {integrity: sha512-TDD4UJzos3JJtM+tHX+w2Uc+KWj7GV+VKKFdMVd2Rx8sdA19hcc3P3AHFYd5LVOw+pYuSd5lICC3gm52B6Rwxw==} engines: {node: '>=6.9.0'} dependencies: - core-js-pure: 3.35.0 - regenerator-runtime: 0.14.1 + core-js-pure: 3.29.0 + regenerator-runtime: 0.13.11 dev: false - /@babel/runtime@7.23.8: - resolution: {integrity: sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==} + /@babel/runtime@7.21.0: + resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} engines: {node: '>=6.9.0'} dependencies: - regenerator-runtime: 0.14.1 + regenerator-runtime: 0.13.11 - /@babel/template@7.22.15: - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + /@babel/template@7.22.5: + resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.5 - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 + '@babel/code-frame': 7.22.10 + '@babel/parser': 7.22.10 + '@babel/types': 7.22.10 - /@babel/traverse@7.23.7: - resolution: {integrity: sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==} + /@babel/traverse@7.22.10: + resolution: {integrity: sha512-Q/urqV4pRByiNNpb/f5OSv28ZlGJiFiiTh+GAHktbIrkPhPbl90+uW6SmpoLyZqutrg9AEaEf3Q/ZBRHBXgxig==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.6 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 + '@babel/code-frame': 7.22.10 + '@babel/generator': 7.22.10 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 + '@babel/parser': 7.22.10 + '@babel/types': 7.22.10 debug: 4.3.4(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color - /@babel/types@7.23.6: - resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} + /@babel/types@7.22.10: + resolution: {integrity: sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 to-fast-properties: 2.0.0 /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: true /@colors/colors@1.5.0: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} @@ -2076,7 +1903,6 @@ packages: engines: {node: '>=12'} dependencies: '@jridgewell/trace-mapping': 0.3.9 - dev: true /@discoveryjs/json-ext@0.5.7: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} @@ -2086,11 +1912,7 @@ packages: resolution: {integrity: sha512-6SCwI7P8ao+se1TUsdZ7B4XzL+gqeQZnBc+2EONZlcVa0dVrk0NjETxozFKgMv0eEGH8QzP1fkN+A1rH61l4eg==} dev: false - /@docsearch/css@3.5.2: - resolution: {integrity: sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==} - dev: false - - /@docsearch/react@3.3.3(@algolia/client-search@4.15.0)(@types/react@18.0.28)(react-dom@18.2.0)(react@18.2.0): + /@docsearch/react@3.3.3(@algolia/client-search@4.15.0)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-pLa0cxnl+G0FuIDuYlW+EBK6Rw2jwLw9B1RHIeS4N4s2VhsfJ/wzeCi3CWcs5yVfxLd5ZK50t//TMA5e79YT7Q==} peerDependencies: '@types/react': '>= 16.8.0 < 19.0.0' @@ -2105,128 +1927,99 @@ packages: optional: true dependencies: '@algolia/autocomplete-core': 1.7.4 - '@algolia/autocomplete-preset-algolia': 1.7.4(@algolia/client-search@4.15.0)(algoliasearch@4.22.1) + '@algolia/autocomplete-preset-algolia': 1.7.4(@algolia/client-search@4.15.0)(algoliasearch@4.15.0) '@docsearch/css': 3.3.3 - '@types/react': 18.0.28 - algoliasearch: 4.22.1 + algoliasearch: 4.15.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: - '@algolia/client-search' dev: false - /@docsearch/react@3.5.2(@algolia/client-search@4.15.0)(@types/react@18.0.28)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0): - resolution: {integrity: sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==} - peerDependencies: - '@types/react': '>= 16.8.0 < 19.0.0' - react: '>= 16.8.0 < 19.0.0 || 18' - react-dom: '>= 16.8.0 < 19.0.0 || 18' - search-insights: '>= 1 < 3' - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true - react-dom: - optional: true - search-insights: - optional: true - dependencies: - '@algolia/autocomplete-core': 1.9.3(@algolia/client-search@4.15.0)(algoliasearch@4.22.1)(search-insights@2.13.0) - '@algolia/autocomplete-preset-algolia': 1.9.3(@algolia/client-search@4.15.0)(algoliasearch@4.22.1) - '@docsearch/css': 3.5.2 - '@types/react': 18.0.28 - algoliasearch: 4.22.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - search-insights: 2.13.0 - transitivePeerDependencies: - - '@algolia/client-search' - dev: false - - /@docusaurus/core@3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-GWudMGYA9v26ssbAWJNfgeDZk+lrudUTclLPRsmxiknEBk7UMp7Rglonhqbsf3IKHOyHkMU4Fr5jFyg5SBx9jQ==} - engines: {node: '>=18.0'} + /@docusaurus/core@3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0)(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6): + resolution: {integrity: sha512-e1P/PpQqy0DFnYmE6Mv7Dv0RhhA0nF5G+jwkMEEOrztRKaDOqHzWZYy7IC0s+63YizCzgYYuyD02QMhgr77Yhg==} + engines: {node: '>=16.14'} hasBin: true peerDependencies: react: ^18.0.0 || 18 react-dom: ^18.0.0 || 18 dependencies: - '@babel/core': 7.23.7 - '@babel/generator': 7.23.6 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-transform-runtime': 7.23.7(@babel/core@7.23.7) - '@babel/preset-env': 7.23.8(@babel/core@7.23.7) - '@babel/preset-react': 7.23.3(@babel/core@7.23.7) - '@babel/preset-typescript': 7.23.3(@babel/core@7.23.7) - '@babel/runtime': 7.23.8 - '@babel/runtime-corejs3': 7.23.8 - '@babel/traverse': 7.23.7 - '@docusaurus/cssnano-preset': 3.1.0 - '@docusaurus/logger': 3.1.0 - '@docusaurus/mdx-loader': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0) + '@babel/core': 7.22.10 + '@babel/generator': 7.22.10 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-transform-runtime': 7.21.0(@babel/core@7.22.10) + '@babel/preset-env': 7.20.2(@babel/core@7.22.10) + '@babel/preset-react': 7.18.6(@babel/core@7.22.10) + '@babel/preset-typescript': 7.21.0(@babel/core@7.22.10) + '@babel/runtime': 7.21.0 + '@babel/runtime-corejs3': 7.21.0 + '@babel/traverse': 7.22.10 + '@docusaurus/cssnano-preset': 3.0.0-alpha.0 + '@docusaurus/logger': 3.0.0-alpha.0 + '@docusaurus/mdx-loader': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0)(react-dom@18.2.0)(react@18.2.0) '@docusaurus/react-loadable': 5.5.2(react@18.2.0) - '@docusaurus/utils': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11) - '@docusaurus/utils-common': 3.1.0(@docusaurus/types@3.1.0) - '@docusaurus/utils-validation': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11) + '@docusaurus/utils': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) + '@docusaurus/utils-common': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) + '@docusaurus/utils-validation': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) '@slorber/static-site-generator-webpack-plugin': 4.0.7 '@svgr/webpack': 6.5.1 - autoprefixer: 10.4.16(postcss@8.4.31) - babel-loader: 9.1.3(@babel/core@7.23.7)(webpack@5.89.0) + autoprefixer: 10.4.13(postcss@8.4.21) + babel-loader: 9.1.3(@babel/core@7.22.10)(webpack@5.88.2) babel-plugin-dynamic-import-node: 2.3.3 boxen: 6.2.1 chalk: 4.1.2 chokidar: 3.5.3 - clean-css: 5.3.3 + clean-css: 5.3.2 cli-table3: 0.6.3 - combine-promises: 1.2.0 + combine-promises: 1.1.0 commander: 5.1.0 - copy-webpack-plugin: 11.0.0(webpack@5.89.0) - core-js: 3.35.0 - css-loader: 6.9.0(webpack@5.89.0) - css-minimizer-webpack-plugin: 4.2.2(clean-css@5.3.3)(esbuild@0.17.11)(webpack@5.89.0) - cssnano: 5.1.15(postcss@8.4.31) + copy-webpack-plugin: 11.0.0(webpack@5.88.2) + core-js: 3.29.0 + css-loader: 6.7.3(webpack@5.88.2) + css-minimizer-webpack-plugin: 4.2.2(clean-css@5.3.2)(webpack@5.88.2) + cssnano: 5.1.15(postcss@8.4.21) del: 6.1.1 detect-port: 1.5.1 escape-html: 1.0.3 - eta: 2.2.0 - file-loader: 6.2.0(webpack@5.89.0) - fs-extra: 11.2.0 + eta: 2.0.1 + file-loader: 6.2.0(webpack@5.88.2) + fs-extra: 11.1.0 html-minifier-terser: 7.2.0 - html-tags: 3.3.1 - html-webpack-plugin: 5.6.0(webpack@5.89.0) + html-tags: 3.2.0 + html-webpack-plugin: 5.5.0(webpack@5.88.2) + import-fresh: 3.3.0 leven: 3.1.0 lodash: 4.17.21 - mini-css-extract-plugin: 2.7.7(webpack@5.89.0) - postcss: 8.4.31 - postcss-loader: 7.3.4(postcss@8.4.31)(typescript@5.2.2)(webpack@5.89.0) + mini-css-extract-plugin: 2.7.3(webpack@5.88.2) + postcss: 8.4.21 + postcss-loader: 7.0.2(postcss@8.4.21)(webpack@5.88.2) prompts: 2.4.2 react: 18.2.0 - react-dev-utils: 12.0.1(eslint@8.53.0)(typescript@5.2.2)(webpack@5.89.0) + react-dev-utils: 12.0.1(eslint@8.38.0)(typescript@5.1.6)(webpack@5.88.2) react-dom: 18.2.0(react@18.2.0) react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0) react-loadable: /@docusaurus/react-loadable@5.5.2(react@18.2.0) - react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@5.5.2)(webpack@5.89.0) + react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@5.5.2)(webpack@5.88.2) react-router: 5.3.4(react@18.2.0) react-router-config: 5.1.1(react-router@5.3.4)(react@18.2.0) react-router-dom: 5.3.4(react@18.2.0) - rtl-detect: 1.1.2 + rtl-detect: 1.0.4 semver: 7.5.4 serve-handler: 6.1.5 shelljs: 0.8.5 - terser-webpack-plugin: 5.3.10(esbuild@0.17.11)(webpack@5.89.0) - tslib: 2.6.2 + terser-webpack-plugin: 5.3.9(webpack@5.88.2) + tslib: 2.6.1 update-notifier: 6.0.2 - url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.89.0) - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) - webpack-bundle-analyzer: 4.10.1 - webpack-dev-server: 4.15.1(webpack@5.89.0) - webpack-merge: 5.10.0 - webpackbar: 5.0.2(webpack@5.89.0) + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.88.2) + wait-on: 7.0.1 + webpack: 5.88.2(webpack-cli@5.1.4) + webpack-bundle-analyzer: 4.8.0 + webpack-dev-server: 4.11.1(webpack-cli@5.1.4)(webpack@5.88.2) + webpack-merge: 5.9.0 + webpackbar: 5.0.2(webpack@5.88.2) transitivePeerDependencies: - '@docusaurus/types' - '@parcel/css' - - '@rspack/core' - '@swc/core' - '@swc/css' - bufferutil @@ -2243,59 +2036,58 @@ packages: - webpack-cli dev: false - /@docusaurus/cssnano-preset@3.1.0: - resolution: {integrity: sha512-ned7qsgCqSv/e7KyugFNroAfiszuxLwnvMW7gmT2Ywxb/Nyt61yIw7KHyAZCMKglOalrqnYA4gMhLUCK/mVePA==} - engines: {node: '>=18.0'} + /@docusaurus/cssnano-preset@3.0.0-alpha.0: + resolution: {integrity: sha512-W+rCRAAv/AIePyWk62tYUxZBRJojBWwIW0/olhhjoEyI4cyLrfUXE1be8gilu0SoDw6S1WukDCoEf+31+9+ZJg==} + engines: {node: '>=16.14'} dependencies: - cssnano-preset-advanced: 5.3.10(postcss@8.4.31) - postcss: 8.4.31 - postcss-sort-media-queries: 4.4.1(postcss@8.4.31) - tslib: 2.6.2 + cssnano-preset-advanced: 5.3.10(postcss@8.4.21) + postcss: 8.4.21 + postcss-sort-media-queries: 4.3.0(postcss@8.4.21) + tslib: 2.6.1 dev: false - /@docusaurus/logger@3.1.0: - resolution: {integrity: sha512-p740M+HCst1VnKKzL60Hru9xfG4EUYJDarjlEC4hHeBy9+afPmY3BNPoSHx9/8zxuYfUlv/psf7I9NvRVdmdvg==} - engines: {node: '>=18.0'} + /@docusaurus/logger@3.0.0-alpha.0: + resolution: {integrity: sha512-atQzfn8A5A95qOIgTU8+YQts0eWwv7jru9NLp+Jauu0ykWVjKP0IXFHrtHkpLi96gUjIgdRb0AYaLZFGME74ZQ==} + engines: {node: '>=16.14'} dependencies: chalk: 4.1.2 - tslib: 2.6.2 + tslib: 2.6.1 dev: false - /@docusaurus/mdx-loader@3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-D7onDz/3mgBonexWoQXPw3V2E5Bc4+jYRf9gGUUK+KoQwU8xMDaDkUUfsr7t6UBa/xox9p5+/3zwLuXOYMzGSg==} - engines: {node: '>=18.0'} + /@docusaurus/mdx-loader@3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-R4NUhQldtTdoxLq5C1QgTmX+qAmH0S3RBQHnGhlNjnK1ZUUzrbZvl4luTQ5OziQ2eQDuDmwpPPZqYKbeuKLNcw==} + engines: {node: '>=16.14'} peerDependencies: react: ^18.0.0 || 18 react-dom: ^18.0.0 || 18 dependencies: - '@babel/parser': 7.23.6 - '@babel/traverse': 7.23.7 - '@docusaurus/logger': 3.1.0 - '@docusaurus/utils': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11) - '@docusaurus/utils-validation': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11) - '@mdx-js/mdx': 3.0.0 - '@slorber/remark-comment': 1.0.0 + '@babel/parser': 7.22.10 + '@babel/traverse': 7.22.10 + '@docusaurus/logger': 3.0.0-alpha.0 + '@docusaurus/utils': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) + '@docusaurus/utils-validation': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) + '@mdx-js/mdx': 2.3.0 escape-html: 1.0.3 - estree-util-value-to-estree: 3.0.1 - file-loader: 6.2.0(webpack@5.89.0) - fs-extra: 11.2.0 - image-size: 1.1.1 - mdast-util-mdx: 3.0.0 - mdast-util-to-string: 4.0.0 + estree-util-value-to-estree: 2.1.0 + file-loader: 6.2.0(webpack@5.88.2) + fs-extra: 11.1.0 + hastscript: 7.2.0 + image-size: 1.0.2 + mdast-util-mdx: 2.0.1 + mdast-util-to-string: 3.2.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - rehype-raw: 7.0.0 - remark-directive: 3.0.0 - remark-emoji: 4.0.1 - remark-frontmatter: 5.0.0 - remark-gfm: 4.0.0 + rehype-raw: 6.1.1 + remark-comment: 1.0.0 + remark-directive: 2.0.1 + remark-emoji: 2.2.0 + remark-gfm: 3.0.1 stringify-object: 3.3.0 - tslib: 2.6.2 - unified: 11.0.4 - unist-util-visit: 5.0.0 - url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.89.0) - vfile: 6.0.1 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) + tslib: 2.6.1 + unified: 10.1.2 + unist-util-visit: 2.0.3 + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.88.2) + webpack: 5.88.2(webpack-cli@5.1.4) transitivePeerDependencies: - '@docusaurus/types' - '@swc/core' @@ -2305,58 +2097,55 @@ packages: - webpack-cli dev: false - /@docusaurus/module-type-aliases@3.1.0(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-XUl7Z4PWlKg4l6KF05JQ3iDHQxnPxbQUqTNKvviHyuHdlalOFv6qeDAm7IbzyQPJD5VA6y4dpRbTWSqP9ClwPg==} + /@docusaurus/module-type-aliases@3.0.0-alpha.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-9Uko9ndSSsRFFpw23zCw0TuzQOrHuYwfuA1gxDoATSGmWdSu8+EVGBV7TP3EHKb8s9EImlZ6I+3CROuoM1fvDQ==} peerDependencies: react: '*' react-dom: '*' dependencies: '@docusaurus/react-loadable': 5.5.2(react@18.2.0) - '@docusaurus/types': 3.1.0(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.0.0-alpha.0(react-dom@18.2.0)(react@18.2.0) '@types/history': 4.7.11 '@types/react': 18.0.28 - '@types/react-router-config': 5.0.11 + '@types/react-router-config': 5.0.6 '@types/react-router-dom': 5.3.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-helmet-async: 2.0.4(react-dom@18.2.0)(react@18.2.0) + react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0) react-loadable: /@docusaurus/react-loadable@5.5.2(react@18.2.0) transitivePeerDependencies: - '@swc/core' - esbuild - - supports-color - uglify-js - webpack-cli - /@docusaurus/plugin-content-blog@3.1.0(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-iMa6WBaaEdYuxckvJtLcq/HQdlA4oEbCXf/OFfsYJCCULcDX7GDZpKxLF3X1fLsax3sSm5bmsU+CA0WD+R1g3A==} - engines: {node: '>=18.0'} + /@docusaurus/plugin-content-blog@3.0.0-alpha.0(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6): + resolution: {integrity: sha512-ZKYq0Q888AeIPrTUhw6igq/e2Ee5WLENaOSy2uzVtPLieXu0BAw4gQqV2qyhZr0vwvMYhJ4Ke7KTMFSAgBXdyg==} + engines: {node: '>=16.14'} peerDependencies: react: ^18.0.0 || 18 react-dom: ^18.0.0 || 18 dependencies: - '@docusaurus/core': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/logger': 3.1.0 - '@docusaurus/mdx-loader': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/types': 3.1.0(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11) - '@docusaurus/utils-common': 3.1.0(@docusaurus/types@3.1.0) - '@docusaurus/utils-validation': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11) + '@docusaurus/core': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0)(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/logger': 3.0.0-alpha.0 + '@docusaurus/mdx-loader': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.0.0-alpha.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) + '@docusaurus/utils-common': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) + '@docusaurus/utils-validation': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) cheerio: 1.0.0-rc.12 feed: 4.2.2 - fs-extra: 11.2.0 + fs-extra: 11.1.0 lodash: 4.17.21 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) reading-time: 1.5.0 - srcset: 4.0.0 - tslib: 2.6.2 - unist-util-visit: 5.0.0 + tslib: 2.6.1 + unist-util-visit: 2.0.3 utility-types: 3.10.0 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.1.4) transitivePeerDependencies: - '@parcel/css' - - '@rspack/core' - '@swc/core' - '@swc/css' - bufferutil @@ -2373,33 +2162,33 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-content-docs@3.1.0(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-el5GxhT8BLrsWD0qGa8Rq+Ttb/Ni6V3DGT2oAPio0qcs/mUAxeyXEAmihkvmLCnAgp6xD27Ce7dISZ5c6BXeqA==} - engines: {node: '>=18.0'} + /@docusaurus/plugin-content-docs@3.0.0-alpha.0(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6): + resolution: {integrity: sha512-dlxgXsbvjl4jARJi32dn5BAU7LgQRJX18pC/jsrq3IeHQNS9sXSBFmHItK66JtqwXTdhpipkui3iIari2NNpFQ==} + engines: {node: '>=16.14'} peerDependencies: react: ^18.0.0 || 18 react-dom: ^18.0.0 || 18 dependencies: - '@docusaurus/core': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/logger': 3.1.0 - '@docusaurus/mdx-loader': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/module-type-aliases': 3.1.0(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/types': 3.1.0(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11) - '@docusaurus/utils-validation': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11) - '@types/react-router-config': 5.0.11 - combine-promises: 1.2.0 - fs-extra: 11.2.0 + '@docusaurus/core': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0)(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/logger': 3.0.0-alpha.0 + '@docusaurus/mdx-loader': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/module-type-aliases': 3.0.0-alpha.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.0.0-alpha.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) + '@docusaurus/utils-validation': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) + '@types/react-router-config': 5.0.6 + combine-promises: 1.1.0 + fs-extra: 11.1.0 + import-fresh: 3.3.0 js-yaml: 4.1.0 lodash: 4.17.21 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - tslib: 2.6.2 + tslib: 2.6.1 utility-types: 3.10.0 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.1.4) transitivePeerDependencies: - '@parcel/css' - - '@rspack/core' - '@swc/core' - '@swc/css' - bufferutil @@ -2416,26 +2205,25 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-content-pages@3.1.0(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-9gntYQFpk+93+Xl7gYczJu8I9uWoyRLnRwS0+NUFcs9iZtHKsdqKWPRrONC9elfN3wJ9ORwTbcVzsTiB8jvYlg==} - engines: {node: '>=18.0'} + /@docusaurus/plugin-content-pages@3.0.0-alpha.0(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6): + resolution: {integrity: sha512-yoTfh+xBZaOM3tBJFBpwYsDqnK4zAJjJtAJ80MnnnXIZ9gw640T9F+OjIqwFwp3rphpdONGg1QmeEnmAzy64QA==} + engines: {node: '>=16.14'} peerDependencies: react: ^18.0.0 || 18 react-dom: ^18.0.0 || 18 dependencies: - '@docusaurus/core': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/mdx-loader': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/types': 3.1.0(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11) - '@docusaurus/utils-validation': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11) - fs-extra: 11.2.0 + '@docusaurus/core': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0)(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/mdx-loader': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/types': 3.0.0-alpha.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) + '@docusaurus/utils-validation': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) + fs-extra: 11.1.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - tslib: 2.6.2 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) + tslib: 2.6.1 + webpack: 5.88.2(webpack-cli@5.1.4) transitivePeerDependencies: - '@parcel/css' - - '@rspack/core' - '@swc/core' - '@swc/css' - bufferutil @@ -2452,29 +2240,30 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-debug@3.1.0(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-AbvJwCVRbmQ8w9d8QXbF4Iq/ui0bjPZNYFIhtducGFnm2YQRN1mraK8mCEQb0Aq0T8SqRRvSfC/far4n/s531w==} - engines: {node: '>=18.0'} + /@docusaurus/plugin-debug@3.0.0-alpha.0(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6): + resolution: {integrity: sha512-2dNVjl//5G5djj1+YZ3aqaAmxNGGQydzUr3tZnaGfej7Z2NrhYrGo1LFKI+EgB5TpX/Pu9zIhGi/D0kS8j7BlA==} + engines: {node: '>=16.14'} peerDependencies: react: ^18.0.0 || 18 react-dom: ^18.0.0 || 18 dependencies: - '@docusaurus/core': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/types': 3.1.0(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11) - fs-extra: 11.2.0 + '@docusaurus/core': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0)(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/types': 3.0.0-alpha.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) + fs-extra: 11.1.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-json-view-lite: 1.2.1(react@18.2.0) - tslib: 2.6.2 + react-json-view: 1.21.3(react-dom@18.2.0)(react@18.2.0) + tslib: 2.6.1 transitivePeerDependencies: - '@parcel/css' - - '@rspack/core' - '@swc/core' - '@swc/css' + - '@types/react' - bufferutil - csso - debug + - encoding - esbuild - eslint - lightningcss @@ -2486,22 +2275,21 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-google-analytics@3.1.0(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-zvUOMzu9Uhz0ciqnSbtnp/5i1zEYlzarQrOXG90P3Is3efQI43p2YLW/rzSGdLb5MfQo2HvKT6Q5+tioMO045Q==} - engines: {node: '>=18.0'} + /@docusaurus/plugin-google-analytics@3.0.0-alpha.0(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6): + resolution: {integrity: sha512-ybaJQBHGzMNWOEPMEQ9jhln0pxBrLgWIbj7YlzjKjfHCKZ1FYEKlvQBrps8MPfH+d3LhwS7f9dd7Z1sJs3GUlA==} + engines: {node: '>=16.14'} peerDependencies: react: ^18.0.0 || 18 react-dom: ^18.0.0 || 18 dependencies: - '@docusaurus/core': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/types': 3.1.0(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils-validation': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11) + '@docusaurus/core': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0)(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/types': 3.0.0-alpha.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils-validation': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - tslib: 2.6.2 + tslib: 2.6.1 transitivePeerDependencies: - '@parcel/css' - - '@rspack/core' - '@swc/core' - '@swc/css' - bufferutil @@ -2518,23 +2306,22 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-google-gtag@3.1.0(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-0txshvaY8qIBdkk2UATdVcfiCLGq3KAUfuRQD2cRNgO39iIf4/ihQxH9NXcRTwKs4Q5d9yYHoix3xT6pFuEYOg==} - engines: {node: '>=18.0'} + /@docusaurus/plugin-google-gtag@3.0.0-alpha.0(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6): + resolution: {integrity: sha512-IJkZuBf4bIjKWUWe6qg82tSTjTI06rqIWPbw2wCW6H/m+rgI0jbinpR3pmrFl1agVi3dWtn731CVXV4lSvv7cg==} + engines: {node: '>=16.14'} peerDependencies: react: ^18.0.0 || 18 react-dom: ^18.0.0 || 18 dependencies: - '@docusaurus/core': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/types': 3.1.0(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils-validation': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11) + '@docusaurus/core': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0)(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/types': 3.0.0-alpha.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils-validation': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) '@types/gtag.js': 0.0.12 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - tslib: 2.6.2 + tslib: 2.6.1 transitivePeerDependencies: - '@parcel/css' - - '@rspack/core' - '@swc/core' - '@swc/css' - bufferutil @@ -2551,22 +2338,21 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-google-tag-manager@3.1.0(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-zOWPEi8kMyyPtwG0vhyXrdbLs8fIZmY5vlbi9lUU+v8VsroO5iHmfR2V3SMsrsfOanw5oV/ciWqbxezY00qEZg==} - engines: {node: '>=18.0'} + /@docusaurus/plugin-google-tag-manager@3.0.0-alpha.0(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6): + resolution: {integrity: sha512-y/9jcokUjreRHghWrhMe6hy2G768JaEdmqie6X5OmXM2Lr+L3H4W4tJiRacqkW+/K5BsrVudOzxAqtXTwfBGvA==} + engines: {node: '>=16.14'} peerDependencies: react: ^18.0.0 || 18 react-dom: ^18.0.0 || 18 dependencies: - '@docusaurus/core': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/types': 3.1.0(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils-validation': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11) + '@docusaurus/core': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0)(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/types': 3.0.0-alpha.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils-validation': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - tslib: 2.6.2 + tslib: 2.6.1 transitivePeerDependencies: - '@parcel/css' - - '@rspack/core' - '@swc/core' - '@swc/css' - bufferutil @@ -2583,27 +2369,26 @@ packages: - webpack-cli dev: false - /@docusaurus/plugin-sitemap@3.1.0(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-TkR5vGBpUooEB9SoW42thahqqwKzfHrQQhkB+JrEGERsl4bKODSuJNle4aA4h6LSkg4IyfXOW8XOI0NIPWb9Cg==} - engines: {node: '>=18.0'} + /@docusaurus/plugin-sitemap@3.0.0-alpha.0(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6): + resolution: {integrity: sha512-UftoalMEWAeKPf80tdt0Olfg82V0SyeDEVpf9epRanT9fkr1DaF5lTWhJIgjFdou5XboW7feUeGPOZ78DWQr0w==} + engines: {node: '>=16.14'} peerDependencies: react: ^18.0.0 || 18 react-dom: ^18.0.0 || 18 dependencies: - '@docusaurus/core': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/logger': 3.1.0 - '@docusaurus/types': 3.1.0(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11) - '@docusaurus/utils-common': 3.1.0(@docusaurus/types@3.1.0) - '@docusaurus/utils-validation': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11) - fs-extra: 11.2.0 + '@docusaurus/core': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0)(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/logger': 3.0.0-alpha.0 + '@docusaurus/types': 3.0.0-alpha.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) + '@docusaurus/utils-common': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) + '@docusaurus/utils-validation': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) + fs-extra: 11.1.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) sitemap: 7.1.1 - tslib: 2.6.2 + tslib: 2.6.1 transitivePeerDependencies: - '@parcel/css' - - '@rspack/core' - '@swc/core' - '@swc/css' - bufferutil @@ -2620,42 +2405,41 @@ packages: - webpack-cli dev: false - /@docusaurus/preset-classic@3.1.0(@algolia/client-search@4.15.0)(@types/react@18.0.28)(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.2.2): - resolution: {integrity: sha512-xGLQRFmmT9IinAGUDVRYZ54Ys28USNbA3OTXQXnSJLPr1rCY7CYnHI4XoOnKWrNnDiAI4ruMzunXWyaElUYCKQ==} - engines: {node: '>=18.0'} + /@docusaurus/preset-classic@3.0.0-alpha.0(@algolia/client-search@4.15.0)(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6): + resolution: {integrity: sha512-NH2Ufv0jSGiPwBD/+JhS3pbedsyUpAU33IzRouVFniQDwBr/n//yJNXTQBW7ZTUeCSebxr4cEABArAVg+RTmQA==} + engines: {node: '>=16.14'} peerDependencies: react: ^18.0.0 || 18 react-dom: ^18.0.0 || 18 dependencies: - '@docusaurus/core': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/plugin-content-blog': 3.1.0(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/plugin-content-docs': 3.1.0(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/plugin-content-pages': 3.1.0(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/plugin-debug': 3.1.0(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/plugin-google-analytics': 3.1.0(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/plugin-google-gtag': 3.1.0(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/plugin-google-tag-manager': 3.1.0(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/plugin-sitemap': 3.1.0(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/theme-classic': 3.1.0(@types/react@18.0.28)(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/theme-common': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/theme-search-algolia': 3.1.0(patch_hash=lazxwgumd4o5a3ibe55vftei5e)(@algolia/client-search@4.15.0)(@docusaurus/types@3.1.0)(@types/react@18.0.28)(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.2.2) - '@docusaurus/types': 3.1.0(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/core': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0)(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/plugin-content-blog': 3.0.0-alpha.0(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/plugin-content-docs': 3.0.0-alpha.0(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/plugin-content-pages': 3.0.0-alpha.0(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/plugin-debug': 3.0.0-alpha.0(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/plugin-google-analytics': 3.0.0-alpha.0(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/plugin-google-gtag': 3.0.0-alpha.0(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/plugin-google-tag-manager': 3.0.0-alpha.0(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/plugin-sitemap': 3.0.0-alpha.0(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/theme-classic': 3.0.0-alpha.0(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/theme-common': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0)(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/theme-search-algolia': 3.0.0-alpha.0(patch_hash=dfty3zxmjzsb7sg6jf27rbwooe)(@algolia/client-search@4.15.0)(@docusaurus/types@3.0.0-alpha.0)(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/types': 3.0.0-alpha.0(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: - '@algolia/client-search' - '@parcel/css' - - '@rspack/core' - '@swc/core' - '@swc/css' - '@types/react' - bufferutil - csso - debug + - encoding - esbuild - eslint - lightningcss - - search-insights - supports-color - typescript - uglify-js @@ -2673,46 +2457,44 @@ packages: prop-types: 15.8.1 react: 18.2.0 - /@docusaurus/theme-classic@3.1.0(@types/react@18.0.28)(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-/+jMl2Z9O8QQxves5AtHdt91gWsEZFgOV3La/6eyKEd7QLqQUtM5fxEJ40rq9NKYjqCd1HzZ9egIMeJoWwillw==} - engines: {node: '>=18.0'} + /@docusaurus/theme-classic@3.0.0-alpha.0(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6): + resolution: {integrity: sha512-EKH1UAi/5I4gy3cpcfAnGBDfX3N5lfdg9NlXIMI5m1337n4QlbfF5f5NPnXwq7F5oWXniyeNAPQnhba/ELTNHA==} + engines: {node: '>=16.14'} peerDependencies: react: ^18.0.0 || 18 react-dom: ^18.0.0 || 18 dependencies: - '@docusaurus/core': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/mdx-loader': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/module-type-aliases': 3.1.0(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/plugin-content-blog': 3.1.0(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/plugin-content-docs': 3.1.0(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/plugin-content-pages': 3.1.0(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/theme-common': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/theme-translations': 3.1.0 - '@docusaurus/types': 3.1.0(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/utils': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11) - '@docusaurus/utils-common': 3.1.0(@docusaurus/types@3.1.0) - '@docusaurus/utils-validation': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11) - '@mdx-js/react': 3.0.0(@types/react@18.0.28)(react@18.2.0) - clsx: 2.1.0 - copy-text-to-clipboard: 3.2.0 + '@docusaurus/core': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0)(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/mdx-loader': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/module-type-aliases': 3.0.0-alpha.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/plugin-content-blog': 3.0.0-alpha.0(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/plugin-content-docs': 3.0.0-alpha.0(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/plugin-content-pages': 3.0.0-alpha.0(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/theme-common': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0)(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/theme-translations': 3.0.0-alpha.0 + '@docusaurus/types': 3.0.0-alpha.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/utils': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) + '@docusaurus/utils-common': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) + '@docusaurus/utils-validation': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) + '@mdx-js/react': 2.3.0(react@18.2.0) + clsx: 1.2.1 + copy-text-to-clipboard: 3.1.0 infima: 0.2.0-alpha.43 lodash: 4.17.21 nprogress: 0.2.0 - postcss: 8.4.31 - prism-react-renderer: 2.3.1(react@18.2.0) + postcss: 8.4.21 + prism-react-renderer: 1.3.5(react@18.2.0) prismjs: 1.29.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-router-dom: 5.3.4(react@18.2.0) - rtlcss: 4.1.1 - tslib: 2.6.2 + rtlcss: 4.1.0 + tslib: 2.6.1 utility-types: 3.10.0 transitivePeerDependencies: - '@parcel/css' - - '@rspack/core' - '@swc/core' - '@swc/css' - - '@types/react' - bufferutil - csso - debug @@ -2727,34 +2509,34 @@ packages: - webpack-cli dev: false - /@docusaurus/theme-common@3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2): - resolution: {integrity: sha512-YGwEFALLIbF5ocW/Fy6Ae7tFWUOugEN3iwxTx8UkLAcLqYUboDSadesYtVBmRCEB4FVA2qoP7YaW3lu3apUPPw==} - engines: {node: '>=18.0'} + /@docusaurus/theme-common@3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0)(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6): + resolution: {integrity: sha512-dEMSB0G+ZigAb9KqQ+yztz2BiXbAX3/vFlE5xpNbH8nSahSfIwF9QG5f+5DON99+0VnpF3fMmLLq6lQR5/LVMQ==} + engines: {node: '>=16.14'} peerDependencies: react: ^18.0.0 || 18 react-dom: ^18.0.0 || 18 dependencies: - '@docusaurus/mdx-loader': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/module-type-aliases': 3.1.0(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0) - '@docusaurus/plugin-content-blog': 3.1.0(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/plugin-content-docs': 3.1.0(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/plugin-content-pages': 3.1.0(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/utils': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11) - '@docusaurus/utils-common': 3.1.0(@docusaurus/types@3.1.0) + '@docusaurus/mdx-loader': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/module-type-aliases': 3.0.0-alpha.0(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/plugin-content-blog': 3.0.0-alpha.0(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/plugin-content-docs': 3.0.0-alpha.0(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/plugin-content-pages': 3.0.0-alpha.0(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/utils': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) + '@docusaurus/utils-common': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) '@types/history': 4.7.11 '@types/react': 18.0.28 - '@types/react-router-config': 5.0.11 - clsx: 2.1.0 + '@types/react-router-config': 5.0.6 + clsx: 1.2.1 parse-numeric-range: 1.3.0 - prism-react-renderer: 2.3.1(react@18.2.0) + prism-react-renderer: 1.3.5(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - tslib: 2.6.2 + tslib: 2.6.1 + use-sync-external-store: 1.2.0(react@18.2.0) utility-types: 3.10.0 transitivePeerDependencies: - '@docusaurus/types' - '@parcel/css' - - '@rspack/core' - '@swc/core' - '@swc/css' - bufferutil @@ -2771,36 +2553,35 @@ packages: - webpack-cli dev: false - /@docusaurus/theme-search-algolia@3.1.0(patch_hash=lazxwgumd4o5a3ibe55vftei5e)(@algolia/client-search@4.15.0)(@docusaurus/types@3.1.0)(@types/react@18.0.28)(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0)(typescript@5.2.2): - resolution: {integrity: sha512-8cJH0ZhPsEDjq3jR3I+wHmWzVY2bXMQJ59v2QxUmsTZxbWA4u+IzccJMIJx4ooFl9J6iYynwYsFuHxyx/KUmfQ==} - engines: {node: '>=18.0'} + /@docusaurus/theme-search-algolia@3.0.0-alpha.0(patch_hash=dfty3zxmjzsb7sg6jf27rbwooe)(@algolia/client-search@4.15.0)(@docusaurus/types@3.0.0-alpha.0)(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6): + resolution: {integrity: sha512-tOtcer8YUA1c1JUsE5UuXYMn4/PvwMXo1/2NFhws3S2+K6mh+1axongRJ8frKf0xMWWTnswtFsLBhwhG8aTwMA==} + engines: {node: '>=16.14'} peerDependencies: react: ^18.0.0 || 18 react-dom: ^18.0.0 || 18 dependencies: - '@docsearch/react': 3.5.2(@algolia/client-search@4.15.0)(@types/react@18.0.28)(react-dom@18.2.0)(react@18.2.0)(search-insights@2.13.0) - '@docusaurus/core': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/logger': 3.1.0 - '@docusaurus/plugin-content-docs': 3.1.0(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/theme-common': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11)(eslint@8.53.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.2.2) - '@docusaurus/theme-translations': 3.1.0 - '@docusaurus/utils': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11) - '@docusaurus/utils-validation': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11) - algoliasearch: 4.22.1 - algoliasearch-helper: 3.16.1(algoliasearch@4.22.1) - clsx: 2.1.0 - eta: 2.2.0 - fs-extra: 11.2.0 + '@docsearch/react': 3.3.3(@algolia/client-search@4.15.0)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/core': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0)(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/logger': 3.0.0-alpha.0 + '@docusaurus/plugin-content-docs': 3.0.0-alpha.0(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/theme-common': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0)(eslint@8.38.0)(react-dom@18.2.0)(react@18.2.0)(typescript@5.1.6) + '@docusaurus/theme-translations': 3.0.0-alpha.0 + '@docusaurus/utils': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) + '@docusaurus/utils-validation': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) + algoliasearch: 4.15.0 + algoliasearch-helper: 3.12.0(algoliasearch@4.15.0) + clsx: 1.2.1 + eta: 2.0.1 + fs-extra: 11.1.0 lodash: 4.17.21 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - tslib: 2.6.2 + tslib: 2.6.1 utility-types: 3.10.0 transitivePeerDependencies: - '@algolia/client-search' - '@docusaurus/types' - '@parcel/css' - - '@rspack/core' - '@swc/core' - '@swc/css' - '@types/react' @@ -2810,7 +2591,6 @@ packages: - esbuild - eslint - lightningcss - - search-insights - supports-color - typescript - uglify-js @@ -2820,60 +2600,58 @@ packages: dev: false patched: true - /@docusaurus/theme-translations@3.1.0: - resolution: {integrity: sha512-DApE4AbDI+WBajihxB54L4scWQhVGNZAochlC9fkbciPuFAgdRBD3NREb0rgfbKexDC/rioppu/WJA0u8tS+yA==} - engines: {node: '>=18.0'} + /@docusaurus/theme-translations@3.0.0-alpha.0: + resolution: {integrity: sha512-32s4dxdz3F8p/6WsYdiNlnV0W3glHyG1qDM3SngZLp7sihgmvAIFzLhrbTLYqZhR8DXqy6QdiD7utRN1oQrWUg==} + engines: {node: '>=16.14'} dependencies: - fs-extra: 11.2.0 - tslib: 2.6.2 + fs-extra: 11.1.0 + tslib: 2.6.1 dev: false - /@docusaurus/types@3.1.0(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-VaczOZf7+re8aFBIWnex1XENomwHdsSTkrdX43zyor7G/FY4OIsP6X28Xc3o0jiY0YdNuvIDyA5TNwOtpgkCVw==} + /@docusaurus/types@3.0.0-alpha.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-DdLoy6U6KzHxYYEgBN9AG5Xv2yrDXil4EhL+QUui5cGk/BrBDoADmLJ9c/6dQcqThVEqgmAl5tf19tG9P6atgw==} peerDependencies: react: ^18.0.0 || 18 react-dom: ^18.0.0 || 18 dependencies: - '@mdx-js/mdx': 3.0.0 '@types/history': 4.7.11 '@types/react': 18.0.28 commander: 5.1.0 - joi: 17.11.1 + joi: 17.8.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0) utility-types: 3.10.0 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) - webpack-merge: 5.10.0 + webpack: 5.88.2(webpack-cli@5.1.4) + webpack-merge: 5.9.0 transitivePeerDependencies: - '@swc/core' - esbuild - - supports-color - uglify-js - webpack-cli - /@docusaurus/utils-common@3.1.0(@docusaurus/types@3.1.0): - resolution: {integrity: sha512-SfvnRLHoZ9bwTw67knkSs7IcUR0GY2SaGkpdB/J9pChrDiGhwzKNUhcieoPyPYrOWGRPk3rVNYtoy+Bc7psPAw==} - engines: {node: '>=18.0'} + /@docusaurus/utils-common@3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0): + resolution: {integrity: sha512-Q50+OHy1HNR0L1PZSe+eOwqSDXeZdUHkHcfQcIEmoSH7pGB4Wr2TRPUyHgzCkkVhWbqzsgprWH/u6+JmNCV84Q==} + engines: {node: '>=16.14'} peerDependencies: '@docusaurus/types': '*' peerDependenciesMeta: '@docusaurus/types': optional: true dependencies: - '@docusaurus/types': 3.1.0(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0) - tslib: 2.6.2 + '@docusaurus/types': 3.0.0-alpha.0(react-dom@18.2.0)(react@18.2.0) + tslib: 2.6.1 dev: false - /@docusaurus/utils-validation@3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11): - resolution: {integrity: sha512-dFxhs1NLxPOSzmcTk/eeKxLY5R+U4cua22g9MsAMiRWcwFKStZ2W3/GDY0GmnJGqNS8QAQepJrxQoyxXkJNDeg==} - engines: {node: '>=18.0'} + /@docusaurus/utils-validation@3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0): + resolution: {integrity: sha512-xqe2ekhMg3HQa/PwqZncP/KlI7wofYSrgjIwWZywLAb1ZhOwZngRBOUMCAVTgeJekq7+waVVb5wXqNSqt/hahw==} + engines: {node: '>=16.14'} dependencies: - '@docusaurus/logger': 3.1.0 - '@docusaurus/utils': 3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11) - joi: 17.11.1 + '@docusaurus/logger': 3.0.0-alpha.0 + '@docusaurus/utils': 3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0) + joi: 17.8.3 js-yaml: 4.1.0 - tslib: 2.6.2 + tslib: 2.6.1 transitivePeerDependencies: - '@docusaurus/types' - '@swc/core' @@ -2883,33 +2661,32 @@ packages: - webpack-cli dev: false - /@docusaurus/utils@3.1.0(@docusaurus/types@3.1.0)(esbuild@0.17.11): - resolution: {integrity: sha512-LgZfp0D+UBqAh7PZ//MUNSFBMavmAPku6Si9x8x3V+S318IGCNJ6hUr2O29UO0oLybEWUjD5Jnj9IUN6XyZeeg==} - engines: {node: '>=18.0'} + /@docusaurus/utils@3.0.0-alpha.0(@docusaurus/types@3.0.0-alpha.0): + resolution: {integrity: sha512-+dtf9zxLUkgQFf4qOgz1r812EMrVMDPdxlHkZ6Hr/QqDI0XlpFCTBmmngFDGpkvInji40gP7QORxqOrP03r4Bw==} + engines: {node: '>=16.14'} peerDependencies: '@docusaurus/types': '*' peerDependenciesMeta: '@docusaurus/types': optional: true dependencies: - '@docusaurus/logger': 3.1.0 - '@docusaurus/types': 3.1.0(esbuild@0.17.11)(react-dom@18.2.0)(react@18.2.0) + '@docusaurus/logger': 3.0.0-alpha.0 + '@docusaurus/types': 3.0.0-alpha.0(react-dom@18.2.0)(react@18.2.0) '@svgr/webpack': 6.5.1 escape-string-regexp: 4.0.0 - file-loader: 6.2.0(webpack@5.89.0) - fs-extra: 11.2.0 + file-loader: 6.2.0(webpack@5.88.2) + fs-extra: 11.1.0 github-slugger: 1.5.0 globby: 11.1.0 gray-matter: 4.0.3 - jiti: 1.21.0 js-yaml: 4.1.0 lodash: 4.17.21 micromatch: 4.0.5 resolve-pathname: 3.0.0 shelljs: 0.8.5 - tslib: 2.6.2 - url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.89.0) - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) + tslib: 2.6.1 + url-loader: 4.1.1(file-loader@6.2.0)(webpack@5.88.2) + webpack: 5.88.2(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -2918,7 +2695,7 @@ packages: - webpack-cli dev: false - /@effortlessmotion/html-webpack-inline-source-plugin@1.0.3(html-webpack-plugin@5.5.0)(webpack@5.89.0): + /@effortlessmotion/html-webpack-inline-source-plugin@1.0.3(html-webpack-plugin@5.5.0)(webpack@5.88.2): resolution: {integrity: sha512-erpdT6H/PvtO4iTz30ORlyc8xpGWkW9ijLbSmRVuYAaLlGrYhkAUd0pKXGwQ7asIj34ySpacwYch+Zqss2mzdA==} engines: {node: '>=10.13.0'} peerDependencies: @@ -2926,10 +2703,31 @@ packages: webpack: '>=5' dependencies: escape-string-regexp: 4.0.0 - html-webpack-plugin: 5.5.0(webpack@5.89.0) + html-webpack-plugin: 5.5.0(webpack@5.88.2) slash: 3.0.0 source-map-url: 0.4.1 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.1.4) + dev: true + + /@esbuild-kit/cjs-loader@2.4.2: + resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==} + dependencies: + '@esbuild-kit/core-utils': 3.1.0 + get-tsconfig: 4.5.0 + dev: true + + /@esbuild-kit/core-utils@3.1.0: + resolution: {integrity: sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==} + dependencies: + esbuild: 0.17.11 + source-map-support: 0.5.21 + dev: true + + /@esbuild-kit/esm-loader@2.5.5: + resolution: {integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==} + dependencies: + '@esbuild-kit/core-utils': 3.1.0 + get-tsconfig: 4.5.0 dev: true /@esbuild/android-arm64@0.17.11: @@ -2938,6 +2736,7 @@ packages: cpu: [arm64] os: [android] requiresBuild: true + dev: true optional: true /@esbuild/android-arm@0.17.11: @@ -2946,6 +2745,7 @@ packages: cpu: [arm] os: [android] requiresBuild: true + dev: true optional: true /@esbuild/android-x64@0.17.11: @@ -2954,6 +2754,7 @@ packages: cpu: [x64] os: [android] requiresBuild: true + dev: true optional: true /@esbuild/darwin-arm64@0.17.11: @@ -2962,6 +2763,7 @@ packages: cpu: [arm64] os: [darwin] requiresBuild: true + dev: true optional: true /@esbuild/darwin-x64@0.17.11: @@ -2970,6 +2772,7 @@ packages: cpu: [x64] os: [darwin] requiresBuild: true + dev: true optional: true /@esbuild/freebsd-arm64@0.17.11: @@ -2978,6 +2781,7 @@ packages: cpu: [arm64] os: [freebsd] requiresBuild: true + dev: true optional: true /@esbuild/freebsd-x64@0.17.11: @@ -2986,6 +2790,7 @@ packages: cpu: [x64] os: [freebsd] requiresBuild: true + dev: true optional: true /@esbuild/linux-arm64@0.17.11: @@ -2994,6 +2799,7 @@ packages: cpu: [arm64] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-arm@0.17.11: @@ -3002,6 +2808,7 @@ packages: cpu: [arm] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-ia32@0.17.11: @@ -3010,6 +2817,7 @@ packages: cpu: [ia32] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-loong64@0.17.11: @@ -3018,6 +2826,7 @@ packages: cpu: [loong64] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-mips64el@0.17.11: @@ -3026,6 +2835,7 @@ packages: cpu: [mips64el] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-ppc64@0.17.11: @@ -3034,6 +2844,7 @@ packages: cpu: [ppc64] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-riscv64@0.17.11: @@ -3042,6 +2853,7 @@ packages: cpu: [riscv64] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-s390x@0.17.11: @@ -3050,6 +2862,7 @@ packages: cpu: [s390x] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/linux-x64@0.17.11: @@ -3058,6 +2871,7 @@ packages: cpu: [x64] os: [linux] requiresBuild: true + dev: true optional: true /@esbuild/netbsd-x64@0.17.11: @@ -3066,6 +2880,7 @@ packages: cpu: [x64] os: [netbsd] requiresBuild: true + dev: true optional: true /@esbuild/openbsd-x64@0.17.11: @@ -3074,6 +2889,7 @@ packages: cpu: [x64] os: [openbsd] requiresBuild: true + dev: true optional: true /@esbuild/sunos-x64@0.17.11: @@ -3082,6 +2898,7 @@ packages: cpu: [x64] os: [sunos] requiresBuild: true + dev: true optional: true /@esbuild/win32-arm64@0.17.11: @@ -3090,6 +2907,7 @@ packages: cpu: [arm64] os: [win32] requiresBuild: true + dev: true optional: true /@esbuild/win32-ia32@0.17.11: @@ -3098,6 +2916,7 @@ packages: cpu: [ia32] os: [win32] requiresBuild: true + dev: true optional: true /@esbuild/win32-x64@0.17.11: @@ -3106,30 +2925,31 @@ packages: cpu: [x64] os: [win32] requiresBuild: true + dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.53.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.38.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.53.0 - eslint-visitor-keys: 3.4.3 + eslint: 8.38.0 + eslint-visitor-keys: 3.4.0 - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + /@eslint-community/regexpp@4.5.0: + resolution: {integrity: sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - /@eslint/eslintrc@2.1.3: - resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} + /@eslint/eslintrc@2.0.2: + resolution: {integrity: sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4(supports-color@8.1.1) - espree: 9.6.1 - globals: 13.23.0 - ignore: 5.3.0 + espree: 9.5.1 + globals: 13.20.0 + ignore: 5.2.4 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -3137,8 +2957,8 @@ packages: transitivePeerDependencies: - supports-color - /@eslint/js@8.53.0: - resolution: {integrity: sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==} + /@eslint/js@8.38.0: + resolution: {integrity: sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} /@fortawesome/fontawesome-common-types@6.3.0: @@ -3190,11 +3010,11 @@ packages: dependencies: '@hapi/hoek': 9.3.0 - /@humanwhocodes/config-array@0.11.13: - resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + /@humanwhocodes/config-array@0.11.8: + resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} engines: {node: '>=10.10.0'} dependencies: - '@humanwhocodes/object-schema': 2.0.1 + '@humanwhocodes/object-schema': 1.2.1 debug: 4.3.4(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: @@ -3204,8 +3024,8 @@ packages: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - /@humanwhocodes/object-schema@2.0.1: - resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + /@humanwhocodes/object-schema@1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -3230,27 +3050,24 @@ packages: get-package-type: 0.1.0 js-yaml: 3.14.1 resolve-from: 5.0.0 - dev: true /@istanbuljs/schema@0.1.3: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - dev: true - /@jest/console@29.7.0: - resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + /@jest/console@29.5.0: + resolution: {integrity: sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.3 - '@types/node': 18.18.9 + '@jest/types': 29.6.1 + '@types/node': 16.18.40 chalk: 4.1.2 - jest-message-util: 29.7.0 - jest-util: 29.7.0 + jest-message-util: 29.6.2 + jest-util: 29.6.2 slash: 3.0.0 - dev: true - /@jest/core@29.7.0(ts-node@10.9.1): - resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + /@jest/core@29.5.0(ts-node@10.9.1): + resolution: {integrity: sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -3258,93 +3075,86 @@ packages: node-notifier: optional: true dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.18.9 + '@jest/console': 29.5.0 + '@jest/reporters': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.6.1 + '@types/node': 16.18.40 ansi-escapes: 4.3.2 chalk: 4.1.2 - ci-info: 3.9.0 + ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.18.9)(ts-node@10.9.1) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 + jest-changed-files: 29.5.0 + jest-config: 29.5.0(@types/node@16.18.40)(ts-node@10.9.1) + jest-haste-map: 29.5.0 + jest-message-util: 29.6.2 + jest-regex-util: 29.4.3 + jest-resolve: 29.5.0 + jest-resolve-dependencies: 29.5.0 + jest-runner: 29.5.0 + jest-runtime: 29.5.0 + jest-snapshot: 29.5.0 + jest-util: 29.6.2 + jest-validate: 29.5.0 + jest-watcher: 29.5.0 micromatch: 4.0.5 - pretty-format: 29.7.0 + pretty-format: 29.6.2 slash: 3.0.0 strip-ansi: 6.0.1 transitivePeerDependencies: - - babel-plugin-macros - supports-color - ts-node - dev: true - /@jest/environment@29.7.0: - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + /@jest/environment@29.6.2: + resolution: {integrity: sha512-AEcW43C7huGd/vogTddNNTDRpO6vQ2zaQNrttvWV18ArBx9Z56h7BIsXkNFJVOO4/kblWEQz30ckw0+L3izc+Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.18.9 - jest-mock: 29.7.0 - dev: true + '@jest/fake-timers': 29.6.2 + '@jest/types': 29.6.1 + '@types/node': 16.18.40 + jest-mock: 29.6.2 - /@jest/expect-utils@29.7.0: - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + /@jest/expect-utils@29.5.0: + resolution: {integrity: sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - jest-get-type: 29.6.3 - dev: true + jest-get-type: 29.4.3 - /@jest/expect@29.7.0: - resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + /@jest/expect@29.5.0: + resolution: {integrity: sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - expect: 29.7.0 - jest-snapshot: 29.7.0 + expect: 29.5.0 + jest-snapshot: 29.5.0 transitivePeerDependencies: - supports-color - dev: true - /@jest/fake-timers@29.7.0: - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + /@jest/fake-timers@29.6.2: + resolution: {integrity: sha512-euZDmIlWjm1Z0lJ1D0f7a0/y5Kh/koLFMUBE5SUYWrmy8oNhJpbTBDAP6CxKnadcMLDoDf4waRYCe35cH6G6PA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.3 + '@jest/types': 29.6.1 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 18.18.9 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 - dev: true + '@types/node': 16.18.40 + jest-message-util: 29.6.2 + jest-mock: 29.6.2 + jest-util: 29.6.2 - /@jest/globals@29.7.0: - resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + /@jest/globals@29.5.0: + resolution: {integrity: sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/types': 29.6.3 - jest-mock: 29.7.0 + '@jest/environment': 29.6.2 + '@jest/expect': 29.5.0 + '@jest/types': 29.6.1 + jest-mock: 29.6.2 transitivePeerDependencies: - supports-color - dev: true - /@jest/reporters@29.7.0: - resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + /@jest/reporters@29.5.0: + resolution: {integrity: sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -3353,100 +3163,95 @@ packages: optional: true dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.21 - '@types/node': 18.18.9 + '@jest/console': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.6.1 + '@jridgewell/trace-mapping': 0.3.19 + '@types/node': 16.18.40 chalk: 4.1.2 - collect-v8-coverage: 1.0.2 + collect-v8-coverage: 1.0.1 exit: 0.1.2 glob: 7.2.3 graceful-fs: 4.2.11 istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 6.0.1 - istanbul-lib-report: 3.0.1 + istanbul-lib-instrument: 5.2.1 + istanbul-lib-report: 3.0.0 istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.6 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - jest-worker: 29.7.0 + istanbul-reports: 3.1.5 + jest-message-util: 29.6.2 + jest-util: 29.6.2 + jest-worker: 29.5.0 slash: 3.0.0 string-length: 4.0.2 strip-ansi: 6.0.1 - v8-to-istanbul: 9.1.3 + v8-to-istanbul: 9.1.0 transitivePeerDependencies: - supports-color - dev: true - /@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + /@jest/schemas@29.6.0: + resolution: {integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@sinclair/typebox': 0.27.8 - /@jest/source-map@29.6.3: - resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + /@jest/source-map@29.4.3: + resolution: {integrity: sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jridgewell/trace-mapping': 0.3.21 + '@jridgewell/trace-mapping': 0.3.19 callsites: 3.1.0 graceful-fs: 4.2.11 - dev: true - /@jest/test-result@29.7.0: - resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + /@jest/test-result@29.5.0: + resolution: {integrity: sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/console': 29.7.0 - '@jest/types': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.2 - dev: true + '@jest/console': 29.5.0 + '@jest/types': 29.6.1 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.1 - /@jest/test-sequencer@29.7.0: - resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + /@jest/test-sequencer@29.5.0: + resolution: {integrity: sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/test-result': 29.7.0 + '@jest/test-result': 29.5.0 graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 + jest-haste-map: 29.5.0 slash: 3.0.0 - dev: true - /@jest/transform@29.7.0: - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + /@jest/transform@29.5.0: + resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.23.7 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.21 + '@babel/core': 7.22.10 + '@jest/types': 29.6.1 + '@jridgewell/trace-mapping': 0.3.19 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 + jest-haste-map: 29.5.0 + jest-regex-util: 29.4.3 + jest-util: 29.6.2 micromatch: 4.0.5 - pirates: 4.0.6 + pirates: 4.0.5 slash: 3.0.0 write-file-atomic: 4.0.2 transitivePeerDependencies: - supports-color - dev: true - /@jest/types@29.6.3: - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + /@jest/types@29.6.1: + resolution: {integrity: sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 18.18.9 - '@types/yargs': 17.0.32 + '@jest/schemas': 29.6.0 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 16.18.40 + '@types/yargs': 17.0.24 chalk: 4.1.2 /@jridgewell/gen-mapping@0.3.3: @@ -3455,7 +3260,7 @@ packages: dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.21 + '@jridgewell/trace-mapping': 0.3.19 /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} @@ -3469,13 +3274,13 @@ packages: resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} dependencies: '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.21 + '@jridgewell/trace-mapping': 0.3.19 /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - /@jridgewell/trace-mapping@0.3.21: - resolution: {integrity: sha512-SRfKmRe1KvYnxjEMtxEr+J4HIeMX5YBg/qhRHpxEIGjhX1rshcHlnFUE9K0GazhVKWM7B+nARSkV8LuvJdJ5/g==} + /@jridgewell/trace-mapping@0.3.19: + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 @@ -3485,56 +3290,37 @@ packages: dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 - dev: true /@leichtgewicht/ip-codec@2.0.4: resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} - /@mdx-js/loader@3.0.0(webpack@5.89.0): - resolution: {integrity: sha512-9kLv83YtgxpoXVYHaf0ygx1dmhCffo0MQCv6KtNG67jy/JlBK/2Q0dSWfuuyStP3jnZKABHfbjv8zsiT1buu6A==} - peerDependencies: - webpack: '>=5' - dependencies: - '@mdx-js/mdx': 3.0.0 - source-map: 0.7.4 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) - transitivePeerDependencies: - - supports-color - dev: false - - /@mdx-js/mdx@3.0.0: - resolution: {integrity: sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw==} + /@mdx-js/mdx@2.3.0: + resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} dependencies: - '@types/estree': 1.0.5 - '@types/estree-jsx': 1.0.3 - '@types/hast': 3.0.3 + '@types/estree-jsx': 1.0.0 '@types/mdx': 2.0.5 - collapse-white-space: 2.1.0 - devlop: 1.1.0 - estree-util-build-jsx: 3.0.1 - estree-util-is-identifier-name: 3.0.0 - estree-util-to-js: 2.0.0 + estree-util-build-jsx: 2.2.2 + estree-util-is-identifier-name: 2.1.0 + estree-util-to-js: 1.2.0 estree-walker: 3.0.3 - hast-util-to-estree: 3.1.0 - hast-util-to-jsx-runtime: 2.3.0 - markdown-extensions: 2.0.0 + hast-util-to-estree: 2.3.3 + markdown-extensions: 1.1.1 periscopic: 3.1.0 - remark-mdx: 3.0.0 - remark-parse: 11.0.0 - remark-rehype: 11.1.0 - source-map: 0.7.4 - unified: 11.0.4 - unist-util-position-from-estree: 2.0.0 - unist-util-stringify-position: 4.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 + remark-mdx: 2.3.0 + remark-parse: 10.0.2 + remark-rehype: 10.1.0 + unified: 10.1.2 + unist-util-position-from-estree: 1.1.2 + unist-util-stringify-position: 3.0.3 + unist-util-visit: 4.1.2 + vfile: 5.3.7 transitivePeerDependencies: - supports-color + dev: false - /@mdx-js/react@3.0.0(@types/react@18.0.28)(react@18.2.0): - resolution: {integrity: sha512-nDctevR9KyYFyV+m+/+S4cpzCWHqj+iHDHq3QrsWezcC+B17uZdIWgCguESUkwFhM3n/56KxWVE3V6EokrmONQ==} + /@mdx-js/react@2.3.0(react@18.2.0): + resolution: {integrity: sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g==} peerDependencies: - '@types/react': '>=16' react: '>=16 || 18' dependencies: '@types/mdx': 2.0.5 @@ -3547,34 +3333,36 @@ packages: engines: {node: '>= 10.*'} dev: true - /@next/env@13.5.4: - resolution: {integrity: sha512-LGegJkMvRNw90WWphGJ3RMHMVplYcOfRWf2Be3td3sUa+1AaxmsYyANsA+znrGCBjXJNi4XAQlSoEfUxs/4kIQ==} + /@next/env@13.2.3: + resolution: {integrity: sha512-FN50r/E+b8wuqyRjmGaqvqNDuWBWYWQiigfZ50KnSFH0f+AMQQyaZl+Zm2+CIpKk0fL9QxhLxOpTVA3xFHgFow==} dev: false - /@next/eslint-plugin-next@13.5.4: - resolution: {integrity: sha512-vI94U+D7RNgX6XypSyjeFrOzxGlZyxOplU0dVE5norIfZGn/LDjJYPHdvdsR5vN1eRtl6PDAsOHmycFEOljK5A==} + /@next/eslint-plugin-next@13.2.3: + resolution: {integrity: sha512-QmMPItnU7VeojI1KnuwL9SLFWEwmaNHNlnOGpoTwdLoSiP9sc8KYiAHWEc4/44L+cAdCxcZYvn7frcRNP5l84Q==} dependencies: glob: 7.1.7 - dev: true + dev: false - /@next/mdx@13.4.10(@mdx-js/loader@3.0.0)(@mdx-js/react@3.0.0): - resolution: {integrity: sha512-0ZbUIr3yuFFfkaYth2kNFAT0fbyylJTMqZy5zTdb7YGqvYjKFD8n75L3UYAX0g5mibGp3iETJ0I7730sW13PKQ==} - peerDependencies: - '@mdx-js/loader': '>=0.15.0' - '@mdx-js/react': '>=0.15.0' - peerDependenciesMeta: - '@mdx-js/loader': - optional: true - '@mdx-js/react': - optional: true - dependencies: - '@mdx-js/loader': 3.0.0(webpack@5.89.0) - '@mdx-js/react': 3.0.0(@types/react@18.0.28)(react@18.2.0) - source-map: 0.7.4 + /@next/swc-android-arm-eabi@13.2.3: + resolution: {integrity: sha512-mykdVaAXX/gm+eFO2kPeVjnOCKwanJ9mV2U0lsUGLrEdMUifPUjiXKc6qFAIs08PvmTMOLMNnUxqhGsJlWGKSw==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + requiresBuild: true dev: false + optional: true + + /@next/swc-android-arm64@13.2.3: + resolution: {integrity: sha512-8XwHPpA12gdIFtope+n9xCtJZM3U4gH4vVTpUwJ2w1kfxFmCpwQ4xmeGSkR67uOg80yRMuF0h9V1ueo05sws5w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true - /@next/swc-darwin-arm64@13.5.4: - resolution: {integrity: sha512-Df8SHuXgF1p+aonBMcDPEsaahNo2TCwuie7VXED4FVyECvdXfRT9unapm54NssV9tF3OQFKBFOdlje4T43VO0w==} + /@next/swc-darwin-arm64@13.2.3: + resolution: {integrity: sha512-TXOubiFdLpMfMtaRu1K5d1I9ipKbW5iS2BNbu8zJhoqrhk3Kp7aRKTxqFfWrbliAHhWVE/3fQZUYZOWSXVQi1w==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -3582,8 +3370,8 @@ packages: dev: false optional: true - /@next/swc-darwin-x64@13.5.4: - resolution: {integrity: sha512-siPuUwO45PnNRMeZnSa8n/Lye5ZX93IJom9wQRB5DEOdFrw0JjOMu1GINB8jAEdwa7Vdyn1oJ2xGNaQpdQQ9Pw==} + /@next/swc-darwin-x64@13.2.3: + resolution: {integrity: sha512-GZctkN6bJbpjlFiS5pylgB2pifHvgkqLAPumJzxnxkf7kqNm6rOGuNjsROvOWVWXmKhrzQkREO/WPS2aWsr/yw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -3591,8 +3379,26 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-gnu@13.5.4: - resolution: {integrity: sha512-l/k/fvRP/zmB2jkFMfefmFkyZbDkYW0mRM/LB+tH5u9pB98WsHXC0WvDHlGCYp3CH/jlkJPL7gN8nkTQVrQ/2w==} + /@next/swc-freebsd-x64@13.2.3: + resolution: {integrity: sha512-rK6GpmMt/mU6MPuav0/M7hJ/3t8HbKPCELw/Uqhi4732xoq2hJ2zbo2FkYs56y6w0KiXrIp4IOwNB9K8L/q62g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm-gnueabihf@13.2.3: + resolution: {integrity: sha512-yeiCp/Odt1UJ4KUE89XkeaaboIDiVFqKP4esvoLKGJ0fcqJXMofj4ad3tuQxAMs3F+qqrz9MclqhAHkex1aPZA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-gnu@13.2.3: + resolution: {integrity: sha512-/miIopDOUsuNlvjBjTipvoyjjaxgkOuvlz+cIbbPcm1eFvzX2ltSfgMgty15GuOiR8Hub4FeTSiq3g2dmCkzGA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -3600,8 +3406,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-musl@13.5.4: - resolution: {integrity: sha512-YYGb7SlLkI+XqfQa8VPErljb7k9nUnhhRrVaOdfJNCaQnHBcvbT7cx/UjDQLdleJcfyg1Hkn5YSSIeVfjgmkTg==} + /@next/swc-linux-arm64-musl@13.2.3: + resolution: {integrity: sha512-sujxFDhMMDjqhruup8LLGV/y+nCPi6nm5DlFoThMJFvaaKr/imhkXuk8uCTq4YJDbtRxnjydFv2y8laBSJVC2g==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -3609,8 +3415,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-gnu@13.5.4: - resolution: {integrity: sha512-uE61vyUSClnCH18YHjA8tE1prr/PBFlBFhxBZis4XBRJoR+txAky5d7gGNUIbQ8sZZ7LVkSVgm/5Fc7mwXmRAg==} + /@next/swc-linux-x64-gnu@13.2.3: + resolution: {integrity: sha512-w5MyxPknVvC9LVnMenAYMXMx4KxPwXuJRMQFvY71uXg68n7cvcas85U5zkdrbmuZ+JvsO5SIG8k36/6X3nUhmQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -3618,8 +3424,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-musl@13.5.4: - resolution: {integrity: sha512-qVEKFYML/GvJSy9CfYqAdUexA6M5AklYcQCW+8JECmkQHGoPxCf04iMh7CPR7wkHyWWK+XLt4Ja7hhsPJtSnhg==} + /@next/swc-linux-x64-musl@13.2.3: + resolution: {integrity: sha512-CTeelh8OzSOVqpzMFMFnVRJIFAFQoTsI9RmVJWW/92S4xfECGcOzgsX37CZ8K982WHRzKU7exeh7vYdG/Eh4CA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -3627,8 +3433,8 @@ packages: dev: false optional: true - /@next/swc-win32-arm64-msvc@13.5.4: - resolution: {integrity: sha512-mDSQfqxAlfpeZOLPxLymZkX0hYF3juN57W6vFHTvwKlnHfmh12Pt7hPIRLYIShk8uYRsKPtMTth/EzpwRI+u8w==} + /@next/swc-win32-arm64-msvc@13.2.3: + resolution: {integrity: sha512-7N1KBQP5mo4xf52cFCHgMjzbc9jizIlkTepe9tMa2WFvEIlKDfdt38QYcr9mbtny17yuaIw02FXOVEytGzqdOQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -3636,8 +3442,8 @@ packages: dev: false optional: true - /@next/swc-win32-ia32-msvc@13.5.4: - resolution: {integrity: sha512-aoqAT2XIekIWoriwzOmGFAvTtVY5O7JjV21giozBTP5c6uZhpvTWRbmHXbmsjZqY4HnEZQRXWkSAppsIBweKqw==} + /@next/swc-win32-ia32-msvc@13.2.3: + resolution: {integrity: sha512-LzWD5pTSipUXTEMRjtxES/NBYktuZdo7xExJqGDMnZU8WOI+v9mQzsmQgZS/q02eIv78JOCSemqVVKZBGCgUvA==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -3645,8 +3451,8 @@ packages: dev: false optional: true - /@next/swc-win32-x64-msvc@13.5.4: - resolution: {integrity: sha512-cyRvlAxwlddlqeB9xtPSfNSCRy8BOa4wtMo0IuI9P7Y0XT2qpDrpFKRyZ7kUngZis59mPVla5k8X1oOJ8RxDYg==} + /@next/swc-win32-x64-msvc@13.2.3: + resolution: {integrity: sha512-aLG2MaFs4y7IwaMTosz2r4mVbqRyCnMoFqOcmfTi7/mAS+G4IMH0vJp4oLdbshqiVoiVuKrAfqtXj55/m7Qu1Q==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -3670,7 +3476,7 @@ packages: engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.16.0 + fastq: 1.15.0 /@npmcli/arborist@4.3.1: resolution: {integrity: sha512-yMRgZVDpwWjplorzt9SFSaakWx6QIK248Nw4ZFgkrAy/GvJaFRaSZzE6nD7JBK5r8g/+PTxFq5Wj/sfciE7x+A==} @@ -3938,7 +3744,7 @@ packages: '@octokit/request-error': 2.1.0 '@octokit/types': 6.41.0 is-plain-object: 5.0.0 - node-fetch: 2.7.0 + node-fetch: 2.6.12 universal-user-agent: 6.0.0 transitivePeerDependencies: - encoding @@ -3973,8 +3779,7 @@ packages: open: 8.4.2 picocolors: 1.0.0 tiny-glob: 0.2.9 - tslib: 2.6.2 - dev: true + tslib: 2.6.1 /@pnpm/cli-meta@5.0.1: resolution: {integrity: sha512-s7rVArn3s78w2ZDWC2/NzMaYBzq39QBmo1BQ4+qq1liX+ltSErDyAx3M/wvvJQgc+Ur3dZJYuc9t96roPnW3XQ==} @@ -4181,7 +3986,7 @@ packages: '@pnpm/read-project-manifest': 5.0.1 '@pnpm/types': 9.1.0 '@pnpm/util.lex-comparator': 1.0.0 - fast-glob: 3.3.2 + fast-glob: 3.3.1 p-filter: 2.1.0 dev: true @@ -4452,13 +4257,13 @@ packages: write-yaml-file: 5.0.0 dev: true - /@polka/url@1.0.0-next.24: - resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} + /@polka/url@1.0.0-next.21: + resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} dev: false - /@rushstack/eslint-patch@1.5.1: - resolution: {integrity: sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==} - dev: true + /@rushstack/eslint-patch@1.2.0: + resolution: {integrity: sha512-sXo/qW2/pAcmT43VoRKOJbDOfV3cYpq3szSVfIThQXNt+E4DfKj361vaAt3c88U5tPUxzEswam7GW48PJqtKAg==} + dev: false /@sideway/address@4.1.4: resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} @@ -4493,11 +4298,6 @@ packages: /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - /@sindresorhus/is@4.6.0: - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} - dev: false - /@sindresorhus/is@5.6.0: resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} @@ -4519,13 +4319,11 @@ packages: resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} dependencies: type-detect: 4.0.8 - dev: true /@sinonjs/fake-timers@10.3.0: resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} dependencies: '@sinonjs/commons': 3.0.0 - dev: true /@sinonjs/fake-timers@7.1.2: resolution: {integrity: sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==} @@ -4545,14 +4343,6 @@ packages: resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} dev: true - /@slorber/remark-comment@1.0.0: - resolution: {integrity: sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==} - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - dev: false - /@slorber/static-site-generator-webpack-plugin@4.0.7: resolution: {integrity: sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==} engines: {node: '>=14'} @@ -4562,92 +4352,92 @@ packages: webpack-sources: 3.2.3 dev: false - /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.23.7): + /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.22.10): resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.22.10 - /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.23.7): - resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} - engines: {node: '>=14'} + /@svgr/babel-plugin-remove-jsx-attribute@6.5.0(@babel/core@7.22.10): + resolution: {integrity: sha512-8zYdkym7qNyfXpWvu4yq46k41pyNM9SOstoWhKlm+IfdCE1DdnRKeMUPsWIEO/DEkaWxJ8T9esNdG3QwQ93jBA==} + engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.22.10 - /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.23.7): - resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} - engines: {node: '>=14'} + /@svgr/babel-plugin-remove-jsx-empty-expression@6.5.0(@babel/core@7.22.10): + resolution: {integrity: sha512-NFdxMq3xA42Kb1UbzCVxplUc0iqSyM9X8kopImvFnB+uSDdzIHOdbs1op8ofAvVRtbg4oZiyRl3fTYeKcOe9Iw==} + engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.22.10 - /@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.23.7): + /@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.22.10): resolution: {integrity: sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.22.10 - /@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.23.7): + /@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.22.10): resolution: {integrity: sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.22.10 - /@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.23.7): + /@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.22.10): resolution: {integrity: sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.22.10 - /@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.23.7): + /@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.22.10): resolution: {integrity: sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.22.10 - /@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.23.7): + /@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.22.10): resolution: {integrity: sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==} engines: {node: '>=12'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.22.10 - /@svgr/babel-preset@6.5.1(@babel/core@7.23.7): + /@svgr/babel-preset@6.5.1(@babel/core@7.22.10): resolution: {integrity: sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==} engines: {node: '>=10'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.23.7) - '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.23.7) - '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.23.7) - '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.23.7) - '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.23.7) - '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.23.7) - '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.23.7) - '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.23.7) + '@babel/core': 7.22.10 + '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.22.10) + '@svgr/babel-plugin-remove-jsx-attribute': 6.5.0(@babel/core@7.22.10) + '@svgr/babel-plugin-remove-jsx-empty-expression': 6.5.0(@babel/core@7.22.10) + '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.22.10) + '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.22.10) + '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.22.10) + '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.22.10) + '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.22.10) /@svgr/core@6.5.1: resolution: {integrity: sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.23.7 - '@svgr/babel-preset': 6.5.1(@babel/core@7.23.7) + '@babel/core': 7.22.10 + '@svgr/babel-preset': 6.5.1(@babel/core@7.22.10) '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) camelcase: 6.3.0 cosmiconfig: 7.1.0 @@ -4658,7 +4448,7 @@ packages: resolution: {integrity: sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==} engines: {node: '>=10'} dependencies: - '@babel/types': 7.23.6 + '@babel/types': 7.22.10 entities: 4.5.0 /@svgr/plugin-jsx@6.5.1(@svgr/core@6.5.1): @@ -4667,8 +4457,8 @@ packages: peerDependencies: '@svgr/core': ^6.0.0 dependencies: - '@babel/core': 7.23.7 - '@svgr/babel-preset': 6.5.1(@babel/core@7.23.7) + '@babel/core': 7.22.10 + '@svgr/babel-preset': 6.5.1(@babel/core@7.22.10) '@svgr/core': 6.5.1 '@svgr/hast-util-to-babel-ast': 6.5.1 svg-parser: 2.0.4 @@ -4683,28 +4473,28 @@ packages: dependencies: '@svgr/core': 6.5.1 cosmiconfig: 7.1.0 - deepmerge: 4.3.1 + deepmerge: 4.3.0 svgo: 2.8.0 /@svgr/webpack@6.5.1: resolution: {integrity: sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.23.7 - '@babel/plugin-transform-react-constant-elements': 7.23.3(@babel/core@7.23.7) - '@babel/preset-env': 7.23.8(@babel/core@7.23.7) - '@babel/preset-react': 7.23.3(@babel/core@7.23.7) - '@babel/preset-typescript': 7.23.3(@babel/core@7.23.7) + '@babel/core': 7.22.10 + '@babel/plugin-transform-react-constant-elements': 7.20.2(@babel/core@7.22.10) + '@babel/preset-env': 7.20.2(@babel/core@7.22.10) + '@babel/preset-react': 7.18.6(@babel/core@7.22.10) + '@babel/preset-typescript': 7.21.0(@babel/core@7.22.10) '@svgr/core': 6.5.1 '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) '@svgr/plugin-svgo': 6.5.1(@svgr/core@6.5.1) transitivePeerDependencies: - supports-color - /@swc/helpers@0.5.2: - resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} + /@swc/helpers@0.4.14: + resolution: {integrity: sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==} dependencies: - tslib: 2.6.2 + tslib: 2.6.1 dev: false /@szmarczak/http-timer@5.0.1: @@ -4718,10 +4508,10 @@ packages: resolution: {integrity: sha512-fTOVsMY9QLFCCXRHG3Ese6cMH5qIWwSbgxZsgeF5TNsy81HKaZ4kgehnSF8FsR3OF+numlIV2YcU79MzbnhSig==} engines: {node: '>=14'} dependencies: - '@babel/code-frame': 7.23.5 - '@babel/runtime': 7.23.8 + '@babel/code-frame': 7.22.10 + '@babel/runtime': 7.21.0 '@types/aria-query': 5.0.1 - aria-query: 5.3.0 + aria-query: 5.1.3 chalk: 4.1.2 dom-accessibility-api: 0.5.16 lz-string: 1.5.0 @@ -4735,7 +4525,7 @@ packages: react: ^18.0.0 || 18 react-dom: ^18.0.0 || 18 dependencies: - '@babel/runtime': 7.23.8 + '@babel/runtime': 7.21.0 '@testing-library/dom': 9.0.1 '@types/react-dom': 18.0.11 react: 18.2.0 @@ -4754,25 +4544,21 @@ packages: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} - /@tsconfig/docusaurus@2.0.2: - resolution: {integrity: sha512-12HWfYmgUl4M2o76/TFufGtI68wl2k/b8qPrIrG7ci9YJLrpAtadpy897Bz5v29Mlkr7a1Hq4KHdQTKtU+2rhQ==} + /@tsconfig/docusaurus@2.0.0: + resolution: {integrity: sha512-X5wptT7pXA/46/IRFTW76oR5GNjoy9qjNM/1JGhFV4QAsmLh3YUpJJA+Vpx7Ds6eEBxSxz1QrgoNEBy6rLVs8w==} dev: true /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} - dev: true /@tsconfig/node12@1.0.11: resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - dev: true /@tsconfig/node14@1.0.3: resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - dev: true /@tsconfig/node16@1.0.3: resolution: {integrity: sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==} - dev: true /@tufjs/canonical-json@1.0.0: resolution: {integrity: sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==} @@ -4788,139 +4574,137 @@ packages: /@types/acorn@4.0.6: resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.1 + dev: false /@types/aria-query@5.0.1: resolution: {integrity: sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==} dev: true - /@types/babel__core@7.20.3: - resolution: {integrity: sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==} + /@types/babel__core@7.20.0: + resolution: {integrity: sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==} dependencies: - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 - '@types/babel__generator': 7.6.6 - '@types/babel__template': 7.4.3 - '@types/babel__traverse': 7.20.3 - dev: true + '@babel/parser': 7.22.10 + '@babel/types': 7.22.10 + '@types/babel__generator': 7.6.4 + '@types/babel__template': 7.4.1 + '@types/babel__traverse': 7.18.3 - /@types/babel__generator@7.6.6: - resolution: {integrity: sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==} + /@types/babel__generator@7.6.4: + resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: - '@babel/types': 7.23.6 - dev: true + '@babel/types': 7.22.10 - /@types/babel__template@7.4.3: - resolution: {integrity: sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==} + /@types/babel__template@7.4.1: + resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.23.6 - '@babel/types': 7.23.6 - dev: true + '@babel/parser': 7.22.10 + '@babel/types': 7.22.10 - /@types/babel__traverse@7.20.3: - resolution: {integrity: sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==} + /@types/babel__traverse@7.18.3: + resolution: {integrity: sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==} dependencies: - '@babel/types': 7.23.6 - dev: true + '@babel/types': 7.22.10 - /@types/body-parser@1.19.5: - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + /@types/body-parser@1.19.2: + resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: - '@types/connect': 3.4.38 - '@types/node': 18.18.9 + '@types/connect': 3.4.35 + '@types/node': 16.18.40 - /@types/bonjour@3.5.13: - resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + /@types/bonjour@3.5.10: + resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} dependencies: - '@types/node': 18.18.9 + '@types/node': 16.18.40 /@types/chai@4.3.4: resolution: {integrity: sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==} dev: true - /@types/connect-history-api-fallback@1.5.4: - resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + /@types/connect-history-api-fallback@1.3.5: + resolution: {integrity: sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==} dependencies: - '@types/express-serve-static-core': 4.17.41 - '@types/node': 18.18.9 + '@types/express-serve-static-core': 4.17.33 + '@types/node': 16.18.40 - /@types/connect@3.4.38: - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + /@types/connect@3.4.35: + resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 18.18.9 + '@types/node': 16.18.40 - /@types/debug@4.1.12: - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + /@types/debug@4.1.8: + resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} dependencies: - '@types/ms': 0.7.34 + '@types/ms': 0.7.31 + dev: false - /@types/eslint-scope@3.7.7: - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + /@types/eslint-scope@3.7.4: + resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} dependencies: - '@types/eslint': 8.56.2 - '@types/estree': 1.0.5 + '@types/eslint': 8.44.2 + '@types/estree': 1.0.1 - /@types/eslint@8.56.2: - resolution: {integrity: sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==} + /@types/eslint@8.44.2: + resolution: {integrity: sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg==} dependencies: - '@types/estree': 1.0.5 - '@types/json-schema': 7.0.15 + '@types/estree': 1.0.1 + '@types/json-schema': 7.0.12 - /@types/estree-jsx@1.0.3: - resolution: {integrity: sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==} + /@types/estree-jsx@1.0.0: + resolution: {integrity: sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.1 + dev: false - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + /@types/estree@1.0.1: + resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} /@types/expect@1.20.4: resolution: {integrity: sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==} - /@types/express-serve-static-core@4.17.41: - resolution: {integrity: sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==} + /@types/express-serve-static-core@4.17.33: + resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} dependencies: - '@types/node': 18.18.9 - '@types/qs': 6.9.11 - '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 + '@types/node': 16.18.40 + '@types/qs': 6.9.7 + '@types/range-parser': 1.2.4 - /@types/express@4.17.21: - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + /@types/express@4.17.17: + resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} dependencies: - '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.17.41 - '@types/qs': 6.9.11 - '@types/serve-static': 1.15.5 + '@types/body-parser': 1.19.2 + '@types/express-serve-static-core': 4.17.33 + '@types/qs': 6.9.7 + '@types/serve-static': 1.15.1 /@types/fs-extra@11.0.1: resolution: {integrity: sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==} dependencies: '@types/jsonfile': 6.1.1 - '@types/node': 18.18.9 + '@types/node': 16.18.40 dev: true /@types/glob@7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 18.18.9 + '@types/node': 16.18.40 dev: true - /@types/graceful-fs@4.1.8: - resolution: {integrity: sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw==} + /@types/graceful-fs@4.1.6: + resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: - '@types/node': 18.18.9 - dev: true + '@types/node': 16.18.40 /@types/gtag.js@0.0.12: resolution: {integrity: sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==} dev: false - /@types/hast@3.0.3: - resolution: {integrity: sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==} + /@types/hast@2.3.4: + resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 2.0.6 + dev: false /@types/history@4.7.11: resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} @@ -4928,36 +4712,33 @@ packages: /@types/html-minifier-terser@6.1.0: resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} - /@types/http-cache-semantics@4.0.4: - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + /@types/http-cache-semantics@4.0.1: + resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} dev: false - /@types/http-errors@2.0.4: - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} - - /@types/http-proxy@1.17.14: - resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==} + /@types/http-proxy@1.17.10: + resolution: {integrity: sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g==} dependencies: - '@types/node': 18.18.9 + '@types/node': 16.18.40 - /@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + /@types/istanbul-lib-coverage@2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - /@types/istanbul-lib-report@3.0.3: - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + /@types/istanbul-lib-report@3.0.0: + resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} dependencies: - '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-lib-coverage': 2.0.4 - /@types/istanbul-reports@3.0.4: - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + /@types/istanbul-reports@3.0.1: + resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} dependencies: - '@types/istanbul-lib-report': 3.0.3 + '@types/istanbul-lib-report': 3.0.0 /@types/jest@29.4.0: resolution: {integrity: sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ==} dependencies: - expect: 29.7.0 - pretty-format: 29.7.0 + expect: 29.5.0 + pretty-format: 29.6.2 dev: true /@types/js-cookie@2.2.7: @@ -4971,22 +4752,21 @@ packages: /@types/jsdom@20.0.1: resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} dependencies: - '@types/node': 18.18.9 + '@types/node': 16.18.40 '@types/tough-cookie': 4.0.2 parse5: 7.1.2 dev: true - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + /@types/json-schema@7.0.12: + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: true /@types/jsonfile@6.1.1: resolution: {integrity: sha512-GSgiRCVeapDN+3pqA35IkQwasaCh/0YFH5dEF6S88iDvEn901DjOeH3/QPY+XYP1DFzDZPvIvfeEgk+7br5png==} dependencies: - '@types/node': 18.18.9 + '@types/node': 16.18.40 dev: true /@types/lodash@4.14.181: @@ -4996,28 +4776,15 @@ packages: /@types/mdast@3.0.10: resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 2.0.6 dev: false - /@types/mdast@4.0.3: - resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} - dependencies: - '@types/unist': 3.0.2 - - /@types/mdx-js__react@1.5.5: - resolution: {integrity: sha512-k8pnaP6JXVlQh18HgL5X6sYFNC/qZnzO7R2+HsmwrwUd+JnnsU0d9lyyT0RQrHg1anxDU36S98TI/fsGtmYqqg==} - dependencies: - '@types/react': 18.0.28 - dev: true - /@types/mdx@2.0.5: resolution: {integrity: sha512-76CqzuD6Q7LC+AtbPqrvD9AqsN0k8bsYo2bM2J8pmNldP1aIPAbzUQ7QbobyXL4eLr1wK5x8FZFe8eF/ubRuBg==} + dev: false - /@types/mime@1.3.5: - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - - /@types/mime@3.0.4: - resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} + /@types/mime@3.0.1: + resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} /@types/minimatch@3.0.5: resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} @@ -5030,35 +4797,27 @@ packages: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true - /@types/mocha@10.0.3: - resolution: {integrity: sha512-RsOPImTriV/OE4A9qKjMtk2MnXiuLLbcO3nCXK+kvq4nr0iMfFgpjaX3MPLb6f7+EL1FGSelYvuJMV6REH+ZPQ==} - dev: true - - /@types/ms@0.7.34: - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - - /@types/nearley@2.11.5(patch_hash=5bomp3nnmdzdyzcgrxyr5kymae): - resolution: {integrity: sha512-dM7TrN0bVxGGXTYGx4YhGear8ysLO5SOuouAWM9oltjQ3m9oYa13qi8Z1DJp5zxVMPukvQdsrnZmgzpeuTSEQA==} + /@types/mocha@8.2.3: + resolution: {integrity: sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==} dev: true - patched: true - /@types/node-forge@1.3.11: - resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} - dependencies: - '@types/node': 18.18.9 + /@types/ms@0.7.31: + resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==} + dev: false /@types/node@15.14.9: resolution: {integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==} + /@types/node@16.18.13: + resolution: {integrity: sha512-l0/3XZ153UTlNOnZK8xSNoJlQda9/WnYgiTdcKKPJSZjdjI9MU+A9oMXOesAWLSnqAaaJhj3qfQsU07Dr8OUwg==} + + /@types/node@16.18.40: + resolution: {integrity: sha512-+yno3ItTEwGxXiS/75Q/aHaa5srkpnJaH+kdkTVJ3DtJEwv92itpKbxU+FjPoh2m/5G9zmUQfrL4A4C13c+iGA==} + /@types/node@17.0.45: resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} dev: false - /@types/node@18.18.9: - resolution: {integrity: sha512-0f5klcuImLnG4Qreu9hPj/rEfFq6YRc5n2mAjSsH+ec/mJL+3voBH0+8T7o8RpFjH7ovc+TRsL/c7OYIQsPTfQ==} - dependencies: - undici-types: 5.26.5 - /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -5066,21 +4825,24 @@ packages: resolution: {integrity: sha512-Nd8y/5t/7CRakPYiyPzr/IAfYusy1FkcZYFEAcoMZkwpJv2n4Wm+olW+e7xBdHEXhOnWdG9ddbar0gqZWS4x5Q==} dev: false - /@types/parse-json@4.0.2: - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + /@types/parse-json@4.0.0: + resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} - /@types/prismjs@1.26.3: - resolution: {integrity: sha512-A0D0aTXvjlqJ5ZILMz3rNfDBOx9hHxLZYv2by47Sm/pqW35zzjusrZTryatjN/Rf8Us2gZrJD+KeHbUSTux1Cw==} + /@types/parse5@6.0.3: + resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} dev: false - /@types/prop-types@15.7.11: - resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} + /@types/prettier@2.7.2: + resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==} + + /@types/prop-types@15.7.5: + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} - /@types/qs@6.9.11: - resolution: {integrity: sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==} + /@types/qs@6.9.7: + resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} - /@types/range-parser@1.2.7: - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + /@types/range-parser@1.2.4: + resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} /@types/react-dom@18.0.11: resolution: {integrity: sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==} @@ -5094,8 +4856,8 @@ packages: '@types/react': 18.0.28 dev: true - /@types/react-router-config@5.0.11: - resolution: {integrity: sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==} + /@types/react-router-config@5.0.6: + resolution: {integrity: sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg==} dependencies: '@types/history': 4.7.11 '@types/react': 18.0.28 @@ -5117,47 +4879,40 @@ packages: /@types/react@18.0.28: resolution: {integrity: sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==} dependencies: - '@types/prop-types': 15.7.11 - '@types/scheduler': 0.16.8 - csstype: 3.1.3 + '@types/prop-types': 15.7.5 + '@types/scheduler': 0.16.2 + csstype: 3.1.1 /@types/retry@0.12.0: resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - /@types/sax@1.2.7: - resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + /@types/sax@1.2.4: + resolution: {integrity: sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==} dependencies: - '@types/node': 18.18.9 + '@types/node': 16.18.40 dev: false /@types/sbd@1.0.3: resolution: {integrity: sha512-4rOX5JsLAEFrzOB0zvV2fG0lqwyNoo/TTYuQna/rjKi+ZHsN7s3BLfx70gsqGD6DM0j6Ha0QfneU/KspzMMeUg==} dev: true - /@types/scheduler@0.16.8: - resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + /@types/scheduler@0.16.2: + resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} - /@types/semver@7.5.5: - resolution: {integrity: sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==} + /@types/semver@7.3.13: + resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} dev: true - /@types/send@0.17.4: - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} - dependencies: - '@types/mime': 1.3.5 - '@types/node': 18.18.9 - - /@types/serve-index@1.9.4: - resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} + /@types/serve-index@1.9.1: + resolution: {integrity: sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==} dependencies: - '@types/express': 4.17.21 + '@types/express': 4.17.17 - /@types/serve-static@1.15.5: - resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + /@types/serve-static@1.15.1: + resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} dependencies: - '@types/http-errors': 2.0.4 - '@types/mime': 3.0.4 - '@types/node': 18.18.9 + '@types/mime': 3.0.1 + '@types/node': 16.18.40 /@types/sinon@10.0.13: resolution: {integrity: sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ==} @@ -5169,34 +4924,31 @@ packages: resolution: {integrity: sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==} dev: true - /@types/sockjs@0.3.36: - resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} + /@types/sockjs@0.3.33: + resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} dependencies: - '@types/node': 18.18.9 + '@types/node': 16.18.40 /@types/ssri@7.1.1: resolution: {integrity: sha512-DPP/jkDaqGiyU75MyMURxLWyYLwKSjnAuGe9ZCsLp9QZOpXmDfuevk769F0BS86TmRuD5krnp06qw9nSoNO+0g==} dependencies: - '@types/node': 18.18.9 + '@types/node': 16.18.40 dev: true - /@types/stack-utils@2.0.2: - resolution: {integrity: sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw==} - dev: true + /@types/stack-utils@2.0.1: + resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} /@types/tinycolor2@1.4.3: resolution: {integrity: sha512-Kf1w9NE5HEgGxCRyIcRXR/ZYtDv0V8FVPtYHwLxl0O+maGX0erE77pQlD0gpP+/KByMZ87mOA79SjifhSB3PjQ==} - dev: true + dev: false /@types/tough-cookie@4.0.2: resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==} dev: true - /@types/unist@2.0.10: - resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} - - /@types/unist@3.0.2: - resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + /@types/unist@2.0.6: + resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} + dev: false /@types/uuid@8.3.4: resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} @@ -5206,18 +4958,18 @@ packages: resolution: {integrity: sha512-4UqPv+2567NhMQuMLdKAyK4yzrfCqwaTt6bLhHEs8PFcxbHILsrxaY63n4wgE/BRLDWDQeI+WcTmkXKExh9hQg==} dependencies: '@types/expect': 1.20.4 - '@types/node': 18.18.9 + '@types/node': 16.18.40 - /@types/vscode@1.66.0: - resolution: {integrity: sha512-ZfJck4M7nrGasfs4A4YbUoxis3Vu24cETw3DERsNYtDZmYSYtk6ljKexKFKhImO/ZmY6ZMsmegu2FPkXoUFImA==} + /@types/vscode@1.61.0: + resolution: {integrity: sha512-9k5Nwq45hkRwdfCFY+eKXeQQSbPoA114mF7U/4uJXRBJeGIO7MuJdhF1PnaDN+lllL9iKGQtd6FFXShBXMNaFg==} dev: true - /@types/webpack@5.28.0(esbuild@0.17.11)(webpack-cli@5.1.4): + /@types/webpack@5.28.0(webpack-cli@5.1.4): resolution: {integrity: sha512-8cP0CzcxUiFuA9xGJkfeVpqmWTk9nx6CWwamRGCj95ph1SmlRRk9KlCZ6avhCbZd4L68LvYT6l1kpdEnQXrF8w==} dependencies: - '@types/node': 18.18.9 + '@types/node': 16.18.40 tapable: 2.2.1 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -5225,161 +4977,152 @@ packages: - webpack-cli dev: true - /@types/ws@8.5.10: - resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + /@types/ws@8.5.4: + resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} dependencies: - '@types/node': 18.18.9 + '@types/node': 16.18.40 - /@types/yargs-parser@21.0.3: - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + /@types/yargs-parser@21.0.0: + resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} - /@types/yargs@17.0.32: - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + /@types/yargs@17.0.24: + resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} dependencies: - '@types/yargs-parser': 21.0.3 + '@types/yargs-parser': 21.0.0 - /@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2): - resolution: {integrity: sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/eslint-plugin@5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.38.0)(typescript@5.1.6): + resolution: {integrity: sha512-vxHvLhH0qgBd3/tW6/VccptSfc8FxPQIkmNTVLWcCOVqSBvqpnKkBTYrhcGlXfSnd78azwe+PsjYFj0X34/njA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.2.2) - '@typescript-eslint/scope-manager': 6.10.0 - '@typescript-eslint/type-utils': 6.10.0(eslint@8.53.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.10.0 + '@eslint-community/regexpp': 4.5.0 + '@typescript-eslint/parser': 5.58.0(eslint@8.38.0)(typescript@5.1.6) + '@typescript-eslint/scope-manager': 5.58.0 + '@typescript-eslint/type-utils': 5.58.0(eslint@8.38.0)(typescript@5.1.6) + '@typescript-eslint/utils': 5.58.0(eslint@8.38.0)(typescript@5.1.6) debug: 4.3.4(supports-color@8.1.1) - eslint: 8.53.0 - graphemer: 1.4.0 - ignore: 5.3.0 - natural-compare: 1.4.0 + eslint: 8.38.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 + tsutils: 3.21.0(typescript@5.1.6) + typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.2.2): - resolution: {integrity: sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/parser@5.58.0(eslint@8.38.0)(typescript@5.1.6): + resolution: {integrity: sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.10.0 - '@typescript-eslint/types': 6.10.0 - '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 6.10.0 + '@typescript-eslint/scope-manager': 5.58.0 + '@typescript-eslint/types': 5.58.0 + '@typescript-eslint/typescript-estree': 5.58.0(typescript@5.1.6) debug: 4.3.4(supports-color@8.1.1) - eslint: 8.53.0 - typescript: 5.2.2 + eslint: 8.38.0 + typescript: 5.1.6 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/scope-manager@6.10.0: - resolution: {integrity: sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/scope-manager@5.58.0: + resolution: {integrity: sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 6.10.0 - '@typescript-eslint/visitor-keys': 6.10.0 - dev: true + '@typescript-eslint/types': 5.58.0 + '@typescript-eslint/visitor-keys': 5.58.0 - /@typescript-eslint/type-utils@6.10.0(eslint@8.53.0)(typescript@5.2.2): - resolution: {integrity: sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/type-utils@5.58.0(eslint@8.38.0)(typescript@5.1.6): + resolution: {integrity: sha512-FF5vP/SKAFJ+LmR9PENql7fQVVgGDOS+dq3j+cKl9iW/9VuZC/8CFmzIP0DLKXfWKpRHawJiG70rVH+xZZbp8w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: '*' typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.2.2) - '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 5.58.0(typescript@5.1.6) + '@typescript-eslint/utils': 5.58.0(eslint@8.38.0)(typescript@5.1.6) debug: 4.3.4(supports-color@8.1.1) - eslint: 8.53.0 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 + eslint: 8.38.0 + tsutils: 3.21.0(typescript@5.1.6) + typescript: 5.1.6 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types@6.10.0: - resolution: {integrity: sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: true + /@typescript-eslint/types@5.58.0: + resolution: {integrity: sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /@typescript-eslint/typescript-estree@6.10.0(typescript@5.2.2): - resolution: {integrity: sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/typescript-estree@5.58.0(typescript@5.1.6): + resolution: {integrity: sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.10.0 - '@typescript-eslint/visitor-keys': 6.10.0 + '@typescript-eslint/types': 5.58.0 + '@typescript-eslint/visitor-keys': 5.58.0 debug: 4.3.4(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 + tsutils: 3.21.0(typescript@5.1.6) + typescript: 5.1.6 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/utils@6.10.0(eslint@8.53.0)(typescript@5.2.2): - resolution: {integrity: sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/utils@5.58.0(eslint@8.38.0)(typescript@5.1.6): + resolution: {integrity: sha512-gAmLOTFXMXOC+zP1fsqm3VceKSBQJNzV385Ok3+yzlavNHZoedajjS4UyS21gabJYcobuigQPs/z71A9MdJFqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.5 - '@typescript-eslint/scope-manager': 6.10.0 - '@typescript-eslint/types': 6.10.0 - '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.2.2) - eslint: 8.53.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.38.0) + '@types/json-schema': 7.0.12 + '@types/semver': 7.3.13 + '@typescript-eslint/scope-manager': 5.58.0 + '@typescript-eslint/types': 5.58.0 + '@typescript-eslint/typescript-estree': 5.58.0(typescript@5.1.6) + eslint: 8.38.0 + eslint-scope: 5.1.1 semver: 7.5.4 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys@6.10.0: - resolution: {integrity: sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/visitor-keys@5.58.0: + resolution: {integrity: sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 6.10.0 - eslint-visitor-keys: 3.4.3 - dev: true - - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@typescript-eslint/types': 5.58.0 + eslint-visitor-keys: 3.4.0 - /@vscode/test-electron@2.3.8: - resolution: {integrity: sha512-b4aZZsBKtMGdDljAsOPObnAi7+VWIaYl3ylCz1jTs+oV6BZ4TNHcVNC3xUn0azPeszBmwSBDQYfFESIaUQnrOg==} + /@vscode/test-electron@2.2.3: + resolution: {integrity: sha512-7DmdGYQTqRNaLHKG3j56buc9DkstriY4aV0S3Zj32u0U9/T0L8vwWAC9QGCh1meu1VXDEla1ze27TkqysHGP0Q==} engines: {node: '>=16'} dependencies: http-proxy-agent: 4.0.1 https-proxy-agent: 5.0.1 - jszip: 3.10.1 - semver: 7.5.4 + rimraf: 3.0.2 + unzipper: 0.10.11 transitivePeerDependencies: - supports-color dev: true @@ -5475,17 +5218,17 @@ packages: '@webassemblyjs/ast': 1.11.6 '@xtuc/long': 4.2.2 - /@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.89.0): + /@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.88.2): resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} engines: {node: '>=14.15.0'} peerDependencies: webpack: 5.x.x webpack-cli: 5.x.x dependencies: - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) - webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@4.11.1)(webpack@5.89.0) + webpack: 5.88.2(webpack-cli@5.1.4) + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@4.11.1)(webpack@5.88.2) - /@webpack-cli/generators@3.0.7(prettier@3.0.3)(webpack-cli@5.1.4)(webpack@5.89.0): + /@webpack-cli/generators@3.0.7(prettier@3.0.0)(webpack-cli@5.1.4)(webpack@5.88.2): resolution: {integrity: sha512-H4dlEX8CzO5EHBYYZQop9x4w6lG9FenSF/1spLRlvRAULDgTs0VfmwOuwp03tTLml9jpMsouuVw6vEN8KpwE/w==} engines: {node: '>=14.15.0'} peerDependencies: @@ -5496,9 +5239,9 @@ packages: prettier: optional: true dependencies: - prettier: 3.0.3 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) - webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@4.11.1)(webpack@5.89.0) + prettier: 3.0.0 + webpack: 5.88.2(webpack-cli@5.1.4) + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@4.11.1)(webpack@5.88.2) yeoman-environment: 3.19.3 yeoman-generator: 5.9.0(yeoman-environment@3.19.3) transitivePeerDependencies: @@ -5507,17 +5250,17 @@ packages: - mem-fs - supports-color - /@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.89.0): + /@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.88.2): resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} engines: {node: '>=14.15.0'} peerDependencies: webpack: 5.x.x webpack-cli: 5.x.x dependencies: - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) - webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@4.11.1)(webpack@5.89.0) + webpack: 5.88.2(webpack-cli@5.1.4) + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@4.11.1)(webpack@5.88.2) - /@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack-dev-server@4.11.1)(webpack@5.89.0): + /@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack-dev-server@4.11.1)(webpack@5.88.2): resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} engines: {node: '>=14.15.0'} peerDependencies: @@ -5528,9 +5271,9 @@ packages: webpack-dev-server: optional: true dependencies: - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) - webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@4.11.1)(webpack@5.89.0) - webpack-dev-server: 4.11.1(webpack-cli@5.1.4)(webpack@5.89.0) + webpack: 5.88.2(webpack-cli@5.1.4) + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@4.11.1)(webpack@5.88.2) + webpack-dev-server: 4.11.1(webpack-cli@5.1.4)(webpack@5.88.2) /@xobotyi/scrollbar-width@1.9.5: resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} @@ -5565,7 +5308,6 @@ packages: /abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - deprecated: Use your platform's native atob() and btoa() methods instead dev: true /abbrev@1.1.1: @@ -5587,30 +5329,49 @@ packages: /acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} dependencies: - acorn: 8.11.3 - acorn-walk: 8.3.2 + acorn: 8.10.0 + acorn-walk: 8.2.0 dev: true - /acorn-import-assertions@1.9.0(acorn@8.11.3): + /acorn-import-assertions@1.9.0(acorn@8.10.0): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} peerDependencies: acorn: ^8 dependencies: - acorn: 8.11.3 + acorn: 8.10.0 - /acorn-jsx@5.3.2(acorn@8.11.3): + /acorn-jsx@5.3.2(acorn@8.10.0): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.11.3 + acorn: 8.10.0 + + /acorn-node@1.8.2: + resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + xtend: 4.0.2 + dev: true + + /acorn-walk@7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} - /acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + /acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} engines: {node: '>=0.4.0'} + hasBin: true + dev: true - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} engines: {node: '>=0.4.0'} hasBin: true @@ -5681,32 +5442,32 @@ packages: require-from-string: 2.0.2 uri-js: 4.4.1 - /algoliasearch-helper@3.16.1(algoliasearch@4.22.1): - resolution: {integrity: sha512-qxAHVjjmT7USVvrM8q6gZGaJlCK1fl4APfdAA7o8O6iXEc68G0xMNrzRkxoB/HmhhvyHnoteS/iMTiHiTcQQcg==} + /algoliasearch-helper@3.12.0(algoliasearch@4.15.0): + resolution: {integrity: sha512-/j1U3PEwdan0n6P/QqSnSpNSLC5+cEMvyljd5CnmNmUjDlGrys+vFEOwjVEnqELIiAGMHEA/Nl3CiKVFBUYqyQ==} peerDependencies: algoliasearch: '>= 3.1 < 6' dependencies: '@algolia/events': 4.0.1 - algoliasearch: 4.22.1 + algoliasearch: 4.15.0 dev: false - /algoliasearch@4.22.1: - resolution: {integrity: sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==} + /algoliasearch@4.15.0: + resolution: {integrity: sha512-+vgKQF5944dYsz9zhKk07JbOYeNdKisoD5GeG0woBL3nLzbn2a+nGwki60DXg7CXvaFXBcTXyJG4C+VaBVd44g==} dependencies: - '@algolia/cache-browser-local-storage': 4.22.1 - '@algolia/cache-common': 4.22.1 - '@algolia/cache-in-memory': 4.22.1 - '@algolia/client-account': 4.22.1 - '@algolia/client-analytics': 4.22.1 - '@algolia/client-common': 4.22.1 - '@algolia/client-personalization': 4.22.1 - '@algolia/client-search': 4.22.1 - '@algolia/logger-common': 4.22.1 - '@algolia/logger-console': 4.22.1 - '@algolia/requester-browser-xhr': 4.22.1 - '@algolia/requester-common': 4.22.1 - '@algolia/requester-node-http': 4.22.1 - '@algolia/transporter': 4.22.1 + '@algolia/cache-browser-local-storage': 4.15.0 + '@algolia/cache-common': 4.15.0 + '@algolia/cache-in-memory': 4.15.0 + '@algolia/client-account': 4.15.0 + '@algolia/client-analytics': 4.15.0 + '@algolia/client-common': 4.15.0 + '@algolia/client-personalization': 4.15.0 + '@algolia/client-search': 4.15.0 + '@algolia/logger-common': 4.15.0 + '@algolia/logger-console': 4.15.0 + '@algolia/requester-browser-xhr': 4.15.0 + '@algolia/requester-common': 4.15.0 + '@algolia/requester-node-http': 4.15.0 + '@algolia/transporter': 4.15.0 dev: false /ansi-align@3.0.1: @@ -5770,16 +5531,11 @@ packages: /ansi-styles@5.2.0: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - dev: true /ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: true - /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -5810,7 +5566,6 @@ packages: /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - dev: true /arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} @@ -5823,18 +5578,16 @@ packages: /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - /aria-query@5.3.0: - resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + /aria-query@5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} dependencies: - dequal: 2.0.3 - dev: true + deep-equal: 2.2.0 /array-buffer-byte-length@1.0.0: resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.2 is-array-buffer: 3.0.2 - dev: true /array-differ@3.0.0: resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} @@ -5843,74 +5596,50 @@ packages: /array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - /array-includes@3.1.7: - resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + /array-flatten@2.1.2: + resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} + + /array-includes@3.1.6: + resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.2 - get-intrinsic: 1.2.2 + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + get-intrinsic: 1.2.0 is-string: 1.0.7 - dev: true /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - /array.prototype.findlastindex@1.2.3: - resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.2 - es-shim-unscopables: 1.0.0 - get-intrinsic: 1.2.2 - dev: true - - /array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + /array.prototype.flat@1.3.1: + resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.2 + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 es-shim-unscopables: 1.0.0 - dev: true - /array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + /array.prototype.flatmap@1.3.1: + resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.2 + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 es-shim-unscopables: 1.0.0 - dev: true - /array.prototype.tosorted@1.1.2: - resolution: {integrity: sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==} + /array.prototype.tosorted@1.1.1: + resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==} dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.2 + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 es-shim-unscopables: 1.0.0 - get-intrinsic: 1.2.2 - dev: true - - /arraybuffer.prototype.slice@1.0.2: - resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} - engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.2 - get-intrinsic: 1.2.2 - is-array-buffer: 3.0.2 - is-shared-array-buffer: 1.0.2 - dev: true + get-intrinsic: 1.2.0 + dev: false /arrify@1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} @@ -5936,11 +5665,12 @@ packages: /ast-types-flow@0.0.7: resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} - dev: true + dev: false /astring@1.8.6: resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} hasBin: true + dev: false /async@2.6.4: resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} @@ -5951,198 +5681,183 @@ packages: /async@3.2.4: resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} - /asynciterator.prototype@1.0.0: - resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} - dependencies: - has-symbols: 1.0.3 - dev: true - /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true /at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} dev: false - /autoprefixer@10.4.13(postcss@8.4.31): + /autoprefixer@10.4.13(postcss@8.4.21): resolution: {integrity: sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.23.0 - caniuse-lite: 1.0.30001588 - fraction.js: 4.3.7 - normalize-range: 0.1.2 - picocolors: 1.0.0 - postcss: 8.4.31 - postcss-value-parser: 4.2.0 - - /autoprefixer@10.4.16(postcss@8.4.31): - resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - dependencies: - browserslist: 4.23.0 - caniuse-lite: 1.0.30001588 - fraction.js: 4.3.7 + browserslist: 4.21.10 + caniuse-lite: 1.0.30001519 + fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 - postcss: 8.4.31 + postcss: 8.4.21 postcss-value-parser: 4.2.0 - dev: false /available-typed-arrays@1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} - dev: true - /axe-core@4.8.2: - resolution: {integrity: sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==} + /axe-core@4.6.3: + resolution: {integrity: sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==} engines: {node: '>=4'} - dev: true + dev: false - /axobject-query@3.2.1: - resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + /axios@0.27.2: + resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} dependencies: - dequal: 2.0.3 - dev: true + follow-redirects: 1.15.2 + form-data: 4.0.0 + transitivePeerDependencies: + - debug + dev: false - /babel-jest@29.7.0(@babel/core@7.23.7): - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + /axobject-query@3.1.1: + resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} + dependencies: + deep-equal: 2.2.0 + dev: false + + /babel-jest@29.5.0(@babel/core@7.22.10): + resolution: {integrity: sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.23.7 - '@jest/transform': 29.7.0 - '@types/babel__core': 7.20.3 + '@babel/core': 7.22.10 + '@jest/transform': 29.5.0 + '@types/babel__core': 7.20.0 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.23.7) + babel-preset-jest: 29.5.0(@babel/core@7.22.10) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color - dev: true - /babel-loader@9.1.3(@babel/core@7.23.7)(webpack@5.89.0): + /babel-loader@9.1.3(@babel/core@7.22.10)(webpack@5.88.2): resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} engines: {node: '>= 14.15.0'} peerDependencies: '@babel/core': ^7.12.0 webpack: '>=5' dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.22.10 find-cache-dir: 4.0.0 - schema-utils: 4.2.0 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) + schema-utils: 4.0.0 + webpack: 5.88.2(webpack-cli@5.1.4) dev: false /babel-plugin-dynamic-import-node@2.3.3: resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} dependencies: - object.assign: 4.1.5 + object.assign: 4.1.4 dev: false /babel-plugin-istanbul@6.1.1: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: - '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-plugin-utils': 7.20.2 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 test-exclude: 6.0.0 transitivePeerDependencies: - supports-color - dev: true - /babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + /babel-plugin-jest-hoist@29.5.0: + resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.6 - '@types/babel__core': 7.20.3 - '@types/babel__traverse': 7.20.3 - dev: true + '@babel/template': 7.22.5 + '@babel/types': 7.22.10 + '@types/babel__core': 7.20.0 + '@types/babel__traverse': 7.18.3 - /babel-plugin-polyfill-corejs2@0.4.7(@babel/core@7.23.7): - resolution: {integrity: sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==} + /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.22.10): + resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.23.5 - '@babel/core': 7.23.7 - '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.7) + '@babel/compat-data': 7.22.9 + '@babel/core': 7.22.10 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.22.10) semver: 6.3.1 transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-corejs3@0.8.7(@babel/core@7.23.7): - resolution: {integrity: sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==} + /babel-plugin-polyfill-corejs3@0.6.0(@babel/core@7.22.10): + resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.7) - core-js-compat: 3.35.0 + '@babel/core': 7.22.10 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.22.10) + core-js-compat: 3.29.0 transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-regenerator@0.5.4(@babel/core@7.23.7): - resolution: {integrity: sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==} + /babel-plugin-polyfill-regenerator@0.4.1(@babel/core@7.22.10): + resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.23.7 - '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.23.7) + '@babel/core': 7.22.10 + '@babel/helper-define-polyfill-provider': 0.3.3(@babel/core@7.22.10) transitivePeerDependencies: - supports-color - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.7): + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.22.10): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.7 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.7) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.7) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.7) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.7) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.7) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.7) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.7) - dev: true - - /babel-preset-jest@29.6.3(@babel/core@7.23.7): - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + '@babel/core': 7.22.10 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.10) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.10) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.10) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.10) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.10) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.10) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.10) + + /babel-preset-jest@29.5.0(@babel/core@7.22.10): + resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.23.7 - babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.7) - dev: true + '@babel/core': 7.22.10 + babel-plugin-jest-hoist: 29.5.0 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.10) /bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + dev: false /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /base16@1.0.0: + resolution: {integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==} + dev: false + /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -6166,6 +5881,11 @@ packages: is-windows: 1.0.2 dev: true + /big-integer@1.6.51: + resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} + engines: {node: '>=0.6'} + dev: true + /big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} dev: false @@ -6185,6 +5905,13 @@ packages: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} + /binary@0.3.0: + resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==} + dependencies: + buffers: 0.1.1 + chainsaw: 0.1.0 + dev: true + /binaryextensions@4.18.0: resolution: {integrity: sha512-PQu3Kyv9dM4FnwB7XGj1+HucW+ShvJzJqjuw1JkKVs1mWdwOKVcRjOi+pV9X52A0tNvrPCsPkbFFQb+wE1EAXw==} engines: {node: '>=0.8'} @@ -6196,6 +5923,10 @@ packages: inherits: 2.0.4 readable-stream: 3.6.2 + /bluebird@3.4.7: + resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} + dev: true + /body-parser@1.20.1: resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -6221,9 +5952,11 @@ packages: fast-safe-stringify: 2.1.1 individual: 3.0.0 - /bonjour-service@1.2.1: - resolution: {integrity: sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==} + /bonjour-service@1.1.0: + resolution: {integrity: sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q==} dependencies: + array-flatten: 2.1.2 + dns-equal: 1.0.0 fast-deep-equal: 3.1.3 multicast-dns: 7.2.5 @@ -6293,15 +6026,15 @@ packages: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} dev: true - /browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + /browserslist@4.21.10: + resolution: {integrity: sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001588 - electron-to-chromium: 1.4.673 - node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.23.0) + caniuse-lite: 1.0.30001519 + electron-to-chromium: 1.4.487 + node-releases: 2.0.13 + update-browserslist-db: 1.0.11(browserslist@4.21.10) /bs-logger@0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} @@ -6314,11 +6047,15 @@ packages: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: node-int64: 0.4.0 - dev: true /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + /buffer-indexof-polyfill@1.0.2: + resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==} + engines: {node: '>=0.10'} + dev: true + /buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: @@ -6331,9 +6068,9 @@ packages: base64-js: 1.5.1 ieee754: 1.2.1 - /builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} + /buffers@0.1.1: + resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==} + engines: {node: '>=0.2.0'} dev: true /builtins@1.0.3: @@ -6344,13 +6081,6 @@ packages: dependencies: semver: 7.5.4 - /busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - dependencies: - streamsearch: 1.1.0 - dev: false - /bytes@3.0.0: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} @@ -6415,7 +6145,7 @@ packages: dependencies: '@npmcli/fs': 3.1.0 fs-minipass: 3.0.2 - glob: 10.3.10 + glob: 10.3.3 lru-cache: 7.18.3 minipass: 5.0.0 minipass-collect: 1.0.2 @@ -6431,25 +6161,24 @@ packages: engines: {node: '>=14.16'} dev: false - /cacheable-request@10.2.14: - resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + /cacheable-request@10.2.13: + resolution: {integrity: sha512-3SD4rrMu1msNGEtNSt8Od6enwdo//U9s4ykmXfA2TD58kcLkCobtCDiby7kNyj7a/Q7lz/mAesAFI54rTdnvBA==} engines: {node: '>=14.16'} dependencies: - '@types/http-cache-semantics': 4.0.4 + '@types/http-cache-semantics': 4.0.1 get-stream: 6.0.1 http-cache-semantics: 4.1.1 - keyv: 4.5.4 + keyv: 4.5.3 mimic-response: 4.0.0 normalize-url: 8.0.0 responselike: 3.0.0 dev: false - /call-bind@1.0.5: - resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + /call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: - function-bind: 1.1.2 - get-intrinsic: 1.2.2 - set-function-length: 1.2.0 + function-bind: 1.1.1 + get-intrinsic: 1.2.0 /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -6459,7 +6188,7 @@ packages: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} dependencies: pascal-case: 3.1.2 - tslib: 2.6.2 + tslib: 2.6.1 /camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} @@ -6488,7 +6217,6 @@ packages: /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} - dev: true /camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} @@ -6509,17 +6237,18 @@ packages: /caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: - browserslist: 4.23.0 - caniuse-lite: 1.0.30001588 + browserslist: 4.21.10 + caniuse-lite: 1.0.30001519 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 dev: false - /caniuse-lite@1.0.30001588: - resolution: {integrity: sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ==} + /caniuse-lite@1.0.30001519: + resolution: {integrity: sha512-0QHgqR+Jv4bxHMp8kZ1Kn8CH55OikjKJ6JmKkZYP1F3D7w+lnFXF70nG5eNfsZS89jadi5Ywy5UCSKLAglIRkg==} /ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + dev: false /chai@4.3.7: resolution: {integrity: sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==} @@ -6534,6 +6263,12 @@ packages: type-detect: 4.0.8 dev: true + /chainsaw@0.1.0: + resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==} + dependencies: + traverse: 0.3.9 + dev: true + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -6560,15 +6295,19 @@ packages: /character-entities-html4@2.1.0: resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + dev: false /character-entities-legacy@3.0.0: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + dev: false /character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + dev: false /character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + dev: false /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} @@ -6585,7 +6324,7 @@ packages: css-what: 6.1.0 domelementtype: 2.3.0 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.0.1 dev: false /cheerio@1.0.0-rc.12: @@ -6595,8 +6334,8 @@ packages: cheerio-select: 2.1.0 dom-serializer: 2.0.0 domhandler: 5.0.3 - domutils: 3.1.0 - htmlparser2: 8.0.2 + domutils: 3.0.1 + htmlparser2: 8.0.1 parse5: 7.1.2 parse5-htmlparser2-tree-adapter: 7.0.0 dev: false @@ -6613,7 +6352,7 @@ packages: normalize-path: 3.0.0 readdirp: 3.6.0 optionalDependencies: - fsevents: 2.3.3 + fsevents: 2.3.2 /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} @@ -6623,27 +6362,19 @@ packages: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + /ci-info@3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} engines: {node: '>=8'} - /cjs-module-lexer@1.2.3: - resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} - dev: true + /cjs-module-lexer@1.2.2: + resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} - /clean-css@5.3.3: - resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + /clean-css@5.3.2: + resolution: {integrity: sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==} engines: {node: '>= 10.0'} dependencies: source-map: 0.6.1 - /clean-regexp@1.0.0: - resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} - engines: {node: '>=4'} - dependencies: - escape-string-regexp: 1.0.5 - dev: true - /clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -6714,7 +6445,6 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true /clone-buffer@1.0.0: resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==} @@ -6751,11 +6481,6 @@ packages: engines: {node: '>=6'} dev: false - /clsx@2.1.0: - resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} - engines: {node: '>=6'} - dev: false - /cmd-shim@5.0.0: resolution: {integrity: sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -6765,14 +6490,9 @@ packages: /co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: true - - /collapse-white-space@2.1.0: - resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} - /collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} - dev: true + /collect-v8-coverage@1.0.1: + resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -6806,8 +6526,8 @@ packages: resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==} engines: {node: '>=0.1.90'} - /combine-promises@1.2.0: - resolution: {integrity: sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==} + /combine-promises@1.1.0: + resolution: {integrity: sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==} engines: {node: '>=10'} dev: false @@ -6816,10 +6536,10 @@ packages: engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 - dev: true /comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + dev: false /commander@10.0.0: resolution: {integrity: sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==} @@ -6833,11 +6553,6 @@ packages: /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: true - /commander@5.1.0: resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} engines: {node: '>= 6'} @@ -6935,6 +6650,9 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -6945,8 +6663,8 @@ packages: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} - /copy-text-to-clipboard@3.2.0: - resolution: {integrity: sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==} + /copy-text-to-clipboard@3.1.0: + resolution: {integrity: sha512-PFM6BnjLnOON/lB3ta/Jg7Ywsv+l9kQGD4TWDCSlRBGmqnnTM5MrDkhAFgw+8HZt0wW6Q2BBE4cmy9sq+s9Qng==} engines: {node: '>=12'} dev: false @@ -6956,33 +6674,33 @@ packages: toggle-selection: 1.0.6 dev: false - /copy-webpack-plugin@11.0.0(webpack@5.89.0): + /copy-webpack-plugin@11.0.0(webpack@5.88.2): resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} engines: {node: '>= 14.15.0'} peerDependencies: webpack: ^5.1.0 dependencies: - fast-glob: 3.3.2 + fast-glob: 3.3.1 glob-parent: 6.0.2 - globby: 13.2.2 + globby: 13.1.3 normalize-path: 3.0.0 - schema-utils: 4.2.0 - serialize-javascript: 6.0.2 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) + schema-utils: 4.0.0 + serialize-javascript: 6.0.1 + webpack: 5.88.2(webpack-cli@5.1.4) dev: false - /core-js-compat@3.35.0: - resolution: {integrity: sha512-5blwFAddknKeNgsjBzilkdQ0+YK8L1PfqPYq40NOYMYFSS38qj+hpTcLLWwpIwA2A5bje/x5jmVn2tzUMg9IVw==} + /core-js-compat@3.29.0: + resolution: {integrity: sha512-ScMn3uZNAFhK2DGoEfErguoiAHhV2Ju+oJo/jK08p7B3f3UhocUrCCkTvnZaiS+edl5nlIoiBXKcwMc6elv4KQ==} dependencies: - browserslist: 4.23.0 + browserslist: 4.21.10 - /core-js-pure@3.35.0: - resolution: {integrity: sha512-f+eRYmkou59uh7BPcyJ8MC76DiGhspj1KMxVIcF24tzP8NA9HVa1uC7BTW2tgx7E1QVCzDzsgp7kArrzhlz8Ew==} + /core-js-pure@3.29.0: + resolution: {integrity: sha512-v94gUjN5UTe1n0yN/opTihJ8QBWD2O8i19RfTZR7foONPWArnjB96QA/wk5ozu1mm6ja3udQCzOzwQXTxi3xOQ==} requiresBuild: true dev: false - /core-js@3.35.0: - resolution: {integrity: sha512-ntakECeqg81KqMueeGJ79Q5ZgQNR+6eaE8sxGCx62zMbAIj65q+uYvatToew3m6eAGdU4gNZwpZ34NMe4GYswg==} + /core-js@3.29.0: + resolution: {integrity: sha512-VG23vuEisJNkGl6XQmFJd3rEG/so/CNatqeE+7uZAwTSwFeB/qaO0be8xZYUNWprJ/GIwL8aMt9cj1kvbpTZhg==} requiresBuild: true dev: false @@ -6998,7 +6716,7 @@ packages: resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} engines: {node: '>=8'} dependencies: - '@types/parse-json': 4.0.2 + '@types/parse-json': 4.0.0 import-fresh: 3.3.0 parse-json: 5.2.0 path-type: 4.0.0 @@ -7009,7 +6727,7 @@ packages: resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} engines: {node: '>=10'} dependencies: - '@types/parse-json': 4.0.2 + '@types/parse-json': 4.0.0 import-fresh: 3.3.0 parse-json: 5.2.0 path-type: 4.0.0 @@ -7018,51 +6736,23 @@ packages: /cosmiconfig@8.0.0: resolution: {integrity: sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==} engines: {node: '>=14'} - dependencies: - import-fresh: 3.3.0 - js-yaml: 4.1.0 - parse-json: 5.2.0 - path-type: 4.0.0 - dev: true - - /cosmiconfig@8.3.6(typescript@5.2.2): - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - import-fresh: 3.3.0 - js-yaml: 4.1.0 - parse-json: 5.2.0 - path-type: 4.0.0 - typescript: 5.2.2 - dev: false - - /create-jest@29.7.0(@types/node@18.18.9)(ts-node@10.9.1): - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.18.9)(ts-node@10.9.1) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 dev: true /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - dev: true + + /cross-fetch@3.1.5: + resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==} + dependencies: + node-fetch: 2.6.7 + transitivePeerDependencies: + - encoding + dev: false /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} @@ -7084,13 +6774,13 @@ packages: type-fest: 1.4.0 dev: false - /css-declaration-sorter@6.4.1(postcss@8.4.31): - resolution: {integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==} + /css-declaration-sorter@6.3.1(postcss@8.4.21): + resolution: {integrity: sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==} engines: {node: ^10 || ^12 || >=14} peerDependencies: postcss: ^8.0.9 dependencies: - postcss: 8.4.31 + postcss: 8.4.21 dev: false /css-in-js-utils@3.1.0: @@ -7099,41 +6789,23 @@ packages: hyphenate-style-name: 1.0.4 dev: false - /css-loader@6.7.3(webpack@5.89.0): + /css-loader@6.7.3(webpack@5.88.2): resolution: {integrity: sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.31) - postcss: 8.4.31 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.31) - postcss-modules-local-by-default: 4.0.3(postcss@8.4.31) - postcss-modules-scope: 3.1.0(postcss@8.4.31) - postcss-modules-values: 4.0.0(postcss@8.4.31) - postcss-value-parser: 4.2.0 - semver: 7.5.4 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) - dev: true - - /css-loader@6.9.0(webpack@5.89.0): - resolution: {integrity: sha512-3I5Nu4ytWlHvOP6zItjiHlefBNtrH+oehq8tnQa2kO305qpVyx9XNIT1CXIj5bgCJs7qICBCkgCYxQLKPANoLA==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.0.0 - dependencies: - icss-utils: 5.1.0(postcss@8.4.31) - postcss: 8.4.31 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.31) - postcss-modules-local-by-default: 4.0.3(postcss@8.4.31) - postcss-modules-scope: 3.1.0(postcss@8.4.31) - postcss-modules-values: 4.0.0(postcss@8.4.31) + icss-utils: 5.1.0(postcss@8.4.21) + postcss: 8.4.21 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.21) + postcss-modules-local-by-default: 4.0.0(postcss@8.4.21) + postcss-modules-scope: 3.0.0(postcss@8.4.21) + postcss-modules-values: 4.0.0(postcss@8.4.21) postcss-value-parser: 4.2.0 semver: 7.5.4 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) - dev: false + webpack: 5.88.2(webpack-cli@5.1.4) - /css-minimizer-webpack-plugin@4.2.2(clean-css@5.3.3)(esbuild@0.17.11)(webpack@5.89.0): + /css-minimizer-webpack-plugin@4.2.2(clean-css@5.3.2)(webpack@5.88.2): resolution: {integrity: sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -7158,15 +6830,14 @@ packages: lightningcss: optional: true dependencies: - clean-css: 5.3.3 - cssnano: 5.1.15(postcss@8.4.31) - esbuild: 0.17.11 - jest-worker: 29.7.0 - postcss: 8.4.31 - schema-utils: 4.2.0 - serialize-javascript: 6.0.2 + clean-css: 5.3.2 + cssnano: 5.1.15(postcss@8.4.21) + jest-worker: 29.5.0 + postcss: 8.4.21 + schema-utils: 4.0.0 + serialize-javascript: 6.0.1 source-map: 0.6.1 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.1.4) dev: false /css-select@4.3.0: @@ -7184,7 +6855,7 @@ packages: boolbase: 1.0.0 css-what: 6.1.0 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.0.1 nth-check: 2.1.1 dev: false @@ -7204,77 +6875,77 @@ packages: engines: {node: '>=4'} hasBin: true - /cssnano-preset-advanced@5.3.10(postcss@8.4.31): + /cssnano-preset-advanced@5.3.10(postcss@8.4.21): resolution: {integrity: sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - autoprefixer: 10.4.13(postcss@8.4.31) - cssnano-preset-default: 5.2.14(postcss@8.4.31) - postcss: 8.4.31 - postcss-discard-unused: 5.1.0(postcss@8.4.31) - postcss-merge-idents: 5.1.1(postcss@8.4.31) - postcss-reduce-idents: 5.2.0(postcss@8.4.31) - postcss-zindex: 5.1.0(postcss@8.4.31) + autoprefixer: 10.4.13(postcss@8.4.21) + cssnano-preset-default: 5.2.14(postcss@8.4.21) + postcss: 8.4.21 + postcss-discard-unused: 5.1.0(postcss@8.4.21) + postcss-merge-idents: 5.1.1(postcss@8.4.21) + postcss-reduce-idents: 5.2.0(postcss@8.4.21) + postcss-zindex: 5.1.0(postcss@8.4.21) dev: false - /cssnano-preset-default@5.2.14(postcss@8.4.31): + /cssnano-preset-default@5.2.14(postcss@8.4.21): resolution: {integrity: sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - css-declaration-sorter: 6.4.1(postcss@8.4.31) - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 - postcss-calc: 8.2.4(postcss@8.4.31) - postcss-colormin: 5.3.1(postcss@8.4.31) - postcss-convert-values: 5.1.3(postcss@8.4.31) - postcss-discard-comments: 5.1.2(postcss@8.4.31) - postcss-discard-duplicates: 5.1.0(postcss@8.4.31) - postcss-discard-empty: 5.1.1(postcss@8.4.31) - postcss-discard-overridden: 5.1.0(postcss@8.4.31) - postcss-merge-longhand: 5.1.7(postcss@8.4.31) - postcss-merge-rules: 5.1.4(postcss@8.4.31) - postcss-minify-font-values: 5.1.0(postcss@8.4.31) - postcss-minify-gradients: 5.1.1(postcss@8.4.31) - postcss-minify-params: 5.1.4(postcss@8.4.31) - postcss-minify-selectors: 5.2.1(postcss@8.4.31) - postcss-normalize-charset: 5.1.0(postcss@8.4.31) - postcss-normalize-display-values: 5.1.0(postcss@8.4.31) - postcss-normalize-positions: 5.1.1(postcss@8.4.31) - postcss-normalize-repeat-style: 5.1.1(postcss@8.4.31) - postcss-normalize-string: 5.1.0(postcss@8.4.31) - postcss-normalize-timing-functions: 5.1.0(postcss@8.4.31) - postcss-normalize-unicode: 5.1.1(postcss@8.4.31) - postcss-normalize-url: 5.1.0(postcss@8.4.31) - postcss-normalize-whitespace: 5.1.1(postcss@8.4.31) - postcss-ordered-values: 5.1.3(postcss@8.4.31) - postcss-reduce-initial: 5.1.2(postcss@8.4.31) - postcss-reduce-transforms: 5.1.0(postcss@8.4.31) - postcss-svgo: 5.1.0(postcss@8.4.31) - postcss-unique-selectors: 5.1.1(postcss@8.4.31) - dev: false - - /cssnano-utils@3.1.0(postcss@8.4.31): + css-declaration-sorter: 6.3.1(postcss@8.4.21) + cssnano-utils: 3.1.0(postcss@8.4.21) + postcss: 8.4.21 + postcss-calc: 8.2.4(postcss@8.4.21) + postcss-colormin: 5.3.1(postcss@8.4.21) + postcss-convert-values: 5.1.3(postcss@8.4.21) + postcss-discard-comments: 5.1.2(postcss@8.4.21) + postcss-discard-duplicates: 5.1.0(postcss@8.4.21) + postcss-discard-empty: 5.1.1(postcss@8.4.21) + postcss-discard-overridden: 5.1.0(postcss@8.4.21) + postcss-merge-longhand: 5.1.7(postcss@8.4.21) + postcss-merge-rules: 5.1.4(postcss@8.4.21) + postcss-minify-font-values: 5.1.0(postcss@8.4.21) + postcss-minify-gradients: 5.1.1(postcss@8.4.21) + postcss-minify-params: 5.1.4(postcss@8.4.21) + postcss-minify-selectors: 5.2.1(postcss@8.4.21) + postcss-normalize-charset: 5.1.0(postcss@8.4.21) + postcss-normalize-display-values: 5.1.0(postcss@8.4.21) + postcss-normalize-positions: 5.1.1(postcss@8.4.21) + postcss-normalize-repeat-style: 5.1.1(postcss@8.4.21) + postcss-normalize-string: 5.1.0(postcss@8.4.21) + postcss-normalize-timing-functions: 5.1.0(postcss@8.4.21) + postcss-normalize-unicode: 5.1.1(postcss@8.4.21) + postcss-normalize-url: 5.1.0(postcss@8.4.21) + postcss-normalize-whitespace: 5.1.1(postcss@8.4.21) + postcss-ordered-values: 5.1.3(postcss@8.4.21) + postcss-reduce-initial: 5.1.2(postcss@8.4.21) + postcss-reduce-transforms: 5.1.0(postcss@8.4.21) + postcss-svgo: 5.1.0(postcss@8.4.21) + postcss-unique-selectors: 5.1.1(postcss@8.4.21) + dev: false + + /cssnano-utils@3.1.0(postcss@8.4.21): resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.21 dev: false - /cssnano@5.1.15(postcss@8.4.31): + /cssnano@5.1.15(postcss@8.4.21): resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-preset-default: 5.2.14(postcss@8.4.31) + cssnano-preset-default: 5.2.14(postcss@8.4.21) lilconfig: 2.1.0 - postcss: 8.4.31 + postcss: 8.4.21 yaml: 1.10.2 dev: false @@ -7299,12 +6970,12 @@ packages: cssom: 0.3.8 dev: true - /csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + /csstype@3.1.1: + resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} /damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - dev: true + dev: false /dargs@7.0.0: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} @@ -7326,10 +6997,6 @@ packages: /dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} - /debounce@1.2.1: - resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} - dev: false - /debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -7349,7 +7016,6 @@ packages: optional: true dependencies: ms: 2.1.3 - dev: true /debug@4.3.4(supports-color@8.1.1): resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} @@ -7398,6 +7064,7 @@ packages: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} dependencies: character-entities: 2.0.2 + dev: false /decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} @@ -7406,14 +7073,8 @@ packages: mimic-response: 3.1.0 dev: false - /dedent@1.5.1: - resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - dev: true + /dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} /deep-eql@4.1.3: resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} @@ -7422,6 +7083,27 @@ packages: type-detect: 4.0.8 dev: true + /deep-equal@2.2.0: + resolution: {integrity: sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==} + dependencies: + call-bind: 1.0.2 + es-get-iterator: 1.1.3 + get-intrinsic: 1.2.0 + is-arguments: 1.1.1 + is-array-buffer: 3.0.2 + is-date-object: 1.0.5 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + isarray: 2.0.5 + object-is: 1.1.5 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.4.3 + side-channel: 1.0.4 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.9 + /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -7429,8 +7111,8 @@ packages: /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + /deepmerge@4.3.0: + resolution: {integrity: sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==} engines: {node: '>=0.10.0'} /default-gateway@6.0.3: @@ -7449,26 +7131,21 @@ packages: engines: {node: '>=10'} dev: false - /define-data-property@1.1.1: - resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - /define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + /define-properties@1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} dependencies: - define-data-property: 1.1.1 - has-property-descriptors: 1.0.1 + has-property-descriptors: 1.0.0 object-keys: 1.1.1 + /defined@1.0.1: + resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} + dev: true + /del@6.1.1: resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==} engines: {node: '>=10'} @@ -7486,7 +7163,6 @@ packages: /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - dev: true /delegates@1.0.0: resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} @@ -7505,6 +7181,7 @@ packages: /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + dev: false /destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} @@ -7523,7 +7200,6 @@ packages: /detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} - dev: true /detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} @@ -7549,10 +7225,15 @@ packages: - supports-color dev: false - /devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + /detective@5.2.1: + resolution: {integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==} + engines: {node: '>=0.8.0'} + hasBin: true dependencies: - dequal: 2.0.3 + acorn-node: 1.8.2 + defined: 1.0.1 + minimist: 1.2.8 + dev: true /dezalgo@1.0.4: resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} @@ -7564,15 +7245,13 @@ packages: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} dev: true - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + /diff-sequences@29.4.3: + resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} - dev: true /diff@5.0.0: resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} @@ -7589,16 +7268,15 @@ packages: dependencies: path-type: 4.0.0 - /discontinuous-range@1.0.0: - resolution: {integrity: sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==} - dev: false - /dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} dev: true - /dns-packet@5.6.1: - resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} + /dns-equal@1.0.0: + resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==} + + /dns-packet@5.4.0: + resolution: {integrity: sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==} engines: {node: '>=6'} dependencies: '@leichtgewicht/ip-codec': 2.0.4 @@ -7608,7 +7286,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: esutils: 2.0.3 - dev: true /doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} @@ -7646,7 +7323,6 @@ packages: /domexception@4.0.0: resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} engines: {node: '>=12'} - deprecated: Use your platform's native DOMException instead dependencies: webidl-conversions: 7.0.0 dev: true @@ -7671,8 +7347,8 @@ packages: domelementtype: 2.3.0 domhandler: 4.3.1 - /domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + /domutils@3.0.1: + resolution: {integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==} dependencies: dom-serializer: 2.0.0 domelementtype: 2.3.0 @@ -7683,7 +7359,7 @@ packages: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: no-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.6.1 /dot-prop@6.0.1: resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} @@ -7692,6 +7368,12 @@ packages: is-obj: 2.0.0 dev: false + /duplexer2@0.1.4: + resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} + dependencies: + readable-stream: 2.3.8 + dev: true + /duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} dev: false @@ -7709,13 +7391,12 @@ packages: dependencies: jake: 10.8.7 - /electron-to-chromium@1.4.673: - resolution: {integrity: sha512-zjqzx4N7xGdl5468G+vcgzDhaHkaYgVcf9MqgexcTqsl2UHSCmOj/Bi3HAprg4BZCpC7HyD8a6nZl6QAZf72gw==} + /electron-to-chromium@1.4.487: + resolution: {integrity: sha512-XbCRs/34l31np/p33m+5tdBrdXu9jJkZxSbNxj5I0H1KtV2ZMSB+i/HYqDiRzHaFx2T5EdytjoBRe8QRJE2vQg==} /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} - dev: true /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -7723,17 +7404,13 @@ packages: /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - /emojilib@2.4.0: - resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} - dev: false - /emojis-list@3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} dev: false - /emoticon@4.0.1: - resolution: {integrity: sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw==} + /emoticon@3.2.0: + resolution: {integrity: sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==} dev: false /encode-registry@3.0.0: @@ -7794,23 +7471,22 @@ packages: /error@10.4.0: resolution: {integrity: sha512-YxIFEJuhgcICugOUvRx5th0UM+ActZ9sjY0QJmeVwsQdvosZ7kYzc9QqS0Da3R5iUmgU5meGIxh0xBeZpMVeLw==} - /es-abstract@1.22.2: - resolution: {integrity: sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==} + /es-abstract@1.21.2: + resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.0 - arraybuffer.prototype.slice: 1.0.2 available-typed-arrays: 1.0.5 - call-bind: 1.0.5 + call-bind: 1.0.2 es-set-tostringtag: 2.0.1 es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.2 + function.prototype.name: 1.1.5 + get-intrinsic: 1.2.0 get-symbol-description: 1.0.0 globalthis: 1.0.3 gopd: 1.0.1 - has: 1.0.4 - has-property-descriptors: 1.0.1 + has: 1.0.3 + has-property-descriptors: 1.0.0 has-proto: 1.0.1 has-symbols: 1.0.3 internal-slot: 1.0.5 @@ -7820,61 +7496,48 @@ packages: is-regex: 1.1.4 is-shared-array-buffer: 1.0.2 is-string: 1.0.7 - is-typed-array: 1.1.12 + is-typed-array: 1.1.10 is-weakref: 1.0.2 - object-inspect: 1.13.1 + object-inspect: 1.12.3 object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.1 - safe-array-concat: 1.0.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.4.3 safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.8 - string.prototype.trimend: 1.0.7 - string.prototype.trimstart: 1.0.7 - typed-array-buffer: 1.0.0 - typed-array-byte-length: 1.0.0 - typed-array-byte-offset: 1.0.0 + string.prototype.trim: 1.2.7 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 typed-array-length: 1.0.4 unbox-primitive: 1.0.2 - which-typed-array: 1.1.11 - dev: true + which-typed-array: 1.1.9 - /es-iterator-helpers@1.0.15: - resolution: {integrity: sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==} + /es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} dependencies: - asynciterator.prototype: 1.0.0 - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.2 - es-set-tostringtag: 2.0.1 - function-bind: 1.1.2 - get-intrinsic: 1.2.2 - globalthis: 1.0.3 - has-property-descriptors: 1.0.1 - has-proto: 1.0.1 + call-bind: 1.0.2 + get-intrinsic: 1.2.0 has-symbols: 1.0.3 - internal-slot: 1.0.5 - iterator.prototype: 1.1.2 - safe-array-concat: 1.0.1 - dev: true + is-arguments: 1.1.1 + is-map: 2.0.2 + is-set: 2.0.2 + is-string: 1.0.7 + isarray: 2.0.5 + stop-iteration-iterator: 1.0.0 - /es-module-lexer@1.4.1: - resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + /es-module-lexer@1.3.0: + resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==} /es-set-tostringtag@2.0.1: resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.2 - has: 1.0.4 + get-intrinsic: 1.2.0 + has: 1.0.3 has-tostringtag: 1.0.0 - dev: true /es-shim-unscopables@1.0.0: resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} dependencies: - has: 1.0.4 - dev: true + has: 1.0.3 /es-to-primitive@1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} @@ -7883,7 +7546,6 @@ packages: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 - dev: true /esbuild@0.17.11: resolution: {integrity: sha512-pAMImyokbWDtnA/ufPxjQg0fYo2DDuzAlqwnDvbXqHLphe+m80eF++perYKVm8LeTuj2zUuFXC+xgSVxyoHUdg==} @@ -7913,6 +7575,7 @@ packages: '@esbuild/win32-arm64': 0.17.11 '@esbuild/win32-ia32': 0.17.11 '@esbuild/win32-x64': 0.17.11 + dev: true /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} @@ -7933,7 +7596,6 @@ packages: /escape-string-regexp@2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} - dev: true /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} @@ -7956,8 +7618,8 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-next@13.5.4(eslint@8.53.0)(typescript@5.2.2): - resolution: {integrity: sha512-FzQGIj4UEszRX7fcRSJK6L1LrDiVZvDFW320VVntVKh3BSU8Fb9kpaoxQx0cdFgf3MQXdeSbrCXJ/5Z/NndDkQ==} + /eslint-config-next@13.2.3(eslint@8.38.0)(typescript@5.1.6): + resolution: {integrity: sha512-kPulHiQEHGei9hIaaNGygHRc0UzlWM+3euOmYbxNkd2Nbhci5rrCDeMBMPSV8xgUssphDGmwDHWbk4VZz3rlZQ==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 typescript: '>=3.3.1' @@ -7965,42 +7627,41 @@ packages: typescript: optional: true dependencies: - '@next/eslint-plugin-next': 13.5.4 - '@rushstack/eslint-patch': 1.5.1 - '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.2.2) - eslint: 8.53.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@6.10.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.53.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.10.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.53.0) - eslint-plugin-jsx-a11y: 6.7.1(eslint@8.53.0) - eslint-plugin-react: 7.33.2(eslint@8.53.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.53.0) - typescript: 5.2.2 + '@next/eslint-plugin-next': 13.2.3 + '@rushstack/eslint-patch': 1.2.0 + '@typescript-eslint/parser': 5.58.0(eslint@8.38.0)(typescript@5.1.6) + eslint: 8.38.0 + eslint-import-resolver-node: 0.3.7 + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.38.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.38.0) + eslint-plugin-jsx-a11y: 6.7.1(eslint@8.38.0) + eslint-plugin-react: 7.32.2(eslint@8.38.0) + eslint-plugin-react-hooks: 4.6.0(eslint@8.38.0) + typescript: 5.1.6 transitivePeerDependencies: - eslint-import-resolver-webpack - supports-color - dev: true + dev: false - /eslint-config-prettier@8.8.0(eslint@8.53.0): + /eslint-config-prettier@8.8.0(eslint@8.38.0): resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.53.0 + eslint: 8.38.0 dev: true - /eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + /eslint-import-resolver-node@0.3.7: + resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} dependencies: debug: 3.2.7 - is-core-module: 2.13.1 - resolve: 1.22.8 + is-core-module: 2.13.0 + resolve: 1.22.4 transitivePeerDependencies: - supports-color - dev: true - /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@6.10.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.53.0): + /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.38.0): resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -8009,12 +7670,12 @@ packages: dependencies: debug: 4.3.4(supports-color@8.1.1) enhanced-resolve: 5.15.0 - eslint: 8.53.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.10.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.53.0) - eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.10.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.53.0) - get-tsconfig: 4.7.2 - globby: 13.2.2 - is-core-module: 2.13.1 + eslint: 8.38.0 + eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.38.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.38.0) + get-tsconfig: 4.5.0 + globby: 13.1.3 + is-core-module: 2.13.0 is-glob: 4.0.3 synckit: 0.8.5 transitivePeerDependencies: @@ -8022,10 +7683,9 @@ packages: - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.10.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.53.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + /eslint-module-utils@2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.38.0): + resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -8045,17 +7705,16 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/parser': 5.58.0(eslint@8.38.0)(typescript@5.1.6) debug: 3.2.7 - eslint: 8.53.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@6.10.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.28.1)(eslint@8.53.0) + eslint: 8.38.0 + eslint-import-resolver-node: 0.3.7 + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.38.0) transitivePeerDependencies: - supports-color - dev: true - /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.10.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.53.0): - resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} + /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.38.0): + resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -8064,136 +7723,98 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.2.2) - array-includes: 3.1.7 - array.prototype.findlastindex: 1.2.3 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 + '@typescript-eslint/parser': 5.58.0(eslint@8.38.0)(typescript@5.1.6) + array-includes: 3.1.6 + array.prototype.flat: 1.3.1 + array.prototype.flatmap: 1.3.1 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.53.0 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.10.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.53.0) - has: 1.0.4 - is-core-module: 2.13.1 + eslint: 8.38.0 + eslint-import-resolver-node: 0.3.7 + eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.58.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.38.0) + has: 1.0.3 + is-core-module: 2.13.0 is-glob: 4.0.3 minimatch: 3.1.2 - object.fromentries: 2.0.7 - object.groupby: 1.0.1 - object.values: 1.1.7 + object.values: 1.1.6 + resolve: 1.22.4 semver: 6.3.1 tsconfig-paths: 3.14.2 transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - dev: true - /eslint-plugin-jsx-a11y@6.7.1(eslint@8.53.0): + /eslint-plugin-jsx-a11y@6.7.1(eslint@8.38.0): resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} engines: {node: '>=4.0'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - '@babel/runtime': 7.23.8 - aria-query: 5.3.0 - array-includes: 3.1.7 - array.prototype.flatmap: 1.3.2 + '@babel/runtime': 7.21.0 + aria-query: 5.1.3 + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 ast-types-flow: 0.0.7 - axe-core: 4.8.2 - axobject-query: 3.2.1 + axe-core: 4.6.3 + axobject-query: 3.1.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 8.53.0 - has: 1.0.4 - jsx-ast-utils: 3.3.5 + eslint: 8.38.0 + has: 1.0.3 + jsx-ast-utils: 3.3.3 language-tags: 1.0.5 minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 + object.entries: 1.1.6 + object.fromentries: 2.0.6 semver: 6.3.1 - dev: true - - /eslint-plugin-mocha@10.2.0(eslint@8.53.0): - resolution: {integrity: sha512-ZhdxzSZnd1P9LqDPF0DBcFLpRIGdh1zkF2JHnQklKQOvrQtT73kdP5K9V2mzvbLR+cCAO9OI48NXK/Ax9/ciCQ==} - engines: {node: '>=14.0.0'} - peerDependencies: - eslint: '>=7.0.0' - dependencies: - eslint: 8.53.0 - eslint-utils: 3.0.0(eslint@8.53.0) - rambda: 7.5.0 - dev: true + dev: false - /eslint-plugin-react-hooks@4.6.0(eslint@8.53.0): + /eslint-plugin-react-hooks@4.6.0(eslint@8.38.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.53.0 - dev: true + eslint: 8.38.0 + dev: false - /eslint-plugin-react@7.33.2(eslint@8.53.0): - resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} + /eslint-plugin-react@7.32.2(eslint@8.38.0): + resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 dependencies: - array-includes: 3.1.7 - array.prototype.flatmap: 1.3.2 - array.prototype.tosorted: 1.1.2 + array-includes: 3.1.6 + array.prototype.flatmap: 1.3.1 + array.prototype.tosorted: 1.1.1 doctrine: 2.1.0 - es-iterator-helpers: 1.0.15 - eslint: 8.53.0 + eslint: 8.38.0 estraverse: 5.3.0 - jsx-ast-utils: 3.3.5 + jsx-ast-utils: 3.3.3 minimatch: 3.1.2 - object.entries: 1.1.7 - object.fromentries: 2.0.7 - object.hasown: 1.1.3 - object.values: 1.1.7 + object.entries: 1.1.6 + object.fromentries: 2.0.6 + object.hasown: 1.1.2 + object.values: 1.1.6 prop-types: 15.8.1 - resolve: 2.0.0-next.5 + resolve: 2.0.0-next.4 semver: 6.3.1 - string.prototype.matchall: 4.0.10 - dev: true - - /eslint-plugin-unicorn@49.0.0(eslint@8.53.0): - resolution: {integrity: sha512-0fHEa/8Pih5cmzFW5L7xMEfUTvI9WKeQtjmKpTUmY+BiFCDxkxrTdnURJOHKykhtwIeyYsxnecbGvDCml++z4Q==} - engines: {node: '>=16'} - peerDependencies: - eslint: '>=8.52.0' - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) - ci-info: 3.9.0 - clean-regexp: 1.0.0 - eslint: 8.53.0 - esquery: 1.5.0 - indent-string: 4.0.0 - is-builtin-module: 3.2.1 - jsesc: 3.0.2 - pluralize: 8.0.0 - read-pkg-up: 7.0.1 - regexp-tree: 0.1.27 - regjsparser: 0.10.0 - semver: 7.5.4 - strip-indent: 3.0.0 - dev: true + string.prototype.matchall: 4.0.8 + dev: false - /eslint-plugin-unused-imports@3.0.0(@typescript-eslint/eslint-plugin@6.10.0)(eslint@8.53.0): - resolution: {integrity: sha512-sduiswLJfZHeeBJ+MQaG+xYzSWdRXoSw61DpU13mzWumCkR0ufD0HmO4kdNokjrkluMHpj/7PJeN35pgbhW3kw==} + /eslint-plugin-unused-imports@2.0.0(@typescript-eslint/eslint-plugin@5.58.0)(eslint@8.38.0): + resolution: {integrity: sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - '@typescript-eslint/eslint-plugin': ^6.0.0 + '@typescript-eslint/eslint-plugin': ^5.0.0 eslint: ^8.0.0 peerDependenciesMeta: '@typescript-eslint/eslint-plugin': optional: true dependencies: - '@typescript-eslint/eslint-plugin': 6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2) - eslint: 8.53.0 + '@typescript-eslint/eslint-plugin': 5.58.0(@typescript-eslint/parser@5.58.0)(eslint@8.38.0)(typescript@5.1.6) + eslint: 8.38.0 eslint-rule-composer: 0.3.0 dev: true @@ -8209,85 +7830,72 @@ packages: esrecurse: 4.3.0 estraverse: 4.3.0 - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + /eslint-scope@7.1.1: + resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - /eslint-utils@3.0.0(eslint@8.53.0): - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - dependencies: - eslint: 8.53.0 - eslint-visitor-keys: 2.1.0 - dev: true - - /eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - dev: true - - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + /eslint-visitor-keys@3.4.0: + resolution: {integrity: sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - /eslint@8.53.0: - resolution: {integrity: sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==} + /eslint@8.38.0: + resolution: {integrity: sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.3 - '@eslint/js': 8.53.0 - '@humanwhocodes/config-array': 0.11.13 + '@eslint-community/eslint-utils': 4.4.0(eslint@8.38.0) + '@eslint-community/regexpp': 4.5.0 + '@eslint/eslintrc': 2.0.2 + '@eslint/js': 8.38.0 + '@humanwhocodes/config-array': 0.11.8 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 debug: 4.3.4(supports-color@8.1.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 + eslint-scope: 7.1.1 + eslint-visitor-keys: 3.4.0 + espree: 9.5.1 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.23.0 - graphemer: 1.4.0 - ignore: 5.3.0 + globals: 13.20.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.4 + import-fresh: 3.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 + js-sdsl: 4.4.0 js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.3 + optionator: 0.9.1 strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 text-table: 0.2.0 transitivePeerDependencies: - supports-color - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + /espree@9.5.1: + resolution: {integrity: sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) - eslint-visitor-keys: 3.4.3 + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + eslint-visitor-keys: 3.4.0 /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} @@ -8314,54 +7922,59 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} - /estree-util-attach-comments@3.0.0: - resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + /estree-util-attach-comments@2.1.1: + resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.1 + dev: false - /estree-util-build-jsx@3.0.1: - resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + /estree-util-build-jsx@2.2.2: + resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} dependencies: - '@types/estree-jsx': 1.0.3 - devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 + '@types/estree-jsx': 1.0.0 + estree-util-is-identifier-name: 2.1.0 estree-walker: 3.0.3 + dev: false - /estree-util-is-identifier-name@3.0.0: - resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + /estree-util-is-identifier-name@2.1.0: + resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} + dev: false - /estree-util-to-js@2.0.0: - resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + /estree-util-to-js@1.2.0: + resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} dependencies: - '@types/estree-jsx': 1.0.3 + '@types/estree-jsx': 1.0.0 astring: 1.8.6 source-map: 0.7.4 + dev: false - /estree-util-value-to-estree@3.0.1: - resolution: {integrity: sha512-b2tdzTurEIbwRh+mKrEcaWfu1wgb8J1hVsgREg7FFiecWwK/PhO8X0kyc+0bIcKNtD4sqxIdNoRy6/p/TvECEA==} - engines: {node: '>=16.0.0'} + /estree-util-value-to-estree@2.1.0: + resolution: {integrity: sha512-fcAWmZilY1+tEt7GSeLZoHDvp2NNgLkJznBRYkEpaholas41d+Y0zd/Acch7+qzZdxLtxLi+m04KjHFJSoMa6A==} + engines: {node: '>=14.0.0'} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.1 is-plain-obj: 4.1.0 dev: false - /estree-util-visit@2.0.0: - resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + /estree-util-visit@1.2.1: + resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} dependencies: - '@types/estree-jsx': 1.0.3 - '@types/unist': 3.0.2 + '@types/estree-jsx': 1.0.0 + '@types/unist': 2.0.6 + dev: false /estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.1 + dev: false /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - /eta@2.2.0: - resolution: {integrity: sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==} + /eta@2.0.1: + resolution: {integrity: sha512-46E2qDPDm7QA+usjffUWz9KfXsxVZclPOuKsXs4ZWZdI/X1wpDF7AO424pt7fdYohCzWsIkXAhNGXSlwo5naAg==} engines: {node: '>=6.0.0'} dev: false @@ -8373,7 +7986,7 @@ packages: resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} engines: {node: '>= 0.8'} dependencies: - '@types/node': 18.18.9 + '@types/node': 16.18.40 require-like: 0.1.2 dev: false @@ -8405,22 +8018,20 @@ packages: /exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} - dev: true /expect-more@1.3.0: resolution: {integrity: sha512-HnXT5nJb9V3DMnr5RgA1TiKbu5kRaJ0GD1JkuhZvnr1Qe3HJq+ESnrcl/jmVUZ8Ycnl3Sp0OTYUhmO36d2+zow==} dev: true - /expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + /expect@29.5.0: + resolution: {integrity: sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/expect-utils': 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - dev: true + '@jest/expect-utils': 29.5.0 + jest-get-type: 29.4.3 + jest-matcher-utils: 29.5.0 + jest-message-util: 29.6.2 + jest-util: 29.6.2 /exponential-backoff@3.1.1: resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} @@ -8472,6 +8083,7 @@ packages: /extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: false /external-editor@3.1.0: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} @@ -8485,14 +8097,14 @@ packages: resolution: {integrity: sha512-SqahE9mlL3+lhjJ39joMLwcj6F+24hfZdf/tchlNO8sHcTdrUUdA5P/ZbSFZM9Xpzs36XaneGwE0FWepm/zyOA==} engines: {node: '>=8.0.0'} dependencies: - pure-rand: 6.0.4 + pure-rand: 6.0.0 dev: true /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 @@ -8539,17 +8151,11 @@ packages: resolution: {integrity: sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==} dev: false - /fastq@1.16.0: - resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} dependencies: reusify: 1.0.4 - /fault@2.0.1: - resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} - dependencies: - format: 0.2.2 - dev: false - /faye-websocket@0.11.4: resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} engines: {node: '>=0.8.0'} @@ -8560,7 +8166,32 @@ packages: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} dependencies: bser: 2.1.1 - dev: true + + /fbemitter@3.0.0: + resolution: {integrity: sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==} + dependencies: + fbjs: 3.0.4 + transitivePeerDependencies: + - encoding + dev: false + + /fbjs-css-vars@1.0.2: + resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==} + dev: false + + /fbjs@3.0.4: + resolution: {integrity: sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==} + dependencies: + cross-fetch: 3.1.5 + fbjs-css-vars: 1.0.2 + loose-envify: 1.4.0 + object-assign: 4.1.1 + promise: 7.3.1 + setimmediate: 1.0.5 + ua-parser-js: 0.7.34 + transitivePeerDependencies: + - encoding + dev: false /feed@4.2.2: resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==} @@ -8579,9 +8210,9 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flat-cache: 3.1.1 + flat-cache: 3.0.4 - /file-loader@6.2.0(webpack@5.89.0): + /file-loader@6.2.0(webpack@5.88.2): resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -8589,7 +8220,7 @@ packages: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.1.4) dev: false /filelist@1.0.4: @@ -8671,23 +8302,35 @@ packages: dependencies: readable-stream: 2.3.8 - /flat-cache@3.1.1: - resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==} - engines: {node: '>=12.0.0'} + /flat-cache@3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flatted: 3.2.9 - keyv: 4.5.4 + flatted: 3.2.7 rimraf: 3.0.2 /flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true + dev: true + + /flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} - /flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + /flux@4.0.3(react@18.2.0): + resolution: {integrity: sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==} + peerDependencies: + react: ^15.0.2 || ^16.0.0 || ^17.0.0 || 18 + dependencies: + fbemitter: 3.0.0 + fbjs: 3.0.4 + react: 18.2.0 + transitivePeerDependencies: + - encoding + dev: false - /follow-redirects@1.15.5: - resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + /follow-redirects@1.15.2: + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -8699,7 +8342,6 @@ packages: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 - dev: true /foreground-child@3.1.1: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} @@ -8708,7 +8350,7 @@ packages: cross-spawn: 7.0.3 signal-exit: 4.1.0 - /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.53.0)(typescript@5.2.2)(webpack@5.89.0): + /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.38.0)(typescript@5.1.6)(webpack@5.88.2): resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: @@ -8722,22 +8364,22 @@ packages: vue-template-compiler: optional: true dependencies: - '@babel/code-frame': 7.23.5 - '@types/json-schema': 7.0.15 + '@babel/code-frame': 7.22.10 + '@types/json-schema': 7.0.12 chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 6.0.0 - deepmerge: 4.3.1 - eslint: 8.53.0 + deepmerge: 4.3.0 + eslint: 8.38.0 fs-extra: 9.1.0 glob: 7.2.3 - memfs: 3.5.3 + memfs: 3.4.13 minimatch: 3.1.2 schema-utils: 2.7.0 semver: 7.5.4 tapable: 1.1.3 - typescript: 5.2.2 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) + typescript: 5.1.6 + webpack: 5.88.2(webpack-cli@5.1.4) dev: false /form-data-encoder@2.1.4: @@ -8752,19 +8394,13 @@ packages: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: true - - /format@0.2.2: - resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} - engines: {node: '>=0.4.x'} - dev: false /forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - /fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + /fraction.js@4.2.0: + resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} /fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} @@ -8776,17 +8412,7 @@ packages: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 - universalify: 2.0.1 - dev: true - - /fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - dev: false + universalify: 2.0.0 /fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} @@ -8795,7 +8421,7 @@ packages: at-least-node: 1.0.0 graceful-fs: 4.2.11 jsonfile: 6.1.0 - universalify: 2.0.1 + universalify: 2.0.0 dev: false /fs-minipass@2.1.0: @@ -8810,35 +8436,43 @@ packages: dependencies: minipass: 5.0.0 - /fs-monkey@1.0.5: - resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} + /fs-monkey@1.0.3: + resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true optional: true - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + /fstream@1.0.12: + resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} + engines: {node: '>=0.6'} + dependencies: + graceful-fs: 4.2.11 + inherits: 2.0.4 + mkdirp: 0.5.6 + rimraf: 2.7.1 + dev: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + /function.prototype.name@1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.2 + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 functions-have-names: 1.2.3 - dev: true /functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true /gauge@3.0.2: resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} @@ -8874,19 +8508,17 @@ packages: /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - dev: true /get-func-name@2.0.0: resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} dev: true - /get-intrinsic@1.2.2: - resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + /get-intrinsic@1.2.0: + resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} dependencies: - function-bind: 1.1.2 - has-proto: 1.0.1 + function-bind: 1.1.1 + has: 1.0.3 has-symbols: 1.0.3 - hasown: 2.0.0 /get-own-enumerable-property-symbols@3.0.2: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} @@ -8895,7 +8527,6 @@ packages: /get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} - dev: true /get-source@2.0.12: resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} @@ -8912,15 +8543,11 @@ packages: resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - dev: true + call-bind: 1.0.2 + get-intrinsic: 1.2.0 - /get-tsconfig@4.7.2: - resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} - dependencies: - resolve-pkg-maps: 1.0.0 - dev: true + /get-tsconfig@4.5.0: + resolution: {integrity: sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==} /github-slugger@1.5.0: resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} @@ -8949,28 +8576,17 @@ packages: /glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + /glob@10.3.3: + resolution: {integrity: sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==} engines: {node: '>=16 || 14 >=14.17'} hasBin: true dependencies: foreground-child: 3.1.1 - jackspeak: 2.3.6 + jackspeak: 2.2.2 minimatch: 9.0.3 minipass: 5.0.0 path-scurry: 1.10.1 - /glob@7.1.6: - resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - /glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} dependencies: @@ -8980,7 +8596,6 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true /glob@7.2.0: resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} @@ -9040,8 +8655,8 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - /globals@13.23.0: - resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + /globals@13.20.0: + resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 @@ -9050,12 +8665,10 @@ packages: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} dependencies: - define-properties: 1.2.1 - dev: true + define-properties: 1.2.0 /globalyzer@0.1.0: resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} - dev: true /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} @@ -9063,29 +8676,28 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.0 + fast-glob: 3.3.1 + ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 - /globby@13.2.2: - resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + /globby@13.1.3: + resolution: {integrity: sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.0 + fast-glob: 3.3.1 + ignore: 5.2.4 merge2: 1.4.1 slash: 4.0.0 /globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - dev: true /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.0 /got@12.6.1: resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} @@ -9094,11 +8706,11 @@ packages: '@sindresorhus/is': 5.6.0 '@szmarczak/http-timer': 5.0.1 cacheable-lookup: 7.0.0 - cacheable-request: 10.2.14 + cacheable-request: 10.2.13 decompress-response: 6.0.0 form-data-encoder: 2.1.4 get-stream: 6.0.1 - http2-wrapper: 2.2.1 + http2-wrapper: 2.2.0 lowercase-keys: 3.0.0 p-cancelable: 3.0.0 responselike: 3.0.0 @@ -9110,8 +8722,8 @@ packages: /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + /grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} /gray-matter@4.0.3: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} @@ -9144,7 +8756,6 @@ packages: /has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} @@ -9154,10 +8765,10 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - /has-property-descriptors@1.0.1: - resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + /has-property-descriptors@1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} dependencies: - get-intrinsic: 1.2.2 + get-intrinsic: 1.2.0 /has-proto@1.0.1: resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} @@ -9172,7 +8783,6 @@ packages: engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 - dev: true /has-unicode@2.0.1: resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} @@ -9182,127 +8792,90 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: false - /has@1.0.4: - resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} engines: {node: '>= 0.4.0'} - dev: true - - /hasharray@1.1.2: - resolution: {integrity: sha512-7w3idwaVXX9gL9LiTCBSNKRGTBcp2WI/kf13UYeZ9+trOGBHVYHei6qtMY6DVnwGOouVUSRg0+L2xf4Q2/CmzA==} - dependencies: - jclass: 1.2.1 - dev: false - - /hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} dependencies: - function-bind: 1.1.2 + function-bind: 1.1.1 - /hast-util-from-parse5@8.0.1: - resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + /hast-util-from-parse5@7.1.2: + resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} dependencies: - '@types/hast': 3.0.3 - '@types/unist': 3.0.2 - devlop: 1.1.0 - hastscript: 8.0.0 - property-information: 6.4.0 - vfile: 6.0.1 - vfile-location: 5.0.2 + '@types/hast': 2.3.4 + '@types/unist': 2.0.6 + hastscript: 7.2.0 + property-information: 6.2.0 + vfile: 5.3.7 + vfile-location: 4.1.0 web-namespaces: 2.0.1 dev: false - /hast-util-parse-selector@4.0.0: - resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + /hast-util-parse-selector@3.1.1: + resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} dependencies: - '@types/hast': 3.0.3 + '@types/hast': 2.3.4 dev: false - /hast-util-raw@9.0.1: - resolution: {integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==} + /hast-util-raw@7.2.3: + resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==} dependencies: - '@types/hast': 3.0.3 - '@types/unist': 3.0.2 - '@ungap/structured-clone': 1.2.0 - hast-util-from-parse5: 8.0.1 - hast-util-to-parse5: 8.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.1.0 - parse5: 7.1.2 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 + '@types/hast': 2.3.4 + '@types/parse5': 6.0.3 + hast-util-from-parse5: 7.1.2 + hast-util-to-parse5: 7.1.0 + html-void-elements: 2.0.1 + parse5: 6.0.1 + unist-util-position: 4.0.4 + unist-util-visit: 4.1.2 + vfile: 5.3.7 web-namespaces: 2.0.1 zwitch: 2.0.4 dev: false - /hast-util-to-estree@3.1.0: - resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} + /hast-util-to-estree@2.3.3: + resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} dependencies: - '@types/estree': 1.0.5 - '@types/estree-jsx': 1.0.3 - '@types/hast': 3.0.3 + '@types/estree': 1.0.1 + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.4 + '@types/unist': 2.0.6 comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - estree-util-attach-comments: 3.0.0 - estree-util-is-identifier-name: 3.0.0 - hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.0 - mdast-util-mdx-jsx: 3.0.0 - mdast-util-mdxjs-esm: 2.0.1 - property-information: 6.4.0 + estree-util-attach-comments: 2.1.1 + estree-util-is-identifier-name: 2.1.0 + hast-util-whitespace: 2.0.1 + mdast-util-mdx-expression: 1.3.2 + mdast-util-mdxjs-esm: 1.3.1 + property-information: 6.2.0 space-separated-tokens: 2.0.2 - style-to-object: 0.4.4 - unist-util-position: 5.0.0 + style-to-object: 0.4.2 + unist-util-position: 4.0.4 zwitch: 2.0.4 transitivePeerDependencies: - supports-color + dev: false - /hast-util-to-jsx-runtime@2.3.0: - resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} - dependencies: - '@types/estree': 1.0.5 - '@types/hast': 3.0.3 - '@types/unist': 3.0.2 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 - hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.0 - mdast-util-mdx-jsx: 3.0.0 - mdast-util-mdxjs-esm: 2.0.1 - property-information: 6.4.0 - space-separated-tokens: 2.0.2 - style-to-object: 1.0.5 - unist-util-position: 5.0.0 - vfile-message: 4.0.2 - transitivePeerDependencies: - - supports-color - - /hast-util-to-parse5@8.0.0: - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + /hast-util-to-parse5@7.1.0: + resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==} dependencies: - '@types/hast': 3.0.3 + '@types/hast': 2.3.4 comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - property-information: 6.4.0 + property-information: 6.2.0 space-separated-tokens: 2.0.2 web-namespaces: 2.0.1 zwitch: 2.0.4 dev: false - /hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - dependencies: - '@types/hast': 3.0.3 + /hast-util-whitespace@2.0.1: + resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + dev: false - /hastscript@8.0.0: - resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + /hastscript@7.2.0: + resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} dependencies: - '@types/hast': 3.0.3 + '@types/hast': 2.3.4 comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 4.0.0 - property-information: 6.4.0 + hast-util-parse-selector: 3.1.1 + property-information: 6.2.0 space-separated-tokens: 2.0.2 dev: false @@ -9313,7 +8886,7 @@ packages: /history@4.10.1: resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} dependencies: - '@babel/runtime': 7.23.8 + '@babel/runtime': 7.21.0 loose-envify: 1.4.0 resolve-pathname: 3.0.0 tiny-invariant: 1.3.1 @@ -9357,8 +8930,8 @@ packages: whatwg-encoding: 2.0.0 dev: true - /html-entities@2.4.0: - resolution: {integrity: sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==} + /html-entities@2.3.3: + resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==} /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -9369,12 +8942,12 @@ packages: hasBin: true dependencies: camel-case: 4.1.2 - clean-css: 5.3.3 + clean-css: 5.3.2 commander: 8.3.0 he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.26.0 + terser: 5.19.2 /html-minifier-terser@7.2.0: resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} @@ -9382,24 +8955,24 @@ packages: hasBin: true dependencies: camel-case: 4.1.2 - clean-css: 5.3.3 + clean-css: 5.3.2 commander: 10.0.1 entities: 4.5.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.26.0 + terser: 5.19.2 dev: false - /html-tags@3.3.1: - resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + /html-tags@3.2.0: + resolution: {integrity: sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==} engines: {node: '>=8'} dev: false - /html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + /html-void-elements@2.0.1: + resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} dev: false - /html-webpack-plugin@5.5.0(webpack@5.89.0): + /html-webpack-plugin@5.5.0(webpack@5.88.2): resolution: {integrity: sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==} engines: {node: '>=10.13.0'} peerDependencies: @@ -9410,28 +8983,7 @@ packages: lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) - dev: true - - /html-webpack-plugin@5.6.0(webpack@5.89.0): - resolution: {integrity: sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==} - engines: {node: '>=10.13.0'} - peerDependencies: - '@rspack/core': 0.x || 1.x - webpack: ^5.20.0 - peerDependenciesMeta: - '@rspack/core': - optional: true - webpack: - optional: true - dependencies: - '@types/html-minifier-terser': 6.1.0 - html-minifier-terser: 6.1.0 - lodash: 4.17.21 - pretty-error: 4.0.0 - tapable: 2.2.1 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) - dev: false + webpack: 5.88.2(webpack-cli@5.1.4) /htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} @@ -9441,12 +8993,12 @@ packages: domutils: 2.8.0 entities: 2.2.0 - /htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + /htmlparser2@8.0.1: + resolution: {integrity: sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==} dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 - domutils: 3.1.0 + domutils: 3.0.1 entities: 4.5.0 dev: false @@ -9498,7 +9050,7 @@ packages: transitivePeerDependencies: - supports-color - /http-proxy-middleware@2.0.6(@types/express@4.17.21): + /http-proxy-middleware@2.0.6(@types/express@4.17.17): resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} engines: {node: '>=12.0.0'} peerDependencies: @@ -9507,8 +9059,8 @@ packages: '@types/express': optional: true dependencies: - '@types/express': 4.17.21 - '@types/http-proxy': 1.17.14 + '@types/express': 4.17.17 + '@types/http-proxy': 1.17.10 http-proxy: 1.18.1 is-glob: 4.0.3 is-plain-obj: 3.0.0 @@ -9521,7 +9073,7 @@ packages: engines: {node: '>=8.0.0'} dependencies: eventemitter3: 4.0.7 - follow-redirects: 1.15.5 + follow-redirects: 1.15.2 requires-port: 1.0.0 transitivePeerDependencies: - debug @@ -9549,8 +9101,8 @@ packages: - supports-color dev: true - /http2-wrapper@2.2.1: - resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + /http2-wrapper@2.2.0: + resolution: {integrity: sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==} engines: {node: '>=10.19.0'} dependencies: quick-lru: 5.1.1 @@ -9592,13 +9144,13 @@ packages: dependencies: safer-buffer: 2.1.2 - /icss-utils@5.1.0(postcss@8.4.31): + /icss-utils@5.1.0(postcss@8.4.21): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.31 + postcss: 8.4.21 /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -9615,24 +9167,20 @@ packages: dependencies: minimatch: 9.0.3 - /ignore@5.3.0: - resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} - /image-size@1.1.1: - resolution: {integrity: sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==} - engines: {node: '>=16.x'} + /image-size@1.0.2: + resolution: {integrity: sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==} + engines: {node: '>=14.0.0'} hasBin: true dependencies: queue: 6.0.2 dev: false - /immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - dev: true - - /immer@9.0.21: - resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + /immer@9.0.19: + resolution: {integrity: sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ==} dev: false /immutability-helper@3.1.1: @@ -9710,9 +9258,7 @@ packages: /inline-style-parser@0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - - /inline-style-parser@0.2.2: - resolution: {integrity: sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==} + dev: false /inline-style-prefixer@6.0.4: resolution: {integrity: sha512-FwXmZC2zbeeS7NzGjJ6pAiqRhXR0ugUShSNb6GApMl6da0/XGc4MOJsoWAywia52EEWbXNSy0pzkwz/+Y+swSg==} @@ -9745,10 +9291,9 @@ packages: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} dependencies: - get-intrinsic: 1.2.2 - has: 1.0.4 + get-intrinsic: 1.2.0 + has: 1.0.3 side-channel: 1.0.4 - dev: true /interpret@1.4.0: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} @@ -9763,49 +9308,49 @@ packages: dependencies: loose-envify: 1.4.0 - /ip@2.0.1: - resolution: {integrity: sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==} + /ip@2.0.0: + resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - /ipaddr.js@2.1.0: - resolution: {integrity: sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==} + /ipaddr.js@2.0.1: + resolution: {integrity: sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==} engines: {node: '>= 10'} /is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + dev: false /is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} dependencies: is-alphabetical: 2.0.1 is-decimal: 2.0.1 + dev: false + + /is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - is-typed-array: 1.1.12 - dev: true + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + is-typed-array: 1.1.10 /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - /is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true - /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 - dev: true /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} @@ -9817,43 +9362,39 @@ packages: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.2 has-tostringtag: 1.0.0 - dev: true - /is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} - dependencies: - builtin-modules: 3.3.0 - dev: true + /is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + dev: false /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - dev: true /is-ci@3.0.1: resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} hasBin: true dependencies: - ci-info: 3.9.0 + ci-info: 3.8.0 dev: false - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + /is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} dependencies: - hasown: 2.0.0 + has: 1.0.3 /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - dev: true /is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + dev: false /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} @@ -9869,12 +9410,6 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - /is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} - dependencies: - call-bind: 1.0.5 - dev: true - /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -9882,14 +9417,6 @@ packages: /is-generator-fn@2.1.0: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} - dev: true - - /is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} - dependencies: - has-tostringtag: 1.0.0 - dev: true /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} @@ -9899,6 +9426,7 @@ packages: /is-hexadecimal@2.0.1: resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + dev: false /is-installed-globally@0.4.0: resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} @@ -9917,12 +9445,10 @@ packages: /is-map@2.0.2: resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} - dev: true /is-negative-zero@2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} - dev: true /is-npm@6.0.0: resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} @@ -9934,7 +9460,6 @@ packages: engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - dev: true /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} @@ -9990,18 +9515,18 @@ packages: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: true - /is-reference@3.0.2: - resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + /is-reference@3.0.1: + resolution: {integrity: sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.1 + dev: false /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.2 has-tostringtag: 1.0.0 - dev: true /is-regexp@1.0.0: resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} @@ -10021,13 +9546,11 @@ packages: /is-set@2.0.2: resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} - dev: true /is-shared-array-buffer@1.0.2: resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} dependencies: - call-bind: 1.0.5 - dev: true + call-bind: 1.0.2 /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} @@ -10038,7 +9561,6 @@ packages: engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.0 - dev: true /is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} @@ -10052,14 +9574,16 @@ packages: engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 - dev: true - /is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + /is-typed-array@1.1.10: + resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==} engines: {node: '>= 0.4'} dependencies: - which-typed-array: 1.1.11 - dev: true + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 /is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} @@ -10073,20 +9597,17 @@ packages: /is-weakmap@2.0.1: resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} - dev: true /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: - call-bind: 1.0.5 - dev: true + call-bind: 1.0.2 /is-weakset@2.0.2: resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - dev: true + call-bind: 1.0.2 + get-intrinsic: 1.2.0 /is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} @@ -10112,7 +9633,6 @@ packages: /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true /isbinaryfile@4.0.10: resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} @@ -10132,42 +9652,26 @@ packages: /istanbul-lib-coverage@3.2.0: resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} - dev: true /istanbul-lib-instrument@5.2.1: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.23.7 - '@babel/parser': 7.23.6 + '@babel/core': 7.22.10 + '@babel/parser': 7.22.10 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true - - /istanbul-lib-instrument@6.0.1: - resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==} - engines: {node: '>=10'} - dependencies: - '@babel/core': 7.23.7 - '@babel/parser': 7.23.6 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - dev: true - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} + /istanbul-lib-report@3.0.0: + resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} + engines: {node: '>=8'} dependencies: istanbul-lib-coverage: 3.2.0 - make-dir: 4.0.0 + make-dir: 3.1.0 supports-color: 7.2.0 - dev: true /istanbul-lib-source-maps@4.0.1: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} @@ -10178,32 +9682,20 @@ packages: source-map: 0.6.1 transitivePeerDependencies: - supports-color - dev: true - /istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + /istanbul-reports@3.1.5: + resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} engines: {node: '>=8'} dependencies: html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - dev: true - - /iterator.prototype@1.1.2: - resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} - dependencies: - define-properties: 1.2.1 - get-intrinsic: 1.2.2 - has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.4 - set-function-name: 2.0.1 - dev: true + istanbul-lib-report: 3.0.0 /itertools@2.1.1: resolution: {integrity: sha512-T0icRZBQfWSwhdeBvJT3Sg1m3lBOv1RCD2m+vnY7F12sIInidVDLIn5Fbu1/1gAMN8XIjzkDP48ukF7mTRn/fw==} dev: false - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + /jackspeak@2.2.2: + resolution: {integrity: sha512-mgNtVv4vUuaKA97yxUHoA3+FkuhtxkjdXEWOyB/N76fjy0FjezEt34oy3epBtvCvS+7DyKwqCFWx/oJLV5+kCg==} engines: {node: '>=14'} dependencies: '@isaacs/cliui': 8.0.2 @@ -10220,51 +9712,42 @@ packages: filelist: 1.0.4 minimatch: 3.1.2 - /jclass@1.2.1: - resolution: {integrity: sha512-mRx8uv1qJLOtxbRf3IWOQIH2ro7VIPn6ZkhbTcUJvJEslLzYA7BSATXDi/GR1yKYV9DASsjTZL+0YJPdqSMznw==} - engines: {node: '>= 0.6'} - dev: false - - /jest-changed-files@29.7.0: - resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + /jest-changed-files@29.5.0: + resolution: {integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: execa: 5.1.1 - jest-util: 29.7.0 p-limit: 3.1.0 - dev: true - /jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + /jest-circus@29.5.0: + resolution: {integrity: sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.18.9 + '@jest/environment': 29.6.2 + '@jest/expect': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/types': 29.6.1 + '@types/node': 16.18.40 chalk: 4.1.2 co: 4.6.0 - dedent: 1.5.1 + dedent: 0.7.0 is-generator-fn: 2.1.0 - jest-each: 29.7.0 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 + jest-each: 29.5.0 + jest-matcher-utils: 29.5.0 + jest-message-util: 29.6.2 + jest-runtime: 29.5.0 + jest-snapshot: 29.5.0 + jest-util: 29.6.2 p-limit: 3.1.0 - pretty-format: 29.7.0 - pure-rand: 6.0.4 + pretty-format: 29.6.2 + pure-rand: 6.0.0 slash: 3.0.0 stack-utils: 2.0.6 transitivePeerDependencies: - - babel-plugin-macros - supports-color - dev: true - /jest-cli@29.7.0(@types/node@18.18.9)(ts-node@10.9.1): - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + /jest-cli@29.5.0(@types/node@16.18.13)(ts-node@10.9.1): + resolution: {integrity: sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -10273,26 +9756,25 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0(ts-node@10.9.1) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 + '@jest/core': 29.5.0(ts-node@10.9.1) + '@jest/test-result': 29.5.0 + '@jest/types': 29.6.1 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.18.9)(ts-node@10.9.1) exit: 0.1.2 + graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.18.9)(ts-node@10.9.1) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 + jest-config: 29.5.0(@types/node@16.18.13)(ts-node@10.9.1) + jest-util: 29.6.2 + jest-validate: 29.5.0 + prompts: 2.4.2 + yargs: 17.7.1 transitivePeerDependencies: - '@types/node' - - babel-plugin-macros - supports-color - ts-node - dev: true - /jest-config@29.7.0(@types/node@18.18.9)(ts-node@10.9.1): - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + /jest-config@29.5.0(@types/node@16.18.13)(ts-node@10.9.1): + resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@types/node': '*' @@ -10303,62 +9785,96 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.23.7 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.18.9 - babel-jest: 29.7.0(@babel/core@7.23.7) + '@babel/core': 7.22.10 + '@jest/test-sequencer': 29.5.0 + '@jest/types': 29.6.1 + '@types/node': 16.18.13 + babel-jest: 29.5.0(@babel/core@7.22.10) chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 + ci-info: 3.8.0 + deepmerge: 4.3.0 glob: 7.2.3 graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 + jest-circus: 29.5.0 + jest-environment-node: 29.5.0 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.5.0 + jest-runner: 29.5.0 + jest-util: 29.6.2 + jest-validate: 29.5.0 micromatch: 4.0.5 parse-json: 5.2.0 - pretty-format: 29.7.0 + pretty-format: 29.6.2 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1(@types/node@18.18.9)(typescript@5.2.2) + ts-node: 10.9.1(@types/node@16.18.13)(typescript@5.1.6) transitivePeerDependencies: - - babel-plugin-macros - supports-color - dev: true - /jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + /jest-config@29.5.0(@types/node@16.18.40)(ts-node@10.9.1): + resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true dependencies: + '@babel/core': 7.22.10 + '@jest/test-sequencer': 29.5.0 + '@jest/types': 29.6.1 + '@types/node': 16.18.40 + babel-jest: 29.5.0(@babel/core@7.22.10) chalk: 4.1.2 - diff-sequences: 29.6.3 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - dev: true + ci-info: 3.8.0 + deepmerge: 4.3.0 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.5.0 + jest-environment-node: 29.5.0 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.5.0 + jest-runner: 29.5.0 + jest-util: 29.6.2 + jest-validate: 29.5.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.6.2 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.1(@types/node@16.18.13)(typescript@5.1.6) + transitivePeerDependencies: + - supports-color + + /jest-diff@29.5.0: + resolution: {integrity: sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.4.3 + jest-get-type: 29.4.3 + pretty-format: 29.6.2 - /jest-docblock@29.7.0: - resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + /jest-docblock@29.4.3: + resolution: {integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: detect-newline: 3.1.0 - dev: true - /jest-each@29.7.0: - resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + /jest-each@29.5.0: + resolution: {integrity: sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.3 + '@jest/types': 29.6.1 chalk: 4.1.2 - jest-get-type: 29.6.3 - jest-util: 29.7.0 - pretty-format: 29.7.0 - dev: true + jest-get-type: 29.4.3 + jest-util: 29.6.2 + pretty-format: 29.6.2 /jest-environment-jsdom@29.6.2: resolution: {integrity: sha512-7oa/+266AAEgkzae8i1awNEfTfjwawWKLpiw2XesZmaoVVj9u9t8JOYx18cG29rbPNtkUlZ8V4b5Jb36y/VxoQ==} @@ -10369,13 +9885,13 @@ packages: canvas: optional: true dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 + '@jest/environment': 29.6.2 + '@jest/fake-timers': 29.6.2 + '@jest/types': 29.6.1 '@types/jsdom': 20.0.1 - '@types/node': 18.18.9 - jest-mock: 29.7.0 - jest-util: 29.7.0 + '@types/node': 16.18.40 + jest-mock: 29.6.2 + jest-util: 29.6.2 jsdom: 20.0.3 transitivePeerDependencies: - bufferutil @@ -10383,85 +9899,78 @@ packages: - utf-8-validate dev: true - /jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + /jest-environment-node@29.5.0: + resolution: {integrity: sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.18.9 - jest-mock: 29.7.0 - jest-util: 29.7.0 - dev: true + '@jest/environment': 29.6.2 + '@jest/fake-timers': 29.6.2 + '@jest/types': 29.6.1 + '@types/node': 16.18.40 + jest-mock: 29.6.2 + jest-util: 29.6.2 - /jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + /jest-get-type@29.4.3: + resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - /jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + /jest-haste-map@29.5.0: + resolution: {integrity: sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.3 - '@types/graceful-fs': 4.1.8 - '@types/node': 18.18.9 + '@jest/types': 29.6.1 + '@types/graceful-fs': 4.1.6 + '@types/node': 16.18.40 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - jest-worker: 29.7.0 + jest-regex-util: 29.4.3 + jest-util: 29.6.2 + jest-worker: 29.5.0 micromatch: 4.0.5 walker: 1.0.8 optionalDependencies: - fsevents: 2.3.3 - dev: true + fsevents: 2.3.2 - /jest-leak-detector@29.7.0: - resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + /jest-leak-detector@29.5.0: + resolution: {integrity: sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - dev: true + jest-get-type: 29.4.3 + pretty-format: 29.6.2 - /jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + /jest-matcher-utils@29.5.0: + resolution: {integrity: sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - dev: true + jest-diff: 29.5.0 + jest-get-type: 29.4.3 + pretty-format: 29.6.2 - /jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + /jest-message-util@29.6.2: + resolution: {integrity: sha512-vnIGYEjoPSuRqV8W9t+Wow95SDp6KPX2Uf7EoeG9G99J2OVh7OSwpS4B6J0NfpEIpfkBNHlBZpA2rblEuEFhZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.23.5 - '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.2 + '@babel/code-frame': 7.22.10 + '@jest/types': 29.6.1 + '@types/stack-utils': 2.0.1 chalk: 4.1.2 graceful-fs: 4.2.11 micromatch: 4.0.5 - pretty-format: 29.7.0 + pretty-format: 29.6.2 slash: 3.0.0 stack-utils: 2.0.6 - dev: true - /jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + /jest-mock@29.6.2: + resolution: {integrity: sha512-hoSv3lb3byzdKfwqCuT6uTscan471GUECqgNYykg6ob0yiAw3zYc7OrPnI9Qv8Wwoa4lC7AZ9hyS4AiIx5U2zg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.3 - '@types/node': 18.18.9 - jest-util: 29.7.0 - dev: true + '@jest/types': 29.6.1 + '@types/node': 16.18.40 + jest-util: 29.6.2 - /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + /jest-pnp-resolver@1.2.3(jest-resolve@29.5.0): resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} engines: {node: '>=6'} peerDependencies: @@ -10470,182 +9979,176 @@ packages: jest-resolve: optional: true dependencies: - jest-resolve: 29.7.0 - dev: true + jest-resolve: 29.5.0 - /jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + /jest-regex-util@29.4.3: + resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - /jest-resolve-dependencies@29.7.0: - resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + /jest-resolve-dependencies@29.5.0: + resolution: {integrity: sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - jest-regex-util: 29.6.3 - jest-snapshot: 29.7.0 + jest-regex-util: 29.4.3 + jest-snapshot: 29.5.0 transitivePeerDependencies: - supports-color - dev: true - /jest-resolve@29.7.0: - resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + /jest-resolve@29.5.0: + resolution: {integrity: sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) - jest-util: 29.7.0 - jest-validate: 29.7.0 - resolve: 1.22.8 - resolve.exports: 2.0.2 + jest-haste-map: 29.5.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.5.0) + jest-util: 29.6.2 + jest-validate: 29.5.0 + resolve: 1.22.4 + resolve.exports: 2.0.1 slash: 3.0.0 - dev: true - /jest-runner@29.7.0: - resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + /jest-runner@29.5.0: + resolution: {integrity: sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/console': 29.7.0 - '@jest/environment': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.18.9 + '@jest/console': 29.5.0 + '@jest/environment': 29.6.2 + '@jest/test-result': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.6.1 + '@types/node': 16.18.40 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 - jest-docblock: 29.7.0 - jest-environment-node: 29.7.0 - jest-haste-map: 29.7.0 - jest-leak-detector: 29.7.0 - jest-message-util: 29.7.0 - jest-resolve: 29.7.0 - jest-runtime: 29.7.0 - jest-util: 29.7.0 - jest-watcher: 29.7.0 - jest-worker: 29.7.0 + jest-docblock: 29.4.3 + jest-environment-node: 29.5.0 + jest-haste-map: 29.5.0 + jest-leak-detector: 29.5.0 + jest-message-util: 29.6.2 + jest-resolve: 29.5.0 + jest-runtime: 29.5.0 + jest-util: 29.6.2 + jest-watcher: 29.5.0 + jest-worker: 29.5.0 p-limit: 3.1.0 source-map-support: 0.5.13 transitivePeerDependencies: - supports-color - dev: true - /jest-runtime@29.7.0: - resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + /jest-runtime@29.5.0: + resolution: {integrity: sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/globals': 29.7.0 - '@jest/source-map': 29.6.3 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.18.9 + '@jest/environment': 29.6.2 + '@jest/fake-timers': 29.6.2 + '@jest/globals': 29.5.0 + '@jest/source-map': 29.4.3 + '@jest/test-result': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.6.1 + '@types/node': 16.18.40 chalk: 4.1.2 - cjs-module-lexer: 1.2.3 - collect-v8-coverage: 1.0.2 + cjs-module-lexer: 1.2.2 + collect-v8-coverage: 1.0.1 glob: 7.2.3 graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 + jest-haste-map: 29.5.0 + jest-message-util: 29.6.2 + jest-mock: 29.6.2 + jest-regex-util: 29.4.3 + jest-resolve: 29.5.0 + jest-snapshot: 29.5.0 + jest-util: 29.6.2 slash: 3.0.0 strip-bom: 4.0.0 transitivePeerDependencies: - supports-color - dev: true - /jest-snapshot@29.7.0: - resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + /jest-snapshot@29.5.0: + resolution: {integrity: sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.23.7 - '@babel/generator': 7.23.6 - '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.7) - '@babel/plugin-syntax-typescript': 7.23.3(@babel/core@7.23.7) - '@babel/types': 7.23.6 - '@jest/expect-utils': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.7) + '@babel/core': 7.22.10 + '@babel/generator': 7.22.10 + '@babel/plugin-syntax-jsx': 7.18.6(@babel/core@7.22.10) + '@babel/plugin-syntax-typescript': 7.20.0(@babel/core@7.22.10) + '@babel/traverse': 7.22.10 + '@babel/types': 7.22.10 + '@jest/expect-utils': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.6.1 + '@types/babel__traverse': 7.18.3 + '@types/prettier': 2.7.2 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.10) chalk: 4.1.2 - expect: 29.7.0 + expect: 29.5.0 graceful-fs: 4.2.11 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 + jest-diff: 29.5.0 + jest-get-type: 29.4.3 + jest-matcher-utils: 29.5.0 + jest-message-util: 29.6.2 + jest-util: 29.6.2 natural-compare: 1.4.0 - pretty-format: 29.7.0 + pretty-format: 29.6.2 semver: 7.5.4 transitivePeerDependencies: - supports-color - dev: true - /jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + /jest-util@29.6.2: + resolution: {integrity: sha512-3eX1qb6L88lJNCFlEADKOkjpXJQyZRiavX1INZ4tRnrBVr2COd3RgcTLyUiEXMNBlDU/cgYq6taUS0fExrWW4w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.3 - '@types/node': 18.18.9 + '@jest/types': 29.6.1 + '@types/node': 16.18.40 chalk: 4.1.2 - ci-info: 3.9.0 + ci-info: 3.8.0 graceful-fs: 4.2.11 picomatch: 2.3.1 - /jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + /jest-validate@29.5.0: + resolution: {integrity: sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/types': 29.6.3 + '@jest/types': 29.6.1 camelcase: 6.3.0 chalk: 4.1.2 - jest-get-type: 29.6.3 + jest-get-type: 29.4.3 leven: 3.1.0 - pretty-format: 29.7.0 - dev: true + pretty-format: 29.6.2 - /jest-watcher@29.7.0: - resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + /jest-watcher@29.5.0: + resolution: {integrity: sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.18.9 + '@jest/test-result': 29.5.0 + '@jest/types': 29.6.1 + '@types/node': 16.18.40 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 - jest-util: 29.7.0 + jest-util: 29.6.2 string-length: 4.0.2 - dev: true /jest-worker@27.5.1: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 18.18.9 + '@types/node': 16.18.40 merge-stream: 2.0.0 supports-color: 8.1.1 - /jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + /jest-worker@29.5.0: + resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 18.18.9 - jest-util: 29.7.0 + '@types/node': 16.18.40 + jest-util: 29.6.2 merge-stream: 2.0.0 supports-color: 8.1.1 - /jest@29.7.0(@types/node@18.18.9)(ts-node@10.9.1): - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + /jest@29.5.0(@types/node@16.18.13)(ts-node@10.9.1): + resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -10654,23 +10157,17 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0(ts-node@10.9.1) - '@jest/types': 29.6.3 + '@jest/core': 29.5.0(ts-node@10.9.1) + '@jest/types': 29.6.1 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@18.18.9)(ts-node@10.9.1) + jest-cli: 29.5.0(@types/node@16.18.13)(ts-node@10.9.1) transitivePeerDependencies: - '@types/node' - - babel-plugin-macros - supports-color - ts-node - dev: true - - /jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} - hasBin: true - /joi@17.11.1: - resolution: {integrity: sha512-671acnrx+w96PCcQOzvm0VYQVwNL2PVgZmDRaFuSsx8sIUmGzYElPw5lU8F3Cr0jOuPs1oM56p7W2a1cdDOwcw==} + /joi@17.8.3: + resolution: {integrity: sha512-q5Fn6Tj/jR8PfrLrx4fpGH4v9qM6o+vDUfD4/3vxxyg34OmKcNqYZ1qn2mpLza96S8tL0p0rIw2gOZX+/cTg9w==} dependencies: '@hapi/hoek': 9.3.0 '@hapi/topo': 5.1.0 @@ -10682,6 +10179,9 @@ packages: resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} dev: false + /js-sdsl@4.4.0: + resolution: {integrity: sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==} + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -10708,7 +10208,7 @@ packages: optional: true dependencies: abab: 2.0.6 - acorn: 8.11.3 + acorn: 8.10.0 acorn-globals: 7.0.1 cssom: 0.5.0 cssstyle: 2.3.0 @@ -10731,7 +10231,7 @@ packages: whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 - ws: 8.16.0 + ws: 8.13.0 xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil @@ -10748,14 +10248,9 @@ packages: engines: {node: '>=4'} hasBin: true - /jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true - dev: true - /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: false /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -10784,7 +10279,6 @@ packages: hasBin: true dependencies: minimist: 1.2.8 - dev: true /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} @@ -10794,7 +10288,7 @@ packages: /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: - universalify: 2.0.1 + universalify: 2.0.0 optionalDependencies: graceful-fs: 4.2.11 @@ -10802,24 +10296,13 @@ packages: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} - /jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + /jsx-ast-utils@3.3.3: + resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==} engines: {node: '>=4.0'} dependencies: - array-includes: 3.1.7 - array.prototype.flat: 1.3.2 - object.assign: 4.1.5 - object.values: 1.1.7 - dev: true - - /jszip@3.10.1: - resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} - dependencies: - lie: 3.3.0 - pako: 1.0.11 - readable-stream: 2.3.8 - setimmediate: 1.0.5 - dev: true + array-includes: 3.1.6 + object.assign: 4.1.4 + dev: false /just-diff-apply@5.5.0: resolution: {integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==} @@ -10831,10 +10314,11 @@ packages: resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==} dev: true - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + /keyv@4.5.3: + resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} dependencies: json-buffer: 3.0.1 + dev: false /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} @@ -10844,20 +10328,24 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + /kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: false + /klona@2.0.6: resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} engines: {node: '>= 8'} - dev: true /language-subtag-registry@0.3.22: resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} - dev: true + dev: false /language-tags@1.0.5: resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==} dependencies: language-subtag-registry: 0.3.22 - dev: true + dev: false /latest-version@7.0.0: resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} @@ -10866,13 +10354,6 @@ packages: package-json: 8.1.1 dev: false - /launch-editor@2.6.1: - resolution: {integrity: sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==} - dependencies: - picocolors: 1.0.0 - shell-quote: 1.8.1 - dev: false - /leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -10884,12 +10365,6 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 - /lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - dependencies: - immediate: 3.0.6 - dev: true - /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -10897,6 +10372,10 @@ packages: /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + /listenercount@1.0.1: + resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==} + dev: true + /load-json-file@6.2.0: resolution: {integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==} engines: {node: '>=8'} @@ -10970,9 +10449,17 @@ packages: p-locate: 6.0.0 dev: false + /lodash.curry@4.1.1: + resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==} + dev: false + /lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + /lodash.flow@3.5.0: + resolution: {integrity: sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==} + dev: false + /lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} dev: true @@ -10999,6 +10486,7 @@ packages: /longest-streak@3.1.0: resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + dev: false /loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} @@ -11008,7 +10496,6 @@ packages: /loupe@2.3.6: resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} - deprecated: Please upgrade to 2.3.7 which fixes GHSA-4q6p-r6v2-jvc5 dependencies: get-func-name: 2.0.0 dev: true @@ -11016,15 +10503,15 @@ packages: /lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} dependencies: - tslib: 2.6.2 + tslib: 2.6.1 /lowercase-keys@3.0.0: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: false - /lru-cache@10.0.1: - resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} + /lru-cache@10.0.0: + resolution: {integrity: sha512-svTf/fzsKHffP42sujkO/Rjs37BCIsQVRCeNYIm9WN8rgT7ffoUnRtZCqU+6BqcSBdv8gwJeTz8knJpgACeQMw==} engines: {node: 14 || >=16.14} /lru-cache@5.1.1: @@ -11047,16 +10534,14 @@ packages: hasBin: true dev: true - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} dependencies: - semver: 7.5.4 - dev: true + semver: 6.3.1 /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: true /make-fetch-happen@10.2.1: resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} @@ -11132,7 +10617,6 @@ packages: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: tmpl: 1.0.5 - dev: true /map-age-cleaner@0.1.3: resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==} @@ -11150,25 +10634,33 @@ packages: engines: {node: '>=8'} dev: true - /markdown-extensions@2.0.0: - resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} - engines: {node: '>=16'} + /markdown-extensions@1.1.1: + resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} + engines: {node: '>=0.10.0'} + dev: false /markdown-table@3.0.3: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} dev: false - /mdast-util-directive@3.0.0: - resolution: {integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==} + /mdast-util-definitions@5.1.2: + resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} + dependencies: + '@types/mdast': 3.0.10 + '@types/unist': 2.0.6 + unist-util-visit: 4.1.2 + dev: false + + /mdast-util-directive@2.2.4: + resolution: {integrity: sha512-sK3ojFP+jpj1n7Zo5ZKvoxP1MvLyzVG63+gm40Z/qI00avzdPCYxt7RBMgofwAva9gBjbDBWVRB/i+UD+fUCzQ==} dependencies: - '@types/mdast': 4.0.3 - '@types/unist': 3.0.2 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 + '@types/mdast': 3.0.10 + '@types/unist': 2.0.6 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 parse-entities: 4.0.1 stringify-entities: 4.0.3 - unist-util-visit-parents: 6.0.1 + unist-util-visit-parents: 5.1.3 transitivePeerDependencies: - supports-color dev: false @@ -11182,204 +10674,174 @@ packages: unist-util-visit-parents: 5.1.3 dev: false - /mdast-util-find-and-replace@3.0.1: - resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} - dependencies: - '@types/mdast': 4.0.3 - escape-string-regexp: 5.0.0 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - dev: false - - /mdast-util-from-markdown@2.0.0: - resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + /mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} dependencies: - '@types/mdast': 4.0.3 - '@types/unist': 3.0.2 + '@types/mdast': 3.0.10 + '@types/unist': 2.0.6 decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - mdast-util-to-string: 4.0.0 - micromark: 4.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-decode-string: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - unist-util-stringify-position: 4.0.0 - transitivePeerDependencies: - - supports-color - - /mdast-util-frontmatter@2.0.1: - resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} - dependencies: - '@types/mdast': 4.0.3 - devlop: 1.1.0 - escape-string-regexp: 5.0.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - micromark-extension-frontmatter: 2.0.0 + mdast-util-to-string: 3.2.0 + micromark: 3.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-decode-string: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-stringify-position: 3.0.3 + uvu: 0.5.6 transitivePeerDependencies: - supports-color dev: false - /mdast-util-gfm-autolink-literal@2.0.0: - resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} + /mdast-util-gfm-autolink-literal@1.0.3: + resolution: {integrity: sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==} dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 3.0.10 ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-find-and-replace: 3.0.1 - micromark-util-character: 2.0.1 + mdast-util-find-and-replace: 2.2.2 + micromark-util-character: 1.2.0 dev: false - /mdast-util-gfm-footnote@2.0.0: - resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + /mdast-util-gfm-footnote@1.0.2: + resolution: {integrity: sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==} dependencies: - '@types/mdast': 4.0.3 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - micromark-util-normalize-identifier: 2.0.0 - transitivePeerDependencies: - - supports-color + '@types/mdast': 3.0.10 + mdast-util-to-markdown: 1.5.0 + micromark-util-normalize-identifier: 1.1.0 dev: false - /mdast-util-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + /mdast-util-gfm-strikethrough@1.0.3: + resolution: {integrity: sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==} dependencies: - '@types/mdast': 4.0.3 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color + '@types/mdast': 3.0.10 + mdast-util-to-markdown: 1.5.0 dev: false - /mdast-util-gfm-table@2.0.0: - resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + /mdast-util-gfm-table@1.0.7: + resolution: {integrity: sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==} dependencies: - '@types/mdast': 4.0.3 - devlop: 1.1.0 + '@types/mdast': 3.0.10 markdown-table: 3.0.3 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 transitivePeerDependencies: - supports-color dev: false - /mdast-util-gfm-task-list-item@2.0.0: - resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + /mdast-util-gfm-task-list-item@1.0.2: + resolution: {integrity: sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==} dependencies: - '@types/mdast': 4.0.3 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color + '@types/mdast': 3.0.10 + mdast-util-to-markdown: 1.5.0 dev: false - /mdast-util-gfm@3.0.0: - resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + /mdast-util-gfm@2.0.2: + resolution: {integrity: sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==} dependencies: - mdast-util-from-markdown: 2.0.0 - mdast-util-gfm-autolink-literal: 2.0.0 - mdast-util-gfm-footnote: 2.0.0 - mdast-util-gfm-strikethrough: 2.0.0 - mdast-util-gfm-table: 2.0.0 - mdast-util-gfm-task-list-item: 2.0.0 - mdast-util-to-markdown: 2.1.0 + mdast-util-from-markdown: 1.3.1 + mdast-util-gfm-autolink-literal: 1.0.3 + mdast-util-gfm-footnote: 1.0.2 + mdast-util-gfm-strikethrough: 1.0.3 + mdast-util-gfm-table: 1.0.7 + mdast-util-gfm-task-list-item: 1.0.2 + mdast-util-to-markdown: 1.5.0 transitivePeerDependencies: - supports-color dev: false - /mdast-util-mdx-expression@2.0.0: - resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} + /mdast-util-mdx-expression@1.3.2: + resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} dependencies: - '@types/estree-jsx': 1.0.3 - '@types/hast': 3.0.3 - '@types/mdast': 4.0.3 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.4 + '@types/mdast': 3.0.10 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 transitivePeerDependencies: - supports-color + dev: false - /mdast-util-mdx-jsx@3.0.0: - resolution: {integrity: sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA==} + /mdast-util-mdx-jsx@2.1.4: + resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} dependencies: - '@types/estree-jsx': 1.0.3 - '@types/hast': 3.0.3 - '@types/mdast': 4.0.3 - '@types/unist': 3.0.2 + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.4 + '@types/mdast': 3.0.10 + '@types/unist': 2.0.6 ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 parse-entities: 4.0.1 stringify-entities: 4.0.3 - unist-util-remove-position: 5.0.0 - unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.2 + unist-util-remove-position: 4.0.2 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 transitivePeerDependencies: - supports-color + dev: false - /mdast-util-mdx@3.0.0: - resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + /mdast-util-mdx@2.0.1: + resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} dependencies: - mdast-util-from-markdown: 2.0.0 - mdast-util-mdx-expression: 2.0.0 - mdast-util-mdx-jsx: 3.0.0 - mdast-util-mdxjs-esm: 2.0.1 - mdast-util-to-markdown: 2.1.0 + mdast-util-from-markdown: 1.3.1 + mdast-util-mdx-expression: 1.3.2 + mdast-util-mdx-jsx: 2.1.4 + mdast-util-mdxjs-esm: 1.3.1 + mdast-util-to-markdown: 1.5.0 transitivePeerDependencies: - supports-color + dev: false - /mdast-util-mdxjs-esm@2.0.1: - resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + /mdast-util-mdxjs-esm@1.3.1: + resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} dependencies: - '@types/estree-jsx': 1.0.3 - '@types/hast': 3.0.3 - '@types/mdast': 4.0.3 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 + '@types/estree-jsx': 1.0.0 + '@types/hast': 2.3.4 + '@types/mdast': 3.0.10 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 transitivePeerDependencies: - supports-color + dev: false - /mdast-util-phrasing@4.0.0: - resolution: {integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==} + /mdast-util-phrasing@3.0.1: + resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} dependencies: - '@types/mdast': 4.0.3 - unist-util-is: 6.0.0 + '@types/mdast': 3.0.10 + unist-util-is: 5.2.1 + dev: false - /mdast-util-to-hast@13.1.0: - resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} + /mdast-util-to-hast@12.3.0: + resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} dependencies: - '@types/hast': 3.0.3 - '@types/mdast': 4.0.3 - '@ungap/structured-clone': 1.2.0 - devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.0 + '@types/hast': 2.3.4 + '@types/mdast': 3.0.10 + mdast-util-definitions: 5.1.2 + micromark-util-sanitize-uri: 1.2.0 trim-lines: 3.0.1 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 + unist-util-generated: 2.0.1 + unist-util-position: 4.0.4 + unist-util-visit: 4.1.2 + dev: false - /mdast-util-to-markdown@2.1.0: - resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + /mdast-util-to-markdown@1.5.0: + resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} dependencies: - '@types/mdast': 4.0.3 - '@types/unist': 3.0.2 + '@types/mdast': 3.0.10 + '@types/unist': 2.0.6 longest-streak: 3.1.0 - mdast-util-phrasing: 4.0.0 - mdast-util-to-string: 4.0.0 - micromark-util-decode-string: 2.0.0 - unist-util-visit: 5.0.0 + mdast-util-phrasing: 3.0.1 + mdast-util-to-string: 3.2.0 + micromark-util-decode-string: 1.1.0 + unist-util-visit: 4.1.2 zwitch: 2.0.4 + dev: false - /mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + /mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} dependencies: - '@types/mdast': 4.0.3 + '@types/mdast': 3.0.10 + dev: false /mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} @@ -11425,11 +10887,11 @@ packages: map-age-cleaner: 0.1.3 mimic-fn: 3.1.0 - /memfs@3.5.3: - resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + /memfs@3.4.13: + resolution: {integrity: sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==} engines: {node: '>= 4.0.0'} dependencies: - fs-monkey: 1.0.5 + fs-monkey: 1.0.3 /memoize-one@5.2.1: resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==} @@ -11467,202 +10929,202 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} - /micromark-core-commonmark@2.0.0: - resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} + /micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} dependencies: decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - micromark-factory-destination: 2.0.0 - micromark-factory-label: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-factory-title: 2.0.0 - micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-html-tag-name: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-subtokenize: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - /micromark-extension-directive@3.0.0: - resolution: {integrity: sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==} - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-destination: 1.1.0 + micromark-factory-label: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-factory-title: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-html-tag-name: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-directive@2.2.1: + resolution: {integrity: sha512-ZFKZkNaEqAP86IghX1X7sE8NNnx6kFNq9mSBRvEHjArutTCJZ3LYg6VH151lXVb1JHpmIcW/7rX25oMoIHuSug==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 parse-entities: 4.0.1 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-autolink-literal@1.0.5: + resolution: {integrity: sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==} + dependencies: + micromark-util-character: 1.2.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-extension-gfm-footnote@1.1.2: + resolution: {integrity: sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==} + dependencies: + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-strikethrough@1.0.7: + resolution: {integrity: sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==} + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-table@1.0.7: + resolution: {integrity: sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false + + /micromark-extension-gfm-tagfilter@1.0.2: + resolution: {integrity: sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==} + dependencies: + micromark-util-types: 1.1.0 + dev: false + + /micromark-extension-gfm-task-list-item@1.0.5: + resolution: {integrity: sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==} + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 dev: false - /micromark-extension-frontmatter@2.0.0: - resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} + /micromark-extension-gfm@2.0.3: + resolution: {integrity: sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==} dependencies: - fault: 2.0.1 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-extension-gfm-autolink-literal: 1.0.5 + micromark-extension-gfm-footnote: 1.1.2 + micromark-extension-gfm-strikethrough: 1.0.7 + micromark-extension-gfm-table: 1.0.7 + micromark-extension-gfm-tagfilter: 1.0.2 + micromark-extension-gfm-task-list-item: 1.0.5 + micromark-util-combine-extensions: 1.1.0 + micromark-util-types: 1.1.0 + dev: false + + /micromark-extension-mdx-expression@1.0.8: + resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} + dependencies: + '@types/estree': 1.0.1 + micromark-factory-mdx-expression: 1.0.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 dev: false - /micromark-extension-gfm-autolink-literal@2.0.0: - resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==} + /micromark-extension-mdx-jsx@1.0.5: + resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} dependencies: - micromark-util-character: 2.0.1 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + '@types/acorn': 4.0.6 + '@types/estree': 1.0.1 + estree-util-is-identifier-name: 2.1.0 + micromark-factory-mdx-expression: 1.0.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + vfile-message: 3.1.4 dev: false - /micromark-extension-gfm-footnote@2.0.0: - resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==} + /micromark-extension-mdx-md@1.0.1: + resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} dependencies: - devlop: 1.1.0 - micromark-core-commonmark: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-types: 1.1.0 dev: false - /micromark-extension-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==} + /micromark-extension-mdxjs-esm@1.0.5: + resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + '@types/estree': 1.0.1 + micromark-core-commonmark: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-position-from-estree: 1.1.2 + uvu: 0.5.6 + vfile-message: 3.1.4 dev: false - /micromark-extension-gfm-table@2.0.0: - resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==} + /micromark-extension-mdxjs@1.0.1: + resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + micromark-extension-mdx-expression: 1.0.8 + micromark-extension-mdx-jsx: 1.0.5 + micromark-extension-mdx-md: 1.0.1 + micromark-extension-mdxjs-esm: 1.0.5 + micromark-util-combine-extensions: 1.1.0 + micromark-util-types: 1.1.0 dev: false - /micromark-extension-gfm-tagfilter@2.0.0: - resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + /micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} dependencies: - micromark-util-types: 2.0.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 dev: false - /micromark-extension-gfm-task-list-item@2.0.1: - resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==} + /micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 dev: false - /micromark-extension-gfm@3.0.0: - resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + /micromark-factory-mdx-expression@1.0.9: + resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} dependencies: - micromark-extension-gfm-autolink-literal: 2.0.0 - micromark-extension-gfm-footnote: 2.0.0 - micromark-extension-gfm-strikethrough: 2.0.0 - micromark-extension-gfm-table: 2.0.0 - micromark-extension-gfm-tagfilter: 2.0.0 - micromark-extension-gfm-task-list-item: 2.0.1 - micromark-util-combine-extensions: 2.0.0 - micromark-util-types: 2.0.0 + '@types/estree': 1.0.1 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-position-from-estree: 1.1.2 + uvu: 0.5.6 + vfile-message: 3.1.4 dev: false - /micromark-extension-mdx-expression@3.0.0: - resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} - dependencies: - '@types/estree': 1.0.5 - devlop: 1.1.0 - micromark-factory-mdx-expression: 2.0.1 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-events-to-acorn: 2.0.2 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - /micromark-extension-mdx-jsx@3.0.0: - resolution: {integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==} - dependencies: - '@types/acorn': 4.0.6 - '@types/estree': 1.0.5 - devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 - micromark-factory-mdx-expression: 2.0.1 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - vfile-message: 4.0.2 - - /micromark-extension-mdx-md@2.0.0: - resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} - dependencies: - micromark-util-types: 2.0.0 - - /micromark-extension-mdxjs-esm@3.0.0: - resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} - dependencies: - '@types/estree': 1.0.5 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-events-to-acorn: 2.0.2 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - unist-util-position-from-estree: 2.0.0 - vfile-message: 4.0.2 - - /micromark-extension-mdxjs@3.0.0: - resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} - dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) - micromark-extension-mdx-expression: 3.0.0 - micromark-extension-mdx-jsx: 3.0.0 - micromark-extension-mdx-md: 2.0.0 - micromark-extension-mdxjs-esm: 3.0.0 - micromark-util-combine-extensions: 2.0.0 - micromark-util-types: 2.0.0 - - /micromark-factory-destination@2.0.0: - resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} - dependencies: - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - /micromark-factory-label@2.0.0: - resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} - dependencies: - devlop: 1.1.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - /micromark-factory-mdx-expression@2.0.1: - resolution: {integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==} - dependencies: - '@types/estree': 1.0.5 - devlop: 1.1.0 - micromark-util-character: 2.0.1 - micromark-util-events-to-acorn: 2.0.2 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - unist-util-position-from-estree: 2.0.0 - vfile-message: 4.0.2 - /micromark-factory-space@1.1.0: resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} dependencies: @@ -11670,27 +11132,23 @@ packages: micromark-util-types: 1.1.0 dev: false - /micromark-factory-space@2.0.0: - resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + /micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} dependencies: - micromark-util-character: 2.0.1 - micromark-util-types: 2.0.0 - - /micromark-factory-title@2.0.0: - resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} - dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false - /micromark-factory-whitespace@2.0.0: - resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + /micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false /micromark-util-character@1.2.0: resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} @@ -11699,122 +11157,123 @@ packages: micromark-util-types: 1.1.0 dev: false - /micromark-util-character@2.0.1: - resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==} + /micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} dependencies: - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - /micromark-util-chunked@2.0.0: - resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} - dependencies: - micromark-util-symbol: 2.0.0 + micromark-util-symbol: 1.1.0 + dev: false - /micromark-util-classify-character@2.0.0: - resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + /micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} dependencies: - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + dev: false - /micromark-util-combine-extensions@2.0.0: - resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + /micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} dependencies: - micromark-util-chunked: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-chunked: 1.1.0 + micromark-util-types: 1.1.0 + dev: false - /micromark-util-decode-numeric-character-reference@2.0.1: - resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + /micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} dependencies: - micromark-util-symbol: 2.0.0 + micromark-util-symbol: 1.1.0 + dev: false - /micromark-util-decode-string@2.0.0: - resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + /micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} dependencies: decode-named-character-reference: 1.0.2 - micromark-util-character: 2.0.1 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-symbol: 2.0.0 + micromark-util-character: 1.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-symbol: 1.1.0 + dev: false - /micromark-util-encode@2.0.0: - resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + /micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + dev: false - /micromark-util-events-to-acorn@2.0.2: - resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + /micromark-util-events-to-acorn@1.2.3: + resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} dependencies: '@types/acorn': 4.0.6 - '@types/estree': 1.0.5 - '@types/unist': 3.0.2 - devlop: 1.1.0 - estree-util-visit: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - vfile-message: 4.0.2 + '@types/estree': 1.0.1 + '@types/unist': 2.0.6 + estree-util-visit: 1.2.1 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + vfile-message: 3.1.4 + dev: false - /micromark-util-html-tag-name@2.0.0: - resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + /micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + dev: false - /micromark-util-normalize-identifier@2.0.0: - resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + /micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} dependencies: - micromark-util-symbol: 2.0.0 + micromark-util-symbol: 1.1.0 + dev: false - /micromark-util-resolve-all@2.0.0: - resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + /micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} dependencies: - micromark-util-types: 2.0.0 + micromark-util-types: 1.1.0 + dev: false - /micromark-util-sanitize-uri@2.0.0: - resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + /micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} dependencies: - micromark-util-character: 2.0.1 - micromark-util-encode: 2.0.0 - micromark-util-symbol: 2.0.0 + micromark-util-character: 1.2.0 + micromark-util-encode: 1.1.0 + micromark-util-symbol: 1.1.0 + dev: false - /micromark-util-subtokenize@2.0.0: - resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} + /micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-util-chunked: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + dev: false /micromark-util-symbol@1.1.0: resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} dev: false - /micromark-util-symbol@2.0.0: - resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} - /micromark-util-types@1.1.0: resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} dev: false - /micromark-util-types@2.0.0: - resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} - - /micromark@4.0.0: - resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + /micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} dependencies: - '@types/debug': 4.1.12 + '@types/debug': 4.1.8 debug: 4.3.4(supports-color@8.1.1) decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-chunked: 2.0.0 - micromark-util-combine-extensions: 2.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-encode: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-subtokenize: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-combine-extensions: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-encode: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 transitivePeerDependencies: - supports-color + dev: false /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} @@ -11873,14 +11332,14 @@ packages: engines: {node: '>=4'} dev: true - /mini-css-extract-plugin@2.7.7(webpack@5.89.0): - resolution: {integrity: sha512-+0n11YGyRavUR3IlaOzJ0/4Il1avMvJ1VJfhWfCn24ITQXhRr1gghbhhrda6tgtNcpZaWKdSuwKq20Jb7fnlyw==} + /mini-css-extract-plugin@2.7.3(webpack@5.88.2): + resolution: {integrity: sha512-CD9cXeKeXLcnMw8FZdtfrRrLaM7gwCl4nKuKn2YkY2Bw5wdlB8zU2cCzw+w2zS9RFvbrufTBkMCJACNPwqQA0w==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: - schema-utils: 4.2.0 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) + schema-utils: 4.0.0 + webpack: 5.88.2(webpack-cli@5.1.4) dev: false /minimalistic-assert@1.0.1: @@ -12060,12 +11519,13 @@ packages: yargs-unparser: 2.0.0 dev: true - /moo@0.5.2: - resolution: {integrity: sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==} + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} dev: false - /mrmime@2.0.0: - resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + /mrmime@1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} engines: {node: '>=10'} dev: false @@ -12082,7 +11542,7 @@ packages: resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} hasBin: true dependencies: - dns-packet: 5.6.1 + dns-packet: 5.4.0 thunky: 1.1.0 /multimatch@5.0.0: @@ -12098,14 +11558,6 @@ packages: /mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - dev: true - /nano-css@5.3.5(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-vSB9X12bbNu4ALBu7nigJgRViZ6ja3OU7CeuiV1zMIbXOdmkLahgtPmh3GBOlDxbKY0CitqlPdOReGlBLSp+yg==} peerDependencies: @@ -12113,7 +11565,7 @@ packages: react-dom: '*' dependencies: css-tree: 1.1.3 - csstype: 3.1.3 + csstype: 3.1.1 fastest-stable-stringify: 2.0.2 inline-style-prefixer: 6.0.4 react: 18.2.0 @@ -12130,11 +11582,15 @@ packages: hasBin: true dev: true - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + /natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -12149,17 +11605,6 @@ packages: split2: 3.2.2 through2: 4.0.2 - /nearley@2.20.1(patch_hash=mg2fc7wgvzub3myuz6m74hllma): - resolution: {integrity: sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==} - hasBin: true - dependencies: - commander: 2.20.3 - moo: 0.5.2 - railroad-diagrams: 1.0.0 - randexp: 0.4.6 - dev: false - patched: true - /negotiator@0.6.3: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} @@ -12167,40 +11612,48 @@ packages: /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - /next@13.5.4(@babel/core@7.23.7)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-+93un5S779gho8y9ASQhb/bTkQF17FNQOtXLKAj3lsNgltEcF0C5PMLLncDmH+8X1EnJH1kbqAERa29nRXqhjA==} - engines: {node: '>=16.14.0'} + /next@13.2.3(@babel/core@7.22.10)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-nKFJC6upCPN7DWRx4+0S/1PIOT7vNlCT157w9AzbXEgKy6zkiPKEt5YyRUsRZkmpEqBVrGgOqNfwecTociyg+w==} + engines: {node: '>=14.6.0'} hasBin: true peerDependencies: - '@opentelemetry/api': ^1.1.0 + '@opentelemetry/api': ^1.4.0 + fibers: '>= 3.1.0' + node-sass: ^6.0.0 || ^7.0.0 react: ^18.2.0 || 18 react-dom: ^18.2.0 || 18 sass: ^1.3.0 peerDependenciesMeta: '@opentelemetry/api': optional: true + fibers: + optional: true + node-sass: + optional: true sass: optional: true dependencies: - '@next/env': 13.5.4 - '@swc/helpers': 0.5.2 - busboy: 1.6.0 - caniuse-lite: 1.0.30001588 - postcss: 8.4.31 + '@next/env': 13.2.3 + '@swc/helpers': 0.4.14 + caniuse-lite: 1.0.30001519 + postcss: 8.4.14 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - styled-jsx: 5.1.1(@babel/core@7.23.7)(react@18.2.0) - watchpack: 2.4.0 + styled-jsx: 5.1.1(@babel/core@7.22.10)(react@18.2.0) optionalDependencies: - '@next/swc-darwin-arm64': 13.5.4 - '@next/swc-darwin-x64': 13.5.4 - '@next/swc-linux-arm64-gnu': 13.5.4 - '@next/swc-linux-arm64-musl': 13.5.4 - '@next/swc-linux-x64-gnu': 13.5.4 - '@next/swc-linux-x64-musl': 13.5.4 - '@next/swc-win32-arm64-msvc': 13.5.4 - '@next/swc-win32-ia32-msvc': 13.5.4 - '@next/swc-win32-x64-msvc': 13.5.4 + '@next/swc-android-arm-eabi': 13.2.3 + '@next/swc-android-arm64': 13.2.3 + '@next/swc-darwin-arm64': 13.2.3 + '@next/swc-darwin-x64': 13.2.3 + '@next/swc-freebsd-x64': 13.2.3 + '@next/swc-linux-arm-gnueabihf': 13.2.3 + '@next/swc-linux-arm64-gnu': 13.2.3 + '@next/swc-linux-arm64-musl': 13.2.3 + '@next/swc-linux-x64-gnu': 13.2.3 + '@next/swc-linux-x64-musl': 13.2.3 + '@next/swc-win32-arm64-msvc': 13.2.3 + '@next/swc-win32-ia32-msvc': 13.2.3 + '@next/swc-win32-x64-msvc': 13.2.3 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -12220,20 +11673,27 @@ packages: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: lower-case: 2.0.2 - tslib: 2.6.2 + tslib: 2.6.1 - /node-emoji@2.1.3: - resolution: {integrity: sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==} - engines: {node: '>=18'} + /node-emoji@1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} dependencies: - '@sindresorhus/is': 4.6.0 - char-regex: 1.0.2 - emojilib: 2.4.0 - skin-tone: 2.0.0 + lodash: 4.17.21 dev: false - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + /node-fetch@2.6.12: + resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + + /node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 @@ -12242,6 +11702,7 @@ packages: optional: true dependencies: whatwg-url: 5.0.0 + dev: false /node-forge@1.3.1: resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} @@ -12285,19 +11746,18 @@ packages: transitivePeerDependencies: - supports-color - /node-html-parser@6.1.11: - resolution: {integrity: sha512-FAgwwZ6h0DSDWxfD0Iq1tsDcBCxdJB1nXpLPPxX8YyVWzbfCjKWEzaynF4gZZ/8hziUmp7ZSaKylcn0iKhufUQ==} + /node-html-parser@5.4.2: + resolution: {integrity: sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==} dependencies: - css-select: 5.1.0 + css-select: 4.3.0 he: 1.2.0 dev: false /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - dev: true - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} /nopt@5.0.0: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} @@ -12317,7 +11777,7 @@ packages: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.8 + resolve: 1.22.4 semver: 5.7.2 validate-npm-package-license: 3.0.4 @@ -12326,7 +11786,7 @@ packages: engines: {node: '>=10'} dependencies: hosted-git-info: 4.1.0 - is-core-module: 2.13.1 + is-core-module: 2.13.0 semver: 7.5.4 validate-npm-package-license: 3.0.4 dev: true @@ -12336,7 +11796,7 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: hosted-git-info: 6.1.1 - is-core-module: 2.13.1 + is-core-module: 2.13.0 semver: 7.5.4 validate-npm-package-license: 3.0.4 @@ -12519,64 +11979,61 @@ packages: engines: {node: '>= 6'} dev: true - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + /object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + + /object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + /object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 + call-bind: 1.0.2 + define-properties: 1.2.0 has-symbols: 1.0.3 object-keys: 1.1.1 - /object.entries@1.1.7: - resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} + /object.entries@1.1.6: + resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.2 - dev: true + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: false - /object.fromentries@2.0.7: - resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + /object.fromentries@2.0.6: + resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.2 - dev: true - - /object.groupby@1.0.1: - resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.2 - get-intrinsic: 1.2.2 - dev: true + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: false - /object.hasown@1.1.3: - resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} + /object.hasown@1.1.2: + resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==} dependencies: - define-properties: 1.2.1 - es-abstract: 1.22.2 - dev: true + define-properties: 1.2.0 + es-abstract: 1.21.2 + dev: false - /object.values@1.1.7: - resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + /object.values@1.1.6: + resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.2 - dev: true + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 /obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} @@ -12614,16 +12071,16 @@ packages: resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} hasBin: true - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + /optionator@0.9.1: + resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} engines: {node: '>= 0.8.0'} dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 + word-wrap: 1.2.4 /ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} @@ -12817,15 +12274,11 @@ packages: - bluebird - supports-color - /pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - dev: true - /param-case@3.0.4: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} dependencies: dot-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.6.1 /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} @@ -12844,7 +12297,7 @@ packages: /parse-entities@4.0.1: resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.6 character-entities: 2.0.2 character-entities-legacy: 3.0.0 character-reference-invalid: 2.0.1 @@ -12852,12 +12305,13 @@ packages: is-alphanumerical: 2.0.1 is-decimal: 2.0.1 is-hexadecimal: 2.0.1 + dev: false /parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.22.10 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -12882,6 +12336,10 @@ packages: parse5: 7.1.2 dev: false + /parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: false + /parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} dependencies: @@ -12895,7 +12353,7 @@ packages: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} dependencies: no-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.6.1 /path-absolute@1.0.1: resolution: {integrity: sha512-gds5iRhSeOcDtj8gfWkRHLtZKTPsFVuh7utbjYtvnclw4XM+ffRzJrwqMhOD1PVqef7nBLmgsu1vIujjvAJrAw==} @@ -12938,7 +12396,7 @@ packages: resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} engines: {node: '>=16 || 14 >=14.17'} dependencies: - lru-cache: 10.0.1 + lru-cache: 10.0.0 minipass: 5.0.0 /path-temp@2.1.0: @@ -12971,9 +12429,10 @@ packages: /periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} dependencies: - '@types/estree': 1.0.5 + '@types/estree': 1.0.1 estree-walker: 3.0.3 - is-reference: 3.0.2 + is-reference: 3.0.1 + dev: false /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} @@ -12990,10 +12449,9 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + /pirates@4.0.5: + resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} engines: {node: '>= 6'} - dev: true /pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} @@ -13015,11 +12473,6 @@ packages: find-up: 3.0.0 dev: false - /pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - dev: true - /portfinder@1.0.32: resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} engines: {node: '>= 0.12.0'} @@ -13031,111 +12484,111 @@ packages: - supports-color dev: true - /postcss-calc@8.2.4(postcss@8.4.31): + /postcss-calc@8.2.4(postcss@8.4.21): resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==} peerDependencies: postcss: ^8.2.2 dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.15 + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 dev: false - /postcss-colormin@5.3.1(postcss@8.4.31): + /postcss-colormin@5.3.1(postcss@8.4.21): resolution: {integrity: sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.23.0 + browserslist: 4.21.10 caniuse-api: 3.0.0 colord: 2.9.3 - postcss: 8.4.31 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: false - /postcss-convert-values@5.1.3(postcss@8.4.31): + /postcss-convert-values@5.1.3(postcss@8.4.21): resolution: {integrity: sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.23.0 - postcss: 8.4.31 + browserslist: 4.21.10 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: false - /postcss-discard-comments@5.1.2(postcss@8.4.31): + /postcss-discard-comments@5.1.2(postcss@8.4.21): resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.21 dev: false - /postcss-discard-duplicates@5.1.0(postcss@8.4.31): + /postcss-discard-duplicates@5.1.0(postcss@8.4.21): resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.21 dev: false - /postcss-discard-empty@5.1.1(postcss@8.4.31): + /postcss-discard-empty@5.1.1(postcss@8.4.21): resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.21 dev: false - /postcss-discard-overridden@5.1.0(postcss@8.4.31): + /postcss-discard-overridden@5.1.0(postcss@8.4.21): resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.21 dev: false - /postcss-discard-unused@5.1.0(postcss@8.4.31): + /postcss-discard-unused@5.1.0(postcss@8.4.21): resolution: {integrity: sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.15 + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 dev: false - /postcss-import@15.1.0(postcss@8.4.31): - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} + /postcss-import@14.1.0(postcss@8.4.21): + resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} + engines: {node: '>=10.0.0'} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.31 + postcss: 8.4.21 postcss-value-parser: 4.2.0 read-cache: 1.0.0 - resolve: 1.22.8 + resolve: 1.22.4 dev: true - /postcss-js@4.0.1(postcss@8.4.31): + /postcss-js@4.0.1(postcss@8.4.21): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} engines: {node: ^12 || ^14 || >= 16} peerDependencies: postcss: ^8.4.21 dependencies: camelcase-css: 2.0.1 - postcss: 8.4.31 + postcss: 8.4.21 dev: true - /postcss-load-config@4.0.1(postcss@8.4.31)(ts-node@10.9.1): - resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} - engines: {node: '>= 14'} + /postcss-load-config@3.1.4(postcss@8.4.21)(ts-node@10.9.1): + resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} + engines: {node: '>= 10'} peerDependencies: postcss: '>=8.0.9' ts-node: '>=9.0.0' @@ -13146,12 +12599,12 @@ packages: optional: true dependencies: lilconfig: 2.1.0 - postcss: 8.4.31 - ts-node: 10.9.1(@types/node@18.18.9)(typescript@5.2.2) - yaml: 2.3.4 + postcss: 8.4.21 + ts-node: 10.9.1(@types/node@16.18.13)(typescript@5.1.6) + yaml: 1.10.2 dev: true - /postcss-loader@7.0.2(postcss@8.4.31)(webpack@5.89.0): + /postcss-loader@7.0.2(postcss@8.4.21)(webpack@5.88.2): resolution: {integrity: sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg==} engines: {node: '>= 14.15.0'} peerDependencies: @@ -13160,341 +12613,333 @@ packages: dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 - postcss: 8.4.31 - semver: 7.5.4 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) - dev: true - - /postcss-loader@7.3.4(postcss@8.4.31)(typescript@5.2.2)(webpack@5.89.0): - resolution: {integrity: sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==} - engines: {node: '>= 14.15.0'} - peerDependencies: - postcss: ^7.0.0 || ^8.0.1 - webpack: ^5.0.0 - dependencies: - cosmiconfig: 8.3.6(typescript@5.2.2) - jiti: 1.21.0 - postcss: 8.4.31 + postcss: 8.4.21 semver: 7.5.4 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) - transitivePeerDependencies: - - typescript - dev: false + webpack: 5.88.2(webpack-cli@5.1.4) - /postcss-merge-idents@5.1.1(postcss@8.4.31): + /postcss-merge-idents@5.1.1(postcss@8.4.21): resolution: {integrity: sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 + cssnano-utils: 3.1.0(postcss@8.4.21) + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: false - /postcss-merge-longhand@5.1.7(postcss@8.4.31): + /postcss-merge-longhand@5.1.7(postcss@8.4.21): resolution: {integrity: sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.21 postcss-value-parser: 4.2.0 - stylehacks: 5.1.1(postcss@8.4.31) + stylehacks: 5.1.1(postcss@8.4.21) dev: false - /postcss-merge-rules@5.1.4(postcss@8.4.31): + /postcss-merge-rules@5.1.4(postcss@8.4.21): resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.23.0 + browserslist: 4.21.10 caniuse-api: 3.0.0 - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 - postcss-selector-parser: 6.0.15 + cssnano-utils: 3.1.0(postcss@8.4.21) + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 dev: false - /postcss-minify-font-values@5.1.0(postcss@8.4.31): + /postcss-minify-font-values@5.1.0(postcss@8.4.21): resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: false - /postcss-minify-gradients@5.1.1(postcss@8.4.31): + /postcss-minify-gradients@5.1.1(postcss@8.4.21): resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: colord: 2.9.3 - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 + cssnano-utils: 3.1.0(postcss@8.4.21) + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: false - /postcss-minify-params@5.1.4(postcss@8.4.31): + /postcss-minify-params@5.1.4(postcss@8.4.21): resolution: {integrity: sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.23.0 - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 + browserslist: 4.21.10 + cssnano-utils: 3.1.0(postcss@8.4.21) + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: false - /postcss-minify-selectors@5.2.1(postcss@8.4.31): + /postcss-minify-selectors@5.2.1(postcss@8.4.21): resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.15 + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 dev: false - /postcss-modules-extract-imports@3.0.0(postcss@8.4.31): + /postcss-modules-extract-imports@3.0.0(postcss@8.4.21): resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.31 + postcss: 8.4.21 - /postcss-modules-local-by-default@4.0.3(postcss@8.4.31): - resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==} + /postcss-modules-local-by-default@4.0.0(postcss@8.4.21): + resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.31) - postcss: 8.4.31 - postcss-selector-parser: 6.0.15 + icss-utils: 5.1.0(postcss@8.4.21) + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 postcss-value-parser: 4.2.0 - /postcss-modules-scope@3.1.0(postcss@8.4.31): - resolution: {integrity: sha512-SaIbK8XW+MZbd0xHPf7kdfA/3eOt7vxJ72IRecn3EzuZVLr1r0orzf0MX/pN8m+NMDoo6X/SQd8oeKqGZd8PXg==} + /postcss-modules-scope@3.0.0(postcss@8.4.21): + resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.15 + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 - /postcss-modules-values@4.0.0(postcss@8.4.31): + /postcss-modules-values@4.0.0(postcss@8.4.21): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.31) - postcss: 8.4.31 + icss-utils: 5.1.0(postcss@8.4.21) + postcss: 8.4.21 - /postcss-nested@6.0.1(postcss@8.4.31): - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + /postcss-nested@6.0.0(postcss@8.4.21): + resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} engines: {node: '>=12.0'} peerDependencies: postcss: ^8.2.14 dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.15 + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 dev: true - /postcss-normalize-charset@5.1.0(postcss@8.4.31): + /postcss-normalize-charset@5.1.0(postcss@8.4.21): resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.21 dev: false - /postcss-normalize-display-values@5.1.0(postcss@8.4.31): + /postcss-normalize-display-values@5.1.0(postcss@8.4.21): resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-positions@5.1.1(postcss@8.4.31): + /postcss-normalize-positions@5.1.1(postcss@8.4.21): resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-repeat-style@5.1.1(postcss@8.4.31): + /postcss-normalize-repeat-style@5.1.1(postcss@8.4.21): resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-string@5.1.0(postcss@8.4.31): + /postcss-normalize-string@5.1.0(postcss@8.4.21): resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-timing-functions@5.1.0(postcss@8.4.31): + /postcss-normalize-timing-functions@5.1.0(postcss@8.4.21): resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-unicode@5.1.1(postcss@8.4.31): + /postcss-normalize-unicode@5.1.1(postcss@8.4.21): resolution: {integrity: sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.23.0 - postcss: 8.4.31 + browserslist: 4.21.10 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-url@5.1.0(postcss@8.4.31): + /postcss-normalize-url@5.1.0(postcss@8.4.21): resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: normalize-url: 6.1.0 - postcss: 8.4.31 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: false - /postcss-normalize-whitespace@5.1.1(postcss@8.4.31): + /postcss-normalize-whitespace@5.1.1(postcss@8.4.21): resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: false - /postcss-ordered-values@5.1.3(postcss@8.4.31): + /postcss-ordered-values@5.1.3(postcss@8.4.21): resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-utils: 3.1.0(postcss@8.4.31) - postcss: 8.4.31 + cssnano-utils: 3.1.0(postcss@8.4.21) + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: false - /postcss-reduce-idents@5.2.0(postcss@8.4.31): + /postcss-reduce-idents@5.2.0(postcss@8.4.21): resolution: {integrity: sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: false - /postcss-reduce-initial@5.1.2(postcss@8.4.31): + /postcss-reduce-initial@5.1.2(postcss@8.4.21): resolution: {integrity: sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.23.0 + browserslist: 4.21.10 caniuse-api: 3.0.0 - postcss: 8.4.31 + postcss: 8.4.21 dev: false - /postcss-reduce-transforms@5.1.0(postcss@8.4.31): + /postcss-reduce-transforms@5.1.0(postcss@8.4.21): resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.21 postcss-value-parser: 4.2.0 dev: false - /postcss-selector-parser@6.0.15: - resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} + /postcss-selector-parser@6.0.11: + resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==} engines: {node: '>=4'} dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - /postcss-sort-media-queries@4.4.1(postcss@8.4.31): - resolution: {integrity: sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw==} + /postcss-sort-media-queries@4.3.0(postcss@8.4.21): + resolution: {integrity: sha512-jAl8gJM2DvuIJiI9sL1CuiHtKM4s5aEIomkU8G3LFvbP+p8i7Sz8VV63uieTgoewGqKbi+hxBTiOKJlB35upCg==} engines: {node: '>=10.0.0'} peerDependencies: postcss: ^8.4.16 dependencies: - postcss: 8.4.31 + postcss: 8.4.21 sort-css-media-queries: 2.1.0 dev: false - /postcss-svgo@5.1.0(postcss@8.4.31): + /postcss-svgo@5.1.0(postcss@8.4.21): resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.21 postcss-value-parser: 4.2.0 svgo: 2.8.0 dev: false - /postcss-unique-selectors@5.1.1(postcss@8.4.31): + /postcss-unique-selectors@5.1.1(postcss@8.4.21): resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 - postcss-selector-parser: 6.0.15 + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 dev: false /postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - /postcss-zindex@5.1.0(postcss@8.4.31): + /postcss-zindex@5.1.0(postcss@8.4.21): resolution: {integrity: sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - postcss: 8.4.31 + postcss: 8.4.21 + dev: false + + /postcss@8.4.14: + resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 dev: false - /postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + /postcss@8.4.21: + resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} engines: {node: ^10 || ^12 || >=14} dependencies: - nanoid: 3.3.7 + nanoid: 3.3.6 picocolors: 1.0.0 source-map-js: 1.0.2 @@ -13511,8 +12956,8 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - /prettier@3.0.3: - resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} + /prettier@3.0.0: + resolution: {integrity: sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==} engines: {node: '>=14'} hasBin: true @@ -13535,14 +12980,13 @@ packages: react-is: 17.0.2 dev: true - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + /pretty-format@29.6.2: + resolution: {integrity: sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@jest/schemas': 29.6.3 + '@jest/schemas': 29.6.0 ansi-styles: 5.2.0 react-is: 18.2.0 - dev: true /pretty-ms@7.0.1: resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} @@ -13567,13 +13011,11 @@ packages: resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} dev: true - /prism-react-renderer@2.3.1(react@18.2.0): - resolution: {integrity: sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==} + /prism-react-renderer@1.3.5(react@18.2.0): + resolution: {integrity: sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==} peerDependencies: - react: '>=16.0.0 || 18' + react: '>=0.14.9 || 18' dependencies: - '@types/prismjs': 1.26.3 - clsx: 2.1.0 react: 18.2.0 dev: false @@ -13617,6 +13059,12 @@ packages: err-code: 2.0.3 retry: 0.12.0 + /promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + dependencies: + asap: 2.0.6 + dev: false + /prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -13631,8 +13079,9 @@ packages: object-assign: 4.1.1 react-is: 16.13.1 - /property-information@6.4.0: - resolution: {integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==} + /property-information@6.2.0: + resolution: {integrity: sha512-kma4U7AFCTwpqq5twzC1YVIDXSqg6qQK6JN0smOw8fgRy1OkMi0CYSzFmsy6dnqSenamAtj0CyXMUJ1Mf6oROg==} + dev: false /proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} @@ -13652,8 +13101,8 @@ packages: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} dev: false - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} /pupa@3.1.0: @@ -13663,9 +13112,12 @@ packages: escape-goat: 4.0.0 dev: false - /pure-rand@6.0.4: - resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} - dev: true + /pure-color@1.3.0: + resolution: {integrity: sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==} + dev: false + + /pure-rand@6.0.0: + resolution: {integrity: sha512-rLSBxJjP+4DQOgcJAx6RZHT2he2pkhQdSnofG5VWyVl6GRq/K02ISOuOLcsMOrtKDIJb8JN2zm3FFzWNbezdPw==} /qs@6.11.0: resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} @@ -13695,26 +13147,10 @@ packages: resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} engines: {node: '>=10'} - /railroad-diagrams@1.0.0: - resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==} - dev: false - - /rambda@7.5.0: - resolution: {integrity: sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==} - dev: true - /ramda@0.29.0: resolution: {integrity: sha512-BBea6L67bYLtdbOqfp8f58fPMqEwx0doL+pAi8TZyp2YWz8R9G8z9x75CZI8W+ftqhFHCpEX2cRnUUXK130iKA==} dev: true - /randexp@0.4.6: - resolution: {integrity: sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==} - engines: {node: '>=0.12'} - dependencies: - discontinuous-range: 1.0.0 - ret: 0.1.15 - dev: false - /randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: @@ -13748,7 +13184,16 @@ packages: strip-json-comments: 2.0.1 dev: false - /react-dev-utils@12.0.1(eslint@8.53.0)(typescript@5.2.2)(webpack@5.89.0): + /react-base16-styling@0.6.0: + resolution: {integrity: sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==} + dependencies: + base16: 1.0.0 + lodash.curry: 4.1.1 + lodash.flow: 3.5.0 + pure-color: 1.3.0 + dev: false + + /react-dev-utils@12.0.1(eslint@8.38.0)(typescript@5.1.6)(webpack@5.88.2): resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} engines: {node: '>=14'} peerDependencies: @@ -13758,20 +13203,20 @@ packages: typescript: optional: true dependencies: - '@babel/code-frame': 7.23.5 + '@babel/code-frame': 7.22.10 address: 1.2.2 - browserslist: 4.23.0 + browserslist: 4.21.10 chalk: 4.1.2 cross-spawn: 7.0.3 detect-port-alt: 1.1.6 escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.53.0)(typescript@5.2.2)(webpack@5.89.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.38.0)(typescript@5.1.6)(webpack@5.88.2) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 - immer: 9.0.21 + immer: 9.0.19 is-root: 2.1.0 loader-utils: 3.2.1 open: 8.4.2 @@ -13779,11 +13224,11 @@ packages: prompts: 2.4.2 react-error-overlay: 6.0.11 recursive-readdir: 2.2.3 - shell-quote: 1.8.1 + shell-quote: 1.8.0 strip-ansi: 6.0.1 text-table: 0.2.0 - typescript: 5.2.2 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) + typescript: 5.1.6 + webpack: 5.88.2(webpack-cli@5.1.4) transitivePeerDependencies: - eslint - supports-color @@ -13803,8 +13248,8 @@ packages: resolution: {integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==} dev: false - /react-fast-compare@3.2.2: - resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + /react-fast-compare@3.2.0: + resolution: {integrity: sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==} /react-helmet-async@1.3.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==} @@ -13812,24 +13257,12 @@ packages: react: ^16.6.0 || ^17.0.0 || ^18.0.0 || 18 react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 || 18 dependencies: - '@babel/runtime': 7.23.8 + '@babel/runtime': 7.21.0 invariant: 2.2.4 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-fast-compare: 3.2.2 - shallowequal: 1.1.0 - - /react-helmet-async@2.0.4(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-yxjQMWposw+akRfvpl5+8xejl4JtUlHnEBcji6u8/e6oc7ozT+P9PNTWMhCbz2y9tc5zPegw2BvKjQA+NwdEjQ==} - peerDependencies: - react: ^16.6.0 || ^17.0.0 || ^18.0.0 || 18 - react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 || 18 - dependencies: - invariant: 2.2.4 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-fast-compare: 3.2.2 + react-fast-compare: 3.2.0 shallowequal: 1.1.0 /react-is@16.13.1: @@ -13841,27 +13274,38 @@ packages: /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true - /react-json-view-lite@1.2.1(react@18.2.0): - resolution: {integrity: sha512-Itc0g86fytOmKZoIoJyGgvNqohWSbh3NXIKNgH6W6FT9PC1ck4xas1tT3Rr/b3UlFXyA9Jjaw9QSXdZy2JwGMQ==} - engines: {node: '>=14'} + /react-json-view@1.21.3(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==} peerDependencies: - react: ^16.13.1 || ^17.0.0 || ^18.0.0 || 18 + react: ^17.0.0 || ^16.3.0 || ^15.5.4 || 18 + react-dom: ^17.0.0 || ^16.3.0 || ^15.5.4 || 18 dependencies: + flux: 4.0.3(react@18.2.0) react: 18.2.0 + react-base16-styling: 0.6.0 + react-dom: 18.2.0(react@18.2.0) + react-lifecycles-compat: 3.0.4 + react-textarea-autosize: 8.4.0(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + - encoding + dev: false + + /react-lifecycles-compat@3.0.4: + resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} dev: false - /react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@5.5.2)(webpack@5.89.0): + /react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@5.5.2)(webpack@5.88.2): resolution: {integrity: sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==} engines: {node: '>=10.13.0'} peerDependencies: react-loadable: '*' webpack: '>=4.41.1 || 5.x' dependencies: - '@babel/runtime': 7.23.8 + '@babel/runtime': 7.21.0 react-loadable: /@docusaurus/react-loadable@5.5.2(react@18.2.0) - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.1.4) dev: false /react-player@2.12.0(react@18.2.0): @@ -13869,12 +13313,12 @@ packages: peerDependencies: react: '>=16.6.0 || 18' dependencies: - deepmerge: 4.3.1 + deepmerge: 4.3.0 load-script: 1.0.0 memoize-one: 5.2.1 prop-types: 15.8.1 react: 18.2.0 - react-fast-compare: 3.2.2 + react-fast-compare: 3.2.0 dev: false /react-router-config@5.1.1(react-router@5.3.4)(react@18.2.0): @@ -13883,7 +13327,7 @@ packages: react: '>=15 || 18' react-router: '>=5' dependencies: - '@babel/runtime': 7.23.8 + '@babel/runtime': 7.21.0 react: 18.2.0 react-router: 5.3.4(react@18.2.0) dev: false @@ -13893,7 +13337,7 @@ packages: peerDependencies: react: '>=15 || 18' dependencies: - '@babel/runtime': 7.23.8 + '@babel/runtime': 7.21.0 history: 4.10.1 loose-envify: 1.4.0 prop-types: 15.8.1 @@ -13908,7 +13352,7 @@ packages: peerDependencies: react: '>=15 || 18' dependencies: - '@babel/runtime': 7.23.8 + '@babel/runtime': 7.21.0 history: 4.10.1 hoist-non-react-statics: 3.3.2 loose-envify: 1.4.0 @@ -13925,14 +13369,28 @@ packages: engines: {node: '>=0.12.0'} dev: false - /react-universal-interface@0.6.2(react@18.2.0)(tslib@2.6.2): + /react-textarea-autosize@8.4.0(react@18.2.0): + resolution: {integrity: sha512-YrTFaEHLgJsi8sJVYHBzYn+mkP3prGkmP2DKb/tm0t7CLJY5t1Rxix8070LAKb0wby7bl/lf2EeHkuMihMZMwQ==} + engines: {node: '>=10'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || 18 + dependencies: + '@babel/runtime': 7.21.0 + react: 18.2.0 + use-composed-ref: 1.3.0(react@18.2.0) + use-latest: 1.2.1(react@18.2.0) + transitivePeerDependencies: + - '@types/react' + dev: false + + /react-universal-interface@0.6.2(react@18.2.0)(tslib@2.6.1): resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==} peerDependencies: react: '*' tslib: '*' dependencies: react: 18.2.0 - tslib: 2.6.2 + tslib: 2.6.1 dev: false /react-use@17.4.0(react-dom@18.2.0)(react@18.2.0): @@ -13950,13 +13408,13 @@ packages: nano-css: 5.3.5(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-universal-interface: 0.6.2(react@18.2.0)(tslib@2.6.2) + react-universal-interface: 0.6.2(react@18.2.0)(tslib@2.6.1) resize-observer-polyfill: 1.5.1 screenfull: 5.2.0 set-harmonic-interval: 1.0.1 throttle-debounce: 3.0.1 ts-easing: 0.2.0 - tslib: 2.6.2 + tslib: 2.6.1 dev: false /react@18.2.0: @@ -14001,7 +13459,7 @@ packages: resolution: {integrity: sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dependencies: - glob: 10.3.10 + glob: 10.3.3 json-parse-even-better-errors: 3.0.0 normalize-package-data: 5.0.0 npm-normalize-package-bin: 3.0.1 @@ -14107,13 +13565,13 @@ packages: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} engines: {node: '>= 0.10'} dependencies: - resolve: 1.22.8 + resolve: 1.22.4 /rechoir@0.8.0: resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} engines: {node: '>= 10.13.0'} dependencies: - resolve: 1.22.8 + resolve: 1.22.4 /recursive-readdir@2.2.3: resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} @@ -14130,20 +13588,8 @@ packages: strip-indent: 4.0.0 dev: true - /reflect.getprototypeof@1.0.4: - resolution: {integrity: sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.2 - get-intrinsic: 1.2.2 - globalthis: 1.0.3 - which-builtin-type: 1.1.3 - dev: true - - /regenerate-unicode-properties@10.1.1: - resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + /regenerate-unicode-properties@10.1.0: + resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} engines: {node: '>=4'} dependencies: regenerate: 1.4.2 @@ -14151,27 +13597,21 @@ packages: /regenerate@1.4.2: resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - /regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + /regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - /regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + /regenerator-transform@0.15.1: + resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==} dependencies: - '@babel/runtime': 7.23.8 - - /regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - dev: true + '@babel/runtime': 7.21.0 - /regexp.prototype.flags@1.5.1: - resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} + /regexp.prototype.flags@1.4.3: + resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - set-function-name: 2.0.1 - dev: true + call-bind: 1.0.2 + define-properties: 1.2.0 + functions-have-names: 1.2.3 /regexpu-core@5.3.2: resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} @@ -14179,7 +13619,7 @@ packages: dependencies: '@babel/regjsgen': 0.8.0 regenerate: 1.4.2 - regenerate-unicode-properties: 10.1.1 + regenerate-unicode-properties: 10.1.0 regjsparser: 0.9.1 unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.1.0 @@ -14198,110 +13638,88 @@ packages: rc: 1.2.8 dev: false - /regjsparser@0.10.0: - resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} - hasBin: true - dependencies: - jsesc: 0.5.0 - dev: true - /regjsparser@0.9.1: resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} hasBin: true dependencies: jsesc: 0.5.0 - /rehype-raw@7.0.0: - resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + /rehype-raw@6.1.1: + resolution: {integrity: sha512-d6AKtisSRtDRX4aSPsJGTfnzrX2ZkHQLE5kiUuGOeEoLpbEulFF4hj0mLPbsa+7vmguDKOVVEQdHKDSwoaIDsQ==} dependencies: - '@types/hast': 3.0.3 - hast-util-raw: 9.0.1 - vfile: 6.0.1 + '@types/hast': 2.3.4 + hast-util-raw: 7.2.3 + unified: 10.1.2 dev: false /relateurl@0.2.7: resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} engines: {node: '>= 0.10'} - /remark-directive@3.0.0: - resolution: {integrity: sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==} + /remark-comment@1.0.0: + resolution: {integrity: sha512-k8YPo5MGvl8l4gGxOH6Zk4Fa2AhDACN5eqKnKZcHDORZQS15hlnezlBHj2lqyDiqzApNmYOMTibkEJbMSKU25w==} dependencies: - '@types/mdast': 4.0.3 - mdast-util-directive: 3.0.0 - micromark-extension-directive: 3.0.0 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 dev: false - /remark-emoji@4.0.1: - resolution: {integrity: sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + /remark-directive@2.0.1: + resolution: {integrity: sha512-oosbsUAkU/qmUE78anLaJePnPis4ihsE7Agp0T/oqTzvTea8pOiaYEtfInU/+xMOVTS9PN5AhGOiaIVe4GD8gw==} dependencies: - '@types/mdast': 4.0.3 - emoticon: 4.0.1 - mdast-util-find-and-replace: 3.0.1 - node-emoji: 2.1.3 - unified: 11.0.4 + '@types/mdast': 3.0.10 + mdast-util-directive: 2.2.4 + micromark-extension-directive: 2.2.1 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color dev: false - /remark-frontmatter@5.0.0: - resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} + /remark-emoji@2.2.0: + resolution: {integrity: sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==} dependencies: - '@types/mdast': 4.0.3 - mdast-util-frontmatter: 2.0.1 - micromark-extension-frontmatter: 2.0.0 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color + emoticon: 3.2.0 + node-emoji: 1.11.0 + unist-util-visit: 2.0.3 dev: false - /remark-gfm@4.0.0: - resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + /remark-gfm@3.0.1: + resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} dependencies: - '@types/mdast': 4.0.3 - mdast-util-gfm: 3.0.0 - micromark-extension-gfm: 3.0.0 - remark-parse: 11.0.0 - remark-stringify: 11.0.0 - unified: 11.0.4 + '@types/mdast': 3.0.10 + mdast-util-gfm: 2.0.2 + micromark-extension-gfm: 2.0.3 + unified: 10.1.2 transitivePeerDependencies: - supports-color dev: false - /remark-mdx@3.0.0: - resolution: {integrity: sha512-O7yfjuC6ra3NHPbRVxfflafAj3LTwx3b73aBvkEFU5z4PsD6FD4vrqJAkE5iNGLz71GdjXfgRqm3SQ0h0VuE7g==} + /remark-mdx@2.3.0: + resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} dependencies: - mdast-util-mdx: 3.0.0 - micromark-extension-mdxjs: 3.0.0 + mdast-util-mdx: 2.0.1 + micromark-extension-mdxjs: 1.0.1 transitivePeerDependencies: - supports-color + dev: false - /remark-parse@11.0.0: - resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + /remark-parse@10.0.2: + resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} dependencies: - '@types/mdast': 4.0.3 - mdast-util-from-markdown: 2.0.0 - micromark-util-types: 2.0.0 - unified: 11.0.4 + '@types/mdast': 3.0.10 + mdast-util-from-markdown: 1.3.1 + unified: 10.1.2 transitivePeerDependencies: - supports-color + dev: false - /remark-rehype@11.1.0: - resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} - dependencies: - '@types/hast': 3.0.3 - '@types/mdast': 4.0.3 - mdast-util-to-hast: 13.1.0 - unified: 11.0.4 - vfile: 6.0.1 - - /remark-stringify@11.0.0: - resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + /remark-rehype@10.1.0: + resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} dependencies: - '@types/mdast': 4.0.3 - mdast-util-to-markdown: 2.1.0 - unified: 11.0.4 + '@types/hast': 2.3.4 + '@types/mdast': 3.0.10 + mdast-util-to-hast: 12.3.0 + unified: 10.1.2 dev: false /remove-trailing-separator@1.1.0: @@ -14323,7 +13741,6 @@ packages: /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - dev: true /require-from-string@2.0.2: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} @@ -14362,31 +13779,26 @@ packages: resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==} dev: false - /resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: true - - /resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + /resolve.exports@2.0.1: + resolution: {integrity: sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw==} engines: {node: '>=10'} - dev: true - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + /resolve@1.22.4: + resolution: {integrity: sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==} hasBin: true dependencies: - is-core-module: 2.13.1 + is-core-module: 2.13.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + /resolve@2.0.0-next.4: + resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==} hasBin: true dependencies: - is-core-module: 2.13.1 + is-core-module: 2.13.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true + dev: false /responselike@3.0.0: resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} @@ -14402,11 +13814,6 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 - /ret@0.1.15: - resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} - engines: {node: '>=0.12'} - dev: false - /retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} @@ -14428,6 +13835,13 @@ packages: engines: {node: '>= 0.10'} dev: true + /rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} hasBin: true @@ -14437,21 +13851,21 @@ packages: /rtl-css-js@1.16.1: resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} dependencies: - '@babel/runtime': 7.23.8 + '@babel/runtime': 7.21.0 dev: false - /rtl-detect@1.1.2: - resolution: {integrity: sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==} + /rtl-detect@1.0.4: + resolution: {integrity: sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==} dev: false - /rtlcss@4.1.1: - resolution: {integrity: sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==} + /rtlcss@4.1.0: + resolution: {integrity: sha512-W+N4hh0nVqVrrn3mRkHakxpB+c9cQ4CRT67O39kgA+1DjyhrdsqyCqIuHXyvWaXn4/835n+oX3fYJCi4+G/06A==} engines: {node: '>=12.0.0'} hasBin: true dependencies: escalade: 3.1.1 picocolors: 1.0.0 - postcss: 8.4.31 + postcss: 8.4.21 strip-json-comments: 3.1.1 dev: false @@ -14467,17 +13881,14 @@ packages: /rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: - tslib: 2.6.2 + tslib: 2.6.1 - /safe-array-concat@1.0.1: - resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} - engines: {node: '>=0.4'} + /sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - has-symbols: 1.0.3 - isarray: 2.0.5 - dev: true + mri: 1.2.0 + dev: false /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -14506,10 +13917,9 @@ packages: /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 + call-bind: 1.0.2 + get-intrinsic: 1.2.0 is-regex: 1.1.4 - dev: true /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -14517,16 +13927,16 @@ packages: /sanitize-html@2.11.0: resolution: {integrity: sha512-BG68EDHRaGKqlsNjJ2xUB7gpInPA8gVx/mvjO743hZaeMCZ2DwzW7xvsqZ+KNU4QKwj86HJ3uu2liISf2qBBUA==} dependencies: - deepmerge: 4.3.1 + deepmerge: 4.3.0 escape-string-regexp: 4.0.0 - htmlparser2: 8.0.2 + htmlparser2: 8.0.1 is-plain-object: 5.0.0 parse-srcset: 1.0.2 - postcss: 8.4.31 + postcss: 8.4.21 dev: false - /sax@1.3.0: - resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + /sax@1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} dev: false /saxes@6.0.0: @@ -14551,7 +13961,7 @@ packages: resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} engines: {node: '>= 8.9.0'} dependencies: - '@types/json-schema': 7.0.15 + '@types/json-schema': 7.0.12 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) dev: false @@ -14560,15 +13970,15 @@ packages: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/json-schema': 7.0.15 + '@types/json-schema': 7.0.12 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - /schema-utils@4.2.0: - resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} + /schema-utils@4.0.0: + resolution: {integrity: sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==} engines: {node: '>= 12.13.0'} dependencies: - '@types/json-schema': 7.0.15 + '@types/json-schema': 7.0.12 ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) ajv-keywords: 5.1.0(ajv@8.12.0) @@ -14582,10 +13992,6 @@ packages: engines: {node: '>=0.10.0'} dev: false - /search-insights@2.13.0: - resolution: {integrity: sha512-Orrsjf9trHHxFRuo9/rzm0KIWmgzE8RMlZMzuhZOJ01Rnz3D0YBAe+V6473t6/H6c7irs6Lt48brULAiRWb3Vw==} - dev: false - /section-matter@1.0.0: resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} engines: {node: '>=4'} @@ -14601,11 +14007,10 @@ packages: /select-hose@2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} - /selfsigned@2.4.1: - resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} + /selfsigned@2.1.1: + resolution: {integrity: sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==} engines: {node: '>=10'} dependencies: - '@types/node-forge': 1.3.11 node-forge: 1.3.1 /semver-diff@4.0.0: @@ -14631,6 +14036,14 @@ packages: lru-cache: 6.0.0 dev: true + /semver@7.5.2: + resolution: {integrity: sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: false + /semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} @@ -14664,8 +14077,8 @@ packages: randombytes: 2.1.0 dev: true - /serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + /serialize-javascript@6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} dependencies: randombytes: 2.1.0 @@ -14710,25 +14123,6 @@ packages: /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - /set-function-length@1.2.0: - resolution: {integrity: sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - function-bind: 1.1.2 - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - - /set-function-name@2.0.1: - resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.1 - dev: true - /set-harmonic-interval@1.0.1: resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==} engines: {node: '>=6.9'} @@ -14736,7 +14130,6 @@ packages: /setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - dev: true /setprototypeof@1.1.0: resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} @@ -14763,8 +14156,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - /shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + /shell-quote@1.8.0: + resolution: {integrity: sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==} dev: false /shelljs@0.8.5: @@ -14779,9 +14172,9 @@ packages: /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - object-inspect: 1.13.1 + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + object-inspect: 1.12.3 /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -14804,7 +14197,6 @@ packages: /sinon@11.1.2: resolution: {integrity: sha512-59237HChms4kg7/sXhiRcUzdSkKuydDeTiamT/jesUVHshBgL8XAmhgFo0GfK6RruMDM/iRSij1EybmMog9cJw==} - deprecated: 16.1.1 dependencies: '@sinonjs/commons': 1.8.6 '@sinonjs/fake-timers': 7.1.2 @@ -14814,13 +14206,13 @@ packages: supports-color: 7.2.0 dev: true - /sirv@2.0.4: - resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} + /sirv@1.0.19: + resolution: {integrity: sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==} engines: {node: '>= 10'} dependencies: - '@polka/url': 1.0.0-next.24 - mrmime: 2.0.0 - totalist: 3.0.1 + '@polka/url': 1.0.0-next.21 + mrmime: 1.0.1 + totalist: 1.1.0 dev: false /sisteransi@1.0.5: @@ -14832,16 +14224,9 @@ packages: hasBin: true dependencies: '@types/node': 17.0.45 - '@types/sax': 1.2.7 + '@types/sax': 1.2.4 arg: 5.0.2 - sax: 1.3.0 - dev: false - - /skin-tone@2.0.0: - resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} - engines: {node: '>=8'} - dependencies: - unicode-emoji-modifier-base: 1.0.0 + sax: 1.2.4 dev: false /slash@3.0.0: @@ -14887,7 +14272,7 @@ packages: resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} dependencies: - ip: 2.0.1 + ip: 2.0.0 smart-buffer: 4.2.0 /sort-css-media-queries@2.1.0: @@ -14917,7 +14302,6 @@ packages: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: true /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -14942,6 +14326,7 @@ packages: /source-map@0.7.4: resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} engines: {node: '>= 8'} + dev: false /sourcemap-codec@1.4.8: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} @@ -14950,6 +14335,7 @@ packages: /space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + dev: false /spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -15001,11 +14387,6 @@ packages: /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - /srcset@4.0.0: - resolution: {integrity: sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==} - engines: {node: '>=12'} - dev: false - /ssri@10.0.4: resolution: {integrity: sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -15039,7 +14420,6 @@ packages: engines: {node: '>=10'} dependencies: escape-string-regexp: 2.0.0 - dev: true /stackframe@1.3.4: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} @@ -15075,14 +14455,15 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} - /std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + /std-env@3.3.2: + resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} dev: false - /streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - dev: false + /stop-iteration-iterator@1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} + dependencies: + internal-slot: 1.0.5 /string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} @@ -15090,7 +14471,6 @@ packages: dependencies: char-regex: 1.0.2 strip-ansi: 6.0.1 - dev: true /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -15108,44 +14488,40 @@ packages: emoji-regex: 9.2.2 strip-ansi: 7.1.0 - /string.prototype.matchall@4.0.10: - resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} + /string.prototype.matchall@4.0.8: + resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==} dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.2 - get-intrinsic: 1.2.2 + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + get-intrinsic: 1.2.0 has-symbols: 1.0.3 internal-slot: 1.0.5 - regexp.prototype.flags: 1.5.1 - set-function-name: 2.0.1 + regexp.prototype.flags: 1.4.3 side-channel: 1.0.4 - dev: true + dev: false - /string.prototype.trim@1.2.8: - resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + /string.prototype.trim@1.2.7: + resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.2 - dev: true + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 - /string.prototype.trimend@1.0.7: - resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + /string.prototype.trimend@1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.2 - dev: true + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 - /string.prototype.trimstart@1.0.7: - resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + /string.prototype.trimstart@1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - es-abstract: 1.22.2 - dev: true + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 /string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -15162,6 +14538,7 @@ packages: dependencies: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 + dev: false /stringify-object@3.3.0: resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} @@ -15224,13 +14601,6 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - dependencies: - min-indent: 1.0.1 - dev: true - /strip-indent@4.0.0: resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} engines: {node: '>=12'} @@ -15251,26 +14621,22 @@ packages: resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==} dev: true - /style-loader@3.3.1(webpack@5.89.0): + /style-loader@3.3.1(webpack@5.88.2): resolution: {integrity: sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 dependencies: - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.1.4) dev: true - /style-to-object@0.4.4: - resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + /style-to-object@0.4.2: + resolution: {integrity: sha512-1JGpfPB3lo42ZX8cuPrheZbfQ6kqPPnPHlKMyeRYtfKD+0jG+QsXgXN57O/dvJlzlB2elI6dGmrPnl5VPQFPaA==} dependencies: inline-style-parser: 0.1.1 + dev: false - /style-to-object@1.0.5: - resolution: {integrity: sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==} - dependencies: - inline-style-parser: 0.2.2 - - /styled-jsx@5.1.1(@babel/core@7.23.7)(react@18.2.0): + /styled-jsx@5.1.1(@babel/core@7.22.10)(react@18.2.0): resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} peerDependencies: @@ -15283,40 +14649,26 @@ packages: babel-plugin-macros: optional: true dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.22.10 client-only: 0.0.1 react: 18.2.0 dev: false - /stylehacks@5.1.1(postcss@8.4.31): + /stylehacks@5.1.1(postcss@8.4.21): resolution: {integrity: sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==} engines: {node: ^10 || ^12 || >=14.0} peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.23.0 - postcss: 8.4.31 - postcss-selector-parser: 6.0.15 + browserslist: 4.21.10 + postcss: 8.4.21 + postcss-selector-parser: 6.0.11 dev: false /stylis@4.1.3: resolution: {integrity: sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==} dev: false - /sucrase@3.34.0: - resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} - engines: {node: '>=8'} - hasBin: true - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - commander: 4.1.1 - glob: 7.1.6 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.6 - ts-interface-checker: 0.1.13 - dev: true - /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -15364,8 +14716,7 @@ packages: engines: {node: ^14.18.0 || >=16.0.0} dependencies: '@pkgr/utils': 2.3.1 - tslib: 2.6.2 - dev: true + tslib: 2.6.1 /syncpack@9.8.4: resolution: {integrity: sha512-i81rO+dHuJ2dO8YQq6SCExcyN0x9ZVTY7cVPn8pWjS5Dml0A8uM0cOaneOludFesdrLXMZUA/uEWa74ddBgkPQ==} @@ -15385,33 +14736,36 @@ packages: zod: 3.20.6 dev: true - /tailwindcss@3.3.5(ts-node@10.9.1): - resolution: {integrity: sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==} - engines: {node: '>=14.0.0'} + /tailwindcss@3.2.7(postcss@8.4.21)(ts-node@10.9.1): + resolution: {integrity: sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==} + engines: {node: '>=12.13.0'} hasBin: true + peerDependencies: + postcss: ^8.0.9 dependencies: - '@alloc/quick-lru': 5.2.0 arg: 5.0.2 chokidar: 3.5.3 + color-name: 1.1.4 + detective: 5.2.1 didyoumean: 1.2.2 dlv: 1.1.3 - fast-glob: 3.3.2 + fast-glob: 3.3.1 glob-parent: 6.0.2 is-glob: 4.0.3 - jiti: 1.21.0 lilconfig: 2.1.0 micromatch: 4.0.5 normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.0.0 - postcss: 8.4.31 - postcss-import: 15.1.0(postcss@8.4.31) - postcss-js: 4.0.1(postcss@8.4.31) - postcss-load-config: 4.0.1(postcss@8.4.31)(ts-node@10.9.1) - postcss-nested: 6.0.1(postcss@8.4.31) - postcss-selector-parser: 6.0.15 - resolve: 1.22.8 - sucrase: 3.34.0 + postcss: 8.4.21 + postcss-import: 14.1.0(postcss@8.4.21) + postcss-js: 4.0.1(postcss@8.4.21) + postcss-load-config: 3.1.4(postcss@8.4.21)(ts-node@10.9.1) + postcss-nested: 6.0.0(postcss@8.4.21) + postcss-selector-parser: 6.0.11 + postcss-value-parser: 4.2.0 + quick-lru: 5.1.1 + resolve: 1.22.4 transitivePeerDependencies: - ts-node dev: true @@ -15436,8 +14790,8 @@ packages: mkdirp: 1.0.4 yallist: 4.0.0 - /terser-webpack-plugin@5.3.10(esbuild@0.17.11)(webpack@5.89.0): - resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + /terser-webpack-plugin@5.3.9(webpack@5.88.2): + resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -15452,21 +14806,20 @@ packages: uglify-js: optional: true dependencies: - '@jridgewell/trace-mapping': 0.3.21 - esbuild: 0.17.11 + '@jridgewell/trace-mapping': 0.3.19 jest-worker: 27.5.1 schema-utils: 3.3.0 - serialize-javascript: 6.0.2 - terser: 5.26.0 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) + serialize-javascript: 6.0.1 + terser: 5.19.2 + webpack: 5.88.2(webpack-cli@5.1.4) - /terser@5.26.0: - resolution: {integrity: sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==} + /terser@5.19.2: + resolution: {integrity: sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==} engines: {node: '>=10'} hasBin: true dependencies: '@jridgewell/source-map': 0.3.5 - acorn: 8.11.3 + acorn: 8.10.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -15477,7 +14830,6 @@ packages: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 minimatch: 3.1.2 - dev: true /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} @@ -15486,19 +14838,6 @@ packages: resolution: {integrity: sha512-7D/r3s6uPZyU//MCYrX6I14nzauDwJ5CxazouuRGNuvSCihW87ufN6VLoROLCrHg6FblLuJrT6N2BVaPVzqElw==} engines: {node: '>=0.8'} - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - dependencies: - thenify: 3.3.1 - dev: true - - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - dependencies: - any-promise: 1.3.0 - dev: true - /throttle-debounce@3.0.1: resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} engines: {node: '>=10'} @@ -15520,7 +14859,6 @@ packages: dependencies: globalyzer: 0.1.0 globrex: 0.1.2 - dev: true /tiny-invariant@1.3.1: resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} @@ -15542,7 +14880,6 @@ packages: /tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - dev: true /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} @@ -15562,8 +14899,8 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - /totalist@3.0.1: - resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} + /totalist@1.1.0: + resolution: {integrity: sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==} engines: {node: '>=6'} dev: false @@ -15572,7 +14909,7 @@ packages: engines: {node: '>=6'} dependencies: psl: 1.9.0 - punycode: 2.3.1 + punycode: 2.3.0 universalify: 0.2.0 url-parse: 1.5.10 dev: true @@ -15584,20 +14921,19 @@ packages: resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} engines: {node: '>=12'} dependencies: - punycode: 2.3.1 + punycode: 2.3.0 + dev: true + + /traverse@0.3.9: + resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==} dev: true /treeverse@1.0.4: resolution: {integrity: sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==} - /trie-search@2.0.0: - resolution: {integrity: sha512-AJMlAQ/6E5+K45SAOqzeqr0qXWqSREclp3mAWss0PvB9ifBL+QXn2LeZBgUBUifjj5ZtTpo4uKplqUnt9VZcdQ==} - dependencies: - hasharray: 1.1.2 - dev: false - /trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + dev: false /trim-newlines@4.1.1: resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==} @@ -15606,26 +14942,14 @@ packages: /trough@2.1.0: resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} - - /ts-api-utils@1.0.3(typescript@5.2.2): - resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' - dependencies: - typescript: 5.2.2 - dev: true + dev: false /ts-easing@0.2.0: resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} dev: false - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: true - - /ts-jest@29.1.1(@babel/core@7.23.7)(esbuild@0.17.11)(jest@29.7.0)(typescript@5.2.2): - resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} + /ts-jest@29.0.5(@babel/core@7.22.10)(jest@29.5.0)(typescript@5.1.6): + resolution: {integrity: sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true peerDependencies: @@ -15634,7 +14958,7 @@ packages: babel-jest: ^29.0.0 esbuild: '*' jest: ^29.0.0 - typescript: '>=4.3 <6' + typescript: '>=4.3' peerDependenciesMeta: '@babel/core': optional: true @@ -15645,21 +14969,20 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.23.7 + '@babel/core': 7.22.10 bs-logger: 0.2.6 - esbuild: 0.17.11 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.18.9)(ts-node@10.9.1) - jest-util: 29.7.0 + jest: 29.5.0(@types/node@16.18.13)(ts-node@10.9.1) + jest-util: 29.6.2 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.5.4 - typescript: 5.2.2 + typescript: 5.1.6 yargs-parser: 21.1.1 dev: true - /ts-loader@9.4.2(typescript@5.2.2)(webpack@5.89.0): + /ts-loader@9.4.2(typescript@5.1.6)(webpack@5.88.2): resolution: {integrity: sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==} engines: {node: '>=12.0.0'} peerDependencies: @@ -15670,11 +14993,11 @@ packages: enhanced-resolve: 5.15.0 micromatch: 4.0.5 semver: 7.5.4 - typescript: 5.2.2 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) + typescript: 5.1.6 + webpack: 5.88.2(webpack-cli@5.1.4) dev: true - /ts-node@10.9.1(@types/node@18.18.9)(typescript@5.2.2): + /ts-node@10.9.1(@types/node@16.18.13)(typescript@5.1.6): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -15693,17 +15016,16 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 18.18.9 - acorn: 8.11.3 - acorn-walk: 8.3.2 + '@types/node': 16.18.13 + acorn: 8.10.0 + acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.2.2 + typescript: 5.1.6 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - dev: true /tsconfig-paths@3.14.2: resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} @@ -15712,10 +15034,32 @@ packages: json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 - dev: true - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + /tslib@2.6.1: + resolution: {integrity: sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==} + + /tsutils@3.21.0(typescript@5.1.6): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 5.1.6 + + /tsx@3.12.3: + resolution: {integrity: sha512-Wc5BFH1xccYTXaQob+lEcimkcb/Pq+0en2s+ruiX0VEIC80nV7/0s7XRahx8NnsoCnpCVUPz8wrqVSPi760LkA==} + hasBin: true + dependencies: + '@esbuild-kit/cjs-loader': 2.4.2 + '@esbuild-kit/core-utils': 3.1.0 + '@esbuild-kit/esm-loader': 2.5.5 + optionalDependencies: + fsevents: 2.3.2 + dev: true /tuf-js@1.1.7: resolution: {integrity: sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==} @@ -15736,7 +15080,6 @@ packages: /type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} - dev: true /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} @@ -15775,75 +15118,39 @@ packages: media-typer: 0.3.0 mime-types: 2.1.35 - /typed-array-buffer@1.0.0: - resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - is-typed-array: 1.1.12 - dev: true - - /typed-array-byte-length@1.0.0: - resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.5 - for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 - dev: true - - /typed-array-byte-offset@1.0.0: - resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.5 - for-each: 0.3.3 - has-proto: 1.0.1 - is-typed-array: 1.1.12 - dev: true - /typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.2 for-each: 0.3.3 - is-typed-array: 1.1.12 - dev: true + is-typed-array: 1.1.10 /typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} dependencies: is-typedarray: 1.0.0 - /typescript@5.2.2: - resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + /typescript@5.1.6: + resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} engines: {node: '>=14.17'} hasBin: true + /ua-parser-js@0.7.34: + resolution: {integrity: sha512-cJMeh/eOILyGu0ejgTKB95yKT3zOenSe9UGE3vj6WfiOwgGYnmATUsnDixMFvdU+rNMvWih83hrUP8VwhF9yXQ==} + dev: false + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: - call-bind: 1.0.5 + call-bind: 1.0.2 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - dev: true - - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} /unicode-canonical-property-names-ecmascript@2.0.0: resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} engines: {node: '>=4'} - /unicode-emoji-modifier-base@1.0.0: - resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} - engines: {node: '>=4'} - dev: false - /unicode-match-property-ecmascript@2.0.0: resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} engines: {node: '>=4'} @@ -15859,16 +15166,17 @@ packages: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} - /unified@11.0.4: - resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + /unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 2.0.6 bail: 2.0.2 - devlop: 1.1.0 extend: 3.0.2 + is-buffer: 2.0.5 is-plain-obj: 4.1.0 trough: 2.1.0 - vfile: 6.0.1 + vfile: 5.3.7 + dev: false /union@0.5.0: resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==} @@ -15925,57 +15233,74 @@ packages: crypto-random-string: 4.0.0 dev: false + /unist-util-generated@2.0.1: + resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} + dev: false + + /unist-util-is@4.1.0: + resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} + dev: false + /unist-util-is@5.2.1: resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.6 dev: false - /unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + /unist-util-position-from-estree@1.1.2: + resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 2.0.6 + dev: false - /unist-util-position-from-estree@2.0.0: - resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + /unist-util-position@4.0.4: + resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 2.0.6 + dev: false - /unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + /unist-util-remove-position@4.0.2: + resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 2.0.6 + unist-util-visit: 4.1.2 + dev: false - /unist-util-remove-position@5.0.0: - resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + /unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} dependencies: - '@types/unist': 3.0.2 - unist-util-visit: 5.0.0 + '@types/unist': 2.0.6 + dev: false - /unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + /unist-util-visit-parents@3.1.1: + resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} dependencies: - '@types/unist': 3.0.2 + '@types/unist': 2.0.6 + unist-util-is: 4.1.0 + dev: false /unist-util-visit-parents@5.1.3: resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.6 unist-util-is: 5.2.1 dev: false - /unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + /unist-util-visit@2.0.3: + resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==} dependencies: - '@types/unist': 3.0.2 - unist-util-is: 6.0.0 + '@types/unist': 2.0.6 + unist-util-is: 4.1.0 + unist-util-visit-parents: 3.1.1 + dev: false - /unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + /unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} dependencies: - '@types/unist': 3.0.2 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 + '@types/unist': 2.0.6 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: false /universal-user-agent@6.0.0: resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} @@ -15985,8 +15310,8 @@ packages: engines: {node: '>= 4.0.0'} dev: true - /universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + /universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} /unpipe@1.0.0: @@ -15997,13 +15322,28 @@ packages: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} - /update-browserslist-db@1.0.13(browserslist@4.23.0): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + /unzipper@0.10.11: + resolution: {integrity: sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==} + dependencies: + big-integer: 1.6.51 + binary: 0.3.0 + bluebird: 3.4.7 + buffer-indexof-polyfill: 1.0.2 + duplexer2: 0.1.4 + fstream: 1.0.12 + graceful-fs: 4.2.11 + listenercount: 1.0.1 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + dev: true + + /update-browserslist-db@1.0.11(browserslist@4.21.10): + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.23.0 + browserslist: 4.21.10 escalade: 3.1.1 picocolors: 1.0.0 @@ -16030,13 +15370,13 @@ packages: /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: - punycode: 2.3.1 + punycode: 2.3.0 /url-join@4.0.1: resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} dev: true - /url-loader@4.1.1(file-loader@6.2.0)(webpack@5.89.0): + /url-loader@4.1.1(file-loader@6.2.0)(webpack@5.88.2): resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -16046,11 +15386,11 @@ packages: file-loader: optional: true dependencies: - file-loader: 6.2.0(webpack@5.89.0) + file-loader: 6.2.0(webpack@5.88.2) loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) + webpack: 5.88.2(webpack-cli@5.1.4) dev: false /url-parse@1.5.10: @@ -16060,6 +15400,47 @@ packages: requires-port: 1.0.0 dev: true + /use-composed-ref@1.3.0(react@18.2.0): + resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || 18 + dependencies: + react: 18.2.0 + dev: false + + /use-isomorphic-layout-effect@1.1.2(react@18.2.0): + resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || 18 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + react: 18.2.0 + dev: false + + /use-latest@1.2.1(react@18.2.0): + resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || 18 + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + react: 18.2.0 + use-isomorphic-layout-effect: 1.1.2(react@18.2.0) + dev: false + + /use-sync-external-store@1.2.0(react@18.2.0): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || 18 + dependencies: + react: 18.2.0 + dev: false + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -16083,18 +15464,27 @@ packages: hasBin: true dev: false + /uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + dequal: 2.0.3 + diff: 5.1.0 + kleur: 4.1.5 + sade: 1.8.1 + dev: false + /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - dev: true - /v8-to-istanbul@9.1.3: - resolution: {integrity: sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==} + /v8-to-istanbul@9.1.0: + resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} engines: {node: '>=10.12.0'} dependencies: - '@jridgewell/trace-mapping': 0.3.21 - '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 2.0.0 - dev: true + '@jridgewell/trace-mapping': 0.3.19 + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.9.0 /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -16121,25 +15511,28 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - /vfile-location@5.0.2: - resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + /vfile-location@4.1.0: + resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} dependencies: - '@types/unist': 3.0.2 - vfile: 6.0.1 + '@types/unist': 2.0.6 + vfile: 5.3.7 dev: false - /vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + /vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} dependencies: - '@types/unist': 3.0.2 - unist-util-stringify-position: 4.0.0 + '@types/unist': 2.0.6 + unist-util-stringify-position: 3.0.3 + dev: false - /vfile@6.0.1: - resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + /vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} dependencies: - '@types/unist': 3.0.2 - unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.2 + '@types/unist': 2.0.6 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + dev: false /vinyl-file@3.0.0: resolution: {integrity: sha512-BoJDj+ca3D9xOuPEM6RWVtWQtvEPQiQYn82LvdxhLWplfQsBzBqtgK0yhCP0s1BNTi6dH9BO+dzybvyQIacifg==} @@ -16173,6 +15566,20 @@ packages: xml-name-validator: 4.0.0 dev: true + /wait-on@7.0.1: + resolution: {integrity: sha512-9AnJE9qTjRQOlTZIldAaf/da2eW0eSRSgcqq85mXQja/DW3MriHxkpODDSUEg+Gri/rKEcXUZHe+cevvYItaog==} + engines: {node: '>=12.0.0'} + hasBin: true + dependencies: + axios: 0.27.2 + joi: 17.8.3 + lodash: 4.17.21 + minimist: 1.2.8 + rxjs: 7.8.1 + transitivePeerDependencies: + - debug + dev: false + /walk-up-path@1.0.0: resolution: {integrity: sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==} @@ -16180,7 +15587,6 @@ packages: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: makeerror: 1.0.12 - dev: true /watchpack@2.4.0: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} @@ -16211,30 +15617,27 @@ packages: engines: {node: '>=12'} dev: true - /webpack-bundle-analyzer@4.10.1: - resolution: {integrity: sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==} + /webpack-bundle-analyzer@4.8.0: + resolution: {integrity: sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg==} engines: {node: '>= 10.13.0'} hasBin: true dependencies: '@discoveryjs/json-ext': 0.5.7 - acorn: 8.11.3 - acorn-walk: 8.3.2 + acorn: 8.10.0 + acorn-walk: 8.2.0 + chalk: 4.1.2 commander: 7.2.0 - debounce: 1.2.1 - escape-string-regexp: 4.0.0 gzip-size: 6.0.0 - html-escaper: 2.0.2 - is-plain-object: 5.0.0 + lodash: 4.17.21 opener: 1.5.2 - picocolors: 1.0.0 - sirv: 2.0.4 + sirv: 1.0.19 ws: 7.5.9 transitivePeerDependencies: - bufferutil - utf-8-validate dev: false - /webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@4.11.1)(webpack@5.89.0): + /webpack-cli@5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@4.11.1)(webpack@5.88.2): resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} engines: {node: '>=14.15.0'} hasBin: true @@ -16252,10 +15655,10 @@ packages: optional: true dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.89.0) - '@webpack-cli/generators': 3.0.7(prettier@3.0.3)(webpack-cli@5.1.4)(webpack@5.89.0) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.89.0) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack-dev-server@4.11.1)(webpack@5.89.0) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.88.2) + '@webpack-cli/generators': 3.0.7(prettier@3.0.0)(webpack-cli@5.1.4)(webpack@5.88.2) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.88.2) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack-dev-server@4.11.1)(webpack@5.88.2) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.3 @@ -16264,24 +15667,24 @@ packages: import-local: 3.1.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) - webpack-dev-server: 4.11.1(webpack-cli@5.1.4)(webpack@5.89.0) - webpack-merge: 5.10.0 + webpack: 5.88.2(webpack-cli@5.1.4) + webpack-dev-server: 4.11.1(webpack-cli@5.1.4)(webpack@5.88.2) + webpack-merge: 5.9.0 - /webpack-dev-middleware@5.3.3(webpack@5.89.0): + /webpack-dev-middleware@5.3.3(webpack@5.88.2): resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^4.0.0 || ^5.0.0 dependencies: colorette: 2.0.20 - memfs: 3.5.3 + memfs: 3.4.13 mime-types: 2.1.35 range-parser: 1.2.1 - schema-utils: 4.2.0 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) + schema-utils: 4.0.0 + webpack: 5.88.2(webpack-cli@5.1.4) - /webpack-dev-server@4.11.1(webpack-cli@5.1.4)(webpack@5.89.0): + /webpack-dev-server@4.11.1(webpack-cli@5.1.4)(webpack@5.88.2): resolution: {integrity: sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==} engines: {node: '>= 12.13.0'} hasBin: true @@ -16292,65 +15695,15 @@ packages: webpack-cli: optional: true dependencies: - '@types/bonjour': 3.5.13 - '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.21 - '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.5 - '@types/sockjs': 0.3.36 - '@types/ws': 8.5.10 - ansi-html-community: 0.0.8 - bonjour-service: 1.2.1 - chokidar: 3.5.3 - colorette: 2.0.20 - compression: 1.7.4 - connect-history-api-fallback: 2.0.0 - default-gateway: 6.0.3 - express: 4.18.2 - graceful-fs: 4.2.11 - html-entities: 2.4.0 - http-proxy-middleware: 2.0.6(@types/express@4.17.21) - ipaddr.js: 2.1.0 - open: 8.4.2 - p-retry: 4.6.2 - rimraf: 3.0.2 - schema-utils: 4.2.0 - selfsigned: 2.4.1 - serve-index: 1.9.1 - sockjs: 0.3.24 - spdy: 4.0.2 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) - webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@4.11.1)(webpack@5.89.0) - webpack-dev-middleware: 5.3.3(webpack@5.89.0) - ws: 8.16.0 - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - - /webpack-dev-server@4.15.1(webpack@5.89.0): - resolution: {integrity: sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==} - engines: {node: '>= 12.13.0'} - hasBin: true - peerDependencies: - webpack: ^4.37.0 || ^5.0.0 - webpack-cli: '*' - peerDependenciesMeta: - webpack: - optional: true - webpack-cli: - optional: true - dependencies: - '@types/bonjour': 3.5.13 - '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.21 - '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.5 - '@types/sockjs': 0.3.36 - '@types/ws': 8.5.10 + '@types/bonjour': 3.5.10 + '@types/connect-history-api-fallback': 1.3.5 + '@types/express': 4.17.17 + '@types/serve-index': 1.9.1 + '@types/serve-static': 1.15.1 + '@types/sockjs': 0.3.33 + '@types/ws': 8.5.4 ansi-html-community: 0.0.8 - bonjour-service: 1.2.1 + bonjour-service: 1.1.0 chokidar: 3.5.3 colorette: 2.0.20 compression: 1.7.4 @@ -16358,42 +15711,40 @@ packages: default-gateway: 6.0.3 express: 4.18.2 graceful-fs: 4.2.11 - html-entities: 2.4.0 - http-proxy-middleware: 2.0.6(@types/express@4.17.21) - ipaddr.js: 2.1.0 - launch-editor: 2.6.1 + html-entities: 2.3.3 + http-proxy-middleware: 2.0.6(@types/express@4.17.17) + ipaddr.js: 2.0.1 open: 8.4.2 p-retry: 4.6.2 rimraf: 3.0.2 - schema-utils: 4.2.0 - selfsigned: 2.4.1 + schema-utils: 4.0.0 + selfsigned: 2.1.1 serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) - webpack-dev-middleware: 5.3.3(webpack@5.89.0) - ws: 8.16.0 + webpack: 5.88.2(webpack-cli@5.1.4) + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@4.11.1)(webpack@5.88.2) + webpack-dev-middleware: 5.3.3(webpack@5.88.2) + ws: 8.13.0 transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - dev: false - /webpack-merge@5.10.0: - resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} + /webpack-merge@5.9.0: + resolution: {integrity: sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==} engines: {node: '>=10.0.0'} dependencies: clone-deep: 4.0.1 - flat: 5.0.2 wildcard: 2.0.1 /webpack-sources@3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} - /webpack@5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4): - resolution: {integrity: sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==} + /webpack@5.88.2(webpack-cli@5.1.4): + resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -16402,17 +15753,17 @@ packages: webpack-cli: optional: true dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.5 + '@types/eslint-scope': 3.7.4 + '@types/estree': 1.0.1 '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/wasm-edit': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.11.3 - acorn-import-assertions: 1.9.0(acorn@8.11.3) - browserslist: 4.23.0 + acorn: 8.10.0 + acorn-import-assertions: 1.9.0(acorn@8.10.0) + browserslist: 4.21.10 chrome-trace-event: 1.0.3 enhanced-resolve: 5.15.0 - es-module-lexer: 1.4.1 + es-module-lexer: 1.3.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -16423,16 +15774,16 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(esbuild@0.17.11)(webpack@5.89.0) + terser-webpack-plugin: 5.3.9(webpack@5.88.2) watchpack: 2.4.0 - webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@4.11.1)(webpack@5.89.0) + webpack-cli: 5.1.4(@webpack-cli/generators@3.0.7)(webpack-dev-server@4.11.1)(webpack@5.88.2) webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - /webpackbar@5.0.2(webpack@5.89.0): + /webpackbar@5.0.2(webpack@5.88.2): resolution: {integrity: sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==} engines: {node: '>=12'} peerDependencies: @@ -16441,8 +15792,8 @@ packages: chalk: 4.1.2 consola: 2.15.3 pretty-time: 1.1.0 - std-env: 3.7.0 - webpack: 5.89.0(esbuild@0.17.11)(webpack-cli@5.1.4) + std-env: 3.3.2 + webpack: 5.88.2(webpack-cli@5.1.4) dev: false /websocket-driver@0.7.4: @@ -16491,25 +15842,6 @@ packages: is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 - dev: true - - /which-builtin-type@1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} - engines: {node: '>= 0.4'} - dependencies: - function.prototype.name: 1.1.6 - has-tostringtag: 1.0.0 - is-async-function: 2.0.0 - is-date-object: 1.0.5 - is-finalizationregistry: 1.0.2 - is-generator-function: 1.0.10 - is-regex: 1.1.4 - is-weakref: 1.0.2 - isarray: 2.0.5 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.11 - dev: true /which-collection@1.0.1: resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} @@ -16518,7 +15850,6 @@ packages: is-set: 2.0.2 is-weakmap: 2.0.1 is-weakset: 2.0.2 - dev: true /which-pm@2.0.0: resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} @@ -16527,16 +15858,16 @@ packages: load-yaml-file: 0.2.0 path-exists: 4.0.0 - /which-typed-array@1.1.11: - resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + /which-typed-array@1.1.9: + resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.5 - call-bind: 1.0.5 + call-bind: 1.0.2 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.0 - dev: true + is-typed-array: 1.1.10 /which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} @@ -16581,6 +15912,10 @@ packages: /wildcard@2.0.1: resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + /word-wrap@1.2.4: + resolution: {integrity: sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==} + engines: {node: '>=0.10.0'} + /workerpool@6.2.1: resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} dev: true @@ -16665,8 +16000,8 @@ packages: optional: true dev: false - /ws@8.16.0: - resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + /ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -16686,7 +16021,7 @@ packages: resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} hasBin: true dependencies: - sax: 1.3.0 + sax: 1.2.4 dev: false /xml-name-validator@4.0.0: @@ -16698,10 +16033,14 @@ packages: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} dev: true + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: true + /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - dev: true /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -16713,11 +16052,6 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - /yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} - engines: {node: '>= 14'} - dev: true - /yargs-parser@20.2.4: resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} engines: {node: '>=10'} @@ -16731,7 +16065,6 @@ packages: /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - dev: true /yargs-unparser@2.0.0: resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} @@ -16756,8 +16089,8 @@ packages: yargs-parser: 20.2.9 dev: true - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + /yargs@17.7.1: + resolution: {integrity: sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==} engines: {node: '>=12'} dependencies: cliui: 8.0.1 @@ -16767,7 +16100,6 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - dev: true /yeoman-environment@3.19.3: resolution: {integrity: sha512-/+ODrTUHtlDPRH9qIC0JREH8+7nsRcjDl3Bxn2Xo/rvAaVvixH5275jHwg0C85g4QsF4P6M2ojfScPPAl+pLAg==} @@ -16849,7 +16181,6 @@ packages: /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} - dev: true /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} @@ -16864,9 +16195,10 @@ packages: resolution: {integrity: sha512-oyu0m54SGCtzh6EClBVqDDlAYRz4jrVtKwQ7ZnsEmMI9HnzuZFj8QFwAY1M5uniIYACdGvv0PBWPF2kO0aNofA==} dev: true - /zod@3.22.3: - resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} + /zod@3.21.4: + resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==} dev: false /zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + dev: false diff --git a/pyproject.toml b/pyproject.toml index 8b383b80113..b1327e69660 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,17 +1,9 @@ [tool.black] -target-version = ["py311"] -force-exclude = ''' -( - ^/vendor/ - | ^/data/playground/ -) -''' +target-version = ["py39"] +force-exclude = ["vendor", "data/playground"] [tool.ruff] select = ["E", "F", "C4", "I001", "UP", "SIM"] -ignore = ["E501", "SIM105", "UP007", "UP035"] -target-version = "py311" +ignore = ["E501", "SIM105", "UP035"] +target-version = "py39" extend-exclude = ["vendor", "data/playground/**/*.py"] - -[tool.pyright] -reportSelfClsParameterName = false diff --git a/queries/go.scm b/queries/go.scm index 45cc5157477..1f71bde6f5f 100644 --- a/queries/go.scm +++ b/queries/go.scm @@ -222,55 +222,3 @@ . ) ) @anonymousFunction @namedFunction - -;; switch-based branch - -( - [ - (default_case) - (expression_case) - (type_case) - ] @branch - (#trim-end! @branch) - (#insertion-delimiter! @branch "\n") -) - -[ - (type_switch_statement) - (expression_switch_statement) -] @branch.iteration - -;; if-else-based branch - -;; first if in an if-else chain -( - (if_statement - consequence: (block) @branch.end.endOf - ) @branch.start.startOf - (#not-parent-type? @branch.start.startOf if_statement) - (#insertion-delimiter! @branch.start.startOf " ") -) - -;; internal if in an if-else chain -(if_statement - "else" @branch.start - alternative: (if_statement - consequence: (block) @branch.end - ) - (#insertion-delimiter! @branch.start " ") -) - -;; final else branch in an if-else chain -( - (if_statement - "else" @branch.start.startOf - alternative: (block) - ) @branch.end.endOf - (#insertion-delimiter! @branch.start.startOf " ") -) - -;; iteration scope is always the outermost if statement -( - (if_statement) @branch.iteration - (#not-parent-type? @branch.iteration if_statement) -) diff --git a/queries/html.scm b/queries/html.scm deleted file mode 100644 index 2862d82fc7c..00000000000 --- a/queries/html.scm +++ /dev/null @@ -1,99 +0,0 @@ -;;!! -;;! ^^^ -;;! ----- -(start_tag - (tag_name) @name -) @_.domain - -;;!! -;;! ^^^ -;;! ------ -(end_tag - (tag_name) @name -) @_.domain - -;;!! -;;! ^^^^^^^ -(attribute) @attribute - -;;!! -;;! ^^ -(attribute - (attribute_name) @collectionKey - [ - (quoted_attribute_value) - (attribute_value) - ] ? @collectionKey.trailing.startOf -) @_.domain - -;;!! -;;! ^ -;;!! -;;! ^^^^ -(attribute - (attribute_name) @value.leading.endOf - [ - (quoted_attribute_value) - (attribute_value) - ] @value -) @value.domain - -;;!! -;;! ^^ -(quoted_attribute_value - (attribute_value) @textFragment -) @string - -;;!! -;;! ^^^^^ -(start_tag) @attribute.iteration @collectionKey.iteration @value.iteration - -;;!! -;;! ^^^^^^^^^^^^^^^^ -(comment) @comment @textFragment - -;;!! text -;;! ^^^^ -(text) @textFragment - -;;!! -;;! ^^^^^ -(raw_text) @textFragment - -;; Use parent wildcard to get all three kinds of elements: element, script_element, style_element - -;;!! text -;;! ^^^^^^^^^^^^^^^ -;;! ^^^^ -(_ - (start_tag) @xmlElement.interior.start.endOf - (end_tag) @xmlElement.interior.end.startOf -) @xmlElement - -;;!! text -;;! ^^^^^ ^^^^^^ -;;! --------------- -(_ - (start_tag) @xmlStartTag - (end_tag) @xmlEndTag -) @_.domain - -(_ - [ - (start_tag) - (end_tag) - ] @xmlBothTags - (#allow-multiple! @xmlBothTags) -) @_.domain - -(_ - (start_tag) @xmlElement.iteration.start.endOf @xmlBothTags.iteration.start.endOf - (element) - (end_tag) @xmlElement.iteration.end.startOf @xmlBothTags.iteration.end.startOf -) - -(_ - (start_tag) @xmlStartTag.iteration.start.endOf @xmlEndTag.iteration.start.endOf - (element) - (end_tag) @xmlStartTag.iteration.end.startOf @xmlEndTag.iteration.end.startOf -) diff --git a/queries/java.scm b/queries/java.scm deleted file mode 100644 index 30582705392..00000000000 --- a/queries/java.scm +++ /dev/null @@ -1,328 +0,0 @@ -;; Generated by the following command: -;; > curl https://raw.githubusercontent.com/tree-sitter/tree-sitter-java/master/src/node-types.json | jq '[.[] | select(.type == "statement" or .type == "declaration") | .subtypes[].type]' -[ - (annotation_type_declaration) - (class_declaration) - (enum_declaration) - (import_declaration) - (interface_declaration) - (module_declaration) - (package_declaration) - (assert_statement) - (break_statement) - (continue_statement) - (declaration) - (do_statement) - (enhanced_for_statement) - (expression_statement) - (for_statement) - (if_statement) - (labeled_statement) - (local_variable_declaration) - (return_statement) - (switch_expression) - (synchronized_statement) - (throw_statement) - (try_statement) - (try_with_resources_statement) - (while_statement) - (yield_statement) - - ;; exceptions - ;; ";", - ;; "block", - (method_declaration) - (constructor_declaration) - (field_declaration) -] @statement - -(class_declaration - name: (_) @name @className -) @class @_.domain - -;;!! void myFunk() {} -;;! ^^^^^^^^^^^^^^^^ -(method_declaration - name: (_) @name @functionName -) @namedFunction @_.domain -(constructor_declaration - name: (_) @name @functionName -) @namedFunction @_.domain - -;;!! ((value) -> true) -;;! ^^^^^^^^^^^^^^^ -(lambda_expression) @anonymousFunction - -;;!! if (value) {} -;;! ^^^^^^^^^^^^^ -( - (if_statement) @ifStatement - (#not-parent-type? @ifStatement "if_statement") -) - -;;!! "string" -;;! ^^^^^^^^ -(string_literal) @string @textFragment - -;;!! // comment -;;! ^^^^^^^^^^ -[ - (line_comment) - (block_comment) -] @comment @textFragment - -;;!! int[] values = {1, 2, 3}; -;;! ^^^^^^^^^ -(array_initializer) @list - -;;!! List value = new ArrayList() {{ add("a"); }}; -;;! ^^^^^^^^^^^^^^^ -(object_creation_expression - (class_body - (block) @map - ) -) - -;;!! foo(1); -;;! ^^^^^^ -;;!! new Foo(1); -;;! ^^^^^^^^^^ -;;!! super(1); -;;! ^^^^^^^^ -[ - (method_invocation) - (object_creation_expression) - (explicit_constructor_invocation) -] @functionCall - -;;!! case "0": return "zero"; -;;! ^^^^^^^^^^^^^^^^^^^^^^^^ -;;!! case "0" -> "zero"; -;;! ^^^^^^^^^^^^^^^^^^^ -[ - (switch_block_statement_group) - (switch_rule) -] @branch - -;;!! case "0": return "zero"; -;;! ^^^ -;;! ------------------------ -(switch_block_statement_group - (switch_label - (_) @condition - ) -) @condition.domain - -;;!! case "0" -> "zero"; -;;! ^^^ -;;! ------------------- -(switch_rule - (switch_label - (_) @condition - ) -) @condition.domain - -(switch_expression) @branch.iteration @condition.iteration - -;;!! if () {} -;;! ^^^^^^^^ -( - (if_statement - "if" @branch.start @branch.removal.start - condition: (_) @condition - consequence: (block) @branch.end @branch.removal.end - alternative: (if_statement)? @branch.removal.end.startOf - ) @condition.domain - (#not-parent-type? @condition.domain "if_statement") - (#child-range! @condition 0 -1 true true) -) - -;;!! else if () {} -;;! ^^^^^^^^^^^^^ -(if_statement - "else" @branch.start @condition.domain.start - alternative: (if_statement - condition: (_) @condition - consequence: (block) @branch.end @condition.domain.end - (#child-range! @condition 0 -1 true true) - ) -) - -;;!! else {} -;;! ^^^^^^^ -(if_statement - "else" @branch.start - alternative: (block) @branch.end -) - -;;!! for (int i = 0; i < 5; ++i) {} -;;! ^^^^^ -;;! ------------------------------ -(for_statement - condition: (_) @condition -) @_.domain - -;;!! while (value) {} -;;! ^^^^^ -;;! ---------------- -(while_statement - condition: (_) @condition - (#child-range! @condition 0 -1 true true) -) @_.domain - -(do_statement - condition: (_) @condition - (#child-range! @condition 0 -1 true true) -) @_.domain - -;;!! switch (value) {} -;;! ^^^^^ -;;! ----------------- -(switch_expression - condition: (_) @private.switchStatementSubject - (#child-range! @private.switchStatementSubject 0 -1 true true) -) @_.domain - -;;!! true ? 1 : 2 -(ternary_expression - condition: (_) @condition - consequence: (_) @branch -) @condition.domain -(ternary_expression - alternative: (_) @branch -) - -;;!! true ? 1 : 2 -;;! ^^^^^^^^^^^^ -(ternary_expression) @branch.iteration - -;;!! void myFunk(int value) {} -;;! ^^^^^ -;;! ------------------------- -(formal_parameters - (formal_parameter - (identifier) @name - ) @_.domain -) @_.iteration - -;;!! Map -;;! ^^^^^^^ ^^^^^^ -(type_arguments - (type_identifier) @type -) - -;;!! List list = value; -;;! ^^^^^^^^^^^^ -;;! -------------------------- -(local_variable_declaration - type: (_) @type -) @_.domain - -;;!! name = new ArrayList(); -;;! ^^^^^^^^^^^^^^^^^ -;;! ----------------------- -(object_creation_expression - type: (_) @type -) @_.domain - -;;!! name = new int[5]; -;;! ^^^ -;;! ---------- -(array_creation_expression - type: (_) @type -) @_.domain - -;;!! void myFunk(int value) {} -;;! ^^^ -;;! --------- -(formal_parameter - type: (_) @type -) @_.domain - -;;!! int size() {} -;;! ^^^ -;;! ------------- -(method_declaration - type: (_) @type -) @_.domain - -;;!! new test(); -;;! ^^^^^^^^ -;;! ----------- -(_ - (object_creation_expression - (argument_list) @functionCallee.end.startOf - ) @functionCallee.start.startOf @_.domain.start - ";"? @_.domain.end -) - -;;!! new test().bar(); -;;! ^^^^^^^^^^^^^^ -;;! ----------------- -(_ - (method_invocation - (argument_list) @functionCallee.end.startOf - ) @functionCallee.start.startOf @_.domain.start - ";"? @_.domain.end -) - -;;!! super(); -;;! ^^^^^ -;;! -------- -(explicit_constructor_invocation - (argument_list) @functionCallee.end.startOf -) @functionCallee.start.startOf @_.domain - -;;!! for (int value : values) {} -;;! ^^^^^^ -;;! --------------------------- -(enhanced_for_statement - type: (_) @type - name: (_) @name - value: (_) @value -) @_.domain - -;;!! int value = 1; -;;! ^ -;;! xxxx -;;! -------------- -(local_variable_declaration - (variable_declarator - name: (_) @name @value.leading.endOf - value: (_)? @value @name.trailing.startOf - ) -) @_.domain -(field_declaration - (variable_declarator - name: (_) @name @value.leading.endOf - value: (_)? @value @name.trailing.startOf - ) -) @_.domain - -;;!! value = 1; -;;! ^ -;;! xxxx -;;! ---------- -(_ - (assignment_expression - left: (_) @name @value.leading.endOf - right: (_) @value @name.trailing.startOf - ) @_.domain.start - ";"? @_.domain.end -) - -;;!! return value; -;;! ^^^^^ -;;! ------------- -( - (return_statement) @value @_.domain - (#child-range! @value 1 -2) -) - -;;!! str -> str.length > 0 -;;! ^^^^^^^^^^^^^^ -;;! --------------------- -(lambda_expression - body: (_) @value - (#not-type? @value block) -) @_.domain diff --git a/queries/javascript.core.scm b/queries/javascript.core.scm index 5e853f2aeea..c7978670de0 100644 --- a/queries/javascript.core.scm +++ b/queries/javascript.core.scm @@ -1,5 +1,4 @@ ;; import javascript.function.scm -;; import javascript.fieldAccess.scm ;; `name` scope without `export` ( @@ -23,11 +22,11 @@ (export_statement (_ name: (_) @name - ) @_dummy + ) @dummy ;; We have a special case for this one. Note we don't need to list the other ;; special cases from above because they can't be exported - (#not-type? @_dummy variable_declarator) + (#not-type? @dummy variable_declarator) ) @_.domain ;; Special cases for `(let | const | var) foo = ...;` because the full statement @@ -35,93 +34,21 @@ ;; this full grandparent statement. ( [ - ;; name: ;;!! (const | let) foo = ...; - ;;! ^^^ - ;;! xxxxxxxxxxxxxxxxxxxx - ;;! ------------------------ - ;; value: - ;;!! (const | let) foo = ...; - ;;! ^^^ - ;;! xxxxxx - ;;! ------------------------ + ;;! --------------^^^------- (lexical_declaration - . - (variable_declarator - name: (_) @name @name.removal.end.endOf - value: (_)? @name.removal.end.startOf - ) - ) - - ;; name: - ;;!! var foo = ...; - ;;! ^^^ - ;;! xxxxxxxxxx - ;;! -------------- - ;; value: - ;;!! var foo = ...; - ;;! ^^^ - ;;! xxxxxx - ;;! -------------- - ;; Note that we can't merge this with the variable declaration above because - ;; of https://github.com/tree-sitter/tree-sitter/issues/1442#issuecomment-1584628651 - (variable_declaration - . - (variable_declarator - name: (_) @name @name.removal.end.endOf - value: (_)? @name.removal.end.startOf - ) - ) - ] @_.domain @name.removal.start.startOf - (#not-parent-type? @_.domain export_statement) - - ;; Handle multiple variable declarators in one statement, eg - ;;!! (let | const | var) aaa = ..., ccc = ...; - ;;! --------------------^^^--------^^^------- - (#allow-multiple! @name) -) - -;; Note that the same domains below will also have the first variable -;; as a target, but that is matched above -( - [ - ;; name: - ;;!! (const | let) aaa = 0, bbb = 0; - ;;! ^^^ - ;;! xxxxxx - ;;! ------------------------------- - ;; value: - ;;!! (const | let) aaa = 0, bbb = 0; - ;;! ^ - ;;! xxxx - ;;! ------------------------------- - (lexical_declaration - (variable_declarator) - . (variable_declarator name: (_) @name - value: (_)? @name.trailing.startOf ) ) - ;; name: - ;;!! var aaa = 0, bbb = 0; - ;;! ^^^ - ;;! xxxxxx - ;;! --------------------- - ;; value: - ;;!! var aaa = 0, bbb = 0; - ;;! ^ - ;;! xxxx - ;;! --------------------- + ;;!! var foo = ...; + ;;! ----^^^------- ;; Note that we can't merge this with the variable declaration above because ;; of https://github.com/tree-sitter/tree-sitter/issues/1442#issuecomment-1584628651 (variable_declaration - (variable_declarator) - . (variable_declarator name: (_) @name - value: (_)? @name.trailing.startOf ) ) ] @_.domain @@ -136,19 +63,10 @@ ( (export_statement (_ - ;; name: - ;;!! export (const | let | var) foo = ...; - ;;! ^^^ - ;;! xxxxxx - ;;! ------------------------------------- - ;; value: - ;;!! export (const | let | var) foo = 0; - ;;! ^ - ;;! xxxx - ;;! ----------------------------------- + ;;!! export [default] (let | const | var) foo = ...; + ;;! -------------------------------------^^^------- (variable_declarator name: (_) @name - value: (_)? @name.trailing.startOf ) ) ) @_.domain @@ -159,242 +77,22 @@ (#allow-multiple! @name) ) -;; name: -;;!! (const | let | var) aaa = 0, bbb = 0; -;;! ^^^ -;;! xxxxxxxxxxxxxxxxxxxxxxxxxx -;;! ------- -;; value: -;;!! (const | let | var) aaa = 0, bbb = 0; -;;! ^ -;;! xxxx -;;! ------- -(_ - . - (variable_declarator - name: (_) @name @name.removal.end.endOf - value: (_)? @name.removal.end.startOf - ) @_.domain - . - (variable_declarator) -) @name.removal.start.startOf - -;;!! (const | let | var) aaa = 0, bbb = 0; -;;! ^^^ -;;! xxxxxx -;;! ------- -(_ - (variable_declarator) - . - (variable_declarator - name: (_) @name - value: (_)? @name.trailing.startOf - ) @_.domain -) - -;; Special cases for `(let | const | var) foo = ...;` because the full statement -;; is actually a grandparent of the `name` node, so we want the domain to include -;; this full grandparent statement. -( - [ - ;;!! (const | let) aaa: Bbb = 0; - ;;! ^ - ;;! xxxx - ;;! --------------------------- - (lexical_declaration - (variable_declarator - (_) @value.leading.endOf - . - value: (_)? @value - ) - ) - - ;;!! var aaa: Bbb = 0; - ;;! ^ - ;;! xxxx - ;;! ----------------- - ;; Note that we can't merge this with the variable declaration above because - ;; of https://github.com/tree-sitter/tree-sitter/issues/1442#issuecomment-1584628651 - (variable_declaration - (variable_declarator - (_) @value.leading.endOf - . - value: (_)? @value - ) - ) - ] @_.domain - (#not-parent-type? @_.domain export_statement) - - ;; Handle multiple variable declarators in one statement, eg - ;;!! (let | const | var) aaa: Bbb = ..., ccc: Ddd = ...; - ;;! -------------------------------^^^-------------^^^- - (#allow-multiple! @value) -) - -( - (export_statement - (_ - ;;!! export (const | let | var) aaa: Bbb = 0; - ;;! ^ - ;;! xxxx - ;;! ---------------------------------------- - (variable_declarator - (_) @value.leading.endOf - . - value: (_)? @value - ) - ) - ) @_.domain - - ;; Handle multiple variable declarators in one statement, eg - ;;!! export (let | const | var) aaa: Bbb = ..., ccc: Ddd = ...; - ;;! --------------------------------------^^^-------------^^^- - (#allow-multiple! @value) -) - -;;!! (const | let | var) aaa: Ccc = 0, bbb: Ddd = 0; -;;!1 ^ -;;!1 xxxx -;;!1 ------------ -;;!2 ^ -;;!2 xxxx -;;!2 ------------ -( - (_ - (variable_declarator - (_) @value.leading.endOf - . - value: (_)? @value - ) @_.domain - ) @_dummy - (#has-multiple-children-of-type? @_dummy variable_declarator) -) - -(expression_statement - [ - ;; name: - ;;!! foo = 0; - ;;! ^^^ - ;;! xxxxxx - ;;! -------- - ;; value: - ;;!! foo = 0; - ;;! ^ - ;;! xxxx - ;;! -------- - (assignment_expression - left: (_) @name @value.leading.endOf - right: (_) @value @name.trailing.startOf - ) - - ;; name: - ;;!! foo += 1; - ;;! ^^^ - ;;! xxxxxxx - ;;! --------- - ;; value: - ;;!! foo += 1; - ;;! ^ - ;;! xxxxx - ;;! --------- - (augmented_assignment_expression - left: (_) @name @value.leading.endOf - right: (_) @value @name.trailing.startOf - ) - ] -) @_.domain - -( - [ - ;; name: - ;;!! aaa = 0, bbb = 0; - ;;!1 ^^^ - ;;!1 xxxxxx - ;;!1 ------- - ;;!2 ^^^ - ;;!2 xxxxxx - ;;!2 ------- - ;; value: - ;;!! aaa = 0, bbb = 0; - ;;!1 ^ - ;;!1 xxxx - ;;!1 ------- - ;;!2 ^ - ;;!2 xxxx - ;;!2 ------- - (assignment_expression - left: (_) @name @value.leading.endOf - right: (_) @value @name.trailing.startOf - ) - - ;; name: - ;;!! aaa += 0, bbb += 0; - ;;!1 ^^^ - ;;!1 xxxxxxx - ;;!1 -------- - ;;!2 ^^^ - ;;!2 xxxxxxx - ;;!2 -------- - ;; value: - ;;!! aaa += 0, bbb += 0; - ;;!1 ^ - ;;!1 xxxxx - ;;!1 -------- - ;;!2 ^ - ;;!2 xxxxx - ;;!2 -------- - (augmented_assignment_expression - left: (_) @name @value.leading.endOf - right: (_) @value @name.trailing.startOf - ) - ] @_.domain - - (#not-parent-type? @_.domain expression_statement) -) - -;;!! const aaa = {bbb}; -;;! ^^^ -(shorthand_property_identifier) @collectionKey @value - -;;!! return 0; -;;! ^ -;;! --------- -(return_statement - (_) @value -) @_.domain - -;;!! yield 0; -;;! ^ -;;! -------- -(yield_expression - (_) @value -) @_.domain - -;;!! str => str.length > 0 -;;! ^^^^^^^^^^^^^^ -;;! --------------------- -(arrow_function - body: (_) @value - (#not-type? @value statement_block) +;;!! foo += ...; +;;! ^^^-------- +(augmented_assignment_expression + left: (_) @name ) @_.domain -;; name: -;;!! for (const aaa of bbb) {} -;;! ^^^ -;;! ---------------------- -;; value: -;;!! for (const aaa of bbb) {} -;;! ^^^ -;;! ---------------------- -(for_in_statement +;;!! foo = ...; +;;! ^^^------- +(assignment_expression left: (_) @name - right: (_) @value ) @_.domain [ (program) (formal_parameters) -] @name.iteration @value.iteration @type.iteration +] @name.iteration ;; Treat interior of all bodies as iteration scopes for `name`, eg ;;!! function foo() { } @@ -402,327 +100,8 @@ (_ body: (_ . - "{" @name.iteration.start.endOf @value.iteration.start.endOf @type.iteration.start.endOf - "}" @name.iteration.end.startOf @value.iteration.end.startOf @type.iteration.end.startOf + "{" @name.iteration.start.endOf + "}" @name.iteration.end.startOf . ) ) - -;;!! const aaa = {bbb: 0, ccc: 0}; -;;! ************** -(object - "{" @collectionKey.iteration.start.endOf @value.iteration.start.endOf - "}" @collectionKey.iteration.end.startOf @value.iteration.end.startOf -) - -;;!! const { aaa: bbb } = ccc; -;;! ^^^ -;;! -------- -(pair_pattern - key: (_) @collectionKey @value.leading.endOf - value: (_) @value @collectionKey.trailing.startOf -) @_.domain - -;;!! "string" -;;!! `string` -;;! ^^^^^^^^ -[ - (string) - (template_string) -] @string - -;;!! // comment -;;! ^^^^^^^^^^ -(comment) @comment - -;;!! /\w+/ -;;! ^^^^^ -(regex) @regularExpression - -[ - (string_fragment) - (comment) - (regex_pattern) -] @textFragment - -( - (template_string) @textFragment - (#child-range! @textFragment 0 -1 true true) -) - -;;!! { value: 0 } -;;! ^^^^^^^^^^^^ -[ - (object) - (object_pattern) -] @map - -;;!! [ 0 ] -;;! ^^^^^ -[ - (array) - (array_pattern) -] @list - -;;!! if () {} -;;! ^^^^^^^^ -(if_statement) @ifStatement - -;;!! switch (value) {} -;;! ^^^^^ -;;! ----------------- -(switch_statement - value: (_) @private.switchStatementSubject - (#child-range! @private.switchStatementSubject 0 -1 true true) -) @_.domain - -;;!! foo() -;;! ^^^^^ -;;!! new Foo() -;;! ^^^^^^^^^ -[ - (call_expression) - (new_expression) -] @functionCall - -;;!! foo() -;;! ^^^ -;;! ----- -(call_expression - function: (_) @functionCallee -) @_.domain - -;;!! new Foo() -;;! ^^^^^^^ -;;! --------- -(new_expression - (arguments) @functionCallee.end.startOf -) @functionCallee.start.startOf @_.domain - -;;!! class Foo {} -;;! ^^^^^^^^^^^^ -( - [ - (class_declaration - name: (_) @className - ) - (class - name: (_) @className - ) - ] @class @_.domain - (#not-parent-type? @class export_statement) -) - -;;!! export class Foo {} -;;! ^^^^^^^^^^^^^^^^^^^ -(export_statement - [ - (class_declaration - name: (_) @className - ) - (class - name: (_) @className - ) - ] -) @class @_.domain - -;;!! true ? 0 : 1; -;;! ^^^^ -;;! ^ ^ -;;! -------------- -(ternary_expression - condition: (_) @condition - consequence: (_) @branch -) @condition.domain -(ternary_expression - alternative: (_) @branch -) - -;;!! for (let i = 0; i < 2; ++i) {} -;;! ^^^^^ -;;! ------------------------------ -(for_statement - condition: (_) @condition - (#child-range! @condition 0 -1 false true) -) @_.domain - -;;!! while (true) {} -;;! ^^^^ -(while_statement - condition: (_) @condition - (#child-range! @condition 0 -1 true true) -) @_.domain - -;;!! do {} while (true); -;;! ^^^^ -(do_statement - condition: (_) @condition - (#child-range! @condition 0 -1 true true) -) @_.domain - -;;!! case 0: {} -;;! ^^^^^^^^^^ -;;! ^ -(switch_case - value: (_) @condition -) @branch @condition.domain - -;;!! switch () {} -;;! ^^^^^^^^^^^^ -(switch_statement) @branch.iteration @condition.iteration - -;;!! if () {} -;;! ^^^^^^^^ -( - (if_statement - condition: (_) @condition - consequence: (_) @branch.end.endOf @branch.removal.end.endOf - alternative: (_ - (if_statement) @branch.removal.end.startOf - )? - ) @branch.start.startOf @branch.removal.start.startOf @condition.domain - (#not-parent-type? @condition.domain "else_clause") - (#child-range! @condition 0 -1 true true) -) - -;;!! else if () {} -;;! ^^^^^^^^^^^^^ -(else_clause - (if_statement - condition: (_) @condition - consequence: (_) @branch.end.endOf @condition.domain.end.endOf - ) - (#child-range! @condition 0 -1 true true) -) @branch.start.startOf @condition.domain.start.startOf - -;;!! else {} -;;! ^^^^^^^ -(else_clause - (statement_block) -) @branch - -;;!! if () {} else if () {} else {} -;;! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -( - (if_statement) @branch.iteration - (#not-parent-type? @branch.iteration "else_clause") -) - -;;!! try () {} -;;! ^^^^^^^^^ -(try_statement - "try" @branch.start - body: (_) @branch.end -) - -;;!! catch () {} -;;! ^^^^^^^^^^^ -(try_statement - handler: (_) @branch -) - -;;!! finally {} -;;! ^^^^^^^^^^ -(try_statement - finalizer: (_) @branch -) - -;;!! try () {} catch () {} finally {} -;;! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -(try_statement) @branch.iteration - -;;!! { value: 0 } -;;! ^^^^^ -;;! xxxxxxx -;;!! { value: 0 } -;;! ^ -;;! xxx -;;! -------- -(pair - key: (_) @collectionKey @value.leading.endOf - value: (_) @value @collectionKey.trailing.startOf -) @_.domain - -;; Statements that are not a child of an export statement -;; Generated by the following command: -;; > curl https://raw.githubusercontent.com/tree-sitter/tree-sitter-typescript/4c20b54771e4b390ee058af2930feb2cd55f2bf8/typescript/src/node-types.json \ -;; | jq '[.[] | select(.type == "statement" or .type == "declaration") | .subtypes[].type]' -( - [ - (break_statement) - (class_declaration) - (continue_statement) - (debugger_statement) - (declaration) - (do_statement) - (empty_statement) - (export_statement) - (expression_statement) - (for_in_statement) - (for_statement) - (generator_function_declaration) - (if_statement) - (import_statement) - (labeled_statement) - (lexical_declaration) - (return_statement) - ;; (statement_block), This is disabled since we want the whole statement and not just the block - (switch_statement) - (throw_statement) - (try_statement) - (variable_declaration) - (while_statement) - (with_statement) - - ;; Manually added1 - (method_definition) - ] @statement - (#not-parent-type? @statement export_statement) -) - -(program) @statement.iteration - -(statement_block - "{" @statement.iteration.start.endOf - "}" @statement.iteration.end.startOf -) - -;;!! foo(name: string) {} -;;! ^^^^^^^^^^^^ -( - (formal_parameters - (_)? @_.leading.endOf - . - (_) @argumentOrParameter - . - (_)? @_.trailing.startOf - ) @_dummy - (#not-type? @argumentOrParameter "comment") - (#single-or-multi-line-delimiter! @argumentOrParameter @_dummy ", " ",\n") -) - -;;!! foo("bar") -;;! ^^^^^ -( - (arguments - (_)? @_.leading.endOf - . - (_) @argumentOrParameter - . - (_)? @_.trailing.startOf - ) @_dummy - (#not-type? @argumentOrParameter "comment") - (#single-or-multi-line-delimiter! @argumentOrParameter @_dummy ", " ",\n") -) - -(_ - (formal_parameters - "(" @argumentOrParameter.iteration.start.endOf - ")" @argumentOrParameter.iteration.end.startOf - ) -) @argumentOrParameter.iteration.domain - -(arguments - "(" @argumentOrParameter.iteration.start.endOf - ")" @argumentOrParameter.iteration.end.startOf -) @argumentOrParameter.iteration.domain diff --git a/queries/javascript.fieldAccess.scm b/queries/javascript.fieldAccess.scm deleted file mode 100644 index 355f2f07562..00000000000 --- a/queries/javascript.fieldAccess.scm +++ /dev/null @@ -1,105 +0,0 @@ -;;!! foo.bar -;;! ^^^ -( - (member_expression - object: (_) @private.fieldAccess - ) - (#not-type? @private.fieldAccess call_expression member_expression subscript_expression) -) - -;;!! foo().bar -;;! ^^^^^ -( - (member_expression - object: (call_expression - function: (_) @_dummy - ) @private.fieldAccess - ) - (#not-type? @_dummy member_expression) -) - -;;!! foo[0].bar -;;! ^^^^^^ -( - (member_expression - object: (subscript_expression - object: (_) @_dummy - ) @private.fieldAccess - ) - (#not-type? @_dummy member_expression) -) - -;;!! foo.bar -;;! ^^^^ -( - (member_expression - [ - "." - (optional_chain) - ] @private.fieldAccess.start - property: (_) @private.fieldAccess.end - ) @_dummy - (#not-parent-type? @_dummy call_expression subscript_expression) -) - -;;!! foo.bar() -;;! ^^^^^^ -(call_expression - function: (member_expression - [ - "." - (optional_chain) - ] @private.fieldAccess.start - ) - arguments: (_) @private.fieldAccess.end -) - -;;!! foo.bar[0] -;;! ^^^^^^^ -(subscript_expression - object: (member_expression - [ - "." - (optional_chain) - ] @private.fieldAccess.start - ) - "]" @private.fieldAccess.end -) - -;;!! foo[bar.baz] -;;! ^^^^ -;; The reason we need this special treatment for subscript_expression is that -;; the member_expression inside the index of the subscript_expression is a -;; direct child of the subscript_expression, so will be ruled out by the -;; `foo.bar` pattern above. Note that this is not the case for `call_expression`, -;; where the arguments get their own parent node, and are thus not direct children -;; of the call_expression. -(subscript_expression - index: (member_expression - [ - "." - (optional_chain) - ] @private.fieldAccess.start - property: (_) @private.fieldAccess.end - ) -) - -;; Use the largest member_expression, call_expression, or subscript_expression -;; in a chain of such ancestors as the iteration scope. -( - [ - (member_expression) - (call_expression) - (subscript_expression) - ] @private.fieldAccess.iteration - (#not-parent-type? @private.fieldAccess.iteration member_expression call_expression subscript_expression) -) - -;; Use the interior of the `[]` in a subscript_expression as an iteration scope -(subscript_expression - index: [ - (member_expression) - (call_expression) - (subscript_expression) - ] @private.fieldAccess.iteration -) diff --git a/queries/javascript.jsx.scm b/queries/javascript.jsx.scm index 9424c13e6a2..f9b2cb44f9c 100644 --- a/queries/javascript.jsx.scm +++ b/queries/javascript.jsx.scm @@ -81,41 +81,3 @@ "<" @_.domain.start ">" @name.startOf @_.domain.end ) - -;;!! -;;! ^^^^^^^^^ -(jsx_attribute) @attribute - -;;!! -;;! ^^^ -(jsx_attribute - (property_identifier) @collectionKey - (_)? @_.trailing.startOf -) @_.domain - -;;!! -;;! ^^^^^ -;;! xxxxxx -;;! --------- -(jsx_attribute - (_) @_.leading.endOf - (_) @value -) @_.domain - -;;!! -;;! ^^^^ -(jsx_self_closing_element - "<" @attribute.iteration.start.endOf @collectionKey.iteration.start.endOf @value.iteration.start.endOf - "/" @attribute.iteration.end.startOf @collectionKey.iteration.end.startOf @value.iteration.end.startOf -) - -;;!! -;;! ^^^ -(jsx_opening_element - "<" @attribute.iteration.start.endOf @collectionKey.iteration.start.endOf @value.iteration.start.endOf - ">" @attribute.iteration.end.startOf @collectionKey.iteration.end.startOf @value.iteration.end.startOf -) - -;;!!
    text
    -;;! ^^^^ -(jsx_text) @textFragment diff --git a/queries/javascript.scm b/queries/javascript.scm index bc0e80d126e..697325d5488 100644 --- a/queries/javascript.scm +++ b/queries/javascript.scm @@ -35,9 +35,8 @@ ;;!! foo = ...; ;;! ^^^------- (field_definition - property: (_) @name @value.leading.endOf - value: (_)? @value @name.trailing.startOf - ) @_.domain.start + property: (_) @name + ) @name.domain.start . - ";"? @_.domain.end + ";"? @name.domain.end ) diff --git a/queries/json.scm b/queries/json.scm deleted file mode 100644 index 05df53358e7..00000000000 --- a/queries/json.scm +++ /dev/null @@ -1,36 +0,0 @@ -;;!! "string" -;;! ^^^^^^ -(string_content) @textFragment - -;;!! {"value": 0} -;;! ^^^^^^^^^^^^ -(object) @map - -;;!! [0] -;;! ^^^ -(array) @list - -;;!! "string" -;;! ^^^^^^^^ -(string) @string - -;;!! // aaa -;;! ^^^^^^ -;;!! /* aaa */ -;;! ^^^^^^^^^ -(comment) @comment @textFragment - -;;!! {"value": 0} -;;! ^^^^^^^ ^ -;;! ---------- -(pair - key: (_) @collectionKey @value.leading.endOf - value: (_) @value @collectionKey.trailing.startOf -) @_.domain - -;;!! {"bbb": 0, "ccc": 0} -;;! ****************** -(object - "{" @collectionKey.iteration.start.endOf @value.iteration.start.endOf - "}" @collectionKey.iteration.end.startOf @value.iteration.end.startOf -) diff --git a/queries/jsonc.scm b/queries/jsonc.scm deleted file mode 100644 index 088157abf4d..00000000000 --- a/queries/jsonc.scm +++ /dev/null @@ -1 +0,0 @@ -;; import json.scm diff --git a/queries/jsonl.scm b/queries/jsonl.scm deleted file mode 100644 index 088157abf4d..00000000000 --- a/queries/jsonl.scm +++ /dev/null @@ -1 +0,0 @@ -;; import json.scm diff --git a/queries/markdown.scm b/queries/markdown.scm deleted file mode 100644 index c4fe4d54893..00000000000 --- a/queries/markdown.scm +++ /dev/null @@ -1,43 +0,0 @@ -(document) @textFragment - -(html_block) @comment - -;;!! * hello * stuff -;;! ^^^^^^^^^^^^^^^ -(list) @list - -;;!! # Title -;;! ^^^^^ -;;!! xxxxxxx -;;! ------- -(section - (atx_heading - (_) - heading_content: (_) @name - ) @_.removal - (#shrink-to-match! @name "^\\s*(?.*)$") -) @_.domain - -;;!! - 0 -;;! ^ -;;! --- -(list - (list_item - (paragraph - (inline) @_.leading.endOf - ) - )? - . - (list_item - (_) @_.prefix - (paragraph - (inline) @collectionItem - ) - ) @_.domain - . - (list_item)? @_.trailing.startOf - (#trim-end! @_.domain) - (#insertion-delimiter! @collectionItem "\n") -) - -(list) @collectionItem.iteration diff --git a/queries/php.scm b/queries/php.scm deleted file mode 100644 index c31bd7e2e0a..00000000000 --- a/queries/php.scm +++ /dev/null @@ -1,86 +0,0 @@ -;; @statement generated by the following command: -;; curl https://raw.githubusercontent.com/tree-sitter/tree-sitter-php/master/src/node-types.json | jq '[.[] | select(.type == "_statement" or .type == "_simple_statement") | .subtypes[].type]' | grep -v '\"_' | sed -n '1d;p' | sed '$d' | sort -;; and then cleaned up. -[ - (break_statement) - (class_declaration) - (compound_statement) - (const_declaration) - (continue_statement) - (declare_statement) - (do_statement) - (echo_statement) - (empty_statement) - (enum_declaration) - (expression_statement) - (for_statement) - (foreach_statement) - (function_definition) - (function_static_declaration) - (global_declaration) - (goto_statement) - (if_statement) - (interface_declaration) - (named_label_statement) - (namespace_definition) - (namespace_use_declaration) - (return_statement) - (switch_statement) - (trait_declaration) - (try_statement) - (unset_statement) - (while_statement) -] @statement - -[ - (string) - (shell_command_expression) -] @string @textFragment - -(comment) @comment @textFragment - -(if_statement) @ifStatement - -[ - (array_creation_expression) -] @list - -(class_declaration - name: (_) @className -) @class @className.domain - -[ - (function_definition) @namedFunction - (method_declaration) @namedFunction - (expression_statement - (assignment_expression - right: (anonymous_function_creation_expression) - ) @namedFunction - ";" @_.trailing - ) - (expression_statement - (assignment_expression - right: (arrow_function) - ) @namedFunction - ";" @_.trailing - ) -] @namedFunction.domain - -[ - (anonymous_function_creation_expression) - (arrow_function) -] @anonymousFunction - -[ - (function_definition - name: (_) @functionName - ) - (method_declaration - name: (_) @functionName - ) -] @functionName.domain - -[ - (function_call_expression) - (object_creation_expression) -] @functionCall diff --git a/queries/python.fieldAccess.scm b/queries/python.fieldAccess.scm deleted file mode 100644 index 583952ba0f5..00000000000 --- a/queries/python.fieldAccess.scm +++ /dev/null @@ -1,93 +0,0 @@ -;;!! foo.bar -;;! ^^^ -( - (attribute - object: (_) @private.fieldAccess - ) - (#not-type? @private.fieldAccess call attribute subscript) -) - -;;!! foo().bar -;;! ^^^^^ -( - (attribute - object: (call - function: (_) @_dummy - ) @private.fieldAccess - ) - (#not-type? @_dummy attribute) -) - -;;!! foo[0].bar -;;! ^^^^^^ -( - (attribute - object: (subscript - value: (_) @_dummy - ) @private.fieldAccess - ) - (#not-type? @_dummy attribute) -) - -;;!! foo.bar -;;! ^^^^ -( - (attribute - "." @private.fieldAccess.start - attribute: (_) @private.fieldAccess.end - ) @_dummy - (#not-parent-type? @_dummy call subscript) -) - -;;!! foo.bar() -;;! ^^^^^^ -(call - function: (attribute - "." @private.fieldAccess.start - ) - arguments: (_) @private.fieldAccess.end -) - -;;!! foo.bar[0] -;;! ^^^^^^^ -(subscript - value: (attribute - "." @private.fieldAccess.start - ) - "]" @private.fieldAccess.end -) - -;;!! foo[bar.baz] -;;! ^^^^ -;; The reason we need this special treatment for subscript is that -;; the attribute inside the subscript of the subscript is a -;; direct child of the subscript, so will be ruled out by the -;; `foo.bar` pattern above. Note that this is not the case for `call`, -;; where the arguments get their own parent node, and are thus not direct children -;; of the call. -(subscript - subscript: (attribute - "." @private.fieldAccess.start - attribute: (_) @private.fieldAccess.end - ) -) - -;; Use the largest attribute, call, or subscript -;; in a chain of such ancestors as the iteration scope. -( - [ - (attribute) - (call) - (subscript) - ] @private.fieldAccess.iteration - (#not-parent-type? @private.fieldAccess.iteration attribute call subscript) -) - -;; Use the interior of the `[]` in a subscript as an iteration scope -(subscript - subscript: [ - (attribute) - (call) - (subscript) - ] @private.fieldAccess.iteration -) diff --git a/queries/python.scm b/queries/python.scm index 074d4972952..094f9161741 100644 --- a/queries/python.scm +++ b/queries/python.scm @@ -1,5 +1,3 @@ -;; import python.fieldAccess.scm - ;; Generated by the following command: ;; > curl https://raw.githubusercontent.com/tree-sitter/tree-sitter-python/d6210ceab11e8d812d4ab59c07c81458ec6e5184/src/node-types.json \ ;; | jq '[.[] | select(.type == "_simple_statement" or .type == "_compound_statement") | .subtypes[].type]' @@ -19,7 +17,6 @@ (if_statement) (import_from_statement) (import_statement) - (match_statement) (nonlocal_statement) (pass_statement) (print_statement) @@ -35,79 +32,19 @@ ;;! xxxxx ;;! ------ (assignment - (_) @_.leading.endOf + (_) @_.leading.start.endOf . - right: (_) @value + right: (_) @value @_.leading.end.startOf ) @_.domain -;; value: ;;!! a /= 25 ;;! ^^ ;;! xxxxxx ;;! ------- -;; name: -;;!! a /= 25 -;;! ^ -;;! xxxxx -;;! ------- (augmented_assignment - left: (_) @name @value.leading.endOf - right: (_) @value @name.trailing.startOf -) @_.domain - -;;!! a = 25 -;;! ^ -;;! xxxx -;;! ------ -;;!! a: int = 25 -;;! ^ -;;! xxxxxxxxx -;;! ----------- -(assignment - left: (_) @name - right: (_)? @_.trailing.startOf -) @_.domain - -(_ - name: (_) @name -) @_.domain - -;;!! def aaa(bbb): -;;! ^^^ -(parameters - (identifier) @name -) - -;;!! def aaa(bbb: str): -;;! ^^^ -;;! -------- -(typed_parameter + (_) @_.leading.start.endOf . - (_) @name -) @_.domain - -;; Matches any node at field `type` of its parent, with leading delimiter until -;; previous named node. For example: -;;!! aaa: str = "bbb"; -;;! ^^^ -;;! ----------------- -;;! xxxxx -(_ - (_) @_.leading.endOf - . - type: (_) @type -) @_.domain - -;;!! def aaa() -> str: -;;! ^^^ -;;! xxxxxxx -;;! [----------------- -;;!! pass -;;! --------] -(function_definition - (_) @_.leading.endOf - . - return_type: (_) @type + right: (_) @value @_.leading.end.startOf ) @_.domain ;;!! d = {"a": 1234} @@ -124,9 +61,9 @@ ;;! --------------- ( (_ - (_) @_.leading.endOf + (_) @_.leading.start.endOf . - value: (_) @value + value: (_) @value @_.leading.end.startOf ) @_.domain (#not-type? @_.domain subscript) ) @@ -142,123 +79,6 @@ (_) @value ) @_.domain -;;!! yield 1 -;;! ^ -;;! xx -;;! ------- -;; -;; NOTE: in tree-sitter, both "yield" and the "1" are children of `yield` but -;; "yield" is anonymous whereas "1" is named node, so no need to exclude -;; explicitly -(yield - (_) @value -) @_.domain - -;;!! with aaa: -;;! ^^^ -;;! -------- -( - (with_statement - (with_clause - (with_item)? @_.leading.endOf - . - (with_item - value: (_) @value @name - ) - . - (with_item)? @_.trailing.startOf - ) - ) @_.domain - (#not-type? @value "as_pattern") - (#allow-multiple! @value) - (#allow-multiple! @name) -) - -;;!! with aaa: -;;! ^^^ -;;! -------- -( - (with_statement - (with_clause - (with_item)? @_.leading.endOf - . - (with_item - value: (_) @value @name - ) - . - (with_item)? @_.trailing.startOf - ) @_with_clause - ) - (#not-type? @value "as_pattern") - (#has-multiple-children-of-type? @_with_clause "with_item") - (#allow-multiple! @value) - (#allow-multiple! @name) -) - -;;!! with aaa as bbb: -;;! ^^^ <~~ value -;;! ^^^ <~~ name -;;! ---------------- -( - (with_statement - (with_clause - (with_item - value: (as_pattern - (_) @value @name.leading.endOf - alias: (_) @name @value.trailing.startOf - ) - ) - ) - ) @_.domain - (#allow-multiple! @value) - (#allow-multiple! @name) -) - -;;!! with aaa as ccc, bbb: -;;! ^^^ ^^^ -;;! ---------- --- -( - (with_statement - (with_clause - (with_item - value: (as_pattern - (_) @value @name.leading.endOf - alias: (_) @name @value.trailing.startOf - ) - ) @_.domain - ) @_with_clause - ) - (#has-multiple-children-of-type? @_with_clause "with_item") - (#allow-multiple! @value) - (#allow-multiple! @name) -) - -( - (with_statement - (with_clause) @value.iteration @name.iteration - ) @value.iteration.domain @name.iteration.domain -) - -;;!! lambda str: len(str) > 0 -;;! ^^^^^^^^^^^^ -;;! ------------------------ -(lambda - body: (_) @value -) @_.domain - -;; value: -;;!! for aaa in bbb: -;;! ^^^ -;;! --------------- -;; name: -;;!! for aaa in bbb: -;;! ^^^ -;;! --------------- -(for_statement - left: (_) @name - right: (_) @value -) @_.domain - (comment) @comment @textFragment (string @@ -307,15 +127,6 @@ (module) @className.iteration @class.iteration (module) @statement.iteration - -;; This is a hack to handle the case where the entire document is a `with` statement -( - (module - (_) @_statement - ) @value.iteration @name.iteration - (#not-type? @_statement "with_statement") -) - (module) @namedFunction.iteration @functionName.iteration (class_definition) @namedFunction.iteration @functionName.iteration @@ -326,8 +137,7 @@ ;;! ***** ;;!! c = 2 ;;! *****> -(block) @statement.iteration @value.iteration @name.iteration -(block) @type.iteration +(block) @statement.iteration @value.iteration ;;!! {"a": 1, "b": 2, "c": 3} ;;! ********************** @@ -339,164 +149,6 @@ ;;!! def func(a=0, b=1): ;;! ******** (parameters - "(" @value.iteration.start.endOf @name.iteration.start.endOf @type.iteration.start.endOf - ")" @value.iteration.end.startOf @name.iteration.end.startOf @type.iteration.end.startOf + "(" @value.iteration.start.endOf + ")" @value.iteration.end.startOf ) - -;;!! if true: pass -;;! ^^^^^^^^^^^^^ -(if_statement) @ifStatement - -;;!! foo() -;;! ^^^^^ -(call) @functionCall - -;;!! foo() -;;! ^^^^^ -(call - function: (_) @functionCallee -) @_.domain - -;;!! lambda _: pass -;;! ^^^^^^^^^^^^^^ -(lambda) @anonymousFunction - -;;!! match value: -;;! ^^^^^ -(match_statement - subject: (_) @private.switchStatementSubject -) @_.domain - -;;!! { "value": 0 } -;;! ^^^^^^^ -;;! xxxxxxxxx -(pair - key: (_) @collectionKey - value: (_) @_.trailing.startOf -) @_.domain - -;;!! if True: -;;! ^^^^ -;;!! elif True: -;;! ^^^^ -;;!! while True: -;;! ^^^^ -(_ - condition: (_) @condition -) @_.domain - -;;!! match value: -;;! ^^^^^ -(case_clause - pattern: (_) @condition.start - guard: (_)? @condition.end -) @_.domain - -;;!! case 0: pass -;;! ^^^^^^^^^^^^ -(case_clause) @branch - -(match_statement) @branch.iteration @condition.iteration - -;;!! 1 if True else 0 -;;! ^^^^ -;;! ---------------- -( - (conditional_expression - "if" - . - (_) @condition - ) @_.domain -) - -;;!! 1 if True else 0 -;;! ^ -( - (conditional_expression - (_) @branch - . - "if" - ) -) - -;;!! 1 if True else 0 -;;! ^ -( - (conditional_expression - "else" - . - (_) @branch - ) -) - -(conditional_expression) @branch.iteration - -;;!! [aaa for aaa in bbb if ccc] -;;!! (aaa for aaa in bbb if ccc) -;;!! {aaa for aaa in bbb if ccc} -;;! ^^^ -;;! xxxxxx -;;! --------------------------- -;;!! {aaa: aaa for aaa in bbb if ccc} -;;! ^^^ -;;! xxxxxx -;;! -------------------------------- -(_ - (if_clause - "if" - (_) @condition - ) @_.removal - (#not-parent-type? @_.removal case_clause) -) @_.domain - -;;!! if True: pass -;;! ^^^^^^^^^^^^^ -(if_statement - "if" @branch.start - consequence: (_) @branch.end -) - -;;!! elif True: pass -;;! ^^^^^^^^^^^^^^^ -(elif_clause) @branch - -;;!! else: pass -;;! ^^^^^^^^^^ -(else_clause) @branch - -(if_statement) @branch.iteration - -;;!! try: pass -;;! ^^^^^^^^^ -(try_statement - "try" @branch.start - body: (_) @branch.end -) - -;;!! except: pass -;;! ^^^^^^^^^^^^ -(except_clause) @branch - -;;!! finally: pass -;;! ^^^^^^^^^^^^^ -(finally_clause) @branch - -(try_statement) @branch.iteration - -;;!! while True: pass -;;! ^^^^^^^^^^^^^^^^ -(while_statement - "while" @branch.start - body: (_) @branch.end -) - -(while_statement) @branch.iteration - -;;!! for aaa in bbb: pass -;;! ^^^^^^^^^^^^^^^^^^^^ -(for_statement - "for" @branch.start - body: (_) @branch.end -) - -(for_statement) @branch.iteration diff --git a/queries/scm.name.scm b/queries/scm.name.scm index 247b0ad9717..01bd7cc3909 100644 --- a/queries/scm.name.scm +++ b/queries/scm.name.scm @@ -1,43 +1,59 @@ ;;!! (aaa) @bbb @ccc -;;! ^^^^^^^^^ +;;! ^^^^^^^^ +;;! xxxxxxxxx ;;! --------------- ( (_ - _ @_dummy + _ @dummy . - (capture) @name.start + (capture + "@" @_.leading + name: (identifier) @name.start + ) (capture)? @name.end . ) @_.domain (#not-type? @_.domain parameters) - (#not-type? @_dummy capture) + (#not-type? @dummy capture) (#not-parent-type? @_.domain field_definition) + (#insertion-delimiter! @name.start " @") ) ;;!! eee: (aaa) @bbb @ccc -;;! ^^^^^^^^^ +;;! ^^^^^^^^ +;;! xxxxxxxxx ;;! -------------------- ( (field_definition (_ - _ @_dummy + _ @dummy . - (capture) @name.start + (capture + "@" @_.leading + name: (identifier) @name.start + ) (capture)? @name.end . ) ) @_.domain - (#not-type? @_dummy capture) + (#not-type? @dummy capture) + (#insertion-delimiter! @name.start " @") ) ;;!! (aaa) @bbb @ccc -;;! ^^^^ ^^^^ +;;! ^^^ ^^^ +;;! xxxx xxxx +;;! ---- ---- ( (_ - (capture) @name - ) @_dummy - (#not-type? @_dummy parameters) - (#has-multiple-children-of-type? @_dummy capture) + (capture + "@" @_.leading + name: (identifier) @name + ) @_.domain + ) @dummy + (#not-type? @dummy parameters) + (#has-multiple-children-of-type? @dummy capture) + (#insertion-delimiter! @name " @") ) ;;!! (aaa) @bbb @ccc @@ -45,11 +61,11 @@ ;;! --------------- <~ iteration domain ( (_ - _ @_dummy + _ @dummy . (capture) @name.iteration.start ) @name.iteration.end.endOf @name.iteration.domain - (#not-type? @_dummy capture) + (#not-type? @dummy capture) (#not-type? @name.iteration.start parameters) (#not-parent-type? @name.iteration.domain field_definition) ) @@ -63,21 +79,21 @@ ;; Note that we can't use wildcard node due to ;; https://github.com/tree-sitter/tree-sitter/issues/2483 (named_node - _ @_dummy + _ @dummy . (capture) @name.iteration.start ) (anonymous_node - _ @_dummy + _ @dummy . (capture) @name.iteration.start ) (list - _ @_dummy + _ @dummy . (capture) @name.iteration.start ) ] ) @name.iteration.end.endOf @name.iteration.domain - (#not-type? @_dummy capture) + (#not-type? @dummy capture) ) diff --git a/queries/scm.scm b/queries/scm.scm index 66ebad40e69..2e981f1e1aa 100644 --- a/queries/scm.scm +++ b/queries/scm.scm @@ -65,9 +65,9 @@ ;;! xxxxx ;;! --------------- (field_definition - name: (identifier) @collectionKey + name: (identifier) @collectionKey @collectionKey.trailing.start.endOf . - (_) @_.trailing.startOf + (_) @collectionKey.trailing.end.startOf ) @_.domain ;;!! aaa: (bbb) @ccc diff --git a/queries/talon.scm b/queries/talon.scm index 884e7b94ff9..4275407c7ba 100644 --- a/queries/talon.scm +++ b/queries/talon.scm @@ -25,11 +25,19 @@ (parrot_declaration) ] @statement -[ - (matches) - (declarations) - (block) -] @statement.iteration +( + [ + (matches) + (declarations) + (block) + ] @statement.iteration + + ;; The Talon Tree sitter can contain an empty matches node if there is no + ;; header. When this happens and the user has an empty cursor at the start of + ;; the document we get an empty range for the iteration scope for + ;; key/value/name/statement. + (#not-empty? @statement.iteration) +) ;;!! not mode: command ;;! ----^^^^--------- @@ -99,13 +107,15 @@ ;;! ------------- ;;!! foo: key(a) ;;! -----------] -(source_file - (matches - (_) @condition.end.endOf - . - "-" @_.trailing - ) @condition.start.startOf -) @_.domain +( + (source_file + (matches) @condition @_.trailing + ) @_.domain + (#not-empty? @condition) + (#not-empty? @_.trailing) + (#shrink-to-match! @condition "^(?.*)(\s|\n|\r)+-$") + (#shrink-to-match! @_.trailing "^.*(?(\s|\n|\r)+-)$") +) ;;!! slap: key(enter) ;;! ^^^^^^^^^^^^^^^^ @@ -159,11 +169,11 @@ ;;! ^^^^^^^ ^^^^^^^ (action arguments: (_ - (_)? @_.leading.endOf + (_)? @_.leading.start.endOf . - (_) @argumentOrParameter + (_) @argumentOrParameter @_.leading.end.startOf @_.trailing.start.endOf . - (_)? @_.trailing.startOf + (_)? @_.trailing.end.startOf ) (#insertion-delimiter! @argumentOrParameter ", ") ) diff --git a/queries/typescript.core.scm b/queries/typescript.core.scm deleted file mode 100644 index ebc8c8578a5..00000000000 --- a/queries/typescript.core.scm +++ /dev/null @@ -1,327 +0,0 @@ -;; Note that we don't just import `javascript.scm` because that includes -;; `javascript.jsx.scm`, and tree-sitter would complain because those node -;; types are not defined in the typescript grammar. - -;; import javascript.core.scm - -;;!! function aaa(bbb?: Ccc = "ddd") {} -;;! ^^^-------------- -(optional_parameter - (identifier) @name -) @_.domain - -;;!! function aaa(bbb: Ccc = "ddd") {} -;;! ^^^------------- -(required_parameter - (identifier) @name -) @_.domain - -;; Define these here because these node types don't exist in javascript. -( - [ - ;;!! class Foo { foo() {} } - ;;! ^^^^^^^^ - ;;!! interface Foo { foo(): void; } - ;;! ^^^^^^^^^^^^ - (method_signature - name: (_) @functionName @name - ) - - ;;!! class Foo { abstract foo(): void; } - ;;! ^^^^^^^^^^^^^^^^^^^^^ - (abstract_method_signature - name: (_) @functionName @name - ) - - ;;!! class Foo { - ;;!! (public | private | protected) foo = () => {}; - ;;! ^^^^^^^^^^^^^^^ - ;;!! (public | private | protected) foo = function() {}; - ;;! ^^^^^^^^^^^^^^^^^^^^ - ;;!! (public | private | protected) foo = function *() {}; - ;;! ^^^^^^^^^^^^^^^^^^^^^^ - ;;!! } - (public_field_definition - name: (_) @functionName - value: [ - (function - !name - ) - (generator_function - !name - ) - (arrow_function) - ] - ) - ] @namedFunction.start @functionName.domain.start @name.domain.start - . - ";"? @namedFunction.end @functionName.domain.end @name.domain.end -) - -( - ;;!! (public | private | protected) foo = ...; - ;;! ----------------------------------------- - (public_field_definition - name: (_) @name @value.leading.endOf - !type - value: (_)? @value - ) @_.domain.start - . - ";"? @_.domain.end -) - -( - ;;!! (public | private | protected) foo: Bar = ...; - ;;! ---------------------------------------------- - (public_field_definition - name: (_) @name @type.leading.endOf - type: (_ - ":" - (_) @type - ) @value.leading.endOf - value: (_)? @value - ) @_.domain.start - . - ";"? @_.domain.end -) - -[ - (interface_declaration) - (object_type) -] @namedFunction.iteration @functionName.iteration - -;; Special cases for `(let | const | var) foo = ...;` because the full statement -;; is actually a grandparent of the `name` node, so we want the domain to include -;; this full grandparent statement. -( - [ - ;;!! (const | let) aaa: Bbb = 0; - ;;! ^^^ - ;;! xxxxx - ;;! --------------------------- - (lexical_declaration - (variable_declarator - type: (type_annotation - (_) @type - ) @type.removal - ) - ) - - ;;!! var aaa: Bbb = 0; - ;;! ^^^ - ;;! xxxxx - ;;! ----------------- - ;; Note that we can't merge this with the variable declaration above because - ;; of https://github.com/tree-sitter/tree-sitter/issues/1442#issuecomment-1584628651 - (variable_declaration - (variable_declarator - type: (type_annotation - (_) @type - ) @type.removal - ) - ) - ] @_.domain - (#not-parent-type? @_.domain export_statement) - - ;; Handle multiple variable declarators in one statement, eg - ;;!! (let | const | var) aaa: Bbb = ..., ccc: Ddd = ...; - ;;! -------------------------^^^-------------^^^------- - (#allow-multiple! @type) -) - -( - (export_statement - (_ - ;;!! export (const | let | var) aaa: Bbb = 0; - ;;! ^^^ - ;;! xxxxx - ;;! ---------------------------------------- - (variable_declarator - type: (type_annotation - (_) @type - ) @type.removal - ) - ) - ) @_.domain - - ;; Handle multiple variable declarators in one statement, eg - ;;!! export (let | const | var) aaa: Bbb = ..., ccc: Ddd = ...; - ;;! --------------------------------^^^-------------^^^------- - (#allow-multiple! @type) -) - -;;!! (const | let | var) aaa: Ccc = 0, bbb: Ddd = 0; -;;!1 ^^^ -;;!1 xxxxx -;;!1 ------------ -;;!2 ^^^ -;;!2 xxxxx -;;!2 ------------ -( - (_ - (variable_declarator - type: (type_annotation - (_) @type - ) @type.removal - ) @_.domain - ) @_dummy - (#has-multiple-children-of-type? @_dummy variable_declarator) -) - -;;!! function ccc(aaa: string, bbb?: string) {} -;;! ^^^^^^ ^^^^^^ -(formal_parameters - (_ - pattern: (_) @_.leading.endOf - type: (_ - ":" - (_) @type - ) - ) @_.domain -) - -;;!! function ccc(): string {} -;;! ^^^^^^ -;;!! ccc(): string {} -;;! ^^^^^^ -(_ - parameters: (_) @_.leading.endOf - return_type: (_ - ":" - (_) @type - ) -) @_.domain - -;;!! new Aaa() -;;! ^^^^^^^^ -(new_expression - constructor: (_) @type.start - type_arguments: (_)? @type.end -) - -;;!! useState() -;;! ^^^^^^ -;;!! useState>() -;;! ^^^^^^^^^^^^^^^^^^^^^^ -;;! ^^^^^^ ^^^^^^ -(type_arguments - (_) @type - (#not-parent-type? @_dummy type_assertion) -) @_dummy - -;;!! function foo
    () {} -;;! ^ -;;!! const foo = () => {} -;;! ^ -(type_parameters - (_) @type -) - -;;!! interface Aaa {} -;;!! type Aaa = Bbb; -( - [ - (type_alias_declaration) - (interface_declaration) - ] @type - (#not-parent-type? @type export_statement) -) - -;;!! export interface Aaa {} -;;!! export type Aaa = Bbb; -(export_statement - [ - (type_alias_declaration) - (interface_declaration) - ] -) @type - -;;!! aaa as Bbb -;;! ^^^ -;;! xxxxxxx -;;! ---------- -(as_expression - (_) @_.leading.endOf - (_) @type -) @_.domain - -;;!! aaa satisfies Bbb -;;! ^^^ -;;! xxxxxxxxxxxxxx -;;! ----------------- -(satisfies_expression - (_) @_.leading.endOf - [ - (generic_type) - (predefined_type) - ] @type -) @_.domain - -;;!! abstract class MyClass {} -;;! ^^^^^^^^^^^^^^^^^^^^^^^^^ -( - (abstract_class_declaration - name: (_) @className - ) @class @_.domain - (#not-parent-type? @class export_statement) -) - -;;!! export abstract class MyClass {} -;;! ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -(export_statement - (abstract_class_declaration - name: (_) @className - ) -) @class @_.domain - -;;!! class MyClass {} -;;! ^^^^^^^ -;;! ---------------- -(abstract_class_declaration - name: (_) @name -) @_.domain - -;;!! interface Type { name: string; } -;;! ^^^^ -;;! xxxxxx -;;! ------------ -( - (property_signature - name: (_) @collectionKey @type.leading.endOf - type: (_ - ":" - (_) @type @collectionKey.trailing.startOf - ) - ) @_.domain.start - ";"? @_.domain.end -) - -;;!! interface Type { name: string; } -;;! ^^^^^^^^^^^^^^^^^ -(object_type) @collectionKey.iteration - -;; Non-exported statements -( - [ - (ambient_declaration) - (abstract_class_declaration) - (enum_declaration) - (function_signature) - (import_alias) - (interface_declaration) - (internal_module) - (module) - (type_alias_declaration) - ] @statement - (#not-parent-type? @statement export_statement) -) - -;; Statements with optional trailing `;` -( - [ - (property_signature) - (public_field_definition) - (abstract_method_signature) - ] @statement.start - ";"? @statement.end -) diff --git a/queries/typescript.scm b/queries/typescript.scm index f98a4455057..9e724f23806 100644 --- a/queries/typescript.scm +++ b/queries/typescript.scm @@ -1,13 +1,74 @@ -;; import typescript.core.scm - -;; Define this here because type assertions don't exist in TSX because -;; they are not valid JSX. -;;!! bbb -;;! ^^^ -;;! xxxxx -;;! -------- -(type_assertion - (type_arguments - (_) @type - ) @_.removal +;; Note that we don't just import `javascript.scm` because that includes +;; `javascript.jsx.scm`, and tree-sitter would complain because those node +;; types are not defined in the typescript grammar. + +;; import javascript.core.scm + +;;!! function aaa(bbb?: Ccc = "ddd") {} +;;! ^^^-------------- +(optional_parameter + (identifier) @name ) @_.domain + +;;!! function aaa(bbb: Ccc = "ddd") {} +;;! ^^^------------- +(required_parameter + (identifier) @name +) @_.domain + +;; Define these here because these node types don't exist in javascript. +( + [ + ;;!! class Foo { foo() {} } + ;;! ^^^^^^^^ + ;;!! interface Foo { foo(): void; } + ;;! ^^^^^^^^^^^^ + (method_signature + name: (_) @functionName @name + ) + + ;;!! class Foo { abstract foo(): void; } + ;;! ^^^^^^^^^^^^^^^^^^^^^ + (abstract_method_signature + name: (_) @functionName @name + ) + + ;;!! class Foo { + ;;!! (public | private | protected) foo = () => {}; + ;;! ^^^^^^^^^^^^^^^ + ;;!! (public | private | protected) foo = function() {}; + ;;! ^^^^^^^^^^^^^^^^^^^^ + ;;!! (public | private | protected) foo = function *() {}; + ;;! ^^^^^^^^^^^^^^^^^^^^^^ + ;;!! } + (public_field_definition + name: (_) @functionName + value: [ + (function + !name + ) + (generator_function + !name + ) + (arrow_function) + ] + ) + ] @namedFunction.start @functionName.domain.start @name.domain.start + . + ";"? @namedFunction.end @functionName.domain.end @name.domain.end +) + +( + ;;!! (public | private | protected) foo = ...; + ;;! -------------------------------^^^------- + (public_field_definition + name: (_) @name + ) @name.domain.start + . + ";"? @name.domain.end +) + +[ + (interface_declaration) + (object_type) +] @namedFunction.iteration @functionName.iteration diff --git a/queries/typescriptreact.scm b/queries/typescriptreact.scm index b01d30a0f92..934357070cd 100644 --- a/queries/typescriptreact.scm +++ b/queries/typescriptreact.scm @@ -1,2 +1,2 @@ ;; import javascript.jsx.scm -;; import typescript.core.scm +;; import typescript.scm diff --git a/queries/xml.scm b/queries/xml.scm deleted file mode 100644 index 066879cc155..00000000000 --- a/queries/xml.scm +++ /dev/null @@ -1,80 +0,0 @@ -;;!! -;;! ^^^ -;;! ----- -(STag - (Name) @name -) @_.domain - -;;!! -;;! ^^^ -;;! ------ -(ETag - (Name) @name -) @_.domain - -;;!! -;;! ^^^^^^^ -(Attribute) @attribute - -;;!! -;;! ^^ ^^^^ -(Attribute - (Name) @collectionKey @value.leading.endOf - (AttValue) @value @collectionKey.trailing.startOf -) @_.domain - -;;!! -;;! ^^^^^ -(STag) @attribute.iteration @collectionKey.iteration @value.iteration - -;;!! -;;! ^^^^^^^^^^^^^^^^ -(Comment) @comment @textFragment - -;;!! -;;! ^^^^ -(AttValue) @string @textFragment - -;;!! text -;;! ^^^^ -(CharData) @textFragment - -;;!! text -;;! ^^^^^^^^^^^^^^^ -;;! ^^^^ -(element - (STag) @xmlElement.interior.start.endOf - (ETag) @xmlElement.interior.end.startOf -) @xmlElement - -;;!! text -;;! ^^^^^ ^^^^^^ -;;! --------------- -(element - (STag) @xmlStartTag - (ETag) @xmlEndTag -) @_.domain - -(element - [ - (STag) - (ETag) - ] @xmlBothTags - (#allow-multiple! @xmlBothTags) -) @_.domain - -(element - (STag) @xmlElement.iteration.start.endOf @xmlBothTags.iteration.start.endOf - (content - (element) - ) - (ETag) @xmlElement.iteration.end.startOf @xmlBothTags.iteration.end.startOf -) - -(_ - (STag) @xmlStartTag.iteration.start.endOf @xmlEndTag.iteration.start.endOf - (content - (element) - ) - (ETag) @xmlStartTag.iteration.end.startOf @xmlEndTag.iteration.end.startOf -) diff --git a/queries/yaml.scm b/queries/yaml.scm deleted file mode 100644 index d7f12db3cc3..00000000000 --- a/queries/yaml.scm +++ /dev/null @@ -1,77 +0,0 @@ -;; ;;!! foo: bar -;; ;;! ^^^ ^^^ -(_ - key: (_) @collectionKey @value.leading.endOf - value: (_) @value @collectionKey.trailing.startOf -) @_.domain - -;;!! foo: bar -;;! ^^^^^^^^ -(block_mapping - (block_mapping_pair)? @collectionItem.leading.endOf - . - (block_mapping_pair) @collectionItem - . - (block_mapping_pair)? @collectionItem.trailing.startOf -) @map - -;;!! - 0 -;;! ^ -;;! --- -( - (block_sequence - (block_sequence_item)? @collectionItem.leading.endOf - . - (block_sequence_item - "-" @collectionItem.prefix - (_) @collectionItem - ) @collectionItem.domain - . - (block_sequence_item)? @collectionItem.trailing.startOf - (#trim-end! @collectionItem) - (#insertion-delimiter! @collectionItem "\n") - ) @list - (#trim-end! @list) -) - -;;!! [0] -;;! ^ -(flow_sequence - (flow_node)? @collectionItem.leading.endOf - . - (flow_node) @collectionItem - . - (flow_node)? @collectionItem.trailing.startOf - (#insertion-delimiter! @collectionItem ", ") -) @list - -;;!! { foo: bar } -;;! ^^^^^^^^ -(flow_mapping - (flow_pair)? @collectionItem.leading.endOf - . - (flow_pair) @collectionItem - . - (flow_pair)? @collectionItem.trailing.startOf - (#insertion-delimiter! @collectionItem ", ") -) @map - -[ - (block_mapping) - (block_sequence) - (flow_sequence) - (flow_mapping) -] @collectionItem.iteration @collectionKey.iteration @value.iteration - -;;!! foo: bar -;;! ^^^ -;;!! | block scalar -;;! ^^^^^^^^^^^^^ -[ - (string_scalar) - (block_scalar) -] @string @textFragment - -;;!! # comment -;;! ^^^^^^^^^ -(comment) @comment @textFragment diff --git a/schemas/cursorless-snippets.json b/schemas/cursorless-snippets.json index 2782ea5444c..e0677366120 100644 --- a/schemas/cursorless-snippets.json +++ b/schemas/cursorless-snippets.json @@ -96,6 +96,7 @@ "regularExpression", "statement", "string", + "switchStatementSubject", "type", "value", "condition", diff --git a/scripts/build-and-assemble-website.sh b/scripts/build-and-assemble-website.sh index 61585f19dda..a7a1de98e10 100755 --- a/scripts/build-and-assemble-website.sh +++ b/scripts/build-and-assemble-website.sh @@ -10,8 +10,6 @@ NODE_OPTIONS="--max-old-space-size=6144" \ --filter 'cursorless-org-*' \ build -pnpm -F cursorless-vscode generate-railroad - # Merge the root site and the documentation site, placing the documentation site # under docs/ @@ -23,4 +21,3 @@ mkdir -p "$docs_dir" cp -r packages/cursorless-org/out/* "$root_dir" cp -r packages/cursorless-org-docs/build/* "$docs_dir" -cp packages/cursorless-vscode/out/railroad.html "$root_dir/keyboard-modal-railroad.html" diff --git a/scripts/forbid-todo.sh b/scripts/forbid-todo.sh deleted file mode 100755 index 7a2220ef0ba..00000000000 --- a/scripts/forbid-todo.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail -# Fail if there are any TODOs in the codebase - -# Find the string 'TODO' in all files tracked by git, excluding -# this file -TODOS_FOUND=$(git grep --color=always -nw TODO -- ':!scripts/forbid-todo.sh' || true) - -if [ -n "$TODOS_FOUND" ]; then - printf "\e[1;31mERROR: \e[0mTODOs found in codebase:\n" - printf '%s\n' "$TODOS_FOUND" - exit 1 -fi diff --git a/tsconfig.base.json b/tsconfig.base.json index f31610dd3fd..80f180cc275 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1,11 +1,11 @@ { "compilerOptions": { - "module": "ESNext", - "moduleResolution": "Bundler", + "module": "commonjs", + "moduleResolution": "nodenext", "moduleDetection": "force", "target": "es6", "lib": ["es2022"], - "emitDeclarationOnly": true, + "sourceMap": true, "declarationMap": true, "resolveJsonModule": true, "composite": true, diff --git a/typings/object.d.ts b/typings/object.d.ts index 3ca52f5b382..e600e07ee82 100644 --- a/typings/object.d.ts +++ b/typings/object.d.ts @@ -1,21 +1,12 @@ +// From https://fettblog.eu/typescript-better-object-keys/ +type ObjectKeys = T extends object + ? (keyof T)[] + : T extends number + ? [] + : T extends Array | string + ? string[] + : never; + interface ObjectConstructor { - fromEntries< - V extends PropertyKey, - T extends [readonly [V, any]] | Array, - >( - entries: T, - ): Flatten>>; + keys(o: T): ObjectKeys; } - -// From https://github.com/microsoft/TypeScript/issues/35745#issuecomment-566932289 -type UnionToIntersection = (T extends T ? (p: T) => void : never) extends ( - p: infer U, -) => void - ? U - : never; -type FromEntries = T extends T - ? Record - : never; -type Flatten = object & { - [P in keyof T]: T[P]; -};

    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 diff --git a/packages/cursorless-org/public/android-chrome-192x192.png b/packages/cursorless-org/public/android-chrome-192x192.png index cd6d9ef1c62653b4fe06c243c9a3266665be6587..da216ecb34bdeb3130e140eb8e2266acd06b358f 100644 GIT binary patch literal 11115 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 literal 9645 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 QR~3MQ%zNo7DU;y;0bOb!IRF3v diff --git a/packages/cursorless-org/public/android-chrome-512x512.png b/packages/cursorless-org/public/android-chrome-512x512.png index 3bd1adf079354c1f4ee61115188dae206ecc8914..1cb8853dc94e330bf263379409e2676f94bff131 100644 GIT binary patch literal 27858 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 literal 28823 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 literal 2556 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