Mirror: TypeScript LSP plugin that finds GraphQL documents in your code and provides diagnostics, auto-complete and hover-information.

test: try out cursor changes for issue #190 (#191)

* try out cursor changes

* test more

* real fix

* Create strange-pans-clap.md

* Create strange-pans-clap.md

Changed files
+132 -28
.changeset
packages
graphqlsp
src
ast
test
e2e
fixture-project-client-preset
fixtures
+5
.changeset/strange-pans-clap.md
···
+
---
+
"@0no-co/graphqlsp": patch
+
---
+
+
Account for empty lines when asking for completions
-1
packages/graphqlsp/src/ast/token.ts
···
const string = stream.current();
if (
-
string &&
lPos + stream.getStartOfToken() <= cursorPosition &&
lPos + stream.getCurrentPosition() >= cursorPosition
) {
+125 -27
test/e2e/client-preset.test.ts
···
command: 'quickinfo',
arguments: {
file: outfileCombinations,
-
line: 6,
+
line: 7,
offset: 8,
},
});
···
expect(res?.body.entries).toMatchInlineSnapshot(`
[
{
-
"kind": "string",
-
"kindModifiers": "",
-
"name": "\\\\n fragment pokemonFields on Pokemon {\\\\n id\\\\n name\\\\n attacks {\\\\n fast {\\\\n damage\\\\n name\\\\n }\\\\n }\\\\n }\\\\n",
-
"replacementSpan": {
-
"end": {
-
"line": 9,
-
"offset": 1,
-
},
-
"start": {
-
"line": 3,
-
"offset": 39,
-
},
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"detail": " AttacksConnection",
},
-
"sortText": "11",
+
"name": "attacks",
+
"sortText": "0attacks",
},
{
-
"kind": "string",
-
"kindModifiers": "",
-
"name": "\\\\n query Pok($limit: Int!) {\\\\n pokemons(limit: $limit) {\\\\n id\\\\n name\\\\n fleeRate\\\\n classification\\\\n ...pokemonFields\\\\n ...weaknessFields\\\\n __typename\\\\n }\\\\n }\\\\n",
-
"replacementSpan": {
-
"end": {
-
"line": 9,
-
"offset": 1,
-
},
-
"start": {
-
"line": 3,
-
"offset": 39,
-
},
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"detail": " [EvolutionRequirement]",
},
-
"sortText": "11",
+
"name": "evolutionRequirements",
+
"sortText": "2evolutionRequirements",
+
},
+
{
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"detail": " [Pokemon]",
+
},
+
"name": "evolutions",
+
"sortText": "3evolutions",
+
},
+
{
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"description": "Likelihood of an attempt to catch a Pokémon to fail.",
+
"detail": " Float",
+
},
+
"name": "fleeRate",
+
"sortText": "4fleeRate",
+
},
+
{
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"detail": " PokemonDimension",
+
},
+
"name": "height",
+
"sortText": "5height",
+
},
+
{
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"detail": " ID!",
+
},
+
"name": "id",
+
"sortText": "6id",
+
},
+
{
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"description": "Maximum combat power a Pokémon may achieve at max level.",
+
"detail": " Int",
+
},
+
"name": "maxCP",
+
"sortText": "7maxCP",
+
},
+
{
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"description": "Maximum health points a Pokémon may achieve at max level.",
+
"detail": " Int",
+
},
+
"name": "maxHP",
+
"sortText": "8maxHP",
+
},
+
{
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"detail": " String!",
+
},
+
"name": "name",
+
"sortText": "9name",
+
},
+
{
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"detail": " [PokemonType]",
+
},
+
"name": "resistant",
+
"sortText": "10resistant",
+
},
+
{
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"detail": " [PokemonType]",
+
},
+
"name": "types",
+
"sortText": "11types",
+
},
+
{
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"detail": " [PokemonType]",
+
},
+
"name": "weaknesses",
+
"sortText": "12weaknesses",
+
},
+
{
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"detail": " PokemonDimension",
+
},
+
"name": "weight",
+
"sortText": "13weight",
+
},
+
{
+
"kind": "var",
+
"kindModifiers": "declare",
+
"labelDetails": {
+
"description": "The name of the current Object type at runtime.",
+
"detail": " String!",
+
},
+
"name": "__typename",
+
"sortText": "14__typename",
},
]
`);
+2
test/e2e/fixture-project-client-preset/fixtures/fragment.ts
···
import { graphql } from './gql/gql';
+
// prettier-ignore
export const PokemonFields = graphql(`
fragment pokemonFields on Pokemon {
id
name
fleeRate
+
}
`);