vscode-apollo 1.19.2 → 1.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.changeset/README.md +8 -0
- package/.changeset/config.json +14 -0
- package/.circleci/config.yml +82 -0
- package/.eslintrc.js +10 -0
- package/.gitattributes +1 -0
- package/.github/workflows/release.yml +95 -0
- package/.gitleaks.toml +26 -0
- package/.nvmrc +1 -0
- package/.prettierrc +5 -0
- package/.vscode/launch.json +61 -0
- package/.vscode/settings.json +16 -0
- package/.vscode/tasks.json +18 -0
- package/.vscodeignore +17 -1
- package/CHANGELOG.md +172 -1
- package/LICENSE +2 -2
- package/README.md +9 -9
- package/codegen.yml +12 -0
- package/images/IconRun.svg +8 -0
- package/jest.config.ts +11 -0
- package/package.json +102 -22
- package/renovate.json +23 -0
- package/src/__mocks__/fs.js +3 -0
- package/src/__tests__/statusBar.test.ts +8 -7
- package/src/debug.ts +2 -5
- package/src/env/fetch/fetch.ts +32 -0
- package/src/env/fetch/global.ts +30 -0
- package/src/env/fetch/index.d.ts +2 -0
- package/src/env/fetch/index.ts +2 -0
- package/src/env/fetch/url.ts +9 -0
- package/src/env/index.ts +4 -0
- package/src/env/polyfills/array.ts +17 -0
- package/src/env/polyfills/index.ts +2 -0
- package/src/env/polyfills/object.ts +7 -0
- package/src/env/typescript-utility-types.ts +2 -0
- package/src/extension.ts +106 -37
- package/src/language-server/__tests__/diagnostics.test.ts +86 -0
- package/src/language-server/__tests__/document.test.ts +187 -0
- package/src/language-server/__tests__/fileSet.test.ts +46 -0
- package/src/language-server/__tests__/fixtures/starwarsSchema.ts +1917 -0
- package/src/language-server/config/__tests__/config.ts +128 -0
- package/src/language-server/config/__tests__/loadConfig.ts +508 -0
- package/src/language-server/config/__tests__/utils.ts +106 -0
- package/src/language-server/config/config.ts +219 -0
- package/src/language-server/config/index.ts +3 -0
- package/src/language-server/config/loadConfig.ts +228 -0
- package/src/language-server/config/utils.ts +56 -0
- package/src/language-server/diagnostics.ts +109 -0
- package/src/language-server/document.ts +277 -0
- package/src/language-server/engine/GraphQLDataSource.ts +124 -0
- package/src/language-server/engine/index.ts +105 -0
- package/src/language-server/engine/operations/frontendUrlRoot.ts +7 -0
- package/src/language-server/engine/operations/schemaTagsAndFieldStats.ts +24 -0
- package/src/language-server/errors/__tests__/NoMissingClientDirectives.test.ts +220 -0
- package/src/language-server/errors/logger.ts +58 -0
- package/src/language-server/errors/validation.ts +277 -0
- package/src/language-server/fileSet.ts +65 -0
- package/src/language-server/format.ts +48 -0
- package/src/language-server/graphqlTypes.ts +7176 -0
- package/src/language-server/index.ts +29 -0
- package/src/language-server/languageProvider.ts +798 -0
- package/src/language-server/loadingHandler.ts +64 -0
- package/src/language-server/project/base.ts +399 -0
- package/src/language-server/project/client.ts +602 -0
- package/src/language-server/project/defaultClientSchema.ts +45 -0
- package/src/language-server/project/service.ts +48 -0
- package/src/language-server/providers/schema/__tests__/file.ts +150 -0
- package/src/language-server/providers/schema/base.ts +15 -0
- package/src/language-server/providers/schema/endpoint.ts +157 -0
- package/src/language-server/providers/schema/engine.ts +197 -0
- package/src/language-server/providers/schema/file.ts +167 -0
- package/src/language-server/providers/schema/index.ts +75 -0
- package/src/language-server/server.ts +252 -0
- package/src/language-server/typings/codemirror.d.ts +4 -0
- package/src/language-server/typings/graphql.d.ts +27 -0
- package/src/language-server/utilities/__tests__/graphql.test.ts +411 -0
- package/src/language-server/utilities/__tests__/uri.ts +55 -0
- package/src/language-server/utilities/debouncer.ts +8 -0
- package/src/language-server/utilities/debug.ts +89 -0
- package/src/language-server/utilities/graphql.ts +432 -0
- package/src/language-server/utilities/index.ts +3 -0
- package/src/language-server/utilities/source.ts +182 -0
- package/src/language-server/utilities/uri.ts +19 -0
- package/src/language-server/workspace.ts +262 -0
- package/src/languageServerClient.ts +19 -12
- package/src/messages.ts +84 -0
- package/src/statusBar.ts +5 -5
- package/src/tools/__tests__/buildServiceDefinition.test.ts +491 -0
- package/src/tools/__tests__/snapshotSerializers/astSerializer.ts +19 -0
- package/src/tools/__tests__/snapshotSerializers/graphQLTypeSerializer.ts +14 -0
- package/src/tools/buildServiceDefinition.ts +241 -0
- package/src/tools/index.ts +6 -0
- package/src/tools/schema/index.ts +2 -0
- package/src/tools/schema/resolveObject.ts +18 -0
- package/src/tools/schema/resolverMap.ts +23 -0
- package/src/tools/utilities/graphql.ts +22 -0
- package/src/tools/utilities/index.ts +3 -0
- package/src/tools/utilities/invariant.ts +5 -0
- package/src/tools/utilities/predicates.ts +5 -0
- package/src/utils.ts +1 -16
- package/syntaxes/graphql.js.json +3 -3
- package/syntaxes/graphql.json +13 -9
- package/syntaxes/graphql.lua.json +51 -0
- package/syntaxes/graphql.rb.json +1 -1
- package/tsconfig.build.json +4 -0
- package/tsconfig.json +20 -7
- package/create-server-symlink.js +0 -8
- package/lib/debug.d.ts +0 -11
- package/lib/debug.d.ts.map +0 -1
- package/lib/debug.js +0 -48
- package/lib/debug.js.map +0 -1
- package/lib/extension.d.ts +0 -4
- package/lib/extension.d.ts.map +0 -1
- package/lib/extension.js +0 -187
- package/lib/extension.js.map +0 -1
- package/lib/languageServerClient.d.ts +0 -4
- package/lib/languageServerClient.d.ts.map +0 -1
- package/lib/languageServerClient.js +0 -57
- package/lib/languageServerClient.js.map +0 -1
- package/lib/statusBar.d.ts +0 -24
- package/lib/statusBar.d.ts.map +0 -1
- package/lib/statusBar.js +0 -46
- package/lib/statusBar.js.map +0 -1
- package/lib/testRunner/index.d.ts +0 -3
- package/lib/testRunner/index.d.ts.map +0 -1
- package/lib/testRunner/index.js +0 -49
- package/lib/testRunner/index.js.map +0 -1
- package/lib/testRunner/jest-config.d.ts +0 -14
- package/lib/testRunner/jest-config.d.ts.map +0 -1
- package/lib/testRunner/jest-config.js +0 -18
- package/lib/testRunner/jest-config.js.map +0 -1
- package/lib/testRunner/jest-vscode-environment.d.ts +0 -2
- package/lib/testRunner/jest-vscode-environment.d.ts.map +0 -1
- package/lib/testRunner/jest-vscode-environment.js +0 -19
- package/lib/testRunner/jest-vscode-environment.js.map +0 -1
- package/lib/testRunner/jest-vscode-framework-setup.d.ts +0 -1
- package/lib/testRunner/jest-vscode-framework-setup.d.ts.map +0 -1
- package/lib/testRunner/jest-vscode-framework-setup.js +0 -3
- package/lib/testRunner/jest-vscode-framework-setup.js.map +0 -1
- package/lib/testRunner/vscode-test-script.d.ts +0 -2
- package/lib/testRunner/vscode-test-script.d.ts.map +0 -1
- package/lib/testRunner/vscode-test-script.js +0 -23
- package/lib/testRunner/vscode-test-script.js.map +0 -1
- package/lib/utils.d.ts +0 -18
- package/lib/utils.d.ts.map +0 -1
- package/lib/utils.js +0 -52
- package/lib/utils.js.map +0 -1
- package/src/testRunner/README.md +0 -23
- package/src/testRunner/index.ts +0 -72
- package/src/testRunner/jest-config.ts +0 -17
- package/src/testRunner/jest-vscode-environment.ts +0 -25
- package/src/testRunner/jest-vscode-framework-setup.ts +0 -10
- package/src/testRunner/jest.d.ts +0 -37
- package/src/testRunner/vscode-test-script.ts +0 -38
- package/tsconfig.test.json +0 -4
- package/tsconfig.tsbuildinfo +0 -2486
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { Source, buildClientSchema } from "graphql";
|
|
2
|
+
import { GraphQLDocument } from "../document";
|
|
3
|
+
import { collectExecutableDefinitionDiagnositics } from "../diagnostics";
|
|
4
|
+
import { starwarsSchema } from "./fixtures/starwarsSchema";
|
|
5
|
+
|
|
6
|
+
const schema = buildClientSchema(starwarsSchema);
|
|
7
|
+
|
|
8
|
+
const validDocument = new GraphQLDocument(
|
|
9
|
+
new Source(`
|
|
10
|
+
query HeroAndFriendsNames {
|
|
11
|
+
hero {
|
|
12
|
+
name
|
|
13
|
+
friends {
|
|
14
|
+
name
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}`)
|
|
18
|
+
);
|
|
19
|
+
const invalidDocument = new GraphQLDocument(
|
|
20
|
+
new Source(`
|
|
21
|
+
query HeroAndFriendsNames {
|
|
22
|
+
hero {
|
|
23
|
+
nam # Missing letter 'e'
|
|
24
|
+
friend { # Missing letter 's'
|
|
25
|
+
name
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}`)
|
|
29
|
+
);
|
|
30
|
+
const documentWithTypes = new GraphQLDocument(
|
|
31
|
+
new Source(`
|
|
32
|
+
type SomeType {
|
|
33
|
+
thing: String
|
|
34
|
+
}
|
|
35
|
+
enum SomeEnum {
|
|
36
|
+
THING_ONE
|
|
37
|
+
THING_TWO
|
|
38
|
+
}
|
|
39
|
+
query HeroAndFriendsNames {
|
|
40
|
+
hero {
|
|
41
|
+
name
|
|
42
|
+
friends {
|
|
43
|
+
name
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}`)
|
|
47
|
+
);
|
|
48
|
+
const documentWithOffset = new GraphQLDocument(
|
|
49
|
+
new Source(`query QueryWithOffset { hero { nam } }`, "testDocument", {
|
|
50
|
+
line: 5,
|
|
51
|
+
column: 10,
|
|
52
|
+
})
|
|
53
|
+
);
|
|
54
|
+
describe("Language server diagnostics", () => {
|
|
55
|
+
describe("#collectExecutableDefinitionDiagnositics", () => {
|
|
56
|
+
it("returns no diagnostics for a correct document", () => {
|
|
57
|
+
const diagnostics = collectExecutableDefinitionDiagnositics(
|
|
58
|
+
schema,
|
|
59
|
+
validDocument
|
|
60
|
+
);
|
|
61
|
+
expect(diagnostics.length).toEqual(0);
|
|
62
|
+
});
|
|
63
|
+
it("returns two diagnostics for a document with two errors", () => {
|
|
64
|
+
const diagnostics = collectExecutableDefinitionDiagnositics(
|
|
65
|
+
schema,
|
|
66
|
+
invalidDocument
|
|
67
|
+
);
|
|
68
|
+
expect(diagnostics.length).toEqual(2);
|
|
69
|
+
});
|
|
70
|
+
it("returns no diagnostics for a document that includes type definitions", () => {
|
|
71
|
+
const diagnostics = collectExecutableDefinitionDiagnositics(
|
|
72
|
+
schema,
|
|
73
|
+
documentWithTypes
|
|
74
|
+
);
|
|
75
|
+
expect(diagnostics.length).toEqual(0);
|
|
76
|
+
});
|
|
77
|
+
it("correctly offsets locations", () => {
|
|
78
|
+
const diagnostics = collectExecutableDefinitionDiagnositics(
|
|
79
|
+
schema,
|
|
80
|
+
documentWithOffset
|
|
81
|
+
);
|
|
82
|
+
expect(diagnostics.length).toEqual(1);
|
|
83
|
+
expect(diagnostics[0].range.start.character).toEqual(40);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
});
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { extractGraphQLDocuments } from "../document";
|
|
2
|
+
import { TextDocument, Position } from "vscode-languageserver";
|
|
3
|
+
|
|
4
|
+
describe("extractGraphQLDocuments", () => {
|
|
5
|
+
describe("extracting documents from JavaScript template literals", () => {
|
|
6
|
+
const mockTextDocument = (text: string): TextDocument => ({
|
|
7
|
+
getText: jest.fn().mockReturnValue(text),
|
|
8
|
+
offsetAt(): number {
|
|
9
|
+
return 0;
|
|
10
|
+
},
|
|
11
|
+
positionAt(): Position {
|
|
12
|
+
return {
|
|
13
|
+
character: 0,
|
|
14
|
+
line: 0,
|
|
15
|
+
};
|
|
16
|
+
},
|
|
17
|
+
languageId: "javascript",
|
|
18
|
+
lineCount: 0,
|
|
19
|
+
uri: "",
|
|
20
|
+
version: 1,
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("works with placeholders that span multiple rows", () => {
|
|
24
|
+
const textDocument = mockTextDocument(`
|
|
25
|
+
gql\`
|
|
26
|
+
{
|
|
27
|
+
hero {
|
|
28
|
+
...Hero_character
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
\${Hero.fragments
|
|
33
|
+
.character}
|
|
34
|
+
\`
|
|
35
|
+
`);
|
|
36
|
+
const documents = extractGraphQLDocuments(textDocument);
|
|
37
|
+
|
|
38
|
+
expect(documents?.length).toEqual(1);
|
|
39
|
+
expect(documents?.[0].syntaxErrors.length).toBe(0);
|
|
40
|
+
expect(documents?.[0].ast?.definitions.length).toBe(1);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it("works with multiple placeholders in a document", () => {
|
|
44
|
+
const textDocument = mockTextDocument(`
|
|
45
|
+
gql\`
|
|
46
|
+
{
|
|
47
|
+
hero {
|
|
48
|
+
...Hero_character
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
\${Hero.fragments.character}
|
|
53
|
+
|
|
54
|
+
{
|
|
55
|
+
reviews(episode: NEWHOPE) {
|
|
56
|
+
...ReviewList_reviews
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
\${ReviewList.fragments.reviews}
|
|
61
|
+
\`
|
|
62
|
+
`);
|
|
63
|
+
const documents = extractGraphQLDocuments(textDocument);
|
|
64
|
+
|
|
65
|
+
expect(documents?.length).toEqual(1);
|
|
66
|
+
expect(documents?.[0].syntaxErrors.length).toBe(0);
|
|
67
|
+
expect(documents?.[0].ast?.definitions.length).toBe(2);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it("works with a custom tagname", () => {
|
|
71
|
+
const textDocument = mockTextDocument(`
|
|
72
|
+
gqltag\`
|
|
73
|
+
{
|
|
74
|
+
hero {
|
|
75
|
+
...Hero_character
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
\${Hero.fragments.character}
|
|
80
|
+
|
|
81
|
+
{
|
|
82
|
+
reviews(episode: NEWHOPE) {
|
|
83
|
+
...ReviewList_reviews
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
\${ReviewList.fragments.reviews}
|
|
88
|
+
\`
|
|
89
|
+
`);
|
|
90
|
+
const documents = extractGraphQLDocuments(textDocument, "gqltag");
|
|
91
|
+
|
|
92
|
+
expect(documents?.length).toEqual(1);
|
|
93
|
+
expect(documents?.[0].syntaxErrors.length).toBe(0);
|
|
94
|
+
expect(documents?.[0].ast?.definitions.length).toBe(2);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it("works with parens", () => {
|
|
98
|
+
const textDocument = mockTextDocument(`
|
|
99
|
+
gql(\`
|
|
100
|
+
{
|
|
101
|
+
hero {
|
|
102
|
+
...Hero_character
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
\${Hero.fragments.character}
|
|
107
|
+
|
|
108
|
+
{
|
|
109
|
+
reviews(episode: NEWHOPE) {
|
|
110
|
+
...ReviewList_reviews
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
\${ReviewList.fragments.reviews}
|
|
115
|
+
\`)
|
|
116
|
+
`);
|
|
117
|
+
const documents = extractGraphQLDocuments(textDocument);
|
|
118
|
+
|
|
119
|
+
expect(documents?.length).toEqual(1);
|
|
120
|
+
expect(documents?.[0].syntaxErrors.length).toBe(0);
|
|
121
|
+
expect(documents?.[0].ast?.definitions.length).toBe(2);
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
describe("extracting documents from ReasonML extension nodes", () => {
|
|
126
|
+
const mockTextDocument = (text: string): TextDocument => ({
|
|
127
|
+
getText: jest.fn().mockReturnValue(text),
|
|
128
|
+
offsetAt(): number {
|
|
129
|
+
return 0;
|
|
130
|
+
},
|
|
131
|
+
positionAt(): Position {
|
|
132
|
+
return {
|
|
133
|
+
character: 0,
|
|
134
|
+
line: 0,
|
|
135
|
+
};
|
|
136
|
+
},
|
|
137
|
+
languageId: "reason",
|
|
138
|
+
lineCount: 0,
|
|
139
|
+
uri: "",
|
|
140
|
+
version: 1,
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it("works with ReasonRelay nodes", () => {
|
|
144
|
+
const textDocument = mockTextDocument(`
|
|
145
|
+
module Query = [%relay.query
|
|
146
|
+
{|
|
|
147
|
+
query SomeQuery {
|
|
148
|
+
id
|
|
149
|
+
}
|
|
150
|
+
|}
|
|
151
|
+
];
|
|
152
|
+
|
|
153
|
+
module Fragment = [%relay.fragment
|
|
154
|
+
{|
|
|
155
|
+
fragment X on Hero {
|
|
156
|
+
id
|
|
157
|
+
}
|
|
158
|
+
|}
|
|
159
|
+
];
|
|
160
|
+
`);
|
|
161
|
+
const documents = extractGraphQLDocuments(textDocument);
|
|
162
|
+
|
|
163
|
+
expect(documents?.length).toEqual(2);
|
|
164
|
+
expect(documents?.[0].syntaxErrors.length).toBe(0);
|
|
165
|
+
expect(documents?.[1].syntaxErrors.length).toBe(0);
|
|
166
|
+
expect(documents?.[0].ast?.definitions.length).toBe(1);
|
|
167
|
+
expect(documents?.[1].ast?.definitions.length).toBe(1);
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it("works with graphql_ppx style node", () => {
|
|
171
|
+
const textDocument = mockTextDocument(`
|
|
172
|
+
module Query = [%graphql
|
|
173
|
+
{|
|
|
174
|
+
query SomeQuery {
|
|
175
|
+
id
|
|
176
|
+
}
|
|
177
|
+
|}
|
|
178
|
+
];
|
|
179
|
+
`);
|
|
180
|
+
const documents = extractGraphQLDocuments(textDocument);
|
|
181
|
+
|
|
182
|
+
expect(documents?.length).toEqual(1);
|
|
183
|
+
expect(documents?.[0].syntaxErrors.length).toBe(0);
|
|
184
|
+
expect(documents?.[0].ast?.definitions.length).toBe(1);
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { FileSet } from "../fileSet";
|
|
2
|
+
import URI from "vscode-uri";
|
|
3
|
+
|
|
4
|
+
describe("fileSet", () => {
|
|
5
|
+
describe("includesFile", () => {
|
|
6
|
+
it("matches includes starting with ./", () => {
|
|
7
|
+
const fileSet = new FileSet({
|
|
8
|
+
excludes: [],
|
|
9
|
+
includes: ["./src/**/*.tsx"],
|
|
10
|
+
rootURI: URI.parse("/project"),
|
|
11
|
+
});
|
|
12
|
+
const file = "file:///project/src/Component.tsx";
|
|
13
|
+
expect(fileSet.includesFile(file)).toBe(true);
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it("matches includes not starting with ./", () => {
|
|
17
|
+
const fileSet = new FileSet({
|
|
18
|
+
excludes: [],
|
|
19
|
+
includes: ["src/**/*.tsx"],
|
|
20
|
+
rootURI: URI.parse("/project"),
|
|
21
|
+
});
|
|
22
|
+
const file = "file:///project/src/Component.tsx";
|
|
23
|
+
expect(fileSet.includesFile(file)).toBe(true);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("does not match excludes starting with ./", () => {
|
|
27
|
+
const fileSet = new FileSet({
|
|
28
|
+
excludes: ["./src/Component.tsx"],
|
|
29
|
+
includes: ["./src/**/*.tsx"],
|
|
30
|
+
rootURI: URI.parse("/project"),
|
|
31
|
+
});
|
|
32
|
+
const file = "file:///project/src/Component.tsx";
|
|
33
|
+
expect(fileSet.includesFile(file)).toBe(false);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("does not match excludes not starting with ./", () => {
|
|
37
|
+
const fileSet = new FileSet({
|
|
38
|
+
excludes: ["src/Component.tsx"],
|
|
39
|
+
includes: ["src/**/*.tsx"],
|
|
40
|
+
rootURI: URI.parse("/project"),
|
|
41
|
+
});
|
|
42
|
+
const file = "file:///project/src/Component.tsx";
|
|
43
|
+
expect(fileSet.includesFile(file)).toBe(false);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
});
|