Skip to content

Commit 0781a8b

Browse files
vepanimasintellij-monorepo-bot
authored andcommitted
[graphql] WEB-68173 move introspection settings to advanced settings
GitOrigin-RevId: 257a49c6c010f45f860eb833e154b8fdf048dbde
1 parent 8a75af8 commit 0781a8b

File tree

8 files changed

+58
-57
lines changed

8 files changed

+58
-57
lines changed

resources/META-INF/plugin.xml

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -223,18 +223,19 @@
223223
<registryKey key="graphql.schema.build.timeout" defaultValue="500" description="GraphQL schema build timeout in ms"/>
224224
<registryKey key="graphql.schema.size.definitions.limit" defaultValue="4000"
225225
description="A limit on the total number of type definitions in a GraphQL schema"/>
226-
<registryKey key="graphql.introspection.detect.schema.capabilities"
227-
defaultValue="[Adaptive*|Latest|Legacy]"
228-
description="Enables preliminary request to detect GraphQL server capabilities before schema introspection"/>
229226
<registryKey key="graphql.introspection.custom.query"
230227
defaultValue=""
231228
description="Defines a custom query for server introspection, overriding the default behavior"/>
232-
<registryKey key="graphql.introspection.skip.default.values"
233-
defaultValue="false"
234-
description="Improves compatibility with non-compliant endpoints by skipping default values, though this removes default value information from the schema"/>
235-
<registryKey key="graphql.introspection.include.empty.types"
236-
defaultValue="false"
237-
description="Determines whether empty types are included in the introspection result"/>
229+
230+
<advancedSetting id="graphql.introspection.detect.schema.capabilities" default="ADAPTIVE"
231+
enumClass="com.intellij.lang.jsgraphql.ide.introspection.GraphQLSchemaCapabilitiesDetectionStrategy"
232+
groupKey="group.advanced.settings.graphql" bundle="messages.GraphQLBundle"
233+
descriptionKey="advanced.setting.graphql.introspection.detect.schema.capabilities.description"/>
234+
<advancedSetting id="graphql.introspection.skip.default.values" default="false"
235+
groupKey="group.advanced.settings.graphql" bundle="messages.GraphQLBundle"
236+
descriptionKey="advanced.setting.graphql.introspection.skip.default.values.description"/>
237+
<advancedSetting id="graphql.introspection.include.empty.types" default="true"
238+
groupKey="group.advanced.settings.graphql" bundle="messages.GraphQLBundle"/>
238239

239240
<!-- Inspections -->
240241
<localInspection language="GraphQL" key="graphql.inspection.display.name.unresolved.reference"

resources/messages/GraphQLBundle.properties

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,4 +239,12 @@ graphql.validation.unknown.type.0=Unknown type "{0}"
239239
graphql.schema.is.too.complex.error.text=The schema size exceeds the limit of {0} type definitions. This limit is set by the IDE to prevent performance issues. To resolve this, consider defining a more specific scope by creating a GraphQL configuration file
240240

241241
# Parser
242-
graphql.parsing.error.injection.placeholder=Injection placeholder
242+
graphql.parsing.error.injection.placeholder=Injection placeholder
243+
244+
# Advanced settings
245+
group.advanced.settings.graphql=GraphQL
246+
advanced.setting.graphql.introspection.detect.schema.capabilities=Schema capabilities detection mode
247+
advanced.setting.graphql.introspection.detect.schema.capabilities.description=Enables a preliminary request to detect GraphQL server capabilities before schema introspection.
248+
advanced.setting.graphql.introspection.skip.default.values=Skip default values in introspection queries
249+
advanced.setting.graphql.introspection.skip.default.values.description=Improves compatibility with non-compliant endpoints by skipping default values, though this removes default value information from the schema.
250+
advanced.setting.graphql.introspection.include.empty.types=Include empty types in the introspection result

src/main/com/intellij/lang/jsgraphql/ide/introspection/GraphQLIntrospectionQueryExecutor.kt

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import com.google.gson.JsonElement
55
import com.google.gson.JsonObject
66
import com.intellij.lang.jsgraphql.GraphQLBundle
77
import com.intellij.lang.jsgraphql.ide.config.model.GraphQLConfigEndpoint
8-
import com.intellij.lang.jsgraphql.ide.introspection.GraphQLQueryRunner.Companion.parseResponseJson
9-
import com.intellij.lang.jsgraphql.ide.introspection.GraphQLQueryRunner.Companion.prepareQueryPayload
8+
import com.intellij.lang.jsgraphql.ide.introspection.GraphQLQueryClient.Companion.parseResponseJson
9+
import com.intellij.lang.jsgraphql.ide.introspection.GraphQLQueryClient.Companion.prepareQueryPayload
1010
import com.intellij.lang.jsgraphql.ide.introspection.GraphQLSchemaCapability.*
1111
import com.intellij.lang.jsgraphql.ide.notifications.handleIntrospectionError
1212
import com.intellij.openapi.application.EDT
@@ -15,6 +15,7 @@ import com.intellij.openapi.components.service
1515
import com.intellij.openapi.diagnostic.debug
1616
import com.intellij.openapi.diagnostic.getOrLogException
1717
import com.intellij.openapi.diagnostic.logger
18+
import com.intellij.openapi.options.advanced.AdvancedSettings
1819
import com.intellij.openapi.progress.blockingContext
1920
import com.intellij.openapi.project.Project
2021
import com.intellij.openapi.util.io.FileUtil
@@ -58,7 +59,7 @@ class GraphQLIntrospectionQueryExecutor(private val project: Project, private va
5859
}
5960
val introspectionQuery = composeIntrospectionQuery(capabilities)
6061
val rawIntrospectionResponse = withContext(Dispatchers.IO) {
61-
val queryRunner = GraphQLQueryRunner.getInstance(project)
62+
val queryRunner = GraphQLQueryClient.getInstance(project)
6263
queryRunner.sendRequest(endpoint, prepareQueryPayload(introspectionQuery), retry)
6364
} ?: return@withBackgroundProgress
6465
val parsedIntrospection = blockingContext {
@@ -83,7 +84,7 @@ class GraphQLIntrospectionQueryExecutor(private val project: Project, private va
8384
retry: Runnable? = null,
8485
): EnumSet<GraphQLSchemaCapability>? {
8586
val response = withContext(Dispatchers.IO) {
86-
GraphQLQueryRunner.getInstance(project)
87+
GraphQLQueryClient.getInstance(project)
8788
.sendRequest(endpoint, prepareQueryPayload(INTROSPECTION_SCHEMA_CAPABILITIES_QUERY), retry)
8889
} ?: return null
8990

@@ -96,17 +97,7 @@ class GraphQLIntrospectionQueryExecutor(private val project: Project, private va
9697
}
9798

9899
private val capabilitiesDetectionStrategy: GraphQLSchemaCapabilitiesDetectionStrategy
99-
get() {
100-
val option = Registry.get("graphql.introspection.detect.schema.capabilities").selectedOption
101-
?: return GraphQLSchemaCapabilitiesDetectionStrategy.ADAPTIVE
102-
103-
return try {
104-
GraphQLSchemaCapabilitiesDetectionStrategy.valueOf(option.uppercase(Locale.getDefault()))
105-
}
106-
catch (_: IllegalArgumentException) {
107-
GraphQLSchemaCapabilitiesDetectionStrategy.ADAPTIVE
108-
}
109-
}
100+
get() = AdvancedSettings.getEnum("graphql.introspection.detect.schema.capabilities", GraphQLSchemaCapabilitiesDetectionStrategy::class.java)
110101

111102
private suspend fun createIntrospectionOutput(
112103
schemaPath: String,
@@ -144,8 +135,8 @@ class GraphQLIntrospectionQueryExecutor(private val project: Project, private va
144135

145136
// this is still needed since we can have an issue with parsing values returned from server,
146137
// especially for custom JSON types, more https://github.com/JetBrains/js-graphql-intellij-plugin/issues/217
147-
if (Registry.`is`("graphql.introspection.skip.default.values")) {
148-
capabilities.remove(GraphQLSchemaCapability.INPUT_VALUE_DEFAULT_VALUE)
138+
if (AdvancedSettings.getBoolean("graphql.introspection.skip.default.values")) {
139+
capabilities.remove(INPUT_VALUE_DEFAULT_VALUE)
149140
}
150141

151142
return buildIntrospectionQueryFromTemplate(capabilities)
@@ -224,9 +215,3 @@ class GraphQLIntrospectionQueryExecutor(private val project: Project, private va
224215
private fun JsonElement.hasArgument(fieldName: String, argName: String): Boolean =
225216
getArgument(fieldName, argName) != null
226217
}
227-
228-
private enum class GraphQLSchemaCapabilitiesDetectionStrategy {
229-
ADAPTIVE,
230-
LATEST,
231-
LEGACY,
232-
}

src/main/com/intellij/lang/jsgraphql/ide/introspection/GraphQLIntrospectionService.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,12 @@
4242
import com.intellij.openapi.fileEditor.FileEditor;
4343
import com.intellij.openapi.fileEditor.FileEditorManager;
4444
import com.intellij.openapi.fileEditor.TextEditor;
45+
import com.intellij.openapi.options.advanced.AdvancedSettings;
4546
import com.intellij.openapi.progress.ProcessCanceledException;
4647
import com.intellij.openapi.project.DumbService;
4748
import com.intellij.openapi.project.Project;
4849
import com.intellij.openapi.util.Ref;
4950
import com.intellij.openapi.util.io.FileUtil;
50-
import com.intellij.openapi.util.registry.Registry;
5151
import com.intellij.openapi.util.text.StringUtil;
5252
import com.intellij.openapi.vfs.LocalFileSystem;
5353
import com.intellij.openapi.vfs.VirtualFile;
@@ -184,23 +184,23 @@ private boolean isEndpointConfigurationValid(GraphQLConfigEndpoint endpoint) {
184184
}
185185

186186
public static @NotNull String printIntrospectionAsGraphQL(@NotNull Project project, @NotNull String introspectionJson) {
187-
return printIntrospectionAsGraphQL(project, GraphQLQueryRunner.parseResponseJsonAsMap(introspectionJson));
187+
return printIntrospectionAsGraphQL(project, GraphQLQueryClient.parseResponseJsonAsMap(introspectionJson));
188188
}
189189

190190
/**
191-
* @deprecated Use {@link GraphQLQueryRunner#createHttpClient(String, GraphQLConfigSecurity)} instead.
191+
* @deprecated Use {@link GraphQLQueryClient#createHttpClient(String, GraphQLConfigSecurity)} instead.
192192
*/
193193
@Deprecated(forRemoval = true)
194194
public @NotNull CloseableHttpClient createHttpClient(@NotNull String url, @Nullable GraphQLConfigSecurity sslConfig)
195195
throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, IOException, UnrecoverableKeyException,
196196
CertificateException {
197-
return GraphQLQueryRunner.getInstance(myProject).createHttpClient(url, sslConfig);
197+
return GraphQLQueryClient.getInstance(myProject).createHttpClient(url, sslConfig);
198198
}
199199

200200
public static @NotNull String printIntrospectionAsGraphQL(@NotNull Project project, @NotNull Map<String, Object> introspection) {
201201
introspection = getIntrospectionSchemaDataFromParsedResponse(introspection);
202202

203-
if (Registry.is("graphql.introspection.skip.default.values")) {
203+
if (AdvancedSettings.getBoolean("graphql.introspection.skip.default.values")) {
204204
// strip out the defaultValues that are potentially non-spec compliant
205205
Ref<Consumer<Object>> defaultValueVisitJson = Ref.create();
206206
defaultValueVisitJson.set((value) -> {
@@ -220,7 +220,7 @@ else if (value instanceof Map) {
220220
.defaultOptions()
221221
.includeScalarTypes(true)
222222
.includeSchemaDefinition(true)
223-
.includeEmptyTypes(false)
223+
.includeEmptyTypes(AdvancedSettings.getBoolean("graphql.introspection.include.empty.types"))
224224
.includeDirectives(directive -> !GraphQLKnownTypes.DEFAULT_DIRECTIVES.contains(directive.getName()));
225225

226226
GraphQLRegistryInfo registryInfo = new GraphQLRegistryInfo(new SchemaParser().buildRegistry(schemaDefinition), false);
@@ -267,7 +267,7 @@ else if (value instanceof Map) {
267267
}
268268

269269
/**
270-
* @deprecated use {@link GraphQLQueryRunner#createRequest(GraphQLConfigEndpoint, String)} instead.
270+
* @deprecated use {@link GraphQLQueryClient#createRequest(GraphQLConfigEndpoint, String)} instead.
271271
*/
272272
@Deprecated(forRemoval = true)
273273
public static @NotNull HttpPost createRequest(@NotNull GraphQLConfigEndpoint endpoint,
@@ -291,7 +291,7 @@ record IntrospectionOutput(@NotNull String schemaText, @NotNull IntrospectionOut
291291
@NotNull GraphQLConfigEndpoint endpoint,
292292
@NotNull String introspectionResponse) {
293293
try {
294-
Map<String, Object> introspection = GraphQLQueryRunner.parseResponseJsonAsMap(introspectionResponse);
294+
Map<String, Object> introspection = GraphQLQueryClient.parseResponseJsonAsMap(introspectionResponse);
295295
if (GraphQLIntrospectionUtil.getErrorCountFromResponse(introspection) > 0) {
296296
GraphQLUIProjectService.getInstance(project).showQueryResult(introspectionResponse);
297297
}

src/main/com/intellij/lang/jsgraphql/ide/introspection/GraphQLQueryRunner.kt renamed to src/main/com/intellij/lang/jsgraphql/ide/introspection/GraphQLQueryClient.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,13 @@ import java.util.concurrent.CancellationException
4242
import javax.net.ssl.HostnameVerifier
4343

4444
@Service(Service.Level.PROJECT)
45-
class GraphQLQueryRunner(private val project: Project) {
45+
class GraphQLQueryClient(private val project: Project) {
4646

4747
companion object {
48-
private val LOG = logger<GraphQLQueryRunner>()
48+
private val LOG = logger<GraphQLQueryClient>()
4949

5050
@JvmStatic
51-
fun getInstance(project: Project): GraphQLQueryRunner = project.service()
51+
fun getInstance(project: Project): GraphQLQueryClient = project.service()
5252

5353
@JvmStatic
5454
fun parseResponseJsonAsMap(responseJson: String): Map<String, Any?> {
@@ -76,10 +76,12 @@ class GraphQLQueryRunner(private val project: Project) {
7676
return responseJson.replace("[\ud83c\udf00-\ud83d\ude4f]|[\ud83d\ude80-\ud83d\udeff]".toRegex(), "")
7777
}
7878

79+
@JvmStatic
7980
fun prepareQueryPayload(query: String): String =
8081
"""{"query": "${EscapeUtil.escapeJsonString(query)}"}"""
8182
}
8283

84+
@JvmOverloads
8385
fun sendRequest(
8486
endpoint: GraphQLConfigEndpoint,
8587
payload: String,
@@ -108,6 +110,7 @@ class GraphQLQueryRunner(private val project: Project) {
108110
}
109111
}
110112

113+
@JvmOverloads
111114
fun sendRequest(
112115
endpoint: GraphQLConfigEndpoint,
113116
request: HttpUriRequest,
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.intellij.lang.jsgraphql.ide.introspection
2+
3+
enum class GraphQLSchemaCapabilitiesDetectionStrategy(private val displayName: String) {
4+
ADAPTIVE("Adaptive"),
5+
LATEST("Latest"),
6+
LEGACY("Legacy");
7+
8+
override fun toString(): String = displayName
9+
}

src/main/com/intellij/lang/jsgraphql/types/schema/idl/SchemaPrinter.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ The MIT License (MIT)
2626
import com.intellij.lang.jsgraphql.types.schema.*;
2727
import com.intellij.lang.jsgraphql.types.schema.visibility.GraphqlFieldVisibility;
2828
import com.intellij.openapi.project.Project;
29-
import com.intellij.openapi.util.registry.Registry;
3029
import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
3130
import com.intellij.util.containers.ContainerUtil;
3231
import org.jetbrains.annotations.NotNull;
@@ -442,7 +441,7 @@ private TypePrinter<GraphQLEnumType> enumPrinter() {
442441
if (isIntrospectionType(type)) {
443442
return;
444443
}
445-
if (!shouldIncludeEmptyTypes() && type.getValues().isEmpty()) {
444+
if (!options.isIncludeEmptyTypes() && type.getValues().isEmpty()) {
446445
return;
447446
}
448447

@@ -513,7 +512,7 @@ private TypePrinter<GraphQLInterfaceType> interfacePrinter() {
513512
if (isIntrospectionType(type)) {
514513
return;
515514
}
516-
if (!shouldIncludeEmptyTypes() && type.getFields().isEmpty()) {
515+
if (!options.isIncludeEmptyTypes() && type.getFields().isEmpty()) {
517516
return;
518517
}
519518

@@ -560,7 +559,7 @@ private TypePrinter<GraphQLUnionType> unionPrinter() {
560559
if (isIntrospectionType(type)) {
561560
return;
562561
}
563-
if (!shouldIncludeEmptyTypes() && type.getTypes().isEmpty()) {
562+
if (!options.isIncludeEmptyTypes() && type.getTypes().isEmpty()) {
564563
return;
565564
}
566565

@@ -597,7 +596,7 @@ private TypePrinter<GraphQLObjectType> objectPrinter() {
597596
if (isIntrospectionType(type)) {
598597
return;
599598
}
600-
if (!shouldIncludeEmptyTypes() && type.getFields().isEmpty()) {
599+
if (!options.isIncludeEmptyTypes() && type.getFields().isEmpty()) {
601600
return;
602601
}
603602

@@ -644,7 +643,7 @@ private TypePrinter<GraphQLInputObjectType> inputObjectPrinter() {
644643
if (isIntrospectionType(type)) {
645644
return;
646645
}
647-
if (!shouldIncludeEmptyTypes() && type.getFields().isEmpty()) {
646+
if (!options.isIncludeEmptyTypes() && type.getFields().isEmpty()) {
648647
return;
649648
}
650649

@@ -687,10 +686,6 @@ private TypePrinter<GraphQLInputObjectType> inputObjectPrinter() {
687686
};
688687
}
689688

690-
private boolean shouldIncludeEmptyTypes() {
691-
return options.isIncludeEmptyTypes() || Registry.is("graphql.introspection.include.empty.types");
692-
}
693-
694689
/**
695690
* This will return true if the options say to use the AST and we have an AST element
696691
*

src/main/com/intellij/lang/jsgraphql/ui/GraphQLUIProjectService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
import com.intellij.lang.jsgraphql.ide.highlighting.query.GraphQLQueryContextHighlightVisitor;
3232
import com.intellij.lang.jsgraphql.ide.introspection.GraphQLIntrospectionUtil;
3333
import com.intellij.lang.jsgraphql.ide.introspection.GraphQLOpenIntrospectionSchemaAction;
34-
import com.intellij.lang.jsgraphql.ide.introspection.GraphQLQueryRunner;
34+
import com.intellij.lang.jsgraphql.ide.introspection.GraphQLQueryClient;
3535
import com.intellij.lang.jsgraphql.ide.introspection.GraphQLRunIntrospectionQueryAction;
3636
import com.intellij.lang.jsgraphql.ide.introspection.remote.GraphQLRemoteSchemasRegistry;
3737
import com.intellij.lang.jsgraphql.ide.introspection.source.GraphQLGeneratedSourcesManager;
@@ -398,7 +398,7 @@ public void executeGraphQL(@NotNull Editor editor, @NotNull VirtualFile virtualF
398398
return;
399399
}
400400
String payload = createQueryJsonSerializer().toJson(requestData);
401-
HttpUriRequest request = GraphQLQueryRunner.getInstance(myProject).createRequest(selectedEndpoint, payload);
401+
HttpUriRequest request = GraphQLQueryClient.getInstance(myProject).createRequest(selectedEndpoint, payload);
402402
if (request == null) {
403403
return;
404404
}
@@ -422,7 +422,7 @@ private void runQuery(@NotNull Editor editor,
422422
@NotNull GraphQLConfigEndpoint endpoint) {
423423
try {
424424
GraphQLConfigSecurity sslConfig = GraphQLConfigSecurity.getSecurityConfig(endpoint.getConfig());
425-
try (final CloseableHttpClient httpClient = GraphQLQueryRunner.getInstance(myProject).createHttpClient(url, sslConfig)) {
425+
try (final CloseableHttpClient httpClient = GraphQLQueryClient.getInstance(myProject).createHttpClient(url, sslConfig)) {
426426
editor.putUserData(GRAPH_QL_EDITOR_QUERYING, true);
427427

428428
String responseJson;

0 commit comments

Comments
 (0)