From 113d1d9fe4de9522289eed7848992fe53647fa7f Mon Sep 17 00:00:00 2001 From: Nipuna Fernando Date: Tue, 4 Mar 2025 21:18:05 +0530 Subject: [PATCH 01/24] Add inferred return type to node template --- .../flowmodelgenerator/core/TypesManager.java | 3 +- .../core/model/Codedata.java | 11 +- .../core/model/node/CallBuilder.java | 11 +- .../model/node/RemoteActionCallBuilder.java | 4 +- .../remote_action_call-mysql-query.json | 118 ++++++++++++++++++ 5 files changed, 139 insertions(+), 8 deletions(-) create mode 100644 flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-query.json diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/TypesManager.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/TypesManager.java index e355e65b9..b0410f78c 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/TypesManager.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/TypesManager.java @@ -457,7 +457,8 @@ private Codedata getCodedataWithoutPosition(Codedata codedata) { codedata.resourcePath(), codedata.id(), codedata.isNew(), - codedata.isGenerated() + codedata.isGenerated(), + codedata.inferredReturnType() ); } diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/Codedata.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/Codedata.java index 856bbfa1a..a6ed31a6a 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/Codedata.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/Codedata.java @@ -41,7 +41,8 @@ */ public record Codedata(NodeKind node, String org, String module, String object, String symbol, String version, LineRange lineRange, String sourceCode, String parentSymbol, - String resourcePath, Integer id, Boolean isNew, Boolean isGenerated) { + String resourcePath, Integer id, Boolean isNew, Boolean isGenerated, + String inferredReturnType) { @Override public String toString() { @@ -79,6 +80,7 @@ public static class Builder extends FacetedBuilder { private Integer id; private Boolean isNew; private Boolean isGenerated; + private String inferredReturnType; public Builder(T parentBuilder) { super(parentBuilder); @@ -155,9 +157,14 @@ public Builder isGenerated(Boolean isGenerated) { return this; } + public Builder inferredReturnType(String inferredReturnType) { + this.inferredReturnType = inferredReturnType; + return this; + } + public Codedata build() { return new Codedata(node, org, module, object, symbol, version, lineRange, sourceCode, parentSymbol, - resourcePath, id, isNew, isGenerated); + resourcePath, id, isNew, isGenerated, inferredReturnType); } } } diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/CallBuilder.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/CallBuilder.java index 271dce72a..491bdd514 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/CallBuilder.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/CallBuilder.java @@ -91,7 +91,8 @@ public void setConcreteTemplateData(TemplateContext context) { .module(codedata.module()) .object(codedata.object()) .version(codedata.version()) - .symbol(codedata.symbol()); + .symbol(codedata.symbol()) + .inferredReturnType(functionData.returnType()); if (getFunctionNodeKind() != NodeKind.FUNCTION_CALL) { properties().custom() @@ -123,8 +124,7 @@ public void setConcreteTemplateData(TemplateContext context) { protected void setParameterProperties(FunctionData function) { boolean hasOnlyRestParams = function.parameters().size() == 1; for (ParameterData paramResult : function.parameters().values()) { - if (paramResult.kind().equals(ParameterData.Kind.PARAM_FOR_TYPE_INFER) - || paramResult.kind().equals(ParameterData.Kind.INCLUDED_RECORD)) { + if (paramResult.kind().equals(ParameterData.Kind.INCLUDED_RECORD)) { continue; } @@ -147,6 +147,11 @@ protected void setParameterProperties(FunctionData function) { .defaultable(paramResult.optional()); switch (paramResult.kind()) { + case PARAM_FOR_TYPE_INFER -> { + customPropBuilder.advanced(false); + customPropBuilder.optional(false); + customPropBuilder.type(Property.ValueType.TYPE); + } case INCLUDED_RECORD_REST -> { if (hasOnlyRestParams) { customPropBuilder.defaultable(false); diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/RemoteActionCallBuilder.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/RemoteActionCallBuilder.java index 663129fdf..c6d2215c0 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/RemoteActionCallBuilder.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/RemoteActionCallBuilder.java @@ -44,7 +44,7 @@ public class RemoteActionCallBuilder extends CallBuilder { @Override public Map> toSource(SourceBuilder sourceBuilder) { - sourceBuilder.newVariable(); + sourceBuilder.newVariableWithInferredType(); FlowNode flowNode = sourceBuilder.flowNode; if (FlowNodeUtil.hasCheckKeyFlagSet(flowNode)) { @@ -62,7 +62,7 @@ public Map> toSource(SourceBuilder sourceBuilder) { .name(flowNode.metadata().label()) .stepOut() .functionParameters(flowNode, - Set.of(Property.CONNECTION_KEY, Property.VARIABLE_KEY, Property.TYPE_KEY, TARGET_TYPE_KEY, + Set.of(Property.CONNECTION_KEY, Property.VARIABLE_KEY, Property.TYPE_KEY, Property.CHECK_ERROR_KEY)) .textEdit(false) .acceptImport() diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-query.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-query.json new file mode 100644 index 000000000..0ab15640f --- /dev/null +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-query.json @@ -0,0 +1,118 @@ +{ + "source": "data_mapper/main.bal", + "position": { + "line": 14, + "offset": 0 + }, + "description": "Sample diagram node", + "codedata": { + "node": "REMOTE_ACTION_CALL", + "org": "ballerinax", + "module": "mysql", + "object": "Client", + "symbol": "query", + "version": "1.14.0", + "parentSymbol": "mysqlClient", + "resourcePath": "", + "id": 0 + }, + "output": { + "id": "31", + "metadata": { + "label": "query", + "description": "Executes the query, which may return multiple results.\nWhen processing the stream, make sure to consume all fetched data or close the stream.\n", + "icon": "https://bcentral-packageicons.azureedge.net/images/ballerinax_mysql_1.13.1.png" + }, + "codedata": { + "node": "REMOTE_ACTION_CALL", + "org": "ballerinax", + "module": "mysql", + "object": "Client", + "symbol": "query", + "version": "1.14.0", + "id": 2, + "inferredReturnType": "stream" + }, + "returning": false, + "properties": { + "connection": { + "metadata": { + "label": "Connection", + "description": "Connection to use" + }, + "valueType": "IDENTIFIER", + "valueTypeConstraint": "mysql:Client", + "value": "mysqlClient", + "optional": false, + "editable": false, + "advanced": false + }, + "sqlQuery": { + "metadata": { + "label": "sqlQuery", + "description": "The SQL query such as `` `SELECT * from Album WHERE name=${albumName}` ``" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "sql:ParameterizedQuery", + "placeholder": "object {}", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "REQUIRED", + "originalName": "sqlQuery", + "importStatements": "ballerina/sql" + }, + "typeMembers": [ + { + "type": "ParameterizedQuery", + "packageInfo": "ballerina:sql:1.14.0", + "kind": "OBJECT_TYPE", + "selected": false + } + ] + }, + "rowType": { + "metadata": { + "label": "rowType", + "description": "The `typedesc` of the record to which the result needs to be returned" + }, + "valueType": "TYPE", + "valueTypeConstraint": "record {|anydata...;|}", + "placeholder": "record {|anydata...;|}", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "rowType" + }, + "typeMembers": [] + }, + "type": { + "metadata": { + "label": "Variable Type", + "description": "Type of the variable" + }, + "valueType": "TYPE", + "value": "stream", + "placeholder": "var", + "optional": false, + "editable": true, + "advanced": false + }, + "variable": { + "metadata": { + "label": "Variable Name", + "description": "Name of the variable" + }, + "valueType": "IDENTIFIER", + "value": "streamRowtypeSqlError", + "optional": false, + "editable": true, + "advanced": false + } + }, + "flags": 0 + } +} From 62b1f12be9330845b7834f0e43d9412a8dfcfd37 Mon Sep 17 00:00:00 2001 From: Nipuna Fernando Date: Tue, 4 Mar 2025 21:25:43 +0530 Subject: [PATCH 02/24] Add inferred return type to diagram generator --- .../flowmodelgenerator/core/CodeAnalyzer.java | 101 ++++++++++++++++-- 1 file changed, 95 insertions(+), 6 deletions(-) diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/CodeAnalyzer.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/CodeAnalyzer.java index 1f5911ccb..4d22304c5 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/CodeAnalyzer.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/CodeAnalyzer.java @@ -23,8 +23,10 @@ import io.ballerina.compiler.api.symbols.ClassSymbol; import io.ballerina.compiler.api.symbols.FunctionSymbol; import io.ballerina.compiler.api.symbols.FunctionTypeSymbol; +import io.ballerina.compiler.api.symbols.IntersectionTypeSymbol; import io.ballerina.compiler.api.symbols.MethodSymbol; import io.ballerina.compiler.api.symbols.ParameterSymbol; +import io.ballerina.compiler.api.symbols.StreamTypeSymbol; import io.ballerina.compiler.api.symbols.Symbol; import io.ballerina.compiler.api.symbols.SymbolKind; import io.ballerina.compiler.api.symbols.TypeDescKind; @@ -280,7 +282,7 @@ public void visit(RemoteMethodCallActionNode remoteMethodCallActionNode) { .description(functionData.description()) .stepOut() .codedata() - .nodeInfo(remoteMethodCallActionNode) + .nodeInfo(remoteMethodCallActionNode) .object(classSymbol.get().getName().orElse("")) .symbol(functionName) .stepOut() @@ -607,7 +609,7 @@ private void buildPropsFromFuncCallArgs(SeparatedNodeList String escapedParamName = parameterSymbol.getName().get(); ParameterData paramResult = funcParamMap.get(escapedParamName); if (paramResult == null) { - escapedParamName = CommonUtil.escapeReservedKeyword(parameterSymbol.getName().get()); + continue; } paramResult = funcParamMap.get(escapedParamName); Node paramValue; @@ -1238,9 +1240,96 @@ private void processFunctionSymbol(NonTerminalNode callNode, SeparatedNodeList namedArgValueMap = new HashMap<>(); final Queue positionalArgs = new LinkedList<>(); calculateFunctionArgs(namedArgValueMap, positionalArgs, arguments); - buildPropsFromFuncCallArgs(arguments, functionSymbol.typeDescriptor(), functionData.parameters(), - positionalArgs, namedArgValueMap); - handleCheckFlag(callNode, functionSymbol.typeDescriptor()); + + Map funcParamMap = new HashMap<>(); + FunctionTypeSymbol functionTypeSymbol = functionSymbol.typeDescriptor(); + functionData.parameters().forEach((key, paramResult) -> { + if (paramResult.kind() != ParameterData.Kind.PARAM_FOR_TYPE_INFER) { + funcParamMap.put(key, paramResult); + return; + } + + Optional inferredTypeName = getInferredTypeName(functionTypeSymbol, key); + nodeBuilder.codedata().inferredReturnType(functionData.returnType()); + if (inferredTypeName.isEmpty()) { + return; + } + String unescapedParamName = ParamUtils.removeLeadingSingleQuote(paramResult.name()); + nodeBuilder.properties().custom() + .metadata() + .label(unescapedParamName) + .description(paramResult.description()) + .stepOut() + .type(Property.ValueType.TYPE) + .typeConstraint(paramResult.type()) + .value(inferredTypeName.get()) + .placeholder(paramResult.defaultValue()) + .editable() + .codedata() + .kind(paramResult.kind().name()) + .originalName(paramResult.name()) + .importStatements(paramResult.importStatements()) + .stepOut() + .stepOut() + .addProperty(unescapedParamName); + }); + buildPropsFromFuncCallArgs(arguments, functionTypeSymbol, funcParamMap, positionalArgs, namedArgValueMap); + handleCheckFlag(callNode, functionTypeSymbol); + } + + private Optional getInferredTypeName(FunctionTypeSymbol functionTypeSymbol, String parameterName) { + try { + TypeSymbol variableTypeSymbol = + ((VariableSymbol) (semanticModel.symbol(typedBindingPatternNode).orElseThrow())).typeDescriptor(); + TypeSymbol returnTypeSymbol = functionTypeSymbol.returnTypeDescriptor().orElseThrow(); + + // Check if the inferred type is the same as the return type + if (variableTypeSymbol.kind() != returnTypeSymbol.kind()) { + return Optional.empty(); + } + + return switch (returnTypeSymbol.typeKind()) { + case STREAM -> { + StreamTypeSymbol descriptorSymbol = (StreamTypeSymbol) returnTypeSymbol; + StreamTypeSymbol variableSymbol = (StreamTypeSymbol) variableTypeSymbol; + Optional typeParamName = getInferredTypeName(descriptorSymbol.typeParameter(), + variableSymbol.typeParameter(), parameterName); + if (typeParamName.isPresent()) { + yield typeParamName; + } + yield getInferredTypeName(descriptorSymbol.completionValueTypeParameter(), + variableSymbol.completionValueTypeParameter(), parameterName); + } + case UNION -> getInferredTypeFromMembers(((UnionTypeSymbol) returnTypeSymbol).memberTypeDescriptors(), + ((UnionTypeSymbol) variableTypeSymbol).memberTypeDescriptors(), parameterName); + case INTERSECTION -> + getInferredTypeFromMembers(((IntersectionTypeSymbol) returnTypeSymbol).memberTypeDescriptors(), + ((IntersectionTypeSymbol) variableTypeSymbol).memberTypeDescriptors(), parameterName); + default -> getInferredTypeName(returnTypeSymbol, variableTypeSymbol, parameterName); + }; + } catch (Throwable e) { + return Optional.empty(); + } + } + + private Optional getInferredTypeFromMembers(List descriptorMembers, + List variableSymbols, String parameterName) { + for (int i = 0; i < descriptorMembers.size(); i++) { + Optional typeParamName = + getInferredTypeName(descriptorMembers.get(i), variableSymbols.get(i), parameterName); + if (typeParamName.isPresent()) { + return typeParamName; + } + } + return Optional.empty(); + } + + private Optional getInferredTypeName(TypeSymbol descriptorSymbol, TypeSymbol variableSymbol, + String parameterName) { + if (CommonUtils.getTypeSignature(descriptorSymbol, moduleInfo).equals(parameterName)) { + return Optional.of(CommonUtils.getTypeSignature(variableSymbol, moduleInfo)); + } + return Optional.empty(); } private static String getIdentifierName(NameReferenceNode nameReferenceNode) { @@ -1593,7 +1682,7 @@ private void handleConstructorExpressionNode(ExpressionNode constructorExprNode) .properties().expression(constructorExprNode); } } - // Utility methods +// Utility methods /** * It's the responsibility of the parent node to add the children nodes when building the diagram. Hence, the method From 31c912761d1ea9fc1e28ae2c4c73e541726fe45c Mon Sep 17 00:00:00 2001 From: Nipuna Fernando Date: Tue, 4 Mar 2025 21:31:28 +0530 Subject: [PATCH 03/24] Capture import statements in the function data --- .../indexgenerator/DatabaseManager.java | 14 +++-- .../indexgenerator/IndexGenerator.java | 53 ++++++++++------ .../src/main/resources/central-index.sql | 3 +- .../modelgenerator/commons/CommonUtils.java | 1 + .../modelgenerator/commons/FunctionData.java | 8 ++- .../commons/FunctionDataBuilder.java | 61 ++++++++++++------- 6 files changed, 90 insertions(+), 50 deletions(-) diff --git a/flow-model-generator/modules/flow-model-index-generator/src/main/java/io/ballerina/indexgenerator/DatabaseManager.java b/flow-model-generator/modules/flow-model-index-generator/src/main/java/io/ballerina/indexgenerator/DatabaseManager.java index a45665d8a..dce9d50e7 100644 --- a/flow-model-generator/modules/flow-model-index-generator/src/main/java/io/ballerina/indexgenerator/DatabaseManager.java +++ b/flow-model-generator/modules/flow-model-index-generator/src/main/java/io/ballerina/indexgenerator/DatabaseManager.java @@ -93,17 +93,19 @@ public static int insertPackage(String org, String name, String version, List returnTypeSymbol = functionTypeSymbol.returnTypeDescriptor(); + String returnType = returnTypeSymbol .map(returnTypeDesc -> functionSymbol.nameEquals("init") ? getClientType(packageName) : CommonUtils.getTypeSignature(semanticModel, returnTypeDesc, true)) .orElse(""); + // Get import statements for the return type + ModuleInfo defaultModuleInfo = ModuleInfo.from(resolvedPackage.getDefaultModule().descriptor()); + String importStatements = returnTypeSymbol.flatMap( + typeSymbol -> CommonUtils.getImportStatements(returnTypeSymbol.get(), defaultModuleInfo)).orElse(null); + ParamForTypeInfer paramForTypeInfer = null; if (functionSymbol.external()) { List paramNameList = new ArrayList<>(); @@ -243,19 +249,19 @@ private static int processFunctionSymbol(SemanticModel semanticModel, FunctionSy .filter(paramSym -> paramSym.paramKind() == ParameterKind.DEFAULTABLE) .forEach(paramSymbol -> paramNameList.add(paramSymbol.getName().orElse("")))); - Map returnTypeMap = allMembers(functionTypeSymbol.returnTypeDescriptor().orElse(null)); + Map returnTypeMap = allMembers(returnTypeSymbol.orElse(null)); for (String paramName : paramNameList) { if (returnTypeMap.containsKey(paramName)) { - returnType = "json"; - String defaultValue = DefaultValueGeneratorUtil - .getDefaultValueForType(returnTypeMap.get(paramName)); - paramForTypeInfer = new ParamForTypeInfer(paramName, defaultValue, returnType); + TypeSymbol typeDescriptor = returnTypeMap.get(paramName); + String defaultValue = DefaultValueGeneratorUtil.getDefaultValueForType(typeDescriptor); + paramForTypeInfer = new ParamForTypeInfer(paramName, defaultValue, + CommonUtils.getTypeSignature(semanticModel, CommonUtils.getRawType(typeDescriptor), true)); break; } } } - int returnError = functionTypeSymbol.returnTypeDescriptor() + int returnError = returnTypeSymbol .map(returnTypeDesc -> CommonUtils.subTypeOf(returnTypeDesc, errorTypeSymbol) ? 1 : 0).orElse(0); ParamUtils.ResourcePathTemplate resourcePathTemplate = null; @@ -266,7 +272,7 @@ private static int processFunctionSymbol(SemanticModel semanticModel, FunctionSy String resourcePath = resourcePathTemplate == null ? "" : resourcePathTemplate.resourcePathTemplate(); int functionId = DatabaseManager.insertFunction(packageId, name.get(), description, returnType, - functionType.name(), resourcePath, returnError, paramForTypeInfer != null); + functionType.name(), resourcePath, returnError, paramForTypeInfer != null, importStatements); // Store the resource path params if (resourcePathTemplate != null) { @@ -281,7 +287,6 @@ private static int processFunctionSymbol(SemanticModel semanticModel, FunctionSy // Handle the parameters of the function ParamForTypeInfer finalParamForTypeInfer = paramForTypeInfer; - ModuleInfo defaultModuleInfo = ModuleInfo.from(resolvedPackage.getDefaultModule().descriptor()); functionTypeSymbol.params() .ifPresent(paramList -> paramList.forEach(paramSymbol -> processParameterSymbol(paramSymbol, documentationMap, functionId, resolvedPackage, @@ -297,16 +302,26 @@ private static Map allMembers(TypeSymbol typeSymbol) { Map members = new HashMap<>(); if (typeSymbol == null) { return members; - } else if (typeSymbol.typeKind() == TypeDescKind.UNION) { - UnionTypeSymbol unionTypeSymbol = (UnionTypeSymbol) typeSymbol; - unionTypeSymbol.memberTypeDescriptors() - .forEach(memberType -> members.put(memberType.getName().orElse(""), memberType)); - } else if (typeSymbol.typeKind() == TypeDescKind.INTERSECTION) { - IntersectionTypeSymbol intersectionTypeSymbol = (IntersectionTypeSymbol) typeSymbol; - intersectionTypeSymbol.memberTypeDescriptors() - .forEach(memberType -> members.put(memberType.getName().orElse(""), memberType)); - } else { - members.put(typeSymbol.getName().orElse(""), typeSymbol); + } + + switch (typeSymbol.typeKind()) { + case UNION -> { + UnionTypeSymbol unionTypeSymbol = (UnionTypeSymbol) typeSymbol; + unionTypeSymbol.memberTypeDescriptors() + .forEach(memberType -> members.put(memberType.getName().orElse(""), memberType)); + } + case INTERSECTION -> { + IntersectionTypeSymbol intersectionTypeSymbol = (IntersectionTypeSymbol) typeSymbol; + intersectionTypeSymbol.memberTypeDescriptors() + .forEach(memberType -> members.put(memberType.getName().orElse(""), memberType)); + } + case STREAM -> { + StreamTypeSymbol streamTypeSymbol = (StreamTypeSymbol) typeSymbol; + members.put(streamTypeSymbol.typeParameter().getName().orElse(""), streamTypeSymbol.typeParameter()); + members.put(streamTypeSymbol.completionValueTypeParameter().getName().orElse(""), + streamTypeSymbol.completionValueTypeParameter()); + } + default -> members.put(typeSymbol.getName().orElse(""), typeSymbol); } return members; } diff --git a/flow-model-generator/modules/flow-model-index-generator/src/main/resources/central-index.sql b/flow-model-generator/modules/flow-model-index-generator/src/main/resources/central-index.sql index 66992bfc3..a06f9be9b 100644 --- a/flow-model-generator/modules/flow-model-index-generator/src/main/resources/central-index.sql +++ b/flow-model-generator/modules/flow-model-index-generator/src/main/resources/central-index.sql @@ -25,7 +25,8 @@ CREATE TABLE Function ( return_type JSON, -- JSON type for return type information resource_path TEXT NOT NULL, return_error INTEGER CHECK(return_error IN (0, 1)), - inferred_return_type INTEGER CHECK(return_error IN (0, 1)), -- Whether the return type is inferred + inferred_return_type INTEGER CHECK(return_error IN (0, 1)), -- Whether the return type is inferred + import_statements TEXT, -- Import statements for the return type FOREIGN KEY (package_id) REFERENCES Package(package_id) ON DELETE CASCADE ); diff --git a/model-generator-commons/src/main/java/io/ballerina/modelgenerator/commons/CommonUtils.java b/model-generator-commons/src/main/java/io/ballerina/modelgenerator/commons/CommonUtils.java index 24648743b..37acfd266 100644 --- a/model-generator-commons/src/main/java/io/ballerina/modelgenerator/commons/CommonUtils.java +++ b/model-generator-commons/src/main/java/io/ballerina/modelgenerator/commons/CommonUtils.java @@ -619,6 +619,7 @@ private static void analyzeTypeSymbolForImports(Set imports, TypeSymbol case STREAM -> { StreamTypeSymbol streamTypeSymbol = (StreamTypeSymbol) typeSymbol; analyzeTypeSymbolForImports(imports, streamTypeSymbol.typeParameter(), moduleInfo); + analyzeTypeSymbolForImports(imports, streamTypeSymbol.completionValueTypeParameter(), moduleInfo); } case FUTURE -> { FutureTypeSymbol futureTypeSymbol = (FutureTypeSymbol) typeSymbol; diff --git a/model-generator-commons/src/main/java/io/ballerina/modelgenerator/commons/FunctionData.java b/model-generator-commons/src/main/java/io/ballerina/modelgenerator/commons/FunctionData.java index 8badcf5a7..b077acdff 100644 --- a/model-generator-commons/src/main/java/io/ballerina/modelgenerator/commons/FunctionData.java +++ b/model-generator-commons/src/main/java/io/ballerina/modelgenerator/commons/FunctionData.java @@ -38,12 +38,13 @@ public class FunctionData { private final Kind kind; private final boolean returnError; private final boolean inferredReturnType; + private final String importStatements; private Map parameters; private String packageId; public FunctionData(int functionId, String name, String description, String returnType, String packageName, String org, String version, String resourcePath, - Kind kind, boolean returnError, boolean inferredReturnType) { + Kind kind, boolean returnError, boolean inferredReturnType, String importStatements) { this.functionId = functionId; this.name = name; this.description = description; @@ -55,6 +56,7 @@ public FunctionData(int functionId, String name, String description, String retu this.kind = kind; this.returnError = returnError; this.inferredReturnType = inferredReturnType; + this.importStatements = importStatements; } public void setParameters(Map parameters) { @@ -110,6 +112,10 @@ public boolean inferredReturnType() { return inferredReturnType; } + public String importStatements() { + return importStatements; + } + public Map parameters() { return parameters; } diff --git a/model-generator-commons/src/main/java/io/ballerina/modelgenerator/commons/FunctionDataBuilder.java b/model-generator-commons/src/main/java/io/ballerina/modelgenerator/commons/FunctionDataBuilder.java index e342daf6d..0c8ad6ef0 100644 --- a/model-generator-commons/src/main/java/io/ballerina/modelgenerator/commons/FunctionDataBuilder.java +++ b/model-generator-commons/src/main/java/io/ballerina/modelgenerator/commons/FunctionDataBuilder.java @@ -254,7 +254,7 @@ public FunctionData build() { String clientName = getFunctionName(); FunctionData functionData = new FunctionData(0, clientName, getDescription(classSymbol), getTypeSignature(clientName), moduleInfo.packageName(), moduleInfo.org(), - moduleInfo.version(), "", functionKind, false, false); + moduleInfo.version(), "", functionKind, false, false, null); functionData.setParameters(Map.of()); return functionData; } @@ -308,7 +308,7 @@ public FunctionData build() { FunctionData functionData = new FunctionData(0, getFunctionName(), description, returnData.returnType(), moduleInfo.packageName(), moduleInfo.org(), moduleInfo.version(), resourcePath, functionKind, - returnData.returnError(), paramForTypeInfer != null); + returnData.returnError(), paramForTypeInfer != null, returnData.importStatements()); Types types = semanticModel.types(); TypeBuilder builder = semanticModel.types().builder(); @@ -327,7 +327,8 @@ public FunctionData build() { private ReturnData getReturnData(FunctionSymbol symbol) { FunctionTypeSymbol functionTypeSymbol = symbol.typeDescriptor(); - String returnType = functionTypeSymbol.returnTypeDescriptor() + Optional returnTypeSymbol = functionTypeSymbol.returnTypeDescriptor(); + String returnType = returnTypeSymbol .map(typeSymbol -> { if (functionKind == FunctionData.Kind.CONNECTOR) { return CommonUtils.getClassType(moduleInfo.packageName(), @@ -344,22 +345,24 @@ private ReturnData getReturnData(FunctionSymbol symbol) { .filter(paramSym -> paramSym.paramKind() == ParameterKind.DEFAULTABLE) .forEach(paramSymbol -> paramNameList.add(paramSymbol.getName().orElse("")))); - Map returnTypeMap = - allMembers(functionTypeSymbol.returnTypeDescriptor().orElse(null)); + Map returnTypeMap = allMembers(returnTypeSymbol.orElse(null)); for (String paramName : paramNameList) { if (returnTypeMap.containsKey(paramName)) { - returnType = "json"; - String defaultValue = - DefaultValueGeneratorUtil.getDefaultValueForType(returnTypeMap.get(paramName)); - paramForTypeInfer = new ParamForTypeInfer(paramName, defaultValue, returnType); + TypeSymbol typeDescriptor = returnTypeMap.get(paramName); + String defaultValue = DefaultValueGeneratorUtil.getDefaultValueForType(typeDescriptor); + paramForTypeInfer = new ParamForTypeInfer(paramName, defaultValue, + CommonUtils.getTypeSignature(semanticModel, CommonUtils.getRawType(typeDescriptor), true)); break; } } } - boolean returnError = functionTypeSymbol.returnTypeDescriptor() + String importStatements = returnTypeSymbol.flatMap( + typeSymbol -> CommonUtils.getImportStatements(returnTypeSymbol.get(), moduleInfo)).orElse(null); + + boolean returnError = returnTypeSymbol .map(returnTypeDesc -> CommonUtils.subTypeOf(returnTypeDesc, errorTypeSymbol)).orElse(false); - return new ReturnData(returnType, paramForTypeInfer, returnError); + return new ReturnData(returnType, paramForTypeInfer, returnError, importStatements); } private void setParentSymbol() { @@ -453,7 +456,8 @@ public List buildChildNodes() { methodResourcePath, methodKind, returnData.returnError(), - returnData.paramForTypeInfer() != null); + returnData.paramForTypeInfer() != null, + returnData.importStatements()); functionDataList.add(functionData); } return functionDataList; @@ -696,16 +700,26 @@ private static Map allMembers(TypeSymbol typeSymbol) { Map members = new HashMap<>(); if (typeSymbol == null) { return members; - } else if (typeSymbol.typeKind() == TypeDescKind.UNION) { - UnionTypeSymbol unionTypeSymbol = (UnionTypeSymbol) typeSymbol; - unionTypeSymbol.memberTypeDescriptors() - .forEach(memberType -> members.put(memberType.getName().orElse(""), memberType)); - } else if (typeSymbol.typeKind() == TypeDescKind.INTERSECTION) { - IntersectionTypeSymbol intersectionTypeSymbol = (IntersectionTypeSymbol) typeSymbol; - intersectionTypeSymbol.memberTypeDescriptors() - .forEach(memberType -> members.put(memberType.getName().orElse(""), memberType)); - } else { - members.put(typeSymbol.getName().orElse(""), typeSymbol); + } + + switch (typeSymbol.typeKind()) { + case UNION -> { + UnionTypeSymbol unionTypeSymbol = (UnionTypeSymbol) typeSymbol; + unionTypeSymbol.memberTypeDescriptors() + .forEach(memberType -> members.put(memberType.getName().orElse(""), memberType)); + } + case INTERSECTION -> { + IntersectionTypeSymbol intersectionTypeSymbol = (IntersectionTypeSymbol) typeSymbol; + intersectionTypeSymbol.memberTypeDescriptors() + .forEach(memberType -> members.put(memberType.getName().orElse(""), memberType)); + } + case STREAM -> { + StreamTypeSymbol streamTypeSymbol = (StreamTypeSymbol) typeSymbol; + members.put(streamTypeSymbol.typeParameter().getName().orElse(""), streamTypeSymbol.typeParameter()); + members.put(streamTypeSymbol.completionValueTypeParameter().getName().orElse(""), + streamTypeSymbol.completionValueTypeParameter()); + } + default -> members.put(typeSymbol.getName().orElse(""), typeSymbol); } return members; } @@ -795,6 +809,7 @@ private String getDescription(Documentable documentable) { private record ParamForTypeInfer(String paramName, String defaultValue, String type) { } - private record ReturnData(String returnType, ParamForTypeInfer paramForTypeInfer, boolean returnError) { + private record ReturnData(String returnType, ParamForTypeInfer paramForTypeInfer, boolean returnError, + String importStatements) { } } From 988c00250ccd3bbca168e0c290695a823bbc6598 Mon Sep 17 00:00:00 2001 From: Nipuna Fernando Date: Tue, 4 Mar 2025 21:36:13 +0530 Subject: [PATCH 04/24] Write source code for a call with an inferred type --- .../core/model/SourceBuilder.java | 70 +++++++++++++++++-- 1 file changed, 64 insertions(+), 6 deletions(-) diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/SourceBuilder.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/SourceBuilder.java index 97194bdca..8330c7755 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/SourceBuilder.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/SourceBuilder.java @@ -78,6 +78,48 @@ public SourceBuilder newVariable() { return newVariable(Property.TYPE_KEY); } + public SourceBuilder newVariableWithInferredType() { + Optional optionalType = flowNode.getProperty(Property.TYPE_KEY); + Optional variable = flowNode.getProperty(Property.VARIABLE_KEY); + + if (optionalType.isEmpty() || variable.isEmpty()) { + return this; + } + Property type = optionalType.get(); + + // TODO: There can be cases where the return type and the value type both come from imported modules. We have + // to optimize how we handle the return type, as the current implementation does not allow the user to + // assign the error to a variable and handle it. + // Add the import statements if exists in the return type + if (type.codedata() != null && type.codedata().importStatements() != null && + flowNode.getProperty(Property.CHECK_ERROR_KEY).map(property -> property.value().equals("false")) + .orElse(true)) { + // TODO: Improve this logic to process all the imports at once + for (String importStatement : type.codedata().importStatements().split(",")) { + String[] importParts = importStatement.split("/"); + acceptImport(importParts[0], importParts[1]); + } + } + + String typeName = type.value().toString(); + if (flowNode.codedata().inferredReturnType() != null) { + Optional inferredParam = flowNode.properties().values().stream() + .filter(property -> property.codedata() != null && property.codedata().kind() != null && + property.codedata().kind().equals(ParameterData.Kind.PARAM_FOR_TYPE_INFER.name())) + .findFirst(); + if (inferredParam.isPresent()) { + String returnType = flowNode.codedata().inferredReturnType(); + String inferredType = inferredParam.get().value().toString(); + String inferredTypeDef = inferredParam.get() + .metadata().label(); + typeName = returnType.replace(inferredTypeDef, inferredType); + } + } + + tokenBuilder.expressionWithType(typeName, variable.get()).keyword(SyntaxKind.EQUAL_TOKEN); + return this; + } + public SourceBuilder newVariable(String typeKey) { Optional type = flowNode.getProperty(typeKey); Optional variable = flowNode.getProperty(Property.VARIABLE_KEY); @@ -146,7 +188,18 @@ public SourceBuilder acceptImport(Path resolvedPath) { Codedata codedata = flowNode.codedata(); String org = codedata.org(); String module = codedata.module(); + return acceptImport(resolvedPath, org, module); + } + + public SourceBuilder acceptImport() { + return acceptImport(filePath); + } + + public SourceBuilder acceptImport(String org, String module) { + return acceptImport(filePath, org, module); + } + public SourceBuilder acceptImport(Path resolvedPath, String org, String module) { if (org == null || module == null || org.equals(CommonUtil.BALLERINA_ORG_NAME) && CommonUtil.PRE_DECLARED_LANG_LIBS.contains(module)) { return this; @@ -184,12 +237,12 @@ public SourceBuilder acceptImport(Path resolvedPath) { // Add the import statement if (!importExists) { String importSignature; - Boolean generated = codedata.isGenerated(); + Boolean generated = flowNode.codedata().isGenerated(); // TODO: Check this condition for other cases like persist module if (!currentModuleName.isEmpty() && generated != null && generated) { importSignature = currentModuleName + "." + module; } else { - importSignature = codedata.getImportSignature(); + importSignature = CommonUtils.getImportStatement(org, module, module); } tokenBuilder .keyword(SyntaxKind.IMPORT_KEYWORD) @@ -200,10 +253,6 @@ public SourceBuilder acceptImport(Path resolvedPath) { return this; } - public SourceBuilder acceptImport() { - return acceptImport(filePath); - } - public Optional getTypeDefinitionSymbol(String typeName) { try { workspaceManager.loadProject(filePath); @@ -318,6 +367,10 @@ public SourceBuilder functionParameters(FlowNode nodeTemplate, Set ignor String kind = prop.codedata().kind(); boolean optional = prop.optional(); + if (kind.equals(ParameterData.Kind.PARAM_FOR_TYPE_INFER.name())) { + continue; + } + if (firstParamAdded) { if ((kind.equals(ParameterData.Kind.REST_PARAMETER.name()))) { if (isPropValueEmpty(prop) || ((List) prop.value()).isEmpty()) { @@ -530,6 +583,11 @@ public TokenBuilder expressionWithType(Property type, Property variable) { return this; } + public TokenBuilder expressionWithType(String type, Property variable) { + sb.append(type).append(WHITE_SPACE).append(variable.toSourceCode()).append(WHITE_SPACE); + return this; + } + public TokenBuilder expressionWithType(Property property) { sb.append(property.valueType()).append(WHITE_SPACE).append(property.toSourceCode()); return this; From 7245dfd94492176856d9222710aad3671ba41ead Mon Sep 17 00:00:00 2001 From: Nipuna Fernando Date: Tue, 4 Mar 2025 22:14:13 +0530 Subject: [PATCH 05/24] Set the import statements in the codedata --- .../core/model/FormBuilder.java | 16 +++++++++--- .../core/model/node/CallBuilder.java | 10 +++---- .../core/model/node/NewConnectionBuilder.java | 2 +- .../model/node/ResourceActionCallBuilder.java | 3 +-- .../remote_action_call-mysql-query.json | 5 +++- .../commons/DatabaseManager.java | 26 ++++++++++++++----- 6 files changed, 41 insertions(+), 21 deletions(-) diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/FormBuilder.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/FormBuilder.java index 92b439356..94aa3da11 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/FormBuilder.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/FormBuilder.java @@ -122,7 +122,7 @@ public FormBuilder data(Node node, String label, String doc, String templateN if (node != null && !assignment) { propertyBuilder.codedata() - .lineRange(node.lineRange()); + .lineRange(node.lineRange()); } else { propertyBuilder.editable(); } @@ -172,16 +172,24 @@ public FormBuilder type(Node node, String label, boolean editable) { return type(typeName, label, editable, node == null ? null : node.lineRange()); } - public FormBuilder type(String typeName, boolean editable) { - return type(typeName, Property.TYPE_LABEL, editable, null); + public FormBuilder type(String typeName, boolean editable, String importStatements) { + return type(typeName, Property.TYPE_LABEL, editable, null, importStatements); } public FormBuilder type(String typeName, String label, boolean editable, LineRange lineRange) { + return type(typeName, label, editable, lineRange, null); + } + + public FormBuilder type(String typeName, String label, boolean editable, LineRange lineRange, + String importStatements) { propertyBuilder .metadata() .label(label) .description(Property.TYPE_DOC) .stepOut() + .codedata() + .importStatements(importStatements) + .stepOut() .placeholder("var") .value(typeName) .type(Property.ValueType.TYPE) @@ -713,7 +721,7 @@ public FormBuilder functionName(IdentifierToken identifierToken) { if (!functionName.equals(Constants.MAIN_FUNCTION_NAME)) { propertyBuilder.codedata() - .lineRange(identifierToken.lineRange()); + .lineRange(identifierToken.lineRange()); } addProperty(Property.FUNCTION_NAME_KEY); diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/CallBuilder.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/CallBuilder.java index 491bdd514..b738265be 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/CallBuilder.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/CallBuilder.java @@ -111,9 +111,7 @@ public void setConcreteTemplateData(TemplateContext context) { String returnTypeName = functionData.returnType(); if (CommonUtils.hasReturn(functionData.returnType())) { - properties() - .type(returnTypeName, functionData.inferredReturnType()) - .data(returnTypeName, context.getAllVisibleSymbolNames(), Property.VARIABLE_NAME); + setReturnTypeProperties(functionData, context, functionData.inferredReturnType(), Property.VARIABLE_NAME); } if (functionData.returnError()) { @@ -174,11 +172,11 @@ protected void setParameterProperties(FunctionData function) { } } - protected void setReturnTypeProperties(String returnTypeName, TemplateContext context, boolean editable, + protected void setReturnTypeProperties(FunctionData functionData, TemplateContext context, boolean editable, String label) { properties() - .type(returnTypeName, editable) - .data(returnTypeName, context.getAllVisibleSymbolNames(), label); + .type(functionData.returnType(), editable, functionData.importStatements()) + .data(functionData.returnType(), context.getAllVisibleSymbolNames(), label); } protected void setExpressionProperty(Codedata codedata) { diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/NewConnectionBuilder.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/NewConnectionBuilder.java index 5758a64fa..79fb55219 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/NewConnectionBuilder.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/NewConnectionBuilder.java @@ -129,7 +129,7 @@ public void setConcreteTemplateData(TemplateContext context) { setParameterProperties(functionData); if (CommonUtils.hasReturn(functionData.returnType())) { - setReturnTypeProperties(functionData.returnType(), context, false, CONNECTION_NAME_LABEL); + setReturnTypeProperties(functionData, context, false, CONNECTION_NAME_LABEL); } properties() diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/ResourceActionCallBuilder.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/ResourceActionCallBuilder.java index e54ac48f8..363cea4be 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/ResourceActionCallBuilder.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/ResourceActionCallBuilder.java @@ -92,8 +92,7 @@ public void setConcreteTemplateData(TemplateContext context) { String returnTypeName = functionData.returnType(); if (CommonUtils.hasReturn(returnTypeName)) { - setReturnTypeProperties(returnTypeName, context, functionData.inferredReturnType(), - Property.VARIABLE_NAME); + setReturnTypeProperties(functionData, context, functionData.inferredReturnType(), Property.VARIABLE_NAME); } if (functionData.returnError()) { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-query.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-query.json index 0ab15640f..4e686e114 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-query.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-query.json @@ -99,7 +99,10 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": { + "importStatements": "ballerina/sql" + } }, "variable": { "metadata": { diff --git a/model-generator-commons/src/main/java/io/ballerina/modelgenerator/commons/DatabaseManager.java b/model-generator-commons/src/main/java/io/ballerina/modelgenerator/commons/DatabaseManager.java index 9e001d9d5..a56f58ec0 100644 --- a/model-generator-commons/src/main/java/io/ballerina/modelgenerator/commons/DatabaseManager.java +++ b/model-generator-commons/src/main/java/io/ballerina/modelgenerator/commons/DatabaseManager.java @@ -92,6 +92,7 @@ public List getAllFunctions(FunctionData.Kind kind, Map getAllFunctions(FunctionData.Kind kind, Map getFunctionsByOrg(String orgName, FunctionData.Kind fu "f.kind, " + "f.return_error, " + "f.inferred_return_type, " + + "f.import_statements, " + "f.resource_path, " + "p.name AS package_name, " + "p.org, " + @@ -165,7 +168,8 @@ public List getFunctionsByOrg(String orgName, FunctionData.Kind fu rs.getString("resource_path"), FunctionData.Kind.valueOf(rs.getString("kind")), rs.getBoolean("return_error"), - rs.getBoolean("inferred_return_type")); + rs.getBoolean("inferred_return_type"), + rs.getString("import_statements")); functionDataList.add(functionData); } return functionDataList; @@ -185,6 +189,7 @@ public List searchFunctions(Map queryMap, Function "f.kind, " + "f.return_error, " + "f.inferred_return_type, " + + "f.import_statements, " + "p.name AS package_name, " + "p.org, " + "p.version " + @@ -220,7 +225,8 @@ public List searchFunctions(Map queryMap, Function rs.getString("resource_path"), FunctionData.Kind.valueOf(rs.getString("kind")), rs.getBoolean("return_error"), - rs.getBoolean("inferred_return_type")); + rs.getBoolean("inferred_return_type"), + rs.getString("import_statements")); functionDataList.add(functionData); } return functionDataList; @@ -241,6 +247,7 @@ public Optional getFunction(String org, String module, String symb sql.append("f.kind, "); sql.append("f.return_error, "); sql.append("f.inferred_return_type, "); + sql.append("f.import_statements, "); sql.append("p.name AS package_name, "); sql.append("p.org, "); sql.append("p.version "); @@ -276,7 +283,8 @@ public Optional getFunction(String org, String module, String symb rs.getString("resource_path"), FunctionData.Kind.valueOf(rs.getString("kind")), rs.getBoolean("return_error"), - rs.getBoolean("inferred_return_type"))); + rs.getBoolean("inferred_return_type"), + rs.getString("import_statements"))); } return Optional.empty(); } catch (SQLException e) { @@ -318,7 +326,8 @@ public Optional getFunction(int functionId) { rs.getString("resource_path"), FunctionData.Kind.valueOf(rs.getString("kind")), rs.getBoolean("return_error"), - rs.getBoolean("inferred_return_type"))); + rs.getBoolean("inferred_return_type"), + rs.getString("import_statements"))); } return Optional.empty(); } catch (SQLException e) { @@ -500,7 +509,8 @@ public List getConnectorActions(int connectorId) { rs.getString("resource_path"), FunctionData.Kind.valueOf(rs.getString("kind")), rs.getBoolean("return_error"), - rs.getBoolean("inferred_return_type")); + rs.getBoolean("inferred_return_type"), + rs.getString("import_statements")); functionDataList.add(functionData); } return functionDataList; @@ -525,6 +535,7 @@ public List searchFunctionsInPackages(List packageNames, M sql.append("f.kind, "); sql.append("f.return_error, "); sql.append("f.inferred_return_type, "); + sql.append("f.import_statements, "); sql.append("p.name AS package_name, "); sql.append("p.org, "); sql.append("p.version "); @@ -583,7 +594,8 @@ public List searchFunctionsInPackages(List packageNames, M rs.getString("resource_path"), FunctionData.Kind.valueOf(rs.getString("kind")), rs.getBoolean("return_error"), - rs.getBoolean("inferred_return_type")); + rs.getBoolean("inferred_return_type"), + rs.getString("import_statements")); functionDataList.add(functionData); } return functionDataList; From 6d9b066049f2190fec99b0d7d8f27fd9cd1b044d Mon Sep 17 00:00:00 2001 From: Nipuna Fernando Date: Tue, 4 Mar 2025 22:46:21 +0530 Subject: [PATCH 06/24] Add test cases for mysql query --- .../core/model/SourceBuilder.java | 40 +- .../model/node/RemoteActionCallBuilder.java | 2 +- .../config/remote_action_call-mysql1.json | 577 ++++++++++++++++++ .../diagram_generator/source/mysql.bal | 14 + .../remote_action_call-mysql-query.json | 161 +++++ .../remote_action_call-mysql-query1.json | 157 +++++ .../remote_action_call-mysql-query2.json | 157 +++++ 7 files changed, 1092 insertions(+), 16 deletions(-) create mode 100644 flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql1.json create mode 100644 flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/source/mysql.bal create mode 100644 flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/to_source/config/remote_action_call-mysql-query.json create mode 100644 flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/to_source/config/remote_action_call-mysql-query1.json create mode 100644 flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/to_source/config/remote_action_call-mysql-query2.json diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/SourceBuilder.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/SourceBuilder.java index 8330c7755..637152abd 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/SourceBuilder.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/SourceBuilder.java @@ -85,22 +85,8 @@ public SourceBuilder newVariableWithInferredType() { if (optionalType.isEmpty() || variable.isEmpty()) { return this; } - Property type = optionalType.get(); - - // TODO: There can be cases where the return type and the value type both come from imported modules. We have - // to optimize how we handle the return type, as the current implementation does not allow the user to - // assign the error to a variable and handle it. - // Add the import statements if exists in the return type - if (type.codedata() != null && type.codedata().importStatements() != null && - flowNode.getProperty(Property.CHECK_ERROR_KEY).map(property -> property.value().equals("false")) - .orElse(true)) { - // TODO: Improve this logic to process all the imports at once - for (String importStatement : type.codedata().importStatements().split(",")) { - String[] importParts = importStatement.split("/"); - acceptImport(importParts[0], importParts[1]); - } - } + Property type = optionalType.get(); String typeName = type.value().toString(); if (flowNode.codedata().inferredReturnType() != null) { Optional inferredParam = flowNode.properties().values().stream() @@ -191,6 +177,30 @@ public SourceBuilder acceptImport(Path resolvedPath) { return acceptImport(resolvedPath, org, module); } + public SourceBuilder acceptImportWithVariableType() { + Optional optionalType = flowNode.getProperty(Property.TYPE_KEY); + if (optionalType.isPresent()) { + Property type = optionalType.get(); + + // TODO: There can be cases where the return type and the value type both come from imported modules. We + // have + // to optimize how we handle the return type, as the current implementation does not allow the user to + // assign the error to a variable and handle it. + // Add the import statements if exists in the return type + if (type.codedata() != null && type.codedata().importStatements() != null && + flowNode.getProperty(Property.CHECK_ERROR_KEY).map(property -> property.value().equals("false")) + .orElse(true)) { + // TODO: Improve this logic to process all the imports at once + for (String importStatement : type.codedata().importStatements().split(",")) { + String[] importParts = importStatement.split("/"); + acceptImport(importParts[0], importParts[1]); + } + } + } + acceptImport(); + return this; + } + public SourceBuilder acceptImport() { return acceptImport(filePath); } diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/RemoteActionCallBuilder.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/RemoteActionCallBuilder.java index c6d2215c0..89eceb8bd 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/RemoteActionCallBuilder.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/RemoteActionCallBuilder.java @@ -65,7 +65,7 @@ public Map> toSource(SourceBuilder sourceBuilder) { Set.of(Property.CONNECTION_KEY, Property.VARIABLE_KEY, Property.TYPE_KEY, Property.CHECK_ERROR_KEY)) .textEdit(false) - .acceptImport() + .acceptImportWithVariableType() .build(); } diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql1.json new file mode 100644 index 000000000..7d4b47460 --- /dev/null +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql1.json @@ -0,0 +1,577 @@ +{ + "start": { + "line": 10, + "offset": 0 + }, + "end": { + "line": 13, + "offset": 1 + }, + "source": "mysql.bal", + "description": "Tests a simple diagram flow", + "diagram": { + "fileName": "mysql.bal", + "nodes": [ + { + "id": "42936", + "metadata": { + "label": "Start" + }, + "codedata": { + "node": "EVENT_START", + "lineRange": { + "fileName": "mysql.bal", + "startLine": { + "line": 10, + "offset": 38 + }, + "endLine": { + "line": 13, + "offset": 1 + } + }, + "sourceCode": "public function main() returns error? {\n stream res1 = mysqlClient->query(``);\n stream res2 = mysqlClient->query(``);\n}" + }, + "returning": false, + "flags": 0 + }, + { + "id": "42838", + "metadata": { + "label": "query", + "description": "Executes the query, which may return multiple results.\nWhen processing the stream, make sure to consume all fetched data or close the stream.\n", + "icon": "https://bcentral-packageicons.azureedge.net/images/ballerinax_mysql_1.14.0.png" + }, + "codedata": { + "node": "REMOTE_ACTION_CALL", + "org": "ballerinax", + "module": "mysql", + "object": "Client", + "symbol": "query", + "version": "1.14.0", + "lineRange": { + "fileName": "mysql.bal", + "startLine": { + "line": 11, + "offset": 4 + }, + "endLine": { + "line": 11, + "offset": 58 + } + }, + "sourceCode": "stream res1 = mysqlClient->query(``);", + "inferredReturnType": "stream" + }, + "returning": false, + "properties": { + "connection": { + "metadata": { + "label": "Connection", + "description": "Connection to use" + }, + "valueType": "EXPRESSION", + "value": "mysqlClient", + "optional": false, + "editable": false, + "advanced": false + }, + "rowType": { + "metadata": { + "label": "rowType", + "description": "The `typedesc` of the record to which the result needs to be returned" + }, + "valueType": "TYPE", + "valueTypeConstraint": "record {|anydata...;|}", + "value": "Row", + "placeholder": "record {|anydata...;|}", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "rowType" + } + }, + "sqlQuery": { + "metadata": { + "label": "sqlQuery", + "description": "The SQL query such as `` `SELECT * from Album WHERE name=${albumName}` ``" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "sql:ParameterizedQuery", + "value": "``", + "placeholder": "object {}", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "REQUIRED", + "originalName": "sqlQuery", + "importStatements": "ballerina/sql" + }, + "typeMembers": [ + { + "type": "ParameterizedQuery", + "packageInfo": "ballerina:sql:1.14.0", + "kind": "OBJECT_TYPE", + "selected": true + } + ] + }, + "variable": { + "metadata": { + "label": "Variable Name", + "description": "Name of the variable" + }, + "valueType": "IDENTIFIER", + "value": "res1", + "optional": false, + "editable": false, + "advanced": false, + "codedata": { + "lineRange": { + "fileName": "mysql.bal", + "startLine": { + "line": 11, + "offset": 28 + }, + "endLine": { + "line": 11, + "offset": 32 + } + } + } + }, + "type": { + "metadata": { + "label": "Variable Type", + "description": "Type of the variable" + }, + "valueType": "TYPE", + "value": "stream", + "placeholder": "var", + "optional": false, + "editable": true, + "advanced": false + } + }, + "flags": 0 + }, + { + "id": "43857", + "metadata": { + "label": "query", + "description": "Executes the query, which may return multiple results.\nWhen processing the stream, make sure to consume all fetched data or close the stream.\n", + "icon": "https://bcentral-packageicons.azureedge.net/images/ballerinax_mysql_1.14.0.png" + }, + "codedata": { + "node": "REMOTE_ACTION_CALL", + "org": "ballerinax", + "module": "mysql", + "object": "Client", + "symbol": "query", + "version": "1.14.0", + "lineRange": { + "fileName": "mysql.bal", + "startLine": { + "line": 12, + "offset": 4 + }, + "endLine": { + "line": 12, + "offset": 85 + } + }, + "sourceCode": "stream res2 = mysqlClient->query(``);", + "inferredReturnType": "stream" + }, + "returning": false, + "properties": { + "connection": { + "metadata": { + "label": "Connection", + "description": "Connection to use" + }, + "valueType": "EXPRESSION", + "value": "mysqlClient", + "optional": false, + "editable": false, + "advanced": false + }, + "rowType": { + "metadata": { + "label": "rowType", + "description": "The `typedesc` of the record to which the result needs to be returned" + }, + "valueType": "TYPE", + "valueTypeConstraint": "record {|anydata...;|}", + "value": "record {|string id; int val;|}", + "placeholder": "record {|anydata...;|}", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "rowType" + } + }, + "sqlQuery": { + "metadata": { + "label": "sqlQuery", + "description": "The SQL query such as `` `SELECT * from Album WHERE name=${albumName}` ``" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "sql:ParameterizedQuery", + "value": "``", + "placeholder": "object {}", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "REQUIRED", + "originalName": "sqlQuery", + "importStatements": "ballerina/sql" + }, + "typeMembers": [ + { + "type": "ParameterizedQuery", + "packageInfo": "ballerina:sql:1.14.0", + "kind": "OBJECT_TYPE", + "selected": true + } + ] + }, + "variable": { + "metadata": { + "label": "Variable Name", + "description": "Name of the variable" + }, + "valueType": "IDENTIFIER", + "value": "res2", + "optional": false, + "editable": false, + "advanced": false, + "codedata": { + "lineRange": { + "fileName": "mysql.bal", + "startLine": { + "line": 12, + "offset": 55 + }, + "endLine": { + "line": 12, + "offset": 59 + } + } + } + }, + "type": { + "metadata": { + "label": "Variable Type", + "description": "Type of the variable" + }, + "valueType": "TYPE", + "value": "stream", + "placeholder": "var", + "optional": false, + "editable": true, + "advanced": false + } + }, + "flags": 0 + } + ], + "connections": [ + { + "id": "34766", + "metadata": { + "label": "New Connection", + "description": "Represents a MySQL database client.", + "icon": "https://bcentral-packageicons.azureedge.net/images/ballerinax_mysql_1.14.0.png" + }, + "codedata": { + "node": "NEW_CONNECTION", + "org": "ballerinax", + "module": "mysql", + "object": "Client", + "symbol": "init", + "lineRange": { + "fileName": "mysql.bal", + "startLine": { + "line": 3, + "offset": 0 + }, + "endLine": { + "line": 3, + "offset": 46 + } + }, + "sourceCode": "final mysql:Client mysqlClient = check new ();", + "id": 0 + }, + "returning": false, + "properties": { + "host": { + "metadata": { + "label": "host", + "description": "Hostname of the MySQL server" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "string", + "placeholder": "\"\"", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "DEFAULTABLE", + "originalName": "host" + }, + "typeMembers": [ + { + "type": "string", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false + } + ] + }, + "user": { + "metadata": { + "label": "user", + "description": "If the MySQL server is secured, the username" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "string|()", + "placeholder": "()", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "DEFAULTABLE", + "originalName": "user" + }, + "typeMembers": [ + { + "type": "string", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false + } + ] + }, + "password": { + "metadata": { + "label": "password", + "description": "The password of the MySQL server for the provided username" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "string|()", + "placeholder": "()", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "DEFAULTABLE", + "originalName": "password" + }, + "typeMembers": [ + { + "type": "string", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false + } + ] + }, + "database": { + "metadata": { + "label": "database", + "description": "The name of the database" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "string|()", + "placeholder": "()", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "DEFAULTABLE", + "originalName": "database" + }, + "typeMembers": [ + { + "type": "string", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false + } + ] + }, + "port": { + "metadata": { + "label": "port", + "description": "Port number of the MySQL server" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "int", + "placeholder": "0", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "DEFAULTABLE", + "originalName": "port" + }, + "typeMembers": [ + { + "type": "int", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false + } + ] + }, + "options": { + "metadata": { + "label": "options", + "description": "MySQL database options" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "mysql:Options|()", + "placeholder": "()", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "DEFAULTABLE", + "originalName": "options" + }, + "typeMembers": [ + { + "type": "Options", + "packageInfo": "ballerinax:mysql:1.14.0", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false + } + ] + }, + "connectionPool": { + "metadata": { + "label": "connectionPool", + "description": "The `sql:ConnectionPool` to be used for the connection. If there is no\n`connectionPool` provided, the global connection pool (shared by all clients) will be used" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "sql:ConnectionPool|()", + "placeholder": "()", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "DEFAULTABLE", + "originalName": "connectionPool", + "importStatements": "ballerina/sql" + }, + "typeMembers": [ + { + "type": "ConnectionPool", + "packageInfo": "ballerina:sql:1.15.0", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false + } + ] + }, + "checkError": { + "metadata": { + "label": "Check Error", + "description": "Terminate on error" + }, + "valueType": "FLAG", + "value": true, + "optional": false, + "editable": false, + "advanced": true + }, + "scope": { + "metadata": { + "label": "Connection Scope", + "description": "Scope of the connection, Global or Local" + }, + "valueType": "ENUM", + "value": "Global", + "optional": false, + "editable": true, + "advanced": true + }, + "variable": { + "metadata": { + "label": "Connection Name", + "description": "Name of the variable" + }, + "valueType": "IDENTIFIER", + "value": "mysqlClient", + "optional": false, + "editable": false, + "advanced": false, + "codedata": { + "lineRange": { + "fileName": "mysql.bal", + "startLine": { + "line": 3, + "offset": 19 + }, + "endLine": { + "line": 3, + "offset": 30 + } + } + } + }, + "type": { + "metadata": { + "label": "Connection Type", + "description": "Type of the variable" + }, + "valueType": "TYPE", + "value": "mysql:Client", + "placeholder": "var", + "optional": false, + "editable": false, + "advanced": false + } + }, + "flags": 1 + } + ] + } +} diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/source/mysql.bal b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/source/mysql.bal new file mode 100644 index 000000000..a76049d24 --- /dev/null +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/source/mysql.bal @@ -0,0 +1,14 @@ +import ballerina/sql; +import ballerinax/mysql; + +final mysql:Client mysqlClient = check new (); + +type Row record {| + string id; + int value; +|}; + +public function main() returns error? { + stream res1 = mysqlClient->query(``); + stream res2 = mysqlClient->query(``); +} diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/to_source/config/remote_action_call-mysql-query.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/to_source/config/remote_action_call-mysql-query.json new file mode 100644 index 000000000..e9e5872e3 --- /dev/null +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/to_source/config/remote_action_call-mysql-query.json @@ -0,0 +1,161 @@ +{ + "source": "empty.bal", + "description": "Sample diagram node", + "diagram": { + "id": "31", + "metadata": { + "label": "query", + "description": "Executes the query, which may return multiple results.\nWhen processing the stream, make sure to consume all fetched data or close the stream.\n", + "icon": "https://bcentral-packageicons.azureedge.net/images/ballerinax_mysql_1.13.1.png" + }, + "codedata": { + "node": "REMOTE_ACTION_CALL", + "org": "ballerinax", + "module": "mysql", + "object": "Client", + "symbol": "query", + "version": "1.14.0", + "id": 2, + "inferredReturnType": "stream", + "lineRange": { + "fileName": "test.bal", + "startLine": { + "line": 0, + "offset": 0 + }, + "endLine": { + "line": 0, + "offset": 0 + } + } + }, + "returning": false, + "properties": { + "connection": { + "metadata": { + "label": "Connection", + "description": "Connection to use" + }, + "valueType": "IDENTIFIER", + "valueTypeConstraint": "mysql:Client", + "value": "mysqlClient", + "optional": false, + "editable": false, + "advanced": false + }, + "sqlQuery": { + "metadata": { + "label": "sqlQuery", + "description": "The SQL query such as `` `SELECT * from Album WHERE name=${albumName}` ``" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "sql:ParameterizedQuery", + "placeholder": "``", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "REQUIRED", + "originalName": "sqlQuery", + "importStatements": "ballerina/sql" + }, + "typeMembers": [ + { + "type": "ParameterizedQuery", + "packageInfo": "ballerina:sql:1.14.0", + "kind": "OBJECT_TYPE", + "selected": false + } + ] + }, + "rowType": { + "metadata": { + "label": "rowType", + "description": "The `typedesc` of the record to which the result needs to be returned" + }, + "value": "Row", + "valueType": "TYPE", + "valueTypeConstraint": "record {|anydata...;|}", + "placeholder": "record {|anydata...;|}", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "rowType" + }, + "typeMembers": [] + }, + "type": { + "metadata": { + "label": "Variable Type", + "description": "Type of the variable" + }, + "valueType": "TYPE", + "value": "stream", + "placeholder": "var", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "importStatements": "ballerina/sql" + } + }, + "variable": { + "metadata": { + "label": "Variable Name", + "description": "Name of the variable" + }, + "valueType": "IDENTIFIER", + "value": "streamRowtypeSqlError", + "optional": false, + "editable": true, + "advanced": false + } + }, + "flags": 0 + }, + "output": { + "empty.bal": [ + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "newText": "import ballerinax/mysql;" + }, + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "newText": "import ballerina/sql;" + }, + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "newText": "stream streamRowtypeSqlError = mysqlClient->query(``);" + } + ] + } +} diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/to_source/config/remote_action_call-mysql-query1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/to_source/config/remote_action_call-mysql-query1.json new file mode 100644 index 000000000..397f70330 --- /dev/null +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/to_source/config/remote_action_call-mysql-query1.json @@ -0,0 +1,157 @@ +{ + "source": "empty.bal", + "description": "Sample diagram node", + "diagram": { + "id": "42838", + "metadata": { + "label": "query", + "description": "Executes the query, which may return multiple results.\nWhen processing the stream, make sure to consume all fetched data or close the stream.\n", + "icon": "https://bcentral-packageicons.azureedge.net/images/ballerinax_mysql_1.14.0.png" + }, + "codedata": { + "node": "REMOTE_ACTION_CALL", + "org": "ballerinax", + "module": "mysql", + "object": "Client", + "symbol": "query", + "version": "1.14.0", + "lineRange": { + "fileName": "mysql.bal", + "startLine": { + "line": 11, + "offset": 4 + }, + "endLine": { + "line": 11, + "offset": 58 + } + }, + "sourceCode": "stream res1 = mysqlClient->query(``);", + "inferredReturnType": "stream" + }, + "returning": false, + "properties": { + "connection": { + "metadata": { + "label": "Connection", + "description": "Connection to use" + }, + "valueType": "EXPRESSION", + "value": "mysqlClient", + "optional": false, + "editable": false, + "advanced": false + }, + "rowType": { + "metadata": { + "label": "rowType", + "description": "The `typedesc` of the record to which the result needs to be returned" + }, + "valueType": "TYPE", + "valueTypeConstraint": "record {|anydata...;|}", + "value": "record{|string name;|}", + "placeholder": "record {|anydata...;|}", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "rowType" + } + }, + "sqlQuery": { + "metadata": { + "label": "sqlQuery", + "description": "The SQL query such as `` `SELECT * from Album WHERE name=${albumName}` ``" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "sql:ParameterizedQuery", + "value": "``", + "placeholder": "object {}", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "REQUIRED", + "originalName": "sqlQuery", + "importStatements": "ballerina/sql" + }, + "typeMembers": [ + { + "type": "ParameterizedQuery", + "packageInfo": "ballerina:sql:1.14.0", + "kind": "OBJECT_TYPE", + "selected": true + } + ] + }, + "variable": { + "metadata": { + "label": "Variable Name", + "description": "Name of the variable" + }, + "valueType": "IDENTIFIER", + "value": "res1", + "optional": false, + "editable": false, + "advanced": false, + "codedata": { + "lineRange": { + "fileName": "mysql.bal", + "startLine": { + "line": 11, + "offset": 28 + }, + "endLine": { + "line": 11, + "offset": 32 + } + } + } + }, + "type": { + "metadata": { + "label": "Variable Type", + "description": "Type of the variable" + }, + "valueType": "TYPE", + "value": "stream", + "placeholder": "var", + "optional": false, + "editable": true, + "advanced": false + } + }, + "flags": 0 + }, + "output": { + "empty.bal": [ + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "newText": "import ballerinax/mysql;" + }, + { + "range": { + "start": { + "line": 11, + "character": 4 + }, + "end": { + "line": 11, + "character": 58 + } + }, + "newText": "stream res1 = mysqlClient->query(``);" + } + ] + } +} diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/to_source/config/remote_action_call-mysql-query2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/to_source/config/remote_action_call-mysql-query2.json new file mode 100644 index 000000000..79fe04db7 --- /dev/null +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/to_source/config/remote_action_call-mysql-query2.json @@ -0,0 +1,157 @@ +{ + "source": "empty.bal", + "description": "Sample diagram node", + "diagram": { + "id": "43857", + "metadata": { + "label": "query", + "description": "Executes the query, which may return multiple results.\nWhen processing the stream, make sure to consume all fetched data or close the stream.\n", + "icon": "https://bcentral-packageicons.azureedge.net/images/ballerinax_mysql_1.14.0.png" + }, + "codedata": { + "node": "REMOTE_ACTION_CALL", + "org": "ballerinax", + "module": "mysql", + "object": "Client", + "symbol": "query", + "version": "1.14.0", + "lineRange": { + "fileName": "mysql.bal", + "startLine": { + "line": 12, + "offset": 4 + }, + "endLine": { + "line": 12, + "offset": 85 + } + }, + "sourceCode": "stream res2 = mysqlClient->query(``);", + "inferredReturnType": "stream" + }, + "returning": false, + "properties": { + "connection": { + "metadata": { + "label": "Connection", + "description": "Connection to use" + }, + "valueType": "EXPRESSION", + "value": "mysqlClient", + "optional": false, + "editable": false, + "advanced": false + }, + "rowType": { + "metadata": { + "label": "rowType", + "description": "The `typedesc` of the record to which the result needs to be returned" + }, + "valueType": "TYPE", + "valueTypeConstraint": "record {|anydata...;|}", + "value": "Row", + "placeholder": "record {|anydata...;|}", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "rowType" + } + }, + "sqlQuery": { + "metadata": { + "label": "sqlQuery", + "description": "The SQL query such as `` `SELECT * from Album WHERE name=${albumName}` ``" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "sql:ParameterizedQuery", + "value": "``", + "placeholder": "object {}", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "REQUIRED", + "originalName": "sqlQuery", + "importStatements": "ballerina/sql" + }, + "typeMembers": [ + { + "type": "ParameterizedQuery", + "packageInfo": "ballerina:sql:1.14.0", + "kind": "OBJECT_TYPE", + "selected": true + } + ] + }, + "variable": { + "metadata": { + "label": "Variable Name", + "description": "Name of the variable" + }, + "valueType": "IDENTIFIER", + "value": "res2", + "optional": false, + "editable": false, + "advanced": false, + "codedata": { + "lineRange": { + "fileName": "mysql.bal", + "startLine": { + "line": 12, + "offset": 55 + }, + "endLine": { + "line": 12, + "offset": 59 + } + } + } + }, + "type": { + "metadata": { + "label": "Variable Type", + "description": "Type of the variable" + }, + "valueType": "TYPE", + "value": "stream", + "placeholder": "var", + "optional": false, + "editable": true, + "advanced": false + } + }, + "flags": 0 + }, + "output": { + "empty.bal": [ + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "newText": "import ballerinax/mysql;" + }, + { + "range": { + "start": { + "line": 12, + "character": 4 + }, + "end": { + "line": 12, + "character": 85 + } + }, + "newText": "stream res2 = mysqlClient->query(``);" + } + ] + } +} From f147f771daf5f9c730b850795523ecd9760efed8 Mon Sep 17 00:00:00 2001 From: Nipuna Fernando Date: Tue, 4 Mar 2025 22:54:47 +0530 Subject: [PATCH 07/24] Add static rule to update parameterized query --- .../main/java/io/ballerina/indexgenerator/DatabaseManager.java | 2 +- .../main/java/io/ballerina/indexgenerator/IndexGenerator.java | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/flow-model-generator/modules/flow-model-index-generator/src/main/java/io/ballerina/indexgenerator/DatabaseManager.java b/flow-model-generator/modules/flow-model-index-generator/src/main/java/io/ballerina/indexgenerator/DatabaseManager.java index dce9d50e7..d52058974 100644 --- a/flow-model-generator/modules/flow-model-index-generator/src/main/java/io/ballerina/indexgenerator/DatabaseManager.java +++ b/flow-model-generator/modules/flow-model-index-generator/src/main/java/io/ballerina/indexgenerator/DatabaseManager.java @@ -77,7 +77,7 @@ public static void createDatabase() { } } - private static void executeQuery(String sql) { + public static void executeQuery(String sql) { try (Connection conn = DriverManager.getConnection(dbPath); Statement stmt = conn.createStatement()) { // Use Statement instead stmt.executeUpdate(sql); diff --git a/flow-model-generator/modules/flow-model-index-generator/src/main/java/io/ballerina/indexgenerator/IndexGenerator.java b/flow-model-generator/modules/flow-model-index-generator/src/main/java/io/ballerina/indexgenerator/IndexGenerator.java index f87f084cb..1f8d6b5ac 100644 --- a/flow-model-generator/modules/flow-model-index-generator/src/main/java/io/ballerina/indexgenerator/IndexGenerator.java +++ b/flow-model-generator/modules/flow-model-index-generator/src/main/java/io/ballerina/indexgenerator/IndexGenerator.java @@ -115,6 +115,9 @@ public static void main(String[] args) { } catch (IOException e) { LOGGER.severe("Error reading packages JSON file: " + e.getMessage()); } + + // TODO: Remove this once thw raw parameter property type is introduced + DatabaseManager.executeQuery("UPDATE Parameter SET default_value = '``' WHERE type = 'sql:ParameterizedQuery'"); } private static void resolvePackage(BuildProject buildProject, String org, From 922226f1e1d8deef6aa34912d8792b40c9761015 Mon Sep 17 00:00:00 2001 From: Nipuna Fernando Date: Tue, 4 Mar 2025 23:06:32 +0530 Subject: [PATCH 08/24] Make the type readonly --- .../flowmodelgenerator/core/CodeAnalyzer.java | 9 +++++++++ .../config/remote_action_call-mysql1.json | 17 ++++++++++------- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/CodeAnalyzer.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/CodeAnalyzer.java index 4d22304c5..a166021d9 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/CodeAnalyzer.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/CodeAnalyzer.java @@ -114,10 +114,14 @@ import io.ballerina.flowmodelgenerator.core.model.node.BinaryBuilder; import io.ballerina.flowmodelgenerator.core.model.node.DataMapperBuilder; import io.ballerina.flowmodelgenerator.core.model.node.FailBuilder; +import io.ballerina.flowmodelgenerator.core.model.node.FunctionCall; import io.ballerina.flowmodelgenerator.core.model.node.IfBuilder; import io.ballerina.flowmodelgenerator.core.model.node.JsonPayloadBuilder; +import io.ballerina.flowmodelgenerator.core.model.node.MethodCall; import io.ballerina.flowmodelgenerator.core.model.node.NewConnectionBuilder; import io.ballerina.flowmodelgenerator.core.model.node.PanicBuilder; +import io.ballerina.flowmodelgenerator.core.model.node.RemoteActionCallBuilder; +import io.ballerina.flowmodelgenerator.core.model.node.ResourceActionCallBuilder; import io.ballerina.flowmodelgenerator.core.model.node.ReturnBuilder; import io.ballerina.flowmodelgenerator.core.model.node.RollbackBuilder; import io.ballerina.flowmodelgenerator.core.model.node.StartBuilder; @@ -1064,6 +1068,11 @@ private void handleVariableNode(NonTerminalNode variableDeclarationNode) { nodeBuilder.properties() .dataVariable(this.typedBindingPatternNode, NewConnectionBuilder.CONNECTION_NAME_LABEL, NewConnectionBuilder.CONNECTION_TYPE_LABEL, false, new HashSet<>()); + } else if (nodeBuilder instanceof RemoteActionCallBuilder || nodeBuilder instanceof ResourceActionCallBuilder || + nodeBuilder instanceof FunctionCall || nodeBuilder instanceof MethodCall) { + nodeBuilder.properties() + .dataVariable(this.typedBindingPatternNode, Property.VARIABLE_NAME, Property.TYPE_LABEL, false, + new HashSet<>()); } else { nodeBuilder.properties().dataVariable(this.typedBindingPatternNode, implicit, new HashSet<>()); } diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql1.json index 7d4b47460..f7012e4d1 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql1.json @@ -101,7 +101,7 @@ "valueType": "EXPRESSION", "valueTypeConstraint": "sql:ParameterizedQuery", "value": "``", - "placeholder": "object {}", + "placeholder": "``", "optional": false, "editable": true, "advanced": false, @@ -152,8 +152,9 @@ "value": "stream", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -224,7 +225,7 @@ "valueType": "EXPRESSION", "valueTypeConstraint": "sql:ParameterizedQuery", "value": "``", - "placeholder": "object {}", + "placeholder": "``", "optional": false, "editable": true, "advanced": false, @@ -275,8 +276,9 @@ "value": "stream", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -567,7 +569,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 From 2c29fbda0f71d5c6142b38dafc9f45cbee6b58ea Mon Sep 17 00:00:00 2001 From: Nipuna Fernando Date: Tue, 4 Mar 2025 23:06:53 +0530 Subject: [PATCH 09/24] Update the index --- .../src/main/resources/central-index.sqlite | Bin 9269248 -> 9269248 bytes .../src/main/resources/packages.json | 76 ------------------ 2 files changed, 76 deletions(-) diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/main/resources/central-index.sqlite b/flow-model-generator/modules/flow-model-generator-ls-extension/src/main/resources/central-index.sqlite index b6110cd7cba08003234ba400770141bc94a3501c..4047e6dc4ae57af009bbccaad464d9799e817621 100644 GIT binary patch delta 512262 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
RgG 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

nq$2ZY=a*n17M1g84oRMn!uC*YW-L`0? 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

}~B}?~87fKF^mx&IE(g2oV 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≺N@|j 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 delta 691581 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

    fE!ZdHfP2j!9jjZ7+qp69kcv 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

    S70gm2$n!EpEyNOJ$n`K7E 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 V7FWLf;*3<_C Date: Tue, 4 Mar 2025 23:11:48 +0530 Subject: [PATCH 10/24] Update the node template test cases --- .../core/model/node/CallBuilder.java | 2 +- .../node_template/config/foreach.json | 3 +- .../config/function_call-io-println.json | 2 +- .../config/function_call-json-toJson.json | 5 +-- .../config/function_call-log-printInfo.json | 2 +- .../function_call-time-utcFromCivil.json | 5 +-- .../config/function_call-user.json | 3 +- .../config/method_call_redis_close.json | 2 +- .../config/method_call_user.json | 3 +- .../config/new_connection-azure_cosmosdb.json | 3 +- .../config/new_connection-covid.json | 5 +-- .../new_connection-docusign.dsadmin.json | 5 +-- .../config/new_connection-grpc.json | 3 +- .../config/new_connection-http.json | 5 +-- .../config/new_connection-redis.json | 5 +-- .../config/new_connection-snowflake.json | 7 +++-- ...on_call-azure_cosmosdb-createDocument.json | 3 +- ..._action_call-covid-getStatusByCountry.json | 5 +-- .../config/remote_action_call-http-get.json | 27 +++++++++++++--- .../config/remote_action_call-http-post.json | 27 +++++++++++++--- .../remote_action_call-mysql-query.json | 4 +-- .../config/remote_action_call-redis-get.json | 5 +-- .../config/remote_action_call-redis-set.json | 5 +-- .../remote_action_call-snowflake-query.json | 31 +++++++++---------- ...urce_action_call-docusign.dsadmin-get.json | 5 +-- .../config/resource_action_call-github.json | 7 +++-- .../config/resource_action_call-http-get.json | 26 +++++++++++++--- .../resources/node_template/config/start.json | 3 +- .../node_template/config/variable.json | 3 +- .../resources/node_template/config/wait.json | 3 +- 30 files changed, 145 insertions(+), 69 deletions(-) diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/CallBuilder.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/CallBuilder.java index b738265be..1c57c12c1 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/CallBuilder.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/CallBuilder.java @@ -92,7 +92,7 @@ public void setConcreteTemplateData(TemplateContext context) { .object(codedata.object()) .version(codedata.version()) .symbol(codedata.symbol()) - .inferredReturnType(functionData.returnType()); + .inferredReturnType(functionData.inferredReturnType() ? functionData.returnType() : null); if (getFunctionNodeKind() != NodeKind.FUNCTION_CALL) { properties().custom() diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/foreach.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/foreach.json index e93a7ab30..fa44bc4bd 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/foreach.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/foreach.json @@ -92,7 +92,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} }, "collection": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-io-println.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-io-println.json index 8b591b6f1..69f0dd5b3 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-io-println.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-io-println.json @@ -25,7 +25,7 @@ "module": "io", "symbol": "println", "version": "1.6.1", - "id": 313 + "id": 351 }, "returning": false, "properties": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-json-toJson.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-json-toJson.json index 96e914bfb..55e963629 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-json-toJson.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-json-toJson.json @@ -25,7 +25,7 @@ "module": "data.jsondata", "symbol": "toJson", "version": "0.2.0", - "id": 558 + "id": 600 }, "returning": false, "properties": { @@ -63,7 +63,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} }, "variable": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-log-printInfo.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-log-printInfo.json index d501fc007..d27fd9c21 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-log-printInfo.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-log-printInfo.json @@ -25,7 +25,7 @@ "module": "log", "symbol": "printInfo", "version": "2.10.0", - "id": 104 + "id": 278 }, "returning": false, "properties": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-time-utcFromCivil.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-time-utcFromCivil.json index c87fff765..adcc4f977 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-time-utcFromCivil.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-time-utcFromCivil.json @@ -25,7 +25,7 @@ "module": "time", "symbol": "utcFromCivil", "version": "2.5.0", - "id": 624 + "id": 574 }, "returning": false, "properties": { @@ -63,7 +63,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} }, "variable": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-user.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-user.json index 43d291ad7..0a61e7982 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-user.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-user.json @@ -56,7 +56,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} }, "variable": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/method_call_redis_close.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/method_call_redis_close.json index 1b6c0b43b..82362e90a 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/method_call_redis_close.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/method_call_redis_close.json @@ -28,7 +28,7 @@ "object": "Client", "symbol": "close", "version": "3.0.2", - "id": 1461 + "id": 780 }, "returning": false, "properties": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/method_call_user.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/method_call_user.json index 4e09fc125..d0f2a7bc0 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/method_call_user.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/method_call_user.json @@ -71,7 +71,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} }, "variable": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-azure_cosmosdb.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-azure_cosmosdb.json index 974f8e8e9..0afaf986d 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-azure_cosmosdb.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-azure_cosmosdb.json @@ -64,7 +64,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} }, "variable": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-covid.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-covid.json index a34d54b44..452e8404a 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-covid.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-covid.json @@ -26,7 +26,7 @@ "object": "Client", "symbol": "init", "version": "1.5.1", - "id": 701 + "id": 2900 }, "returning": false, "properties": { @@ -88,7 +88,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} }, "variable": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-docusign.dsadmin.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-docusign.dsadmin.json index ff5d2c991..60695f09a 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-docusign.dsadmin.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-docusign.dsadmin.json @@ -21,7 +21,7 @@ "object": "Client", "symbol": "init", "version": "2.0.0", - "id": 1523 + "id": 915 }, "returning": false, "properties": { @@ -436,7 +436,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} }, "variable": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-grpc.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-grpc.json index 8f6c97b69..d08380f0e 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-grpc.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-grpc.json @@ -41,7 +41,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} }, "variable": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-http.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-http.json index 99fe871c9..8d821faba 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-http.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-http.json @@ -26,7 +26,7 @@ "object": "Client", "symbol": "init", "version": "2.12.2", - "id": 563 + "id": 534 }, "returning": false, "properties": { @@ -580,7 +580,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} }, "variable": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-redis.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-redis.json index b41553ae1..e97a56cf1 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-redis.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-redis.json @@ -26,7 +26,7 @@ "object": "Client", "symbol": "init", "version": "3.0.2", - "id": 1105 + "id": 672 }, "returning": false, "properties": { @@ -142,7 +142,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} }, "variable": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-snowflake.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-snowflake.json index a866d4aaf..9eb087996 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-snowflake.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/new_connection-snowflake.json @@ -21,7 +21,7 @@ "object": "Client", "symbol": "init", "version": "2.0.0", - "id": 637 + "id": 861 }, "returning": false, "properties": { @@ -168,7 +168,10 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": { + "importStatements": "ballerina/sql" + } }, "variable": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-azure_cosmosdb-createDocument.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-azure_cosmosdb-createDocument.json index 4cafed5bc..7ee363ed5 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-azure_cosmosdb-createDocument.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-azure_cosmosdb-createDocument.json @@ -218,7 +218,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} }, "variable": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-covid-getStatusByCountry.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-covid-getStatusByCountry.json index bb668703e..47ae47da2 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-covid-getStatusByCountry.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-covid-getStatusByCountry.json @@ -28,7 +28,7 @@ "object": "Client", "symbol": "getStatusByCountry", "version": "1.5.1", - "id": 723 + "id": 2909 }, "returning": false, "properties": { @@ -192,7 +192,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} }, "variable": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-http-get.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-http-get.json index 21cb94ebd..0222aac28 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-http-get.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-http-get.json @@ -28,7 +28,8 @@ "object": "Client", "symbol": "get", "version": "2.12.0", - "id": 596 + "id": 546, + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -98,17 +99,35 @@ } ] }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + }, + "typeMembers": [] + }, "type": { "metadata": { "label": "Variable Type", "description": "Type of the variable" }, "valueType": "TYPE", - "value": "json", + "value": "targetType", "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} }, "variable": { "metadata": { @@ -116,7 +135,7 @@ "description": "Name of the variable" }, "valueType": "IDENTIFIER", - "value": "jsonResult", + "value": "var2", "optional": false, "editable": true, "advanced": false diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-http-post.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-http-post.json index 8a2e24b59..89a85a3da 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-http-post.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-http-post.json @@ -28,7 +28,8 @@ "object": "Client", "symbol": "post", "version": "2.12.0", - "id": 565 + "id": 536, + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -152,17 +153,35 @@ } ] }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + }, + "typeMembers": [] + }, "type": { "metadata": { "label": "Variable Type", "description": "Type of the variable" }, "valueType": "TYPE", - "value": "json", + "value": "targetType", "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} }, "variable": { "metadata": { @@ -170,7 +189,7 @@ "description": "Name of the variable" }, "valueType": "IDENTIFIER", - "value": "jsonResult", + "value": "var2", "optional": false, "editable": true, "advanced": false diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-query.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-query.json index 4e686e114..48758ad95 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-query.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-query.json @@ -30,7 +30,7 @@ "object": "Client", "symbol": "query", "version": "1.14.0", - "id": 2, + "id": 633, "inferredReturnType": "stream" }, "returning": false, @@ -54,7 +54,7 @@ }, "valueType": "EXPRESSION", "valueTypeConstraint": "sql:ParameterizedQuery", - "placeholder": "object {}", + "placeholder": "``", "optional": false, "editable": true, "advanced": false, diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-redis-get.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-redis-get.json index 27dcad7d5..447f1cf88 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-redis-get.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-redis-get.json @@ -28,7 +28,7 @@ "object": "Client", "symbol": "get", "version": "3.1.0", - "id": 1125 + "id": 684 }, "returning": false, "properties": { @@ -78,7 +78,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} }, "variable": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-redis-set.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-redis-set.json index 3527954f1..19b5eb6e5 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-redis-set.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-redis-set.json @@ -28,7 +28,7 @@ "object": "Client", "symbol": "set", "version": "3.1.0", - "id": 1166 + "id": 692 }, "returning": false, "properties": { @@ -102,7 +102,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} }, "variable": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-snowflake-query.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-snowflake-query.json index 28c7341ad..3dd1b826a 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-snowflake-query.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-snowflake-query.json @@ -28,7 +28,8 @@ "object": "Client", "symbol": "query", "version": "2.1.0", - "id": 641 + "id": 862, + "inferredReturnType": "stream" }, "returning": false, "properties": { @@ -51,7 +52,7 @@ }, "valueType": "EXPRESSION", "valueTypeConstraint": "sql:ParameterizedQuery", - "placeholder": "object {}", + "placeholder": "``", "optional": false, "editable": true, "advanced": false, @@ -74,24 +75,17 @@ "label": "rowType", "description": "The `typedesc` of the record to which the result needs to be returned" }, - "valueType": "EXPRESSION", + "valueType": "TYPE", "valueTypeConstraint": "record {|anydata...;|}", - "placeholder": "<>", - "optional": true, + "placeholder": "record {|anydata...;|}", + "optional": false, "editable": true, - "advanced": true, + "advanced": false, "codedata": { - "kind": "DEFAULTABLE", + "kind": "PARAM_FOR_TYPE_INFER", "originalName": "rowType" }, - "typeMembers": [ - { - "type": "typedesc", - "packageInfo": "", - "kind": "OTHER", - "selected": false - } - ] + "typeMembers": [] }, "type": { "metadata": { @@ -102,8 +96,11 @@ "value": "stream", "placeholder": "var", "optional": false, - "editable": false, - "advanced": false + "editable": true, + "advanced": false, + "codedata": { + "importStatements": "ballerina/sql" + } }, "variable": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/resource_action_call-docusign.dsadmin-get.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/resource_action_call-docusign.dsadmin-get.json index bb985364e..1afffb004 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/resource_action_call-docusign.dsadmin-get.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/resource_action_call-docusign.dsadmin-get.json @@ -27,7 +27,7 @@ "module": "docusign.dsadmin", "object": "Client", "symbol": "get", - "id": 1686 + "id": 919 }, "returning": false, "properties": { @@ -191,7 +191,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} }, "variable": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/resource_action_call-github.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/resource_action_call-github.json index 988fcff94..ac3613808 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/resource_action_call-github.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/resource_action_call-github.json @@ -19,7 +19,7 @@ "metadata": { "label": "post", "description": "Create a GitHub App from a manifest\n", - "icon": "https://bcentral-packageicons.azureedge.net/images/ballerinax_github_5.1.0.png" + "icon": "https://bcentral-packageicons.azureedge.net/images/ballerinax_github_5.0.2.png" }, "codedata": { "node": "RESOURCE_ACTION_CALL", @@ -27,7 +27,7 @@ "module": "github", "object": "Client", "symbol": "post", - "id": 2114 + "id": 1717 }, "returning": false, "properties": { @@ -83,7 +83,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} }, "variable": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/resource_action_call-http-get.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/resource_action_call-http-get.json index 4047baa05..ea0edba81 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/resource_action_call-http-get.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/resource_action_call-http-get.json @@ -28,7 +28,7 @@ "module": "http", "object": "Client", "symbol": "get", - "id": 595 + "id": 545 }, "returning": false, "properties": { @@ -88,6 +88,23 @@ } ] }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + }, + "typeMembers": [] + }, "additionalValues": { "metadata": { "label": "Additional Values", @@ -111,11 +128,12 @@ "description": "Type of the variable" }, "valueType": "TYPE", - "value": "json", + "value": "targetType", "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} }, "variable": { "metadata": { @@ -123,7 +141,7 @@ "description": "Name of the variable" }, "valueType": "IDENTIFIER", - "value": "jsonResult", + "value": "var2", "optional": false, "editable": true, "advanced": false diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/start.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/start.json index 8cc2db5db..a58b4a4c7 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/start.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/start.json @@ -35,7 +35,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} }, "expression": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/variable.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/variable.json index e79ce5519..727c1e250 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/variable.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/variable.json @@ -40,7 +40,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} }, "expression": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/wait.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/wait.json index c840019e5..7ffcc4bb7 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/wait.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/wait.json @@ -35,7 +35,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} }, "waitAll": { "metadata": { From 94ea71aa5be41c9252f3be6b4acc2407969c55fe Mon Sep 17 00:00:00 2001 From: Nipuna Fernando Date: Tue, 4 Mar 2025 23:54:11 +0530 Subject: [PATCH 11/24] Add test cases for queryRow --- .../config/remote_action_call-mysql2.json | 467 ++++++++++++++++++ .../remote_action_call-mysql-queryRow.json | 132 +++++ 2 files changed, 599 insertions(+) create mode 100644 flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql2.json create mode 100644 flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-queryRow.json diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql2.json new file mode 100644 index 000000000..56297d3a9 --- /dev/null +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql2.json @@ -0,0 +1,467 @@ +{ + "start": { + "line": 15, + "offset": 0 + }, + "end": { + "line": 17, + "offset": 1 + }, + "source": "mysql.bal", + "description": "Tests a simple diagram flow", + "diagram": { + "fileName": "mysql.bal", + "nodes": [ + { + "id": "47586", + "metadata": { + "label": "Start" + }, + "codedata": { + "node": "EVENT_START", + "lineRange": { + "fileName": "mysql.bal", + "startLine": { + "line": 15, + "offset": 29 + }, + "endLine": { + "line": 17, + "offset": 1 + } + }, + "sourceCode": "function fn() returns error? {\n Row queryRow = check mysqlClient->queryRow(``);\n}" + }, + "returning": false, + "flags": 0 + }, + { + "id": "47791", + "metadata": { + "label": "queryRow", + "description": "Executes the query, which is expected to return at most one row of the result.\nIf the query does not return any results, `sql:NoRowsError` is returned.\n", + "icon": "https://bcentral-packageicons.azureedge.net/images/ballerinax_mysql_1.14.0.png" + }, + "codedata": { + "node": "REMOTE_ACTION_CALL", + "org": "ballerinax", + "module": "mysql", + "object": "Client", + "symbol": "queryRow", + "version": "1.14.0", + "lineRange": { + "fileName": "mysql.bal", + "startLine": { + "line": 16, + "offset": 4 + }, + "endLine": { + "line": 16, + "offset": 51 + } + }, + "sourceCode": "Row queryRow = check mysqlClient->queryRow(``);", + "inferredReturnType": "returnType" + }, + "returning": false, + "properties": { + "connection": { + "metadata": { + "label": "Connection", + "description": "Connection to use" + }, + "valueType": "EXPRESSION", + "value": "mysqlClient", + "optional": false, + "editable": false, + "advanced": false + }, + "returnType": { + "metadata": { + "label": "returnType", + "description": "The `typedesc` of the record to which the result needs to be returned.\nIt can be a basic type if the query result contains only one column" + }, + "valueType": "TYPE", + "valueTypeConstraint": "anydata", + "value": "Row", + "placeholder": "anydata", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "returnType" + } + }, + "sqlQuery": { + "metadata": { + "label": "sqlQuery", + "description": "The SQL query such as `` `SELECT * from Album WHERE name=${albumName}` ``" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "sql:ParameterizedQuery", + "value": "``", + "placeholder": "``", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "REQUIRED", + "originalName": "sqlQuery", + "importStatements": "ballerina/sql" + }, + "typeMembers": [ + { + "type": "ParameterizedQuery", + "packageInfo": "ballerina:sql:1.14.0", + "kind": "OBJECT_TYPE", + "selected": true + } + ] + }, + "checkError": { + "metadata": { + "label": "Check Error", + "description": "Trigger error flow" + }, + "valueType": "FLAG", + "value": true, + "optional": false, + "editable": true, + "advanced": true + }, + "variable": { + "metadata": { + "label": "Variable Name", + "description": "Name of the variable" + }, + "valueType": "IDENTIFIER", + "value": "queryRow", + "optional": false, + "editable": false, + "advanced": false, + "codedata": { + "lineRange": { + "fileName": "mysql.bal", + "startLine": { + "line": 16, + "offset": 8 + }, + "endLine": { + "line": 16, + "offset": 16 + } + } + } + }, + "type": { + "metadata": { + "label": "Variable Type", + "description": "Type of the variable" + }, + "valueType": "TYPE", + "value": "Row", + "placeholder": "var", + "optional": false, + "editable": false, + "advanced": false, + "codedata": {} + } + }, + "flags": 1 + } + ], + "connections": [ + { + "id": "34766", + "metadata": { + "label": "New Connection", + "description": "Represents a MySQL database client.", + "icon": "https://bcentral-packageicons.azureedge.net/images/ballerinax_mysql_1.14.0.png" + }, + "codedata": { + "node": "NEW_CONNECTION", + "org": "ballerinax", + "module": "mysql", + "object": "Client", + "symbol": "init", + "lineRange": { + "fileName": "mysql.bal", + "startLine": { + "line": 3, + "offset": 0 + }, + "endLine": { + "line": 3, + "offset": 46 + } + }, + "sourceCode": "final mysql:Client mysqlClient = check new ();", + "id": 0 + }, + "returning": false, + "properties": { + "host": { + "metadata": { + "label": "host", + "description": "Hostname of the MySQL server" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "string", + "placeholder": "\"\"", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "DEFAULTABLE", + "originalName": "host" + }, + "typeMembers": [ + { + "type": "string", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false + } + ] + }, + "user": { + "metadata": { + "label": "user", + "description": "If the MySQL server is secured, the username" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "string|()", + "placeholder": "()", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "DEFAULTABLE", + "originalName": "user" + }, + "typeMembers": [ + { + "type": "string", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false + } + ] + }, + "password": { + "metadata": { + "label": "password", + "description": "The password of the MySQL server for the provided username" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "string|()", + "placeholder": "()", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "DEFAULTABLE", + "originalName": "password" + }, + "typeMembers": [ + { + "type": "string", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false + } + ] + }, + "database": { + "metadata": { + "label": "database", + "description": "The name of the database" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "string|()", + "placeholder": "()", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "DEFAULTABLE", + "originalName": "database" + }, + "typeMembers": [ + { + "type": "string", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false + } + ] + }, + "port": { + "metadata": { + "label": "port", + "description": "Port number of the MySQL server" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "int", + "placeholder": "0", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "DEFAULTABLE", + "originalName": "port" + }, + "typeMembers": [ + { + "type": "int", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false + } + ] + }, + "options": { + "metadata": { + "label": "options", + "description": "MySQL database options" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "mysql:Options|()", + "placeholder": "()", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "DEFAULTABLE", + "originalName": "options" + }, + "typeMembers": [ + { + "type": "Options", + "packageInfo": "ballerinax:mysql:1.14.0", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false + } + ] + }, + "connectionPool": { + "metadata": { + "label": "connectionPool", + "description": "The `sql:ConnectionPool` to be used for the connection. If there is no\n`connectionPool` provided, the global connection pool (shared by all clients) will be used" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "sql:ConnectionPool|()", + "placeholder": "()", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "DEFAULTABLE", + "originalName": "connectionPool", + "importStatements": "ballerina/sql" + }, + "typeMembers": [ + { + "type": "ConnectionPool", + "packageInfo": "ballerina:sql:1.15.0", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false + } + ] + }, + "checkError": { + "metadata": { + "label": "Check Error", + "description": "Terminate on error" + }, + "valueType": "FLAG", + "value": true, + "optional": false, + "editable": false, + "advanced": true + }, + "scope": { + "metadata": { + "label": "Connection Scope", + "description": "Scope of the connection, Global or Local" + }, + "valueType": "ENUM", + "value": "Global", + "optional": false, + "editable": true, + "advanced": true + }, + "variable": { + "metadata": { + "label": "Connection Name", + "description": "Name of the variable" + }, + "valueType": "IDENTIFIER", + "value": "mysqlClient", + "optional": false, + "editable": false, + "advanced": false, + "codedata": { + "lineRange": { + "fileName": "mysql.bal", + "startLine": { + "line": 3, + "offset": 19 + }, + "endLine": { + "line": 3, + "offset": 30 + } + } + } + }, + "type": { + "metadata": { + "label": "Connection Type", + "description": "Type of the variable" + }, + "valueType": "TYPE", + "value": "mysql:Client", + "placeholder": "var", + "optional": false, + "editable": false, + "advanced": false, + "codedata": {} + } + }, + "flags": 1 + } + ] + } +} diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-queryRow.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-queryRow.json new file mode 100644 index 000000000..d34b79794 --- /dev/null +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-queryRow.json @@ -0,0 +1,132 @@ +{ + "source": "data_mapper/main.bal", + "position": { + "line": 14, + "offset": 0 + }, + "description": "Sample diagram node", + "codedata": { + "node": "REMOTE_ACTION_CALL", + "org": "ballerinax", + "module": "mysql", + "object": "Client", + "symbol": "queryRow", + "version": "1.14.0", + "parentSymbol": "mysqlClient", + "resourcePath": "", + "id": 0 + }, + "output": { + "id": "31", + "metadata": { + "label": "queryRow", + "description": "Executes the query, which is expected to return at most one row of the result.\nIf the query does not return any results, `sql:NoRowsError` is returned.\n", + "icon": "https://bcentral-packageicons.azureedge.net/images/ballerinax_mysql_1.13.1.png" + }, + "codedata": { + "node": "REMOTE_ACTION_CALL", + "org": "ballerinax", + "module": "mysql", + "object": "Client", + "symbol": "queryRow", + "version": "1.14.0", + "id": 634, + "inferredReturnType": "returnType" + }, + "returning": false, + "properties": { + "connection": { + "metadata": { + "label": "Connection", + "description": "Connection to use" + }, + "valueType": "IDENTIFIER", + "valueTypeConstraint": "mysql:Client", + "value": "mysqlClient", + "optional": false, + "editable": false, + "advanced": false + }, + "sqlQuery": { + "metadata": { + "label": "sqlQuery", + "description": "The SQL query such as `` `SELECT * from Album WHERE name=${albumName}` ``" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "sql:ParameterizedQuery", + "placeholder": "``", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "REQUIRED", + "originalName": "sqlQuery", + "importStatements": "ballerina/sql" + }, + "typeMembers": [ + { + "type": "ParameterizedQuery", + "packageInfo": "ballerina:sql:1.14.0", + "kind": "OBJECT_TYPE", + "selected": false + } + ] + }, + "returnType": { + "metadata": { + "label": "returnType", + "description": "The `typedesc` of the record to which the result needs to be returned.\nIt can be a basic type if the query result contains only one column" + }, + "valueType": "TYPE", + "valueTypeConstraint": "anydata", + "placeholder": "anydata", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "returnType" + }, + "typeMembers": [] + }, + "type": { + "metadata": { + "label": "Variable Type", + "description": "Type of the variable" + }, + "valueType": "TYPE", + "value": "returnType", + "placeholder": "var", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "importStatements": "ballerina/sql" + } + }, + "variable": { + "metadata": { + "label": "Variable Name", + "description": "Name of the variable" + }, + "valueType": "IDENTIFIER", + "value": "returnType", + "optional": false, + "editable": true, + "advanced": false + }, + "checkError": { + "metadata": { + "label": "Check Error", + "description": "Trigger error flow" + }, + "valueType": "FLAG", + "value": true, + "optional": false, + "editable": true, + "advanced": true + } + }, + "flags": 0 + } +} From 842fa0473462679be1f1b7d53c9df9acc1a3be23 Mon Sep 17 00:00:00 2001 From: Nipuna Fernando Date: Wed, 5 Mar 2025 00:15:14 +0530 Subject: [PATCH 12/24] Update model generator test cases --- .../diagram_generator/config/assign1.json | 3 +- .../diagram_generator/config/assign2.json | 3 +- .../diagram_generator/config/assign3.json | 3 +- .../diagram_generator/config/assign4.json | 3 +- .../diagram_generator/config/assign5.json | 6 +- .../diagram_generator/config/binary_data.json | 15 +- .../diagram_generator/config/clients1.json | 99 +- .../diagram_generator/config/comment1.json | 3 +- .../diagram_generator/config/comment10.json | 6 +- .../diagram_generator/config/comment11.json | 3 +- .../diagram_generator/config/comment12.json | 3 +- .../diagram_generator/config/comment13.json | 3 +- .../diagram_generator/config/comment2.json | 6 +- .../diagram_generator/config/comment3.json | 3 +- .../diagram_generator/config/comment5.json | 6 +- .../diagram_generator/config/comment6.json | 3 +- .../diagram_generator/config/comment7.json | 3 +- .../diagram_generator/config/comment8.json | 3 +- .../diagram_generator/config/comment9.json | 3 +- .../config/currency_converter1.json | 494 ++++---- .../config/data_mapper1.json | 411 +++---- .../config/diagnostics1.json | 24 +- .../config/diagnostics2.json | 3 +- .../config/diagnostics3.json | 3 +- .../config/diagnostics4.json | 23 +- .../config/diagnostics5.json | 3 +- .../config/error_handler1.json | 434 +++---- .../config/error_handler2.json | 476 ++++---- .../config/error_handler3.json | 431 +++---- .../config/error_handler6.json | 3 +- .../diagram_generator/config/flags1.json | 20 +- .../diagram_generator/config/flags2.json | 3 - .../config/force_assign_function.json | 436 +++---- .../diagram_generator/config/foreach1.json | 6 +- .../diagram_generator/config/foreach2.json | 6 +- .../diagram_generator/config/foreach3.json | 6 +- .../diagram_generator/config/foreach4.json | 6 +- .../diagram_generator/config/foreach5.json | 6 +- .../diagram_generator/config/fork1.json | 3 +- .../diagram_generator/config/fork2.json | 3 +- .../diagram_generator/config/fork3.json | 3 +- .../diagram_generator/config/fork4.json | 3 +- .../diagram_generator/config/fork5.json | 9 +- .../diagram_generator/config/fork6.json | 9 +- .../config/function_call-json1.json | 436 +++---- .../config/function_call-log1.json | 431 +++---- .../config/function_call-user1.json | 414 +++---- .../diagram_generator/config/if1.json | 398 +++---- .../diagram_generator/config/if10.json | 389 +++---- .../diagram_generator/config/if2.json | 395 +++---- .../diagram_generator/config/if3.json | 389 +++---- .../diagram_generator/config/if4.json | 392 +++---- .../diagram_generator/config/if5.json | 389 +++---- .../diagram_generator/config/if6.json | 389 +++---- .../diagram_generator/config/if7.json | 389 +++---- .../diagram_generator/config/if8.json | 389 +++---- .../diagram_generator/config/if9.json | 389 +++---- .../diagram_generator/config/if_windows1.json | 398 +++---- .../config/json_payload1.json | 3 +- .../diagram_generator/config/lock1.json | 3 +- .../diagram_generator/config/lock2.json | 3 +- .../diagram_generator/config/lock3.json | 3 +- .../diagram_generator/config/match12.json | 6 +- .../diagram_generator/config/match8.json | 3 +- .../config/method_call_redis_close.json | 57 +- .../config/nested_node1.json | 389 +++---- .../config/nested_node2.json | 476 ++++---- .../config/nested_node3.json | 389 +++---- .../config/nested_node4.json | 389 +++---- .../config/nested_node5.json | 389 +++---- .../config/nested_node6.json | 395 +++---- .../config/new_connection1.json | 956 +++++++-------- .../config/new_connection2.json | 956 +++++++-------- .../config/new_connection3.json | 960 +++++++-------- .../config/new_connection4.json | 1026 +++++++++-------- .../diagram_generator/config/panic4.json | 3 +- .../config/remote_action_call-http-get1.json | 473 ++++---- .../config/remote_action_call-http-get2.json | 457 ++++---- .../config/remote_action_call-http-get3.json | 784 ++++++------- .../config/remote_action_call-http-post1.json | 473 ++++---- .../config/remote_action_call-http-post2.json | 436 ++++--- .../config/remote_action_call-http-post3.json | 784 ++++++------- .../config/remote_action_call-mysql1.json | 6 +- .../resource_action_call-http-get1.json | 775 +++++++------ .../resource_action_call-http-post1.json | 690 +++++------ .../config/resource_action_call_github.json | 13 +- .../diagram_generator/config/simple_flow.json | 866 +++++++------- .../diagram_generator/config/start1.json | 3 +- .../diagram_generator/config/start2.json | 6 +- .../config/transaction1.json | 3 +- .../config/transaction2.json | 9 +- .../config/transaction3.json | 6 +- .../config/transaction4.json | 3 +- .../config/transaction5.json | 3 +- .../config/transaction6.json | 6 +- .../diagram_generator/config/variable1.json | 24 +- .../diagram_generator/config/variable2.json | 6 +- .../diagram_generator/config/variable3.json | 3 +- .../diagram_generator/config/variable4.json | 9 +- .../diagram_generator/config/variable5.json | 3 +- .../diagram_generator/config/variable6.json | 9 +- .../diagram_generator/config/variable7.json | 12 +- .../diagram_generator/config/wait1.json | 6 +- .../diagram_generator/config/wait2.json | 6 +- .../diagram_generator/config/wait3.json | 3 +- .../diagram_generator/config/wait4.json | 3 +- .../diagram_generator/config/wait5.json | 3 +- .../diagram_generator/config/wait6.json | 3 +- .../diagram_generator/config/wait7.json | 3 +- .../diagram_generator/config/wait8.json | 3 +- .../diagram_generator/config/wait9.json | 18 +- .../diagram_generator/config/while1.json | 437 +++---- .../diagram_generator/config/while2.json | 389 +++---- .../diagram_generator/config/while3.json | 437 +++---- .../diagram_generator/config/while4.json | 437 +++---- .../diagram_generator/config/while5.json | 887 +++++++------- .../diagram_generator/config/while6.json | 437 +++---- .../diagram_generator/config/while7.json | 437 +++---- .../diagram_generator/config/while8.json | 437 +++---- .../diagram_generator/config/xml_payload.json | 15 +- .../diagram_generator/source/mysql.bal | 4 + 121 files changed, 12551 insertions(+), 12270 deletions(-) diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/assign1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/assign1.json index 062b34572..de49b6f37 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/assign1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/assign1.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/assign2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/assign2.json index 706da433b..961bafa5f 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/assign2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/assign2.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/assign3.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/assign3.json index 5afebe567..321aa23da 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/assign3.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/assign3.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/assign4.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/assign4.json index 33f7cab2c..176bd74ad 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/assign4.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/assign4.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/assign5.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/assign5.json index d0a1ff9a8..2c03982cc 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/assign5.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/assign5.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -224,7 +225,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/binary_data.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/binary_data.json index 4f24e47ba..5db9c9375 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/binary_data.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/binary_data.json @@ -80,7 +80,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -153,7 +154,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -226,7 +228,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -299,7 +302,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -372,7 +376,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/clients1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/clients1.json index 6db5bf424..9db132058 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/clients1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/clients1.json @@ -60,7 +60,8 @@ "offset": 51 } }, - "sourceCode": "json moduleVal = check moduleCl->get(\"/hello\");" + "sourceCode": "json moduleVal = check moduleCl->get(\"/hello\");", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -75,6 +76,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -130,23 +148,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "checkError": { "metadata": { "label": "Check Error", @@ -191,8 +192,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -374,7 +376,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -404,7 +407,8 @@ "offset": 49 } }, - "sourceCode": "json localVal = check localCl->get(\"/hello\");" + "sourceCode": "json localVal = check localCl->get(\"/hello\");", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -419,6 +423,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -474,23 +495,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "checkError": { "metadata": { "label": "Check Error", @@ -535,8 +539,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -626,7 +631,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -847,7 +853,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -937,7 +944,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -1027,7 +1035,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment1.json index 6e3dca699..07d0f7e9a 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment1.json @@ -140,7 +140,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment10.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment10.json index 9be90a143..8c1d8de6a 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment10.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment10.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -311,7 +312,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} }, "collection": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment11.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment11.json index 07b76fcf7..1b3bbfa20 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment11.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment11.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment12.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment12.json index 899f50eef..f58ae540e 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment12.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment12.json @@ -140,7 +140,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment13.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment13.json index afa5e42f5..4566a4607 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment13.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment13.json @@ -140,7 +140,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment2.json index 6de08fa14..5dd90d611 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment2.json @@ -197,7 +197,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -270,7 +271,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment3.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment3.json index 95e58e71e..0734ab89b 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment3.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment3.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment5.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment5.json index a20b8551e..7d3f8b69a 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment5.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment5.json @@ -232,7 +232,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -401,7 +402,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment6.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment6.json index 8dddb9367..c52d53c1b 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment6.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment6.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment7.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment7.json index d58772b4c..e916d9dff 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment7.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment7.json @@ -290,7 +290,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment8.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment8.json index e34c7c7f6..5e4e032b0 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment8.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment8.json @@ -183,7 +183,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment9.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment9.json index d5732e521..b4cccf3f2 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment9.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/comment9.json @@ -172,7 +172,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/currency_converter1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/currency_converter1.json index 80cf17196..0c25652ce 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/currency_converter1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/currency_converter1.json @@ -220,7 +220,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -371,8 +372,9 @@ "value": "string|()", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -576,7 +578,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -739,7 +742,8 @@ "offset": 97 } }, - "sourceCode": "// action call - http get call\n json response = check currencyClient->get(\"/latest?base=\" + 'from + \"&to=\" + to);" + "sourceCode": "// action call - http get call\n json response = check currencyClient->get(\"/latest?base=\" + 'from + \"&to=\" + to);", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -754,6 +758,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -809,23 +830,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "checkError": { "metadata": { "label": "Check Error", @@ -870,8 +874,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -981,7 +986,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -1163,8 +1169,9 @@ "value": "decimal", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -1415,7 +1422,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -1865,144 +1873,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -2045,138 +2077,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -2189,54 +2203,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -2249,48 +2257,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -2303,102 +2317,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -2461,7 +2469,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -2526,33 +2535,33 @@ } ] }, - "connectionPooling": { + "secureSocket": { "metadata": { - "label": "connectionPooling", + "label": "secureSocket", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "redis:SecureSocket", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "connectionPooling" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "SecureSocket", + "packageInfo": "ballerinax:redis:3.0.2", + "kind": "RECORD_TYPE", "selected": false } ] }, - "isClusterConnection": { + "connectionPooling": { "metadata": { - "label": "isClusterConnection", + "label": "connectionPooling", "description": "" }, "valueType": "EXPRESSION", @@ -2563,7 +2572,7 @@ "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "isClusterConnection" + "originalName": "connectionPooling" }, "typeMembers": [ { @@ -2574,26 +2583,26 @@ } ] }, - "secureSocket": { + "isClusterConnection": { "metadata": { - "label": "secureSocket", + "label": "isClusterConnection", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "redis:SecureSocket", - "placeholder": "{}", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "isClusterConnection" }, "typeMembers": [ { - "type": "SecureSocket", - "packageInfo": "ballerinax:redis:3.0.2", - "kind": "RECORD_TYPE", + "type": "boolean", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] @@ -2654,7 +2663,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/data_mapper1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/data_mapper1.json index 99629f17e..5c7a4141c 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/data_mapper1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/data_mapper1.json @@ -140,7 +140,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -213,7 +214,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -286,7 +288,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -481,8 +484,9 @@ "value": "Person", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -555,7 +559,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -726,8 +731,9 @@ "value": "Employee", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -863,144 +869,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1043,138 +1073,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1187,54 +1199,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1247,48 +1253,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1301,102 +1313,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1459,7 +1465,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/diagnostics1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/diagnostics1.json index 30cc97a6b..5de1c274b 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/diagnostics1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/diagnostics1.json @@ -175,7 +175,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "diagnostics": { @@ -251,7 +252,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -501,7 +503,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -583,7 +586,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "diagnostics": { @@ -668,7 +672,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "diagnostics": { @@ -944,7 +949,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "diagnostics": { @@ -1138,7 +1144,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "diagnostics": { @@ -1223,7 +1230,8 @@ "message": "unknown type 'str'" } ] - } + }, + "codedata": {} } }, "diagnostics": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/diagnostics2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/diagnostics2.json index 1eac1b15f..9b422d321 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/diagnostics2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/diagnostics2.json @@ -106,7 +106,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/diagnostics3.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/diagnostics3.json index a5b837ebc..07a57fbfa 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/diagnostics3.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/diagnostics3.json @@ -224,7 +224,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/diagnostics4.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/diagnostics4.json index e30e266c5..546f33037 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/diagnostics4.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/diagnostics4.json @@ -106,7 +106,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -225,8 +226,9 @@ "value": "Target", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "diagnostics": { @@ -348,8 +350,9 @@ "value": "Target", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "diagnostics": { @@ -471,8 +474,9 @@ "value": "int", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "diagnostics": { @@ -599,8 +603,9 @@ "value": "string", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "diagnostics": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/diagnostics5.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/diagnostics5.json index 184401706..1f358b11f 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/diagnostics5.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/diagnostics5.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/error_handler1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/error_handler1.json index 57c7e1f9d..57cfb7be9 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/error_handler1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/error_handler1.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -176,7 +177,8 @@ "offset": 65 } }, - "sourceCode": "json res2 = check foodClient->get(\"/western/apples\");" + "sourceCode": "json res2 = check foodClient->get(\"/western/apples\");", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -191,6 +193,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -246,23 +265,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "checkError": { "metadata": { "label": "Check Error", @@ -307,8 +309,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -486,144 +489,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -666,138 +693,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -810,54 +819,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -870,48 +873,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -924,102 +933,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1082,7 +1085,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/error_handler2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/error_handler2.json index 0a0c9c6cd..8c740634a 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/error_handler2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/error_handler2.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -176,7 +177,8 @@ "offset": 66 } }, - "sourceCode": "json res3 = check foodClient->get(\"/western/oranges\");" + "sourceCode": "json res3 = check foodClient->get(\"/western/oranges\");", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -191,6 +193,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -246,23 +265,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "checkError": { "metadata": { "label": "Check Error", @@ -307,8 +309,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -493,7 +496,8 @@ "offset": 103 } }, - "sourceCode": "json res = check foodClient->post(\"/log\", \"Error occurred while getting the response\");" + "sourceCode": "json res = check foodClient->post(\"/log\", \"Error occurred while getting the response\");", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -508,6 +512,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -618,23 +639,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "checkError": { "metadata": { "label": "Check Error", @@ -679,8 +683,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -863,144 +868,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1043,138 +1072,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1187,54 +1198,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1247,48 +1252,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1301,102 +1312,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1459,7 +1464,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/error_handler3.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/error_handler3.json index 49d961504..206f1c01d 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/error_handler3.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/error_handler3.json @@ -103,7 +103,8 @@ "offset": 68 } }, - "sourceCode": "json res = check foodClient->get(\"/western/pineapples\");" + "sourceCode": "json res = check foodClient->get(\"/western/pineapples\");", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -118,6 +119,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -173,23 +191,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "checkError": { "metadata": { "label": "Check Error", @@ -234,8 +235,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -434,144 +436,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -614,138 +640,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -758,54 +766,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -818,48 +820,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -872,102 +880,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1030,7 +1032,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/error_handler6.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/error_handler6.json index 6d8d678d4..1e1f048eb 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/error_handler6.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/error_handler6.json @@ -146,7 +146,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/flags1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/flags1.json index 18aeb50b9..648ce7341 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/flags1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/flags1.json @@ -251,8 +251,9 @@ "value": "boolean", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -349,8 +350,9 @@ "value": "boolean", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 2 @@ -447,8 +449,9 @@ "value": "boolean", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 5 @@ -545,8 +548,9 @@ "value": "boolean", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 6 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/flags2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/flags2.json index 5a77211e5..557e0ae3a 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/flags2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/flags2.json @@ -33,9 +33,6 @@ "sourceCode": "remote function onFileChange(ftp:Caller caller, ftp:WatchEvent & readonly event) returns ftp:Error? {\n\n }" }, "returning": false, - "diagnostics": { - "hasDiagnostics": true - }, "flags": 0 } ], diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/force_assign_function.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/force_assign_function.json index 62b70b75e..3ee82d375 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/force_assign_function.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/force_assign_function.json @@ -132,8 +132,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -162,10 +163,28 @@ "offset": 61 } }, - "sourceCode": "Apple apple = check jsondata:parseAsType(jsonResult);" + "sourceCode": "Apple apple = check jsondata:parseAsType(jsonResult);", + "inferredReturnType": "t" }, "returning": false, "properties": { + "t": { + "metadata": { + "label": "t", + "description": "Target type" + }, + "valueType": "TYPE", + "valueTypeConstraint": "anydata", + "value": "Apple", + "placeholder": "anydata", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "t" + } + }, "v": { "metadata": { "label": "v", @@ -215,23 +234,6 @@ } ] }, - "t": { - "metadata": { - "label": "t", - "description": "Target type" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "t" - }, - "typeMembers": [] - }, "checkError": { "metadata": { "label": "Check Error", @@ -276,8 +278,9 @@ "value": "Apple", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -375,144 +378,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -555,138 +582,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -699,54 +708,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -759,48 +762,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -813,102 +822,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -971,7 +974,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/foreach1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/foreach1.json index 8b8d6ee03..8cdd1a466 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/foreach1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/foreach1.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -237,7 +238,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} }, "collection": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/foreach2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/foreach2.json index 8b8d6ee03..8cdd1a466 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/foreach2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/foreach2.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -237,7 +238,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} }, "collection": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/foreach3.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/foreach3.json index 0f0b7c063..9a91e56ad 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/foreach3.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/foreach3.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -296,7 +297,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} }, "collection": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/foreach4.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/foreach4.json index 6e3b8869a..68c89d505 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/foreach4.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/foreach4.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -333,7 +334,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} }, "collection": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/foreach5.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/foreach5.json index dd3235609..c2fcb035c 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/foreach5.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/foreach5.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -237,7 +238,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} }, "collection": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/fork1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/fork1.json index fa6318ad6..08106b84c 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/fork1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/fork1.json @@ -540,7 +540,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/fork2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/fork2.json index 2f921d035..227306f83 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/fork2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/fork2.json @@ -565,7 +565,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/fork3.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/fork3.json index 255229fc5..789520acc 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/fork3.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/fork3.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/fork4.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/fork4.json index 8e1b809a7..cbd6e44d8 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/fork4.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/fork4.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/fork5.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/fork5.json index e7554fa11..014805878 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/fork5.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/fork5.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -176,7 +177,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -753,7 +755,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/fork6.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/fork6.json index a154615fa..6441a0fb2 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/fork6.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/fork6.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -176,7 +177,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -753,7 +755,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/function_call-json1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/function_call-json1.json index 62b70b75e..3ee82d375 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/function_call-json1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/function_call-json1.json @@ -132,8 +132,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -162,10 +163,28 @@ "offset": 61 } }, - "sourceCode": "Apple apple = check jsondata:parseAsType(jsonResult);" + "sourceCode": "Apple apple = check jsondata:parseAsType(jsonResult);", + "inferredReturnType": "t" }, "returning": false, "properties": { + "t": { + "metadata": { + "label": "t", + "description": "Target type" + }, + "valueType": "TYPE", + "valueTypeConstraint": "anydata", + "value": "Apple", + "placeholder": "anydata", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "t" + } + }, "v": { "metadata": { "label": "v", @@ -215,23 +234,6 @@ } ] }, - "t": { - "metadata": { - "label": "t", - "description": "Target type" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "t" - }, - "typeMembers": [] - }, "checkError": { "metadata": { "label": "Check Error", @@ -276,8 +278,9 @@ "value": "Apple", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -375,144 +378,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -555,138 +582,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -699,54 +708,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -759,48 +762,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -813,102 +822,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -971,7 +974,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/function_call-log1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/function_call-log1.json index 40ce008fa..6c87b19be 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/function_call-log1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/function_call-log1.json @@ -397,7 +397,8 @@ "offset": 86 } }, - "sourceCode": "json|error res = foodClient->get(\"/western/apples?count=\" + count.toString());" + "sourceCode": "json|error res = foodClient->get(\"/western/apples?count=\" + count.toString());", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -412,6 +413,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json|error", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -467,23 +485,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "variable": { "metadata": { "label": "Variable Name", @@ -517,8 +518,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -935,144 +937,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1115,138 +1141,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1259,54 +1267,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1319,48 +1321,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1373,102 +1381,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1531,7 +1533,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/function_call-user1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/function_call-user1.json index 6a28e3e06..ff17f51a6 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/function_call-user1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/function_call-user1.json @@ -140,8 +140,9 @@ "value": "string", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -274,8 +275,9 @@ "value": "int", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -409,8 +411,9 @@ "value": "int", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -587,8 +590,9 @@ "value": "int", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -746,8 +750,9 @@ "value": "int", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -976,144 +981,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1156,138 +1185,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1300,54 +1311,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1360,48 +1365,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1414,102 +1425,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1572,7 +1577,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if1.json index 56c3c6e30..5037d91a9 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if1.json @@ -160,7 +160,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -255,7 +256,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -328,7 +330,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -394,144 +397,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -574,138 +601,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -718,54 +727,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -778,48 +781,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -832,102 +841,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -990,7 +993,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if10.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if10.json index 1495af9c4..392196326 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if10.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if10.json @@ -395,144 +395,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -575,138 +599,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -719,54 +725,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -779,48 +779,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -833,102 +839,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -991,7 +991,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if2.json index 58167e620..923dfd77f 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if2.json @@ -217,7 +217,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -349,7 +350,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -494,144 +496,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -674,138 +700,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -818,54 +826,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -878,48 +880,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -932,102 +940,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1090,7 +1092,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if3.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if3.json index 0e71b1198..9a11972b1 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if3.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if3.json @@ -635,144 +635,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -815,138 +839,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -959,54 +965,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1019,48 +1019,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1073,102 +1079,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1231,7 +1231,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if4.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if4.json index 884f656e5..80409a8df 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if4.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if4.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -568,144 +569,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -748,138 +773,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -892,54 +899,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -952,48 +953,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1006,102 +1013,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1164,7 +1165,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if5.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if5.json index fd41da2af..c9d117e20 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if5.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if5.json @@ -322,144 +322,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -502,138 +526,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -646,54 +652,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -706,48 +706,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -760,102 +766,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -918,7 +918,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if6.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if6.json index e967a245a..fd1f573ad 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if6.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if6.json @@ -300,144 +300,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -480,138 +504,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -624,54 +630,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -684,48 +684,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -738,102 +744,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -896,7 +896,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if7.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if7.json index bdfb1189f..9f8e1f31d 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if7.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if7.json @@ -443,144 +443,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -623,138 +647,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -767,54 +773,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -827,48 +827,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -881,102 +887,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1039,7 +1039,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if8.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if8.json index df081dda3..7719facd5 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if8.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if8.json @@ -516,144 +516,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -696,138 +720,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -840,54 +846,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -900,48 +900,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -954,102 +960,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1112,7 +1112,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if9.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if9.json index 99c86d872..be5a7631c 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if9.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if9.json @@ -370,144 +370,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -550,138 +574,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -694,54 +700,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -754,48 +754,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -808,102 +814,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -966,7 +966,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if_windows1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if_windows1.json index 45e461ea6..0436abf2e 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if_windows1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/if_windows1.json @@ -160,7 +160,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -255,7 +256,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -328,7 +330,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -394,144 +397,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -574,138 +601,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -718,54 +727,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -778,48 +781,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -832,102 +841,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -990,7 +993,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/json_payload1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/json_payload1.json index d876bc1d9..2a19f8121 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/json_payload1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/json_payload1.json @@ -80,7 +80,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/lock1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/lock1.json index 8c2020ab8..efef7b680 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/lock1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/lock1.json @@ -146,7 +146,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/lock2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/lock2.json index cf904ae24..573d802ba 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/lock2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/lock2.json @@ -146,7 +146,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/lock3.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/lock3.json index 8d91e9eca..c5520d265 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/lock3.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/lock3.json @@ -146,7 +146,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/match12.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/match12.json index 06e186038..66b48ecc5 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/match12.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/match12.json @@ -182,7 +182,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -255,7 +256,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/match8.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/match8.json index 673db9f52..d5695ddc3 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/match8.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/match8.json @@ -160,7 +160,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/method_call_redis_close.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/method_call_redis_close.json index 3f9f99d7d..6cff0dae8 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/method_call_redis_close.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/method_call_redis_close.json @@ -119,30 +119,24 @@ }, "returning": false, "properties": { - "connection": { + "secureSocket": { "metadata": { - "label": "connection", + "label": "secureSocket", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "redis:ConnectionUri|redis:ConnectionParams", - "placeholder": "\"\"", + "valueTypeConstraint": "redis:SecureSocket", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "connection" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ConnectionUri", - "packageInfo": "ballerinax:redis:3.0.2", - "kind": "BASIC_TYPE", - "selected": false - }, - { - "type": "ConnectionParams", + "type": "SecureSocket", "packageInfo": "ballerinax:redis:3.0.2", "kind": "RECORD_TYPE", "selected": false @@ -173,50 +167,56 @@ } ] }, - "isClusterConnection": { + "connection": { "metadata": { - "label": "isClusterConnection", + "label": "connection", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "redis:ConnectionUri|redis:ConnectionParams", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "isClusterConnection" + "originalName": "connection" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", + "type": "ConnectionUri", + "packageInfo": "ballerinax:redis:3.0.2", "kind": "BASIC_TYPE", "selected": false + }, + { + "type": "ConnectionParams", + "packageInfo": "ballerinax:redis:3.0.2", + "kind": "RECORD_TYPE", + "selected": false } ] }, - "secureSocket": { + "isClusterConnection": { "metadata": { - "label": "secureSocket", + "label": "isClusterConnection", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "redis:SecureSocket", - "placeholder": "{}", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "isClusterConnection" }, "typeMembers": [ { - "type": "SecureSocket", - "packageInfo": "ballerinax:redis:3.0.2", - "kind": "RECORD_TYPE", + "type": "boolean", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] @@ -277,7 +277,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/nested_node1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/nested_node1.json index 72111c6dd..f88c1320a 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/nested_node1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/nested_node1.json @@ -128,144 +128,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -308,138 +332,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -452,54 +458,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -512,48 +512,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -566,102 +572,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -724,7 +724,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/nested_node2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/nested_node2.json index d42decb11..386edcab6 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/nested_node2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/nested_node2.json @@ -160,7 +160,8 @@ "offset": 67 } }, - "sourceCode": "json j = check asiri->get(path = \"/doctors/kandy\");" + "sourceCode": "json j = check asiri->get(path = \"/doctors/kandy\");", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -175,6 +176,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -230,23 +248,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "checkError": { "metadata": { "label": "Check Error", @@ -291,8 +292,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -344,7 +346,8 @@ "offset": 69 } }, - "sourceCode": "json j = check asiri->get(path = \"/doctors/colombo\");" + "sourceCode": "json j = check asiri->get(path = \"/doctors/colombo\");", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -359,6 +362,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -414,23 +434,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "checkError": { "metadata": { "label": "Check Error", @@ -475,8 +478,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -543,7 +547,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -609,144 +614,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -789,138 +818,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -933,54 +944,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -993,48 +998,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1047,102 +1058,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1205,7 +1210,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/nested_node3.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/nested_node3.json index 4cd1de726..f419c6fe9 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/nested_node3.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/nested_node3.json @@ -128,144 +128,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -308,138 +332,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -452,54 +458,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -512,48 +512,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -566,102 +572,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -724,7 +724,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/nested_node4.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/nested_node4.json index 3d6171b5b..583966a16 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/nested_node4.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/nested_node4.json @@ -128,144 +128,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -308,138 +332,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -452,54 +458,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -512,48 +512,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -566,102 +572,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -724,7 +724,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/nested_node5.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/nested_node5.json index d3cbf86cb..19027d425 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/nested_node5.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/nested_node5.json @@ -128,144 +128,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -308,138 +332,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -452,54 +458,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -512,48 +512,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -566,102 +572,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -724,7 +724,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/nested_node6.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/nested_node6.json index abcd685de..68fbebf02 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/nested_node6.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/nested_node6.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -176,7 +177,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -459,144 +461,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -639,138 +665,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -783,54 +791,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -843,48 +845,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -897,102 +905,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1055,7 +1057,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/new_connection1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/new_connection1.json index 4c32dc7e6..ecc8f12db 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/new_connection1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/new_connection1.json @@ -89,144 +89,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -269,138 +293,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -413,54 +419,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -473,48 +473,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -527,102 +533,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -685,7 +685,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -719,30 +720,24 @@ }, "returning": false, "properties": { - "connection": { + "secureSocket": { "metadata": { - "label": "connection", + "label": "secureSocket", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "redis:ConnectionUri|redis:ConnectionParams", - "placeholder": "\"\"", + "valueTypeConstraint": "redis:SecureSocket", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "connection" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ConnectionUri", - "packageInfo": "ballerinax:redis:3.0.2", - "kind": "BASIC_TYPE", - "selected": false - }, - { - "type": "ConnectionParams", + "type": "SecureSocket", "packageInfo": "ballerinax:redis:3.0.2", "kind": "RECORD_TYPE", "selected": false @@ -773,50 +768,56 @@ } ] }, - "isClusterConnection": { + "connection": { "metadata": { - "label": "isClusterConnection", + "label": "connection", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "redis:ConnectionUri|redis:ConnectionParams", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "isClusterConnection" + "originalName": "connection" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", + "type": "ConnectionUri", + "packageInfo": "ballerinax:redis:3.0.2", "kind": "BASIC_TYPE", "selected": false + }, + { + "type": "ConnectionParams", + "packageInfo": "ballerinax:redis:3.0.2", + "kind": "RECORD_TYPE", + "selected": false } ] }, - "secureSocket": { + "isClusterConnection": { "metadata": { - "label": "secureSocket", + "label": "isClusterConnection", "description": "" }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "redis:SecureSocket", - "placeholder": "{}", + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "isClusterConnection" }, "typeMembers": [ { - "type": "SecureSocket", - "packageInfo": "ballerinax:redis:3.0.2", - "kind": "RECORD_TYPE", + "type": "boolean", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] @@ -877,7 +878,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -1019,7 +1021,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -1078,144 +1081,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1258,138 +1285,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { - "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "proxy": { + "metadata": { + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1402,54 +1411,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1462,48 +1465,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1516,102 +1525,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1674,7 +1677,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -1708,30 +1712,24 @@ }, "returning": false, "properties": { - "connection": { + "secureSocket": { "metadata": { - "label": "connection", + "label": "secureSocket", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "redis:ConnectionUri|redis:ConnectionParams", - "placeholder": "\"\"", + "valueTypeConstraint": "redis:SecureSocket", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "connection" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ConnectionUri", - "packageInfo": "ballerinax:redis:3.0.2", - "kind": "BASIC_TYPE", - "selected": false - }, - { - "type": "ConnectionParams", + "type": "SecureSocket", "packageInfo": "ballerinax:redis:3.0.2", "kind": "RECORD_TYPE", "selected": false @@ -1762,50 +1760,56 @@ } ] }, - "isClusterConnection": { + "connection": { "metadata": { - "label": "isClusterConnection", + "label": "connection", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "redis:ConnectionUri|redis:ConnectionParams", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "isClusterConnection" + "originalName": "connection" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", + "type": "ConnectionUri", + "packageInfo": "ballerinax:redis:3.0.2", "kind": "BASIC_TYPE", "selected": false + }, + { + "type": "ConnectionParams", + "packageInfo": "ballerinax:redis:3.0.2", + "kind": "RECORD_TYPE", + "selected": false } ] }, - "secureSocket": { + "isClusterConnection": { "metadata": { - "label": "secureSocket", + "label": "isClusterConnection", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "redis:SecureSocket", - "placeholder": "{}", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "isClusterConnection" }, "typeMembers": [ { - "type": "SecureSocket", - "packageInfo": "ballerinax:redis:3.0.2", - "kind": "RECORD_TYPE", + "type": "boolean", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] @@ -1866,7 +1870,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -1900,30 +1905,24 @@ }, "returning": false, "properties": { - "connection": { + "secureSocket": { "metadata": { - "label": "connection", + "label": "secureSocket", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "redis:ConnectionUri|redis:ConnectionParams", - "placeholder": "\"\"", + "valueTypeConstraint": "redis:SecureSocket", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "connection" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ConnectionUri", - "packageInfo": "ballerinax:redis:3.0.2", - "kind": "BASIC_TYPE", - "selected": false - }, - { - "type": "ConnectionParams", + "type": "SecureSocket", "packageInfo": "ballerinax:redis:3.0.2", "kind": "RECORD_TYPE", "selected": false @@ -1954,50 +1953,56 @@ } ] }, - "isClusterConnection": { + "connection": { "metadata": { - "label": "isClusterConnection", + "label": "connection", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "redis:ConnectionUri|redis:ConnectionParams", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "isClusterConnection" + "originalName": "connection" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", + "type": "ConnectionUri", + "packageInfo": "ballerinax:redis:3.0.2", "kind": "BASIC_TYPE", "selected": false + }, + { + "type": "ConnectionParams", + "packageInfo": "ballerinax:redis:3.0.2", + "kind": "RECORD_TYPE", + "selected": false } ] }, - "secureSocket": { + "isClusterConnection": { "metadata": { - "label": "secureSocket", + "label": "isClusterConnection", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "redis:SecureSocket", - "placeholder": "{}", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "isClusterConnection" }, "typeMembers": [ { - "type": "SecureSocket", - "packageInfo": "ballerinax:redis:3.0.2", - "kind": "RECORD_TYPE", + "type": "boolean", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] @@ -2058,7 +2063,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/new_connection2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/new_connection2.json index d89e04bb5..88ec8bfa1 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/new_connection2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/new_connection2.json @@ -89,144 +89,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -269,138 +293,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -413,54 +419,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -473,48 +473,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -527,102 +533,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -685,7 +685,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -719,30 +720,24 @@ }, "returning": false, "properties": { - "connection": { + "secureSocket": { "metadata": { - "label": "connection", + "label": "secureSocket", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "redis:ConnectionUri|redis:ConnectionParams", - "placeholder": "\"\"", + "valueTypeConstraint": "redis:SecureSocket", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "connection" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ConnectionUri", - "packageInfo": "ballerinax:redis:3.0.2", - "kind": "BASIC_TYPE", - "selected": false - }, - { - "type": "ConnectionParams", + "type": "SecureSocket", "packageInfo": "ballerinax:redis:3.0.2", "kind": "RECORD_TYPE", "selected": false @@ -773,50 +768,56 @@ } ] }, - "isClusterConnection": { + "connection": { "metadata": { - "label": "isClusterConnection", + "label": "connection", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "redis:ConnectionUri|redis:ConnectionParams", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "isClusterConnection" + "originalName": "connection" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", + "type": "ConnectionUri", + "packageInfo": "ballerinax:redis:3.0.2", "kind": "BASIC_TYPE", "selected": false + }, + { + "type": "ConnectionParams", + "packageInfo": "ballerinax:redis:3.0.2", + "kind": "RECORD_TYPE", + "selected": false } ] }, - "secureSocket": { + "isClusterConnection": { "metadata": { - "label": "secureSocket", + "label": "isClusterConnection", "description": "" }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "redis:SecureSocket", - "placeholder": "{}", + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "isClusterConnection" }, "typeMembers": [ { - "type": "SecureSocket", - "packageInfo": "ballerinax:redis:3.0.2", - "kind": "RECORD_TYPE", + "type": "boolean", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] @@ -877,7 +878,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -1019,7 +1021,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -1078,144 +1081,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1258,138 +1285,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { - "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "proxy": { + "metadata": { + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1402,54 +1411,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1462,48 +1465,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1516,102 +1525,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1674,7 +1677,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -1708,30 +1712,24 @@ }, "returning": false, "properties": { - "connection": { + "secureSocket": { "metadata": { - "label": "connection", + "label": "secureSocket", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "redis:ConnectionUri|redis:ConnectionParams", - "placeholder": "\"\"", + "valueTypeConstraint": "redis:SecureSocket", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "connection" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ConnectionUri", - "packageInfo": "ballerinax:redis:3.0.2", - "kind": "BASIC_TYPE", - "selected": false - }, - { - "type": "ConnectionParams", + "type": "SecureSocket", "packageInfo": "ballerinax:redis:3.0.2", "kind": "RECORD_TYPE", "selected": false @@ -1762,50 +1760,56 @@ } ] }, - "isClusterConnection": { + "connection": { "metadata": { - "label": "isClusterConnection", + "label": "connection", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "redis:ConnectionUri|redis:ConnectionParams", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "isClusterConnection" + "originalName": "connection" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", + "type": "ConnectionUri", + "packageInfo": "ballerinax:redis:3.0.2", "kind": "BASIC_TYPE", "selected": false + }, + { + "type": "ConnectionParams", + "packageInfo": "ballerinax:redis:3.0.2", + "kind": "RECORD_TYPE", + "selected": false } ] }, - "secureSocket": { + "isClusterConnection": { "metadata": { - "label": "secureSocket", + "label": "isClusterConnection", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "redis:SecureSocket", - "placeholder": "{}", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "isClusterConnection" }, "typeMembers": [ { - "type": "SecureSocket", - "packageInfo": "ballerinax:redis:3.0.2", - "kind": "RECORD_TYPE", + "type": "boolean", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] @@ -1866,7 +1870,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -1900,30 +1905,24 @@ }, "returning": false, "properties": { - "connection": { + "secureSocket": { "metadata": { - "label": "connection", + "label": "secureSocket", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "redis:ConnectionUri|redis:ConnectionParams", - "placeholder": "\"\"", + "valueTypeConstraint": "redis:SecureSocket", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "connection" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ConnectionUri", - "packageInfo": "ballerinax:redis:3.0.2", - "kind": "BASIC_TYPE", - "selected": false - }, - { - "type": "ConnectionParams", + "type": "SecureSocket", "packageInfo": "ballerinax:redis:3.0.2", "kind": "RECORD_TYPE", "selected": false @@ -1954,50 +1953,56 @@ } ] }, - "isClusterConnection": { + "connection": { "metadata": { - "label": "isClusterConnection", + "label": "connection", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "redis:ConnectionUri|redis:ConnectionParams", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "isClusterConnection" + "originalName": "connection" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", + "type": "ConnectionUri", + "packageInfo": "ballerinax:redis:3.0.2", "kind": "BASIC_TYPE", "selected": false + }, + { + "type": "ConnectionParams", + "packageInfo": "ballerinax:redis:3.0.2", + "kind": "RECORD_TYPE", + "selected": false } ] }, - "secureSocket": { + "isClusterConnection": { "metadata": { - "label": "secureSocket", + "label": "isClusterConnection", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "redis:SecureSocket", - "placeholder": "{}", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "isClusterConnection" }, "typeMembers": [ { - "type": "SecureSocket", - "packageInfo": "ballerinax:redis:3.0.2", - "kind": "RECORD_TYPE", + "type": "boolean", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] @@ -2058,7 +2063,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/new_connection3.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/new_connection3.json index 8ad3c9b7a..da71972fc 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/new_connection3.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/new_connection3.json @@ -172,7 +172,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -231,144 +232,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -411,138 +436,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -555,54 +562,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -615,48 +616,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -669,102 +676,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -827,7 +828,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -861,30 +863,24 @@ }, "returning": false, "properties": { - "connection": { + "secureSocket": { "metadata": { - "label": "connection", + "label": "secureSocket", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "redis:ConnectionUri|redis:ConnectionParams", - "placeholder": "\"\"", + "valueTypeConstraint": "redis:SecureSocket", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "connection" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ConnectionUri", - "packageInfo": "ballerinax:redis:3.0.2", - "kind": "BASIC_TYPE", - "selected": false - }, - { - "type": "ConnectionParams", + "type": "SecureSocket", "packageInfo": "ballerinax:redis:3.0.2", "kind": "RECORD_TYPE", "selected": false @@ -915,50 +911,56 @@ } ] }, - "isClusterConnection": { + "connection": { "metadata": { - "label": "isClusterConnection", + "label": "connection", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "redis:ConnectionUri|redis:ConnectionParams", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "isClusterConnection" + "originalName": "connection" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", + "type": "ConnectionUri", + "packageInfo": "ballerinax:redis:3.0.2", "kind": "BASIC_TYPE", "selected": false + }, + { + "type": "ConnectionParams", + "packageInfo": "ballerinax:redis:3.0.2", + "kind": "RECORD_TYPE", + "selected": false } ] }, - "secureSocket": { + "isClusterConnection": { "metadata": { - "label": "secureSocket", + "label": "isClusterConnection", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "redis:SecureSocket", - "placeholder": "{}", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "isClusterConnection" }, "typeMembers": [ { - "type": "SecureSocket", - "packageInfo": "ballerinax:redis:3.0.2", - "kind": "RECORD_TYPE", + "type": "boolean", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] @@ -1019,7 +1021,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -1053,30 +1056,24 @@ }, "returning": false, "properties": { - "connection": { + "secureSocket": { "metadata": { - "label": "connection", + "label": "secureSocket", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "redis:ConnectionUri|redis:ConnectionParams", - "placeholder": "\"\"", + "valueTypeConstraint": "redis:SecureSocket", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "connection" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ConnectionUri", - "packageInfo": "ballerinax:redis:3.0.2", - "kind": "BASIC_TYPE", - "selected": false - }, - { - "type": "ConnectionParams", + "type": "SecureSocket", "packageInfo": "ballerinax:redis:3.0.2", "kind": "RECORD_TYPE", "selected": false @@ -1107,50 +1104,56 @@ } ] }, - "isClusterConnection": { + "connection": { "metadata": { - "label": "isClusterConnection", + "label": "connection", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "redis:ConnectionUri|redis:ConnectionParams", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "isClusterConnection" + "originalName": "connection" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", + "type": "ConnectionUri", + "packageInfo": "ballerinax:redis:3.0.2", "kind": "BASIC_TYPE", "selected": false + }, + { + "type": "ConnectionParams", + "packageInfo": "ballerinax:redis:3.0.2", + "kind": "RECORD_TYPE", + "selected": false } ] }, - "secureSocket": { + "isClusterConnection": { "metadata": { - "label": "secureSocket", + "label": "isClusterConnection", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "redis:SecureSocket", - "placeholder": "{}", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "isClusterConnection" }, "typeMembers": [ { - "type": "SecureSocket", - "packageInfo": "ballerinax:redis:3.0.2", - "kind": "RECORD_TYPE", + "type": "boolean", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] @@ -1211,7 +1214,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -1270,144 +1274,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1450,138 +1478,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "socketConfig" + }, + "typeMembers": [ + { + "type": "ClientSocketConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "laxDataBinding" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1594,54 +1604,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1654,48 +1658,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1708,102 +1718,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1842,7 +1846,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} }, "variable": { "metadata": { @@ -1900,30 +1905,24 @@ }, "returning": false, "properties": { - "connection": { + "secureSocket": { "metadata": { - "label": "connection", + "label": "secureSocket", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "redis:ConnectionUri|redis:ConnectionParams", - "placeholder": "\"\"", + "valueTypeConstraint": "redis:SecureSocket", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "connection" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ConnectionUri", - "packageInfo": "ballerinax:redis:3.0.2", - "kind": "BASIC_TYPE", - "selected": false - }, - { - "type": "ConnectionParams", + "type": "SecureSocket", "packageInfo": "ballerinax:redis:3.0.2", "kind": "RECORD_TYPE", "selected": false @@ -1954,50 +1953,56 @@ } ] }, - "isClusterConnection": { + "connection": { "metadata": { - "label": "isClusterConnection", + "label": "connection", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "redis:ConnectionUri|redis:ConnectionParams", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "isClusterConnection" + "originalName": "connection" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", + "type": "ConnectionUri", + "packageInfo": "ballerinax:redis:3.0.2", "kind": "BASIC_TYPE", "selected": false + }, + { + "type": "ConnectionParams", + "packageInfo": "ballerinax:redis:3.0.2", + "kind": "RECORD_TYPE", + "selected": false } ] }, - "secureSocket": { + "isClusterConnection": { "metadata": { - "label": "secureSocket", + "label": "isClusterConnection", "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "redis:SecureSocket", - "placeholder": "{}", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "isClusterConnection" }, "typeMembers": [ { - "type": "SecureSocket", - "packageInfo": "ballerinax:redis:3.0.2", - "kind": "RECORD_TYPE", + "type": "boolean", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] @@ -2034,7 +2039,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} }, "variable": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/new_connection4.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/new_connection4.json index 39409e46a..7744ead60 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/new_connection4.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/new_connection4.json @@ -89,144 +89,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -269,138 +293,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -413,54 +419,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -473,48 +473,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -527,102 +533,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -685,7 +685,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 5 @@ -825,7 +826,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 5 @@ -951,252 +953,258 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "timeout": { + "retryConfig": { "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", + "valueTypeConstraint": "http:RetryConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "timeout" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "decimal", + "type": "RetryConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "poolConfig": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "poolConfig", + "description": "Configurations associated with request pooling" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:PoolConfiguration|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "poolConfig" }, "typeMembers": [ { - "type": "string", + "type": "PoolConfiguration", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "timeout": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", - "placeholder": "()", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "timeout" }, "typeMembers": [ { - "type": "FollowRedirects", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "decimal", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "poolConfig": { + "forwarded": { "metadata": { - "label": "poolConfig", - "description": "Configurations associated with request pooling" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:PoolConfiguration|()", - "placeholder": "()", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "poolConfig" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "PoolConfiguration", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "string", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cache": { + "socketConfig": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", + "valueTypeConstraint": "http:ClientSocketConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CacheConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "compression": { + "laxDataBinding": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "laxDataBinding" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "boolean", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1209,54 +1217,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1269,48 +1271,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1323,102 +1331,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1481,7 +1483,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 5 @@ -1607,75 +1610,141 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + } + ] + }, + "cache": { + "metadata": { + "label": "cache", + "description": "HTTP caching related configurations" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "http:CacheConfig", + "placeholder": "{}", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "cache" + }, + "typeMembers": [ + { + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + } + ] + }, + "cookieConfig": { + "metadata": { + "label": "cookieConfig", + "description": "Configurations associated with cookies" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "cookieConfig" + }, + "typeMembers": [ + { + "type": "CookieConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "http1Settings": { + "retryConfig": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:RetryConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "http2Settings": { + "poolConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "poolConfig", + "description": "Configurations associated with request pooling" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:PoolConfiguration|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "poolConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "PoolConfiguration", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, @@ -1727,132 +1796,126 @@ } ] }, - "followRedirects": { + "socketConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, - { - "type": "()", - "packageInfo": "", - "kind": "BASIC_TYPE", - "selected": false } ] }, - "poolConfig": { + "laxDataBinding": { "metadata": { - "label": "poolConfig", - "description": "Configurations associated with request pooling" + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:PoolConfiguration|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "poolConfig" + "originalName": "laxDataBinding" }, "typeMembers": [ { - "type": "PoolConfiguration", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cache": { + "proxy": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:ProxyConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CacheConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "compression": { + "httpVersion": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "Compression", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "followRedirects": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1865,24 +1928,24 @@ } ] }, - "retryConfig": { + "secureSocket": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", + "valueTypeConstraint": "http:ClientSecureSocket|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1895,24 +1958,24 @@ } ] }, - "cookieConfig": { + "circuitBreaker": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1925,112 +1988,82 @@ } ] }, - "responseLimits": { + "http2Settings": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", + "valueTypeConstraint": "http:ClientHttp2Settings", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientHttp2Settings", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "proxy": { + "compression": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "compression" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", - "kind": "BASIC_TYPE", - "selected": false - } - ] - }, - "validation": { - "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "validation" - }, - "typeMembers": [ - { - "type": "boolean", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "socketConfig": { + "http1Settings": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", + "valueTypeConstraint": "http:ClientHttp1Settings", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "ClientHttp1Settings", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "laxDataBinding": { + "validation": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", "valueTypeConstraint": "boolean", @@ -2040,7 +2073,7 @@ "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "validation" }, "typeMembers": [ { @@ -2051,36 +2084,6 @@ } ] }, - "secureSocket": { - "metadata": { - "label": "secureSocket", - "description": "" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" - }, - "typeMembers": [ - { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", - "kind": "BASIC_TYPE", - "selected": false - } - ] - }, "checkError": { "metadata": { "label": "Check Error", @@ -2137,7 +2140,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 5 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/panic4.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/panic4.json index 0e02287ec..a55d7f131 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/panic4.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/panic4.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-get1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-get1.json index 1d3242d8d..ba871a0cb 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-get1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-get1.json @@ -60,7 +60,8 @@ "offset": 52 } }, - "sourceCode": "json|error res1 = foodClient->get(\"/pears\");" + "sourceCode": "json|error res1 = foodClient->get(\"/pears\");", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -75,6 +76,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json|error", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -130,23 +148,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "variable": { "metadata": { "label": "Variable Name", @@ -180,8 +181,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -211,7 +213,8 @@ "offset": 63 } }, - "sourceCode": "json|http:ClientError res2 = foodClient->get(\"/pears\");" + "sourceCode": "json|http:ClientError res2 = foodClient->get(\"/pears\");", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -226,6 +229,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json|http:ClientError", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -281,23 +301,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "variable": { "metadata": { "label": "Variable Name", @@ -331,8 +334,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -393,144 +397,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -573,138 +601,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -717,54 +727,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -777,48 +781,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -831,102 +841,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -989,7 +993,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-get2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-get2.json index ed7ae0545..baa6cb05b 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-get2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-get2.json @@ -60,7 +60,8 @@ "offset": 72 } }, - "sourceCode": "var res1 = check foodClient->get(\"/bananas\", targetType = json);" + "sourceCode": "var res1 = check foodClient->get(\"/bananas\", targetType = json);", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -130,24 +131,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "value": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "checkError": { "metadata": { "label": "Check Error", @@ -192,8 +175,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -223,7 +207,8 @@ "offset": 65 } }, - "sourceCode": "_ = check foodClient->get(\"/bananas\", targetType = json);" + "sourceCode": "_ = check foodClient->get(\"/bananas\", targetType = json);", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -293,24 +278,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "value": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "checkError": { "metadata": { "label": "Check Error", @@ -350,7 +317,8 @@ "offset": 79 } }, - "sourceCode": "_ = check foodClient->get(\"/bananas\", targetType = json, headers = ());" + "sourceCode": "_ = check foodClient->get(\"/bananas\", targetType = json, headers = ());", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -421,24 +389,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "value": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "checkError": { "metadata": { "label": "Check Error", @@ -546,144 +496,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -726,138 +700,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -870,54 +826,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -930,48 +880,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -984,102 +940,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1142,7 +1092,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-get3.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-get3.json index 8050c052f..d4f82130b 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-get3.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-get3.json @@ -89,144 +89,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -269,138 +293,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -413,54 +419,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" - }, - "typeMembers": [ - { - "type": "RetryConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, + "originalName": "httpVersion" + }, + "typeMembers": [ { - "type": "()", - "packageInfo": "", + "type": "HttpVersion", + "packageInfo": "ballerina:http:2.13.3", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -473,48 +473,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -527,102 +533,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -685,7 +685,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -783,144 +784,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -963,138 +988,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1107,54 +1114,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1167,48 +1168,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1221,102 +1228,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1379,7 +1380,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-post1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-post1.json index 50adfc07a..9e705553e 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-post1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-post1.json @@ -60,7 +60,8 @@ "offset": 61 } }, - "sourceCode": "json|error res1 = foodClient->post(\"/pears\", \"pear\");" + "sourceCode": "json|error res1 = foodClient->post(\"/pears\", \"pear\");", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -75,6 +76,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json|error", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -185,23 +203,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "variable": { "metadata": { "label": "Variable Name", @@ -235,8 +236,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -267,7 +269,8 @@ } }, "sourceCode": "json|http:ClientError res2 = foodClient->/pears.post(\"pear\");", - "resourcePath": "/path/to/subdirectory" + "resourcePath": "/path/to/subdirectory", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -320,6 +323,23 @@ } } }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json|http:ClientError", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "message": { "metadata": { "label": "message", @@ -405,23 +425,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "additionalValues": { "metadata": { "label": "Additional Values", @@ -449,8 +452,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -511,144 +515,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -691,138 +719,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -835,54 +845,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -895,48 +899,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -949,102 +959,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1107,7 +1111,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-post2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-post2.json index 0449dfc95..f8052f83a 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-post2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-post2.json @@ -60,7 +60,8 @@ "offset": 87 } }, - "sourceCode": "var res1 = check foodClient->post(\"/bananas\", \"red banana\", targetType = json);" + "sourceCode": "var res1 = check foodClient->post(\"/bananas\", \"red banana\", targetType = json);", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -185,24 +186,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "value": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "checkError": { "metadata": { "label": "Check Error", @@ -247,8 +230,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -278,7 +262,8 @@ "offset": 92 } }, - "sourceCode": "_ = check foodClient->post(\"/bananas\", targetType = json, message = \"green banana\");" + "sourceCode": "_ = check foodClient->post(\"/bananas\", targetType = json, message = \"green banana\");", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -403,24 +388,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "value": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "checkError": { "metadata": { "label": "Check Error", @@ -528,144 +495,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -708,138 +699,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -852,54 +825,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -912,48 +879,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -966,102 +939,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1124,7 +1091,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-post3.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-post3.json index 918b84762..51ceee37a 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-post3.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-post3.json @@ -89,144 +89,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -269,138 +293,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -413,54 +419,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" - }, - "typeMembers": [ - { - "type": "RetryConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, + "originalName": "httpVersion" + }, + "typeMembers": [ { - "type": "()", - "packageInfo": "", + "type": "HttpVersion", + "packageInfo": "ballerina:http:2.13.3", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -473,48 +473,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -527,102 +533,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -685,7 +685,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -783,144 +784,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -963,138 +988,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1107,54 +1114,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1167,48 +1168,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1221,102 +1228,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1379,7 +1380,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql1.json index f7012e4d1..5b980e8cd 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql1.json @@ -60,8 +60,7 @@ "offset": 58 } }, - "sourceCode": "stream res1 = mysqlClient->query(``);", - "inferredReturnType": "stream" + "sourceCode": "stream res1 = mysqlClient->query(``);" }, "returning": false, "properties": { @@ -184,8 +183,7 @@ "offset": 85 } }, - "sourceCode": "stream res2 = mysqlClient->query(``);", - "inferredReturnType": "stream" + "sourceCode": "stream res2 = mysqlClient->query(``);" }, "returning": false, "properties": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/resource_action_call-http-get1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/resource_action_call-http-get1.json index d892737d2..b2acaeb05 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/resource_action_call-http-get1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/resource_action_call-http-get1.json @@ -61,7 +61,8 @@ } }, "sourceCode": "json res1 = check foodClient->/western/apples.get();", - "resourcePath": "/path/to/subdirectory" + "resourcePath": "/path/to/subdirectory", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -114,6 +115,23 @@ } } }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "headers": { "metadata": { "label": "headers", @@ -144,23 +162,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "additionalValues": { "metadata": { "label": "Additional Values", @@ -199,8 +200,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -231,7 +233,8 @@ } }, "sourceCode": "json res2 = check foodClient->/apples.get(param1=\"param1\", param2=\"param2\");", - "resourcePath": "/path/to/subdirectory" + "resourcePath": "/path/to/subdirectory", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -284,6 +287,23 @@ } } }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "headers": { "metadata": { "label": "headers", @@ -314,23 +334,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "additionalValues": { "metadata": { "label": "Additional Values", @@ -376,8 +379,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -408,7 +412,8 @@ } }, "sourceCode": "json res3 = check foodClient->/.get();", - "resourcePath": "/path/to/subdirectory" + "resourcePath": "/path/to/subdirectory", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -461,6 +466,23 @@ } } }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "headers": { "metadata": { "label": "headers", @@ -491,23 +513,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "additionalValues": { "metadata": { "label": "Additional Values", @@ -546,8 +551,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -578,7 +584,8 @@ } }, "sourceCode": "var res4 = check foodClient->/apples.get(targetType = json);", - "resourcePath": "/path/to/subdirectory" + "resourcePath": "/path/to/subdirectory", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -631,6 +638,23 @@ } } }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "headers": { "metadata": { "label": "headers", @@ -661,24 +685,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "value": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "additionalValues": { "metadata": { "label": "Additional Values", @@ -686,7 +692,11 @@ }, "valueType": "MAPPING_EXPRESSION_SET", "valueTypeConstraint": "http:QueryParamType", - "value": [], + "value": [ + { + "targetType": "json" + } + ], "placeholder": "[]", "optional": true, "editable": true, @@ -717,8 +727,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -749,7 +760,8 @@ } }, "sourceCode": "json res5 = check foodClient->/apples.get();", - "resourcePath": "/path/to/subdirectory" + "resourcePath": "/path/to/subdirectory", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -802,6 +814,23 @@ } } }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "headers": { "metadata": { "label": "headers", @@ -832,23 +861,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "additionalValues": { "metadata": { "label": "Additional Values", @@ -887,8 +899,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -919,7 +932,8 @@ } }, "sourceCode": "json res6 = check foodClient->/apples.get(headers = {\n \"first-header\": \"first\",\n \"second-header\": \"second\"\n });", - "resourcePath": "/path/to/subdirectory" + "resourcePath": "/path/to/subdirectory", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -972,6 +986,23 @@ } } }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "headers": { "metadata": { "label": "headers", @@ -1003,23 +1034,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "additionalValues": { "metadata": { "label": "Additional Values", @@ -1058,8 +1072,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -1090,7 +1105,8 @@ } }, "sourceCode": "Food res7 = check foodClient->/apples.get();", - "resourcePath": "/path/to/subdirectory" + "resourcePath": "/path/to/subdirectory", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -1143,6 +1159,23 @@ } } }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "Food", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "headers": { "metadata": { "label": "headers", @@ -1173,23 +1206,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "additionalValues": { "metadata": { "label": "Additional Values", @@ -1228,8 +1244,9 @@ "value": "Food", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -1260,7 +1277,8 @@ } }, "sourceCode": "json res8 = check foodClient->/apples/[varRef]/[12 + 3].get();", - "resourcePath": "/path/to/subdirectory" + "resourcePath": "/path/to/subdirectory", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -1313,17 +1331,34 @@ } } }, - "headers": { + "targetType": { "metadata": { - "label": "headers", - "description": "The entity headers" + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "map|()", - "placeholder": "()", - "optional": true, - "editable": true, - "advanced": true, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, + "headers": { + "metadata": { + "label": "headers", + "description": "The entity headers" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "map|()", + "placeholder": "()", + "optional": true, + "editable": true, + "advanced": true, "codedata": { "kind": "DEFAULTABLE", "originalName": "headers" @@ -1343,23 +1378,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "additionalValues": { "metadata": { "label": "Additional Values", @@ -1398,8 +1416,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -1430,7 +1449,8 @@ } }, "sourceCode": "Food res9 = check foodClient->/apples;", - "resourcePath": "/path/to/subdirectory" + "resourcePath": "/path/to/subdirectory", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -1483,6 +1503,23 @@ } } }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "Food", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "headers": { "metadata": { "label": "headers", @@ -1550,8 +1587,9 @@ "value": "Food", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -1612,144 +1650,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1792,138 +1854,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1936,54 +1980,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1996,48 +2034,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -2050,102 +2094,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -2208,7 +2246,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/resource_action_call-http-post1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/resource_action_call-http-post1.json index 98ec0ecbc..633a434ba 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/resource_action_call-http-post1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/resource_action_call-http-post1.json @@ -61,7 +61,8 @@ } }, "sourceCode": "json res1 = check foodClient->/western/apples.post(\"western red apple\");", - "resourcePath": "/path/to/subdirectory" + "resourcePath": "/path/to/subdirectory", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -114,6 +115,23 @@ } } }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "message": { "metadata": { "label": "message", @@ -199,23 +217,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "additionalValues": { "metadata": { "label": "Additional Values", @@ -254,8 +255,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -286,7 +288,8 @@ } }, "sourceCode": "json res2 = check foodClient->/apples.post({\"type\": \"red apple\"}, mediaType = \"application/json\");", - "resourcePath": "/path/to/subdirectory" + "resourcePath": "/path/to/subdirectory", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -339,6 +342,23 @@ } } }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "message": { "metadata": { "label": "message", @@ -425,23 +445,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "additionalValues": { "metadata": { "label": "Additional Values", @@ -480,8 +483,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -512,7 +516,8 @@ } }, "sourceCode": "json res3 = check foodClient->/.post(\"green apple\");", - "resourcePath": "/path/to/subdirectory" + "resourcePath": "/path/to/subdirectory", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -565,6 +570,23 @@ } } }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "message": { "metadata": { "label": "message", @@ -650,23 +672,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "additionalValues": { "metadata": { "label": "Additional Values", @@ -705,8 +710,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -737,7 +743,8 @@ } }, "sourceCode": "var res4 = check foodClient->/apples.post(\"green apple\", targetType = json);", - "resourcePath": "/path/to/subdirectory" + "resourcePath": "/path/to/subdirectory", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -790,6 +797,23 @@ } } }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "message": { "metadata": { "label": "message", @@ -875,24 +899,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "value": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "additionalValues": { "metadata": { "label": "Additional Values", @@ -900,7 +906,11 @@ }, "valueType": "MAPPING_EXPRESSION_SET", "valueTypeConstraint": "http:QueryParamType", - "value": [], + "value": [ + { + "targetType": "json" + } + ], "placeholder": "[]", "optional": true, "editable": true, @@ -931,8 +941,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -963,7 +974,8 @@ } }, "sourceCode": "json res5 = check foodClient->/apples.post(\"red apple\", headers = {\n \"first-header\": \"first\",\n \"second-header\": \"second\"\n });", - "resourcePath": "/path/to/subdirectory" + "resourcePath": "/path/to/subdirectory", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -1016,6 +1028,23 @@ } } }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "message": { "metadata": { "label": "message", @@ -1102,23 +1131,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "additionalValues": { "metadata": { "label": "Additional Values", @@ -1157,8 +1169,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -1189,7 +1202,8 @@ } }, "sourceCode": "Food res6 = check foodClient->/apples.post(\"red apple\");", - "resourcePath": "/path/to/subdirectory" + "resourcePath": "/path/to/subdirectory", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -1242,6 +1256,23 @@ } } }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "Food", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "message": { "metadata": { "label": "message", @@ -1327,23 +1358,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "additionalValues": { "metadata": { "label": "Additional Values", @@ -1382,8 +1396,9 @@ "value": "Food", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -1414,7 +1429,8 @@ } }, "sourceCode": "json res7 = check foodClient->/apples/[varRef]/[12 + 3].post(\"green apple\");", - "resourcePath": "/path/to/subdirectory" + "resourcePath": "/path/to/subdirectory", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -1467,6 +1483,23 @@ } } }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "message": { "metadata": { "label": "message", @@ -1552,23 +1585,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "additionalValues": { "metadata": { "label": "Additional Values", @@ -1607,8 +1623,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -1669,144 +1686,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1849,138 +1890,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1993,54 +2016,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -2053,48 +2070,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -2107,102 +2130,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -2265,7 +2282,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/resource_action_call_github.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/resource_action_call_github.json index 00ed4fdcc..f13d0f164 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/resource_action_call_github.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/resource_action_call_github.json @@ -127,8 +127,9 @@ "value": "github:ManifestConversions", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -249,8 +250,9 @@ "value": "$CompilationError$", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -391,7 +393,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/simple_flow.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/simple_flow.json index 035ecbc18..b426855fe 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/simple_flow.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/simple_flow.json @@ -117,7 +117,8 @@ "offset": 63 } }, - "sourceCode": "json j = check asiri->get(path = \"/doctors/kandy\");" + "sourceCode": "json j = check asiri->get(path = \"/doctors/kandy\");", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -132,6 +133,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -187,23 +205,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "checkError": { "metadata": { "label": "Check Error", @@ -248,8 +249,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -338,7 +340,8 @@ "offset": 53 } }, - "sourceCode": "json j = check nawaloka->get(\"/doctors\");" + "sourceCode": "json j = check nawaloka->get(\"/doctors\");", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -353,6 +356,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -408,23 +428,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "checkError": { "metadata": { "label": "Check Error", @@ -469,8 +472,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -573,144 +577,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -753,138 +781,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -897,54 +907,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -957,48 +961,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1011,102 +1021,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1169,7 +1173,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -1228,144 +1233,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "timeout": { + "auth": { "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "timeout" + "originalName": "auth" }, "typeMembers": [ { - "type": "decimal", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "forwarded": { - "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "forwarded" - }, - "typeMembers": [ + }, { - "type": "string", + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1408,138 +1437,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1552,54 +1563,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1612,48 +1617,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1666,102 +1677,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1824,7 +1829,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/start1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/start1.json index 14e5041e9..6761b3ec1 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/start1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/start1.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/start2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/start2.json index 497f800b3..9ccdbc1d5 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/start2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/start2.json @@ -144,7 +144,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -217,7 +218,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/transaction1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/transaction1.json index 027b0c7b2..fa0704d11 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/transaction1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/transaction1.json @@ -112,7 +112,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/transaction2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/transaction2.json index 9b117c4d9..b168e0947 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/transaction2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/transaction2.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -208,7 +209,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -318,7 +320,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/transaction3.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/transaction3.json index 6631c9dd6..91043b4e9 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/transaction3.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/transaction3.json @@ -178,7 +178,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -245,7 +246,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/transaction4.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/transaction4.json index 77f996683..fde5affab 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/transaction4.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/transaction4.json @@ -135,7 +135,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/transaction5.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/transaction5.json index 8b099f7c2..cf667e343 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/transaction5.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/transaction5.json @@ -135,7 +135,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/transaction6.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/transaction6.json index ab09849b3..44a885a36 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/transaction6.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/transaction6.json @@ -178,7 +178,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -245,7 +246,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable1.json index 4c3db7b23..1317eb3c4 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable1.json @@ -80,7 +80,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -153,7 +154,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -226,7 +228,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -299,7 +302,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -372,7 +376,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -445,7 +450,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -518,7 +524,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -591,7 +598,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable2.json index 839c9f503..345f33001 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable2.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -176,7 +177,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable3.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable3.json index 976f6b0dd..7e05b9294 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable3.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable3.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable4.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable4.json index 055a19705..387d67f7f 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable4.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable4.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -176,7 +177,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -249,7 +251,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable5.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable5.json index 99bdc3de1..b72cb1ed6 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable5.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable5.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable6.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable6.json index 3217f1e1d..61e2a35fd 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable6.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable6.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -176,7 +177,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -249,7 +251,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable7.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable7.json index 319ab4048..903e27689 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable7.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/variable7.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -176,7 +177,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -249,7 +251,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -322,7 +325,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait1.json index 5ac6109b7..175d7ae69 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait1.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -225,7 +226,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait2.json index edfc1a21d..9f39a6d5c 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait2.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -225,7 +226,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait3.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait3.json index 0c6e09c7f..f5dc7e81e 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait3.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait3.json @@ -406,7 +406,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait4.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait4.json index b481bede9..01a54d823 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait4.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait4.json @@ -539,7 +539,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait5.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait5.json index 3f4e29f86..7c93cadf5 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait5.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait5.json @@ -539,7 +539,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait6.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait6.json index 42323ac62..6ff796adb 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait6.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait6.json @@ -539,7 +539,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait7.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait7.json index d9c5caa1c..012d51a45 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait7.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait7.json @@ -707,7 +707,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait8.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait8.json index dc733496b..ff53905d6 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait8.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait8.json @@ -320,7 +320,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait9.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait9.json index 56e71edad..d7dcd2842 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait9.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/wait9.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -176,7 +177,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -249,7 +251,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -322,7 +325,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -481,7 +485,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -640,7 +645,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while1.json index 02c57b27a..10a7f8037 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while1.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -176,7 +177,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -249,7 +251,8 @@ "offset": 77 } }, - "sourceCode": "json|http:ClientError response = foodClient->get(\"/food/apples\");" + "sourceCode": "json|http:ClientError response = foodClient->get(\"/food/apples\");", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -264,6 +267,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json|http:ClientError", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -319,23 +339,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "variable": { "metadata": { "label": "Variable Name", @@ -369,8 +372,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -690,144 +694,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -870,138 +898,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1014,54 +1024,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1074,48 +1078,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1128,102 +1138,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1286,7 +1290,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while2.json index 2f53268dc..d5e81b6e2 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while2.json @@ -152,144 +152,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -332,138 +356,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -476,54 +482,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -536,48 +536,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -590,102 +596,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -748,7 +748,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while3.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while3.json index 8ded1f19c..93bbda00a 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while3.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while3.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -176,7 +177,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -249,7 +251,8 @@ "offset": 67 } }, - "sourceCode": "json response = check foodClient->get(\"/food/oranges\");" + "sourceCode": "json response = check foodClient->get(\"/food/oranges\");", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -264,6 +267,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -319,23 +339,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "checkError": { "metadata": { "label": "Check Error", @@ -380,8 +383,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -610,144 +614,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -790,138 +818,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -934,54 +944,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -994,48 +998,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1048,102 +1058,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1206,7 +1210,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while4.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while4.json index 42cac1352..0f3676b52 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while4.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while4.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -176,7 +177,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -249,7 +251,8 @@ "offset": 66 } }, - "sourceCode": "json response = check foodClient->get(\"/food/mangos\");" + "sourceCode": "json response = check foodClient->get(\"/food/mangos\");", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -264,6 +267,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -319,23 +339,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "checkError": { "metadata": { "label": "Check Error", @@ -380,8 +383,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -665,144 +669,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -845,138 +873,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -989,54 +999,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1049,48 +1053,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1103,102 +1113,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1261,7 +1265,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while5.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while5.json index 52b5d113c..658427251 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while5.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while5.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -176,7 +177,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -249,7 +251,8 @@ "offset": 70 } }, - "sourceCode": "json response = check foodClient->get(\"/food/pineapples\");" + "sourceCode": "json response = check foodClient->get(\"/food/pineapples\");", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -264,6 +267,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -319,23 +339,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "checkError": { "metadata": { "label": "Check Error", @@ -380,8 +383,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -587,7 +591,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -646,144 +651,198 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "timeout": { + "auth": { "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "timeout" + "originalName": "auth" }, "typeMembers": [ { - "type": "decimal", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "retryConfig": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:RetryConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "string", + "type": "RetryConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "poolConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "poolConfig", + "description": "Configurations associated with request pooling" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:PoolConfiguration|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "poolConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "PoolConfiguration", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -796,138 +855,120 @@ } ] }, - "poolConfig": { + "timeout": { "metadata": { - "label": "poolConfig", - "description": "Configurations associated with request pooling" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:PoolConfiguration|()", - "placeholder": "()", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "poolConfig" + "originalName": "timeout" }, "typeMembers": [ { - "type": "PoolConfiguration", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false - }, + } + ] + }, + "forwarded": { + "metadata": { + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "string", + "placeholder": "\"\"", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "forwarded" + }, + "typeMembers": [ { - "type": "()", + "type": "string", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cache": { + "socketConfig": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", + "valueTypeConstraint": "http:ClientSocketConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CacheConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "compression": { + "laxDataBinding": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "laxDataBinding" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "boolean", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "proxy": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -940,54 +981,48 @@ } ] }, - "circuitBreaker": { + "httpVersion": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "retryConfig": { + "followRedirects": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1000,24 +1035,24 @@ } ] }, - "cookieConfig": { + "secureSocket": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:ClientSecureSocket|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1030,112 +1065,112 @@ } ] }, - "responseLimits": { + "circuitBreaker": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "http2Settings": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "ClientHttp2Settings", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, - { - "type": "()", - "packageInfo": "", - "kind": "BASIC_TYPE", - "selected": false } ] }, - "validation": { + "compression": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "compression" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", + "type": "Compression", + "packageInfo": "ballerina:http:2.13.3", "kind": "BASIC_TYPE", "selected": false } ] }, - "socketConfig": { + "http1Settings": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", + "valueTypeConstraint": "http:ClientHttp1Settings", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "ClientHttp1Settings", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "laxDataBinding": { + "validation": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", "valueTypeConstraint": "boolean", @@ -1145,7 +1180,7 @@ "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "validation" }, "typeMembers": [ { @@ -1156,36 +1191,6 @@ } ] }, - "secureSocket": { - "metadata": { - "label": "secureSocket", - "description": "" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" - }, - "typeMembers": [ - { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", - "kind": "BASIC_TYPE", - "selected": false - } - ] - }, "scope": { "metadata": { "label": "Connection Scope", @@ -1242,7 +1247,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -1414,7 +1420,8 @@ "offset": 95 } }, - "sourceCode": "json response = check adminClient->post(\"/admin/restart\", {body: e.message()});" + "sourceCode": "json response = check adminClient->post(\"/admin/restart\", {body: e.message()});", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -1429,6 +1436,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -1539,23 +1563,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "checkError": { "metadata": { "label": "Check Error", @@ -1600,8 +1607,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 1 @@ -1870,144 +1878,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -2050,138 +2082,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -2194,54 +2208,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -2254,48 +2262,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -2308,102 +2322,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -2466,7 +2474,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while6.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while6.json index 3d0c0e89c..6cceda13a 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while6.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while6.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -176,7 +177,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -249,7 +251,8 @@ "offset": 67 } }, - "sourceCode": "json|error response = foodClient->get(\"/food/bananas\");" + "sourceCode": "json|error response = foodClient->get(\"/food/bananas\");", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -264,6 +267,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json|error", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -319,23 +339,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "variable": { "metadata": { "label": "Variable Name", @@ -369,8 +372,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -703,144 +707,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -883,138 +911,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1027,54 +1037,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1087,48 +1091,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1141,102 +1151,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1299,7 +1303,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while7.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while7.json index 95cf05283..01e064fe9 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while7.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while7.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -176,7 +177,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -249,7 +251,8 @@ "offset": 66 } }, - "sourceCode": "json|error response = foodClient->get(\"/food/grapes\");" + "sourceCode": "json|error response = foodClient->get(\"/food/grapes\");", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -264,6 +267,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json|error", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -319,23 +339,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "variable": { "metadata": { "label": "Variable Name", @@ -369,8 +372,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -703,144 +707,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -883,138 +911,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1027,54 +1037,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1087,48 +1091,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1141,102 +1151,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1299,7 +1303,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while8.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while8.json index 2e836e1d3..936e0b11f 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while8.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/while8.json @@ -103,7 +103,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -176,7 +177,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -249,7 +251,8 @@ "offset": 71 } }, - "sourceCode": "json|error response = foodClient->get(\"/food/watermelons\");" + "sourceCode": "json|error response = foodClient->get(\"/food/watermelons\");", + "inferredReturnType": "targetType" }, "returning": false, "properties": { @@ -264,6 +267,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json|error", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -319,23 +339,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "json", - "placeholder": "json", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "variable": { "metadata": { "label": "Variable Name", @@ -369,8 +372,9 @@ "value": "json", "placeholder": "var", "optional": false, - "editable": true, - "advanced": false + "editable": false, + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -789,144 +793,168 @@ } ] }, - "httpVersion": { + "responseLimits": { "metadata": { - "label": "httpVersion", - "description": "The HTTP version understood by the client" + "label": "responseLimits", + "description": "Configurations associated with inbound response size limits" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:HttpVersion", - "placeholder": "\"2.0\"", + "valueTypeConstraint": "http:ResponseLimitConfigs", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "httpVersion" + "originalName": "responseLimits" }, "typeMembers": [ { - "type": "HttpVersion", + "type": "ResponseLimitConfigs", "packageInfo": "ballerina:http:2.13.3", - "kind": "BASIC_TYPE", + "kind": "RECORD_TYPE", "selected": false } ] }, - "http1Settings": { + "cache": { "metadata": { - "label": "http1Settings", - "description": "Configurations related to HTTP/1.x protocol" + "label": "cache", + "description": "HTTP caching related configurations" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp1Settings", + "valueTypeConstraint": "http:CacheConfig", "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http1Settings" + "originalName": "cache" }, "typeMembers": [ { - "type": "ClientHttp1Settings", + "type": "CacheConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false } ] }, - "http2Settings": { + "cookieConfig": { "metadata": { - "label": "http2Settings", - "description": "Configurations related to HTTP/2 protocol" + "label": "cookieConfig", + "description": "Configurations associated with cookies" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientHttp2Settings", - "placeholder": "{}", + "valueTypeConstraint": "http:CookieConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "http2Settings" + "originalName": "cookieConfig" }, "typeMembers": [ { - "type": "ClientHttp2Settings", + "type": "CookieConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - } - ] - }, - "timeout": { - "metadata": { - "label": "timeout", - "description": "The maximum time to wait (in seconds) for a response before closing the connection" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "decimal", - "placeholder": "0.0d", - "optional": true, - "editable": true, - "advanced": true, - "codedata": { - "kind": "INCLUDED_FIELD", - "originalName": "timeout" - }, - "typeMembers": [ + }, { - "type": "decimal", + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "forwarded": { + "auth": { "metadata": { - "label": "forwarded", - "description": "The choice of setting `forwarded`/`x-forwarded` header" + "label": "auth", + "description": "Configurations related to client authentication" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "string", - "placeholder": "\"\"", + "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "forwarded" + "originalName": "auth" }, "typeMembers": [ { - "type": "string", + "type": "CredentialsConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "BearerTokenConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "JwtIssuerConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2ClientCredentialsGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2PasswordGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2RefreshTokenGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "OAuth2JwtBearerGrantConfig", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", + "selected": false + }, + { + "type": "()", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "followRedirects": { + "retryConfig": { "metadata": { - "label": "followRedirects", - "description": "Configurations associated with Redirection" + "label": "retryConfig", + "description": "Configurations associated with retrying" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:FollowRedirects|()", + "valueTypeConstraint": "http:RetryConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "followRedirects" + "originalName": "retryConfig" }, "typeMembers": [ { - "type": "FollowRedirects", + "type": "RetryConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -969,138 +997,120 @@ } ] }, - "cache": { + "timeout": { "metadata": { - "label": "cache", - "description": "HTTP caching related configurations" + "label": "timeout", + "description": "The maximum time to wait (in seconds) for a response before closing the connection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CacheConfig", - "placeholder": "{}", + "valueTypeConstraint": "decimal", + "placeholder": "0.0d", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cache" + "originalName": "timeout" }, "typeMembers": [ { - "type": "CacheConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "type": "decimal", + "packageInfo": "", + "kind": "BASIC_TYPE", "selected": false } ] }, - "compression": { + "forwarded": { "metadata": { - "label": "compression", - "description": "Specifies the way of handling compression (`accept-encoding`) header" + "label": "forwarded", + "description": "The choice of setting `forwarded`/`x-forwarded` header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:Compression", - "placeholder": "\"AUTO\"", + "valueTypeConstraint": "string", + "placeholder": "\"\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "compression" + "originalName": "forwarded" }, "typeMembers": [ { - "type": "Compression", - "packageInfo": "ballerina:http:2.13.3", + "type": "string", + "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "auth": { + "socketConfig": { "metadata": { - "label": "auth", - "description": "Configurations related to client authentication" + "label": "socketConfig", + "description": "Provides settings related to client socket configuration" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CredentialsConfig|http:BearerTokenConfig|http:JwtIssuerConfig|http:OAuth2ClientCredentialsGrantConfig|http:OAuth2PasswordGrantConfig|http:OAuth2RefreshTokenGrantConfig|http:OAuth2JwtBearerGrantConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:ClientSocketConfig", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "auth" + "originalName": "socketConfig" }, "typeMembers": [ { - "type": "CredentialsConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "BearerTokenConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "JwtIssuerConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2ClientCredentialsGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2PasswordGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2RefreshTokenGrantConfig", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "OAuth2JwtBearerGrantConfig", + "type": "ClientSocketConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false - }, + } + ] + }, + "laxDataBinding": { + "metadata": { + "label": "laxDataBinding", + "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "boolean", + "placeholder": "false", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "INCLUDED_FIELD", + "originalName": "laxDataBinding" + }, + "typeMembers": [ { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "circuitBreaker": { + "proxy": { "metadata": { - "label": "circuitBreaker", - "description": "Configurations associated with the behaviour of the Circuit Breaker" + "label": "proxy", + "description": "Proxy server related options" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CircuitBreakerConfig|()", + "valueTypeConstraint": "http:ProxyConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "circuitBreaker" + "originalName": "proxy" }, "typeMembers": [ { - "type": "CircuitBreakerConfig", + "type": "ProxyConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1113,54 +1123,48 @@ } ] }, - "retryConfig": { + "httpVersion": { "metadata": { - "label": "retryConfig", - "description": "Configurations associated with retrying" + "label": "httpVersion", + "description": "The HTTP version understood by the client" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RetryConfig|()", - "placeholder": "()", + "valueTypeConstraint": "http:HttpVersion", + "placeholder": "\"2.0\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "retryConfig" + "originalName": "httpVersion" }, "typeMembers": [ { - "type": "RetryConfig", + "type": "HttpVersion", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", - "packageInfo": "", "kind": "BASIC_TYPE", "selected": false } ] }, - "cookieConfig": { + "followRedirects": { "metadata": { - "label": "cookieConfig", - "description": "Configurations associated with cookies" + "label": "followRedirects", + "description": "Configurations associated with Redirection" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:CookieConfig|()", + "valueTypeConstraint": "http:FollowRedirects|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "cookieConfig" + "originalName": "followRedirects" }, "typeMembers": [ { - "type": "CookieConfig", + "type": "FollowRedirects", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1173,48 +1177,54 @@ } ] }, - "responseLimits": { + "secureSocket": { "metadata": { - "label": "responseLimits", - "description": "Configurations associated with inbound response size limits" + "label": "secureSocket", + "description": "" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ResponseLimitConfigs", - "placeholder": "{}", + "valueTypeConstraint": "http:ClientSecureSocket|()", + "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "responseLimits" + "originalName": "secureSocket" }, "typeMembers": [ { - "type": "ResponseLimitConfigs", + "type": "ClientSecureSocket", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false + }, + { + "type": "()", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false } ] }, - "proxy": { + "circuitBreaker": { "metadata": { - "label": "proxy", - "description": "Proxy server related options" + "label": "circuitBreaker", + "description": "Configurations associated with the behaviour of the Circuit Breaker" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ProxyConfig|()", + "valueTypeConstraint": "http:CircuitBreakerConfig|()", "placeholder": "()", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "proxy" + "originalName": "circuitBreaker" }, "typeMembers": [ { - "type": "ProxyConfig", + "type": "CircuitBreakerConfig", "packageInfo": "ballerina:http:2.13.3", "kind": "RECORD_TYPE", "selected": false @@ -1227,102 +1237,96 @@ } ] }, - "validation": { + "http2Settings": { "metadata": { - "label": "validation", - "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" + "label": "http2Settings", + "description": "Configurations related to HTTP/2 protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp2Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "validation" + "originalName": "http2Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp2Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "socketConfig": { + "compression": { "metadata": { - "label": "socketConfig", - "description": "Provides settings related to client socket configuration" + "label": "compression", + "description": "Specifies the way of handling compression (`accept-encoding`) header" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSocketConfig", - "placeholder": "{}", + "valueTypeConstraint": "http:Compression", + "placeholder": "\"AUTO\"", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "socketConfig" + "originalName": "compression" }, "typeMembers": [ { - "type": "ClientSocketConfig", + "type": "Compression", "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", + "kind": "BASIC_TYPE", "selected": false } ] }, - "laxDataBinding": { + "http1Settings": { "metadata": { - "label": "laxDataBinding", - "description": "Enables or disables relaxed data binding on the client side. Disabled by default.\nWhen enabled, the JSON data will be projected to the Ballerina record type and\nduring the projection, nil values will be considered as optional fields and\nabsent fields will be considered for nilable types" + "label": "http1Settings", + "description": "Configurations related to HTTP/1.x protocol" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "boolean", - "placeholder": "false", + "valueTypeConstraint": "http:ClientHttp1Settings", + "placeholder": "{}", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "laxDataBinding" + "originalName": "http1Settings" }, "typeMembers": [ { - "type": "boolean", - "packageInfo": "", - "kind": "BASIC_TYPE", + "type": "ClientHttp1Settings", + "packageInfo": "ballerina:http:2.13.3", + "kind": "RECORD_TYPE", "selected": false } ] }, - "secureSocket": { + "validation": { "metadata": { - "label": "secureSocket", - "description": "" + "label": "validation", + "description": "Enables the inbound payload validation functionalty which provided by the constraint package. Enabled by default" }, "valueType": "EXPRESSION", - "valueTypeConstraint": "http:ClientSecureSocket|()", - "placeholder": "()", + "valueTypeConstraint": "boolean", + "placeholder": "false", "optional": true, "editable": true, "advanced": true, "codedata": { "kind": "INCLUDED_FIELD", - "originalName": "secureSocket" + "originalName": "validation" }, "typeMembers": [ { - "type": "ClientSecureSocket", - "packageInfo": "ballerina:http:2.13.3", - "kind": "RECORD_TYPE", - "selected": false - }, - { - "type": "()", + "type": "boolean", "packageInfo": "", "kind": "BASIC_TYPE", "selected": false @@ -1385,7 +1389,8 @@ "placeholder": "var", "optional": false, "editable": false, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 1 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/xml_payload.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/xml_payload.json index c03013ab6..ad90c6d64 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/xml_payload.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/xml_payload.json @@ -80,7 +80,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -153,7 +154,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -226,7 +228,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -299,7 +302,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 @@ -372,7 +376,8 @@ "placeholder": "var", "optional": false, "editable": true, - "advanced": false + "advanced": false, + "codedata": {} } }, "flags": 0 diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/source/mysql.bal b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/source/mysql.bal index a76049d24..03745da5a 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/source/mysql.bal +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/source/mysql.bal @@ -12,3 +12,7 @@ public function main() returns error? { stream res1 = mysqlClient->query(``); stream res2 = mysqlClient->query(``); } + +function fn() returns error? { + Row queryRow = check mysqlClient->queryRow(``); +} From 6e06f68cb14ffd5f01ce7eee25cce38c9d43183c Mon Sep 17 00:00:00 2001 From: Nipuna Fernando Date: Wed, 5 Mar 2025 00:28:41 +0530 Subject: [PATCH 13/24] Extend the impl to other call types --- .../core/model/node/FunctionCall.java | 4 +- .../core/model/node/MethodCall.java | 4 +- .../model/node/ResourceActionCallBuilder.java | 4 +- .../function_call-json-parseString.json | 136 ++++++++++++++ .../function_call-json-parseString.json | 167 ++++++++++++++++++ 5 files changed, 309 insertions(+), 6 deletions(-) create mode 100644 flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-json-parseString.json create mode 100644 flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/to_source/config/function_call-json-parseString.json diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/FunctionCall.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/FunctionCall.java index f1bb83575..9ea975271 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/FunctionCall.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/FunctionCall.java @@ -42,7 +42,7 @@ public class FunctionCall extends CallBuilder { @Override public Map> toSource(SourceBuilder sourceBuilder) { - sourceBuilder.newVariable(); + sourceBuilder.newVariableWithInferredType(); FlowNode flowNode = sourceBuilder.flowNode; if (FlowNodeUtil.hasCheckKeyFlagSet(flowNode)) { @@ -70,7 +70,7 @@ public Map> toSource(SourceBuilder sourceBuilder) { .stepOut() .functionParameters(flowNode, Set.of("variable", "type", "view", "checkError")) .textEdit(false) - .acceptImport(sourceBuilder.filePath) + .acceptImportWithVariableType() .build(); } diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/MethodCall.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/MethodCall.java index e4b662c93..0c3419538 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/MethodCall.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/MethodCall.java @@ -42,7 +42,7 @@ public class MethodCall extends CallBuilder { @Override public Map> toSource(SourceBuilder sourceBuilder) { - sourceBuilder.newVariable(); + sourceBuilder.newVariableWithInferredType(); FlowNode flowNode = sourceBuilder.flowNode; if (FlowNodeUtil.hasCheckKeyFlagSet(flowNode)) { @@ -62,7 +62,7 @@ public Map> toSource(SourceBuilder sourceBuilder) { .functionParameters(flowNode, Set.of(Property.CONNECTION_KEY, Property.VARIABLE_KEY, Property.TYPE_KEY, Property.CHECK_ERROR_KEY, "view")) .textEdit(false) - .acceptImport(sourceBuilder.filePath) + .acceptImportWithVariableType() .build(); } diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/ResourceActionCallBuilder.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/ResourceActionCallBuilder.java index 363cea4be..fb411682a 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/ResourceActionCallBuilder.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/ResourceActionCallBuilder.java @@ -102,7 +102,7 @@ public void setConcreteTemplateData(TemplateContext context) { @Override public Map> toSource(SourceBuilder sourceBuilder) { - sourceBuilder.newVariable(); + sourceBuilder.newVariableWithInferredType(); FlowNode flowNode = sourceBuilder.flowNode; if (FlowNodeUtil.hasCheckKeyFlagSet(flowNode)) { @@ -159,7 +159,7 @@ public Map> toSource(SourceBuilder sourceBuilder) { .stepOut() .functionParameters(flowNode, ignoredKeys) .textEdit(false) - .acceptImport() + .acceptImportWithVariableType() .build(); } diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-json-parseString.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-json-parseString.json new file mode 100644 index 000000000..89b5a07e5 --- /dev/null +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-json-parseString.json @@ -0,0 +1,136 @@ +{ + "source": "data_mapper/main.bal", + "position": { + "line": 14, + "offset": 0 + }, + "description": "Sample diagram node", + "codedata": { + "node": "FUNCTION_CALL", + "org": "ballerina", + "module": "data.jsondata", + "symbol": "parseString", + "version": "0.2.0" + }, + "output": { + "id": "31", + "metadata": { + "label": "parseString", + "description": "Converts JSON string to subtype of anydata.\n", + "icon": "https://bcentral-packageicons.azureedge.net/images/ballerina_data.jsondata_0.2.0.png" + }, + "codedata": { + "node": "FUNCTION_CALL", + "org": "ballerina", + "module": "data.jsondata", + "symbol": "parseString", + "version": "0.2.0", + "id": 597, + "inferredReturnType": "t" + }, + "returning": false, + "properties": { + "s": { + "metadata": { + "label": "s", + "description": "Source JSON string value or byte[] or byte-block-stream" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "string", + "placeholder": "\"\"", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "REQUIRED", + "originalName": "s" + }, + "typeMembers": [ + { + "type": "string", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false + } + ] + }, + "options": { + "metadata": { + "label": "options", + "description": "Options to be used for filtering in the projection" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "jsondata:Options", + "placeholder": "{}", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "DEFAULTABLE", + "originalName": "options" + }, + "typeMembers": [ + { + "type": "jsondata:Options", + "packageInfo": "ballerina:data.jsondata:0.2.0", + "kind": "RECORD_TYPE", + "selected": false + } + ] + }, + "t": { + "metadata": { + "label": "t", + "description": "Target type" + }, + "valueType": "TYPE", + "valueTypeConstraint": "anydata", + "placeholder": "anydata", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "t" + }, + "typeMembers": [] + }, + "type": { + "metadata": { + "label": "Variable Type", + "description": "Type of the variable" + }, + "valueType": "TYPE", + "value": "t", + "placeholder": "var", + "optional": false, + "editable": true, + "advanced": false, + "codedata": {} + }, + "variable": { + "metadata": { + "label": "Variable Name", + "description": "Name of the variable" + }, + "valueType": "IDENTIFIER", + "value": "t", + "optional": false, + "editable": true, + "advanced": false + }, + "checkError": { + "metadata": { + "label": "Check Error", + "description": "Trigger error flow" + }, + "valueType": "FLAG", + "value": true, + "optional": false, + "editable": true, + "advanced": true + } + }, + "flags": 0 + } +} diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/to_source/config/function_call-json-parseString.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/to_source/config/function_call-json-parseString.json new file mode 100644 index 000000000..a29708bee --- /dev/null +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/to_source/config/function_call-json-parseString.json @@ -0,0 +1,167 @@ +{ + "source": "empty.bal", + "description": "Sample diagram node", + "diagram": { + "id": "31", + "metadata": { + "label": "parseString", + "description": "Converts JSON string to subtype of anydata.\n", + "icon": "https://bcentral-packageicons.azureedge.net/images/ballerina_data.jsondata_0.2.0.png" + }, + "codedata": { + "node": "FUNCTION_CALL", + "org": "ballerina", + "module": "data.jsondata", + "symbol": "parseString", + "version": "0.2.0", + "id": 597, + "inferredReturnType": "t", + "lineRange": { + "fileName": "test.bal", + "startLine": { + "line": 0, + "offset": 0 + }, + "endLine": { + "line": 0, + "offset": 0 + } + } + }, + "returning": false, + "properties": { + "s": { + "metadata": { + "label": "s", + "description": "Source JSON string value or byte[] or byte-block-stream" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "string", + "placeholder": "\"\"", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "REQUIRED", + "originalName": "s" + }, + "typeMembers": [ + { + "type": "string", + "packageInfo": "", + "kind": "BASIC_TYPE", + "selected": false + } + ] + }, + "options": { + "metadata": { + "label": "options", + "description": "Options to be used for filtering in the projection" + }, + "valueType": "EXPRESSION", + "valueTypeConstraint": "jsondata:Options", + "placeholder": "{}", + "optional": true, + "editable": true, + "advanced": true, + "codedata": { + "kind": "DEFAULTABLE", + "originalName": "options" + }, + "typeMembers": [ + { + "type": "jsondata:Options", + "packageInfo": "ballerina:data.jsondata:0.2.0", + "kind": "RECORD_TYPE", + "selected": false + } + ] + }, + "t": { + "metadata": { + "label": "t", + "description": "Target type" + }, + "value": "Row", + "valueType": "TYPE", + "valueTypeConstraint": "anydata", + "placeholder": "anydata", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "t" + }, + "typeMembers": [] + }, + "type": { + "metadata": { + "label": "Variable Type", + "description": "Type of the variable" + }, + "valueType": "TYPE", + "value": "t", + "placeholder": "var", + "optional": false, + "editable": true, + "advanced": false, + "codedata": {} + }, + "variable": { + "metadata": { + "label": "Variable Name", + "description": "Name of the variable" + }, + "valueType": "IDENTIFIER", + "value": "t", + "optional": false, + "editable": true, + "advanced": false + }, + "checkError": { + "metadata": { + "label": "Check Error", + "description": "Trigger error flow" + }, + "valueType": "FLAG", + "value": true, + "optional": false, + "editable": true, + "advanced": true + } + }, + "flags": 0 + }, + "output": { + "empty.bal": [ + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "newText": "import ballerina/data.jsondata;" + }, + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "newText": "Row t = check jsondata:parseString(\"\");" + } + ] + } +} From b46d859062d272e382f0a49e53b4b8359c3cb9a4 Mon Sep 17 00:00:00 2001 From: Nipuna Fernando Date: Wed, 5 Mar 2025 00:28:52 +0530 Subject: [PATCH 14/24] Ignore bin directories generated by idea --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 0d406b740..15f5dab18 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ hs_err_pid* .idea +**/bin/ # mac .DS_Store From a6c5a5534f963b87342c2440981d5338c14d6977 Mon Sep 17 00:00:00 2001 From: Nipuna Fernando Date: Wed, 5 Mar 2025 00:29:55 +0530 Subject: [PATCH 15/24] Fix the deriving of inferred type --- .../flowmodelgenerator/core/CodeAnalyzer.java | 75 ++++++------------- 1 file changed, 21 insertions(+), 54 deletions(-) diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/CodeAnalyzer.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/CodeAnalyzer.java index a166021d9..400b7798b 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/CodeAnalyzer.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/CodeAnalyzer.java @@ -1258,11 +1258,16 @@ private void processFunctionSymbol(NonTerminalNode callNode, SeparatedNodeList inferredTypeName = getInferredTypeName(functionTypeSymbol, key); - nodeBuilder.codedata().inferredReturnType(functionData.returnType()); - if (inferredTypeName.isEmpty()) { + Optional symbol = semanticModel.symbol(typedBindingPatternNode); + if (symbol.isEmpty() || symbol.get().kind() != SymbolKind.VARIABLE) { return; } + String variableType = + CommonUtils.getTypeSignature(((VariableSymbol) symbol.get()).typeDescriptor(), moduleInfo); + String returnType = functionData.returnType(); + String inferredTypeName = deriveInferredType(variableType, returnType, key); + + nodeBuilder.codedata().inferredReturnType(functionData.returnError() ? returnType : null); String unescapedParamName = ParamUtils.removeLeadingSingleQuote(paramResult.name()); nodeBuilder.properties().custom() .metadata() @@ -1271,7 +1276,7 @@ private void processFunctionSymbol(NonTerminalNode callNode, SeparatedNodeList getInferredTypeName(FunctionTypeSymbol functionTypeSymbol, String parameterName) { - try { - TypeSymbol variableTypeSymbol = - ((VariableSymbol) (semanticModel.symbol(typedBindingPatternNode).orElseThrow())).typeDescriptor(); - TypeSymbol returnTypeSymbol = functionTypeSymbol.returnTypeDescriptor().orElseThrow(); - - // Check if the inferred type is the same as the return type - if (variableTypeSymbol.kind() != returnTypeSymbol.kind()) { - return Optional.empty(); - } - - return switch (returnTypeSymbol.typeKind()) { - case STREAM -> { - StreamTypeSymbol descriptorSymbol = (StreamTypeSymbol) returnTypeSymbol; - StreamTypeSymbol variableSymbol = (StreamTypeSymbol) variableTypeSymbol; - Optional typeParamName = getInferredTypeName(descriptorSymbol.typeParameter(), - variableSymbol.typeParameter(), parameterName); - if (typeParamName.isPresent()) { - yield typeParamName; - } - yield getInferredTypeName(descriptorSymbol.completionValueTypeParameter(), - variableSymbol.completionValueTypeParameter(), parameterName); - } - case UNION -> getInferredTypeFromMembers(((UnionTypeSymbol) returnTypeSymbol).memberTypeDescriptors(), - ((UnionTypeSymbol) variableTypeSymbol).memberTypeDescriptors(), parameterName); - case INTERSECTION -> - getInferredTypeFromMembers(((IntersectionTypeSymbol) returnTypeSymbol).memberTypeDescriptors(), - ((IntersectionTypeSymbol) variableTypeSymbol).memberTypeDescriptors(), parameterName); - default -> getInferredTypeName(returnTypeSymbol, variableTypeSymbol, parameterName); - }; - } catch (Throwable e) { - return Optional.empty(); - } - } - - private Optional getInferredTypeFromMembers(List descriptorMembers, - List variableSymbols, String parameterName) { - for (int i = 0; i < descriptorMembers.size(); i++) { - Optional typeParamName = - getInferredTypeName(descriptorMembers.get(i), variableSymbols.get(i), parameterName); - if (typeParamName.isPresent()) { - return typeParamName; - } + private static String deriveInferredType(String variableType, String returnType, String key) { + int keyIndex = returnType.indexOf(key); + if (keyIndex == -1) { + // If key is not found, fallback to returning variableType. + return variableType; } - return Optional.empty(); - } + String prefix = returnType.substring(0, keyIndex); + String suffix = returnType.substring(keyIndex + key.length()); - private Optional getInferredTypeName(TypeSymbol descriptorSymbol, TypeSymbol variableSymbol, - String parameterName) { - if (CommonUtils.getTypeSignature(descriptorSymbol, moduleInfo).equals(parameterName)) { - return Optional.of(CommonUtils.getTypeSignature(variableSymbol, moduleInfo)); + // Check if variableType has the same structure as returnType. + if (variableType.startsWith(prefix) && variableType.endsWith(suffix)) { + return variableType.substring(prefix.length(), variableType.length() - suffix.length()); } - return Optional.empty(); + // If the structure doesn't match, return variableType as fallback. + return variableType; } private static String getIdentifierName(NameReferenceNode nameReferenceNode) { From 64f6d5ecd3bb81ae80354f634ab3e8fef5effc12 Mon Sep 17 00:00:00 2001 From: Nipuna Fernando Date: Wed, 5 Mar 2025 00:49:57 +0530 Subject: [PATCH 16/24] Calculate inferred type from named args --- .../flowmodelgenerator/core/CodeAnalyzer.java | 29 +++++++---- .../core/model/Codedata.java | 27 +++++----- .../core/model/node/CallBuilder.java | 1 - .../config/remote_action_call-http-get2.json | 51 +++++++++++++++++++ .../config/remote_action_call-http-post2.json | 34 +++++++++++++ .../to_source/config/function_call-user.json | 2 +- 6 files changed, 120 insertions(+), 24 deletions(-) diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/CodeAnalyzer.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/CodeAnalyzer.java index 400b7798b..5e68b9a2c 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/CodeAnalyzer.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/CodeAnalyzer.java @@ -23,10 +23,8 @@ import io.ballerina.compiler.api.symbols.ClassSymbol; import io.ballerina.compiler.api.symbols.FunctionSymbol; import io.ballerina.compiler.api.symbols.FunctionTypeSymbol; -import io.ballerina.compiler.api.symbols.IntersectionTypeSymbol; import io.ballerina.compiler.api.symbols.MethodSymbol; import io.ballerina.compiler.api.symbols.ParameterSymbol; -import io.ballerina.compiler.api.symbols.StreamTypeSymbol; import io.ballerina.compiler.api.symbols.Symbol; import io.ballerina.compiler.api.symbols.SymbolKind; import io.ballerina.compiler.api.symbols.TypeDescKind; @@ -1257,15 +1255,28 @@ private void processFunctionSymbol(NonTerminalNode callNode, SeparatedNodeList symbol = semanticModel.symbol(typedBindingPatternNode); - if (symbol.isEmpty() || symbol.get().kind() != SymbolKind.VARIABLE) { - return; + // Derive the value of ht inferred type name + String inferredTypeName; + // Check if the value exists in the named arg map + Node node = namedArgValueMap.get(key); + if (node != null) { + inferredTypeName = node.toSourceCode(); + } else if (typedBindingPatternNode == null) { + // Get the default value if the variable is absent + inferredTypeName = paramResult.defaultValue(); + } else { + // Derive the inferred type from the variable type + Optional symbol = semanticModel.symbol(typedBindingPatternNode); + if (symbol.isEmpty() || symbol.get().kind() != SymbolKind.VARIABLE) { + return; + } + String variableType = + CommonUtils.getTypeSignature(((VariableSymbol) symbol.get()).typeDescriptor(), moduleInfo); + + inferredTypeName = deriveInferredType(variableType, returnType, key); } - String variableType = - CommonUtils.getTypeSignature(((VariableSymbol) symbol.get()).typeDescriptor(), moduleInfo); - String returnType = functionData.returnType(); - String inferredTypeName = deriveInferredType(variableType, returnType, key); nodeBuilder.codedata().inferredReturnType(functionData.returnError() ? returnType : null); String unescapedParamName = ParamUtils.removeLeadingSingleQuote(paramResult.name()); diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/Codedata.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/Codedata.java index a6ed31a6a..6fcb9b784 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/Codedata.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/Codedata.java @@ -24,19 +24,20 @@ /** * Represents the properties that uniquely identifies a node in the diagram. * - * @param node The kind of the component - * @param org The organization which the component belongs to - * @param module The module which the component belongs to - * @param object The object of the component if it is a method or an action call - * @param symbol The symbol of the component - * @param version The version of the component - * @param lineRange The line range of the component - * @param sourceCode The source code of the component - * @param parentSymbol The parent symbol of the component - * @param resourcePath The path of the resource function - * @param id The unique identifier of the component if exists - * @param isNew Whether the component is a node template - * @param isGenerated The component is auto generated or not + * @param node The kind of the component + * @param org The organization which the component belongs to + * @param module The module which the component belongs to + * @param object The object of the component if it is a method or an action call + * @param symbol The symbol of the component + * @param version The version of the component + * @param lineRange The line range of the component + * @param sourceCode The source code of the component + * @param parentSymbol The parent symbol of the component + * @param resourcePath The path of the resource function + * @param id The unique identifier of the component if exists + * @param isNew Whether the component is a node template + * @param isGenerated The component is auto generated or not + * @param inferredReturnType The inferred return type of the component if exists * @since 2.0.0 */ public record Codedata(NodeKind node, String org, String module, String object, String symbol, diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/CallBuilder.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/CallBuilder.java index 1c57c12c1..354c63650 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/CallBuilder.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/CallBuilder.java @@ -109,7 +109,6 @@ public void setConcreteTemplateData(TemplateContext context) { } setParameterProperties(functionData); - String returnTypeName = functionData.returnType(); if (CommonUtils.hasReturn(functionData.returnType())) { setReturnTypeProperties(functionData, context, functionData.inferredReturnType(), Property.VARIABLE_NAME); } diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-get2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-get2.json index baa6cb05b..c84ce638e 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-get2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-get2.json @@ -76,6 +76,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -223,6 +240,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -333,6 +367,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-post2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-post2.json index f8052f83a..e6654fa35 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-post2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-http-post2.json @@ -76,6 +76,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -278,6 +295,23 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "value": "json", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/to_source/config/function_call-user.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/to_source/config/function_call-user.json index 85e088906..ac900c0a4 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/to_source/config/function_call-user.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/to_source/config/function_call-user.json @@ -46,7 +46,7 @@ "description": "Type of the variable" }, "valueType": "TYPE", - "value": "", + "value": "var", "placeholder": "var", "optional": false, "editable": true, From 8dfbcda1033355998ffcce8d072b8711a1dc474c Mon Sep 17 00:00:00 2001 From: Nipuna Fernando Date: Wed, 5 Mar 2025 00:51:53 +0530 Subject: [PATCH 17/24] Update the failing test cases --- .../flowmodelgenerator/core/CodeAnalyzer.java | 5 +- .../core/model/SourceBuilder.java | 1 + .../config/config1.json | 6 +- .../config/config2.json | 6 +- .../config/config3.json | 6 +- .../config/config4.json | 12 +- .../config/config5.json | 12 +- .../resources/module_nodes/config/proj.json | 621 +++++++++--------- .../resources/module_nodes/config/single.json | 621 +++++++++--------- .../openapi_client_gen/config/config1.json | 3 +- .../openapi_client_gen/config/config2.json | 3 +- .../openapi_client_gen/config/config3.json | 3 +- .../config/error_handler3.json | 3 +- .../suggested_flow_model/config/if1.json | 8 +- .../suggested_flow_model/config/if2.json | 8 +- .../suggested_flow_model/config/if3.json | 16 +- .../suggested_flow_model/config/if4.json | 6 +- .../suggested_flow_model/config/if5.json | 6 +- .../suggested_flow_model/config/if6.json | 9 +- .../suggested_flow_model/config/if7.json | 9 +- 20 files changed, 704 insertions(+), 660 deletions(-) diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/CodeAnalyzer.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/CodeAnalyzer.java index 5e68b9a2c..77b558a4d 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/CodeAnalyzer.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/CodeAnalyzer.java @@ -1257,7 +1257,7 @@ private void processFunctionSymbol(NonTerminalNode callNode, SeparatedNodeList Date: Wed, 5 Mar 2025 01:35:04 +0530 Subject: [PATCH 18/24] Pull the sql module if not exists --- .../modules/flow-model-generator-ls-extension/build.gradle | 1 + .../src/test/resources/diagram_generator/config/flags2.json | 3 +++ 2 files changed, 4 insertions(+) diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/build.gradle b/flow-model-generator/modules/flow-model-generator-ls-extension/build.gradle index 64e94f7a0..98059b29e 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/build.gradle +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/build.gradle @@ -107,6 +107,7 @@ test.dependsOn rootProject.pullBallerinaModule('trigger.salesforce') test.dependsOn rootProject.pullBallerinaModule('github') test.dependsOn rootProject.pullBallerinaModule('snowflake') test.dependsOn rootProject.pullBallerinaModule('docusign.dsadmin') +test.dependsOn rootProject.pullBallerinaModule('sql') test.dependsOn rootProject.pullBallerinaModule('wso2.controlplane') test { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/flags2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/flags2.json index 557e0ae3a..5a77211e5 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/flags2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/flags2.json @@ -33,6 +33,9 @@ "sourceCode": "remote function onFileChange(ftp:Caller caller, ftp:WatchEvent & readonly event) returns ftp:Error? {\n\n }" }, "returning": false, + "diagnostics": { + "hasDiagnostics": true + }, "flags": 0 } ], From fe5d6b18c0c7d3a3f3604d01daca60d296190375 Mon Sep 17 00:00:00 2001 From: Nipuna Fernando Date: Wed, 5 Mar 2025 01:51:21 +0530 Subject: [PATCH 19/24] Make inferred param readonly in node template --- .../flowmodelgenerator/core/model/node/CallBuilder.java | 7 +++---- .../core/model/node/NewConnectionBuilder.java | 2 +- .../core/model/node/ResourceActionCallBuilder.java | 2 +- .../config/function_call-json-parseString.json | 2 +- .../node_template/config/remote_action_call-http-get.json | 2 +- .../node_template/config/remote_action_call-http-post.json | 2 +- .../config/remote_action_call-mysql-query.json | 2 +- .../config/remote_action_call-mysql-queryRow.json | 2 +- .../config/remote_action_call-snowflake-query.json | 2 +- .../config/resource_action_call-http-get.json | 2 +- 10 files changed, 12 insertions(+), 13 deletions(-) diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/CallBuilder.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/CallBuilder.java index 354c63650..ef96d63a4 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/CallBuilder.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/CallBuilder.java @@ -110,7 +110,7 @@ public void setConcreteTemplateData(TemplateContext context) { setParameterProperties(functionData); if (CommonUtils.hasReturn(functionData.returnType())) { - setReturnTypeProperties(functionData, context, functionData.inferredReturnType(), Property.VARIABLE_NAME); + setReturnTypeProperties(functionData, context, Property.VARIABLE_NAME); } if (functionData.returnError()) { @@ -171,10 +171,9 @@ protected void setParameterProperties(FunctionData function) { } } - protected void setReturnTypeProperties(FunctionData functionData, TemplateContext context, boolean editable, - String label) { + protected void setReturnTypeProperties(FunctionData functionData, TemplateContext context, String label) { properties() - .type(functionData.returnType(), editable, functionData.importStatements()) + .type(functionData.returnType(), false, functionData.importStatements()) .data(functionData.returnType(), context.getAllVisibleSymbolNames(), label); } diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/NewConnectionBuilder.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/NewConnectionBuilder.java index 79fb55219..c786f1c94 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/NewConnectionBuilder.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/NewConnectionBuilder.java @@ -129,7 +129,7 @@ public void setConcreteTemplateData(TemplateContext context) { setParameterProperties(functionData); if (CommonUtils.hasReturn(functionData.returnType())) { - setReturnTypeProperties(functionData, context, false, CONNECTION_NAME_LABEL); + setReturnTypeProperties(functionData, context, CONNECTION_NAME_LABEL); } properties() diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/ResourceActionCallBuilder.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/ResourceActionCallBuilder.java index fb411682a..9d83abf16 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/ResourceActionCallBuilder.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/ResourceActionCallBuilder.java @@ -92,7 +92,7 @@ public void setConcreteTemplateData(TemplateContext context) { String returnTypeName = functionData.returnType(); if (CommonUtils.hasReturn(returnTypeName)) { - setReturnTypeProperties(functionData, context, functionData.inferredReturnType(), Property.VARIABLE_NAME); + setReturnTypeProperties(functionData, context, Property.VARIABLE_NAME); } if (functionData.returnError()) { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-json-parseString.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-json-parseString.json index 89b5a07e5..5a1f419b8 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-json-parseString.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-json-parseString.json @@ -104,7 +104,7 @@ "value": "t", "placeholder": "var", "optional": false, - "editable": true, + "editable": false, "advanced": false, "codedata": {} }, diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-http-get.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-http-get.json index 0222aac28..a6dc2e1e2 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-http-get.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-http-get.json @@ -125,7 +125,7 @@ "value": "targetType", "placeholder": "var", "optional": false, - "editable": true, + "editable": false, "advanced": false, "codedata": {} }, diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-http-post.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-http-post.json index 89a85a3da..31c69b51f 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-http-post.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-http-post.json @@ -179,7 +179,7 @@ "value": "targetType", "placeholder": "var", "optional": false, - "editable": true, + "editable": false, "advanced": false, "codedata": {} }, diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-query.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-query.json index 48758ad95..ac654bb22 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-query.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-query.json @@ -98,7 +98,7 @@ "value": "stream", "placeholder": "var", "optional": false, - "editable": true, + "editable": false, "advanced": false, "codedata": { "importStatements": "ballerina/sql" diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-queryRow.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-queryRow.json index d34b79794..8189d81f7 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-queryRow.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-queryRow.json @@ -98,7 +98,7 @@ "value": "returnType", "placeholder": "var", "optional": false, - "editable": true, + "editable": false, "advanced": false, "codedata": { "importStatements": "ballerina/sql" diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-snowflake-query.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-snowflake-query.json index 3dd1b826a..659295fb0 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-snowflake-query.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-snowflake-query.json @@ -96,7 +96,7 @@ "value": "stream", "placeholder": "var", "optional": false, - "editable": true, + "editable": false, "advanced": false, "codedata": { "importStatements": "ballerina/sql" diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/resource_action_call-http-get.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/resource_action_call-http-get.json index ea0edba81..efc8dcf90 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/resource_action_call-http-get.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/resource_action_call-http-get.json @@ -131,7 +131,7 @@ "value": "targetType", "placeholder": "var", "optional": false, - "editable": true, + "editable": false, "advanced": false, "codedata": {} }, From 83926abcd19c0c77a78c8831b4ef5cd3c8d431a7 Mon Sep 17 00:00:00 2001 From: Nipuna Fernando Date: Wed, 5 Mar 2025 01:51:52 +0530 Subject: [PATCH 20/24] Fix the pullBallerinaModule method --- build.gradle | 6 +++--- .../flow-model-generator-ls-extension/build.gradle | 14 +++++++------- .../commons/ServiceDatabaseManager.java | 5 ++++- .../build.gradle | 4 ++-- 4 files changed, 16 insertions(+), 13 deletions(-) diff --git a/build.gradle b/build.gradle index e6d3b839b..9965f8ad3 100644 --- a/build.gradle +++ b/build.gradle @@ -126,7 +126,7 @@ def targetSequenceDiagramGeneratorLSExt = file("$project.rootDir/sequence-model- def targetTestManagerServiceLSExt = file("$project.rootDir/test-manager-service/modules/test-manager-service-ls-extension/build/libs/test-manager-service-ls-extension-${project.version}.jar") // TODO: Remove this once the workspace manager is refactored to import modules where necessary. -def pullBallerinaModule(String packageName) { +def pullBallerinaModule(String org, String packageName) { tasks.register("pullBallerinaModule_${packageName.replace('/', '_')}") { doLast { def errOutput = new ByteArrayOutputStream() @@ -134,7 +134,7 @@ def pullBallerinaModule(String packageName) { ignoreExitValue = true // Check if the package exists in the ballerina user - def centralRepoDir = new File(System.getProperty("user.home"), ".ballerina/repositories/central.ballerina.io/bala/ballerinax") + def centralRepoDir = new File(System.getProperty("user.home"), ".ballerina/repositories/central.ballerina.io/bala/${org}") if (centralRepoDir.exists()) { def pkgDir = new File(centralRepoDir, packageName) if (pkgDir.exists()) { @@ -143,7 +143,7 @@ def pullBallerinaModule(String packageName) { } } - def ballPullCommand = "bal pull ballerinax/${packageName}" + def ballPullCommand = "bal pull ${org}/${packageName}" if (org.gradle.internal.os.OperatingSystem.current().isWindows()) { commandLine 'cmd', '/c', ballPullCommand } else { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/build.gradle b/flow-model-generator/modules/flow-model-generator-ls-extension/build.gradle index 98059b29e..2ea5e16db 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/build.gradle +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/build.gradle @@ -102,13 +102,13 @@ task copyStdlibs() { } } -test.dependsOn rootProject.pullBallerinaModule('redis') -test.dependsOn rootProject.pullBallerinaModule('trigger.salesforce') -test.dependsOn rootProject.pullBallerinaModule('github') -test.dependsOn rootProject.pullBallerinaModule('snowflake') -test.dependsOn rootProject.pullBallerinaModule('docusign.dsadmin') -test.dependsOn rootProject.pullBallerinaModule('sql') -test.dependsOn rootProject.pullBallerinaModule('wso2.controlplane') +test.dependsOn rootProject.pullBallerinaModule('ballerinax','redis') +test.dependsOn rootProject.pullBallerinaModule('ballerinax','trigger.salesforce') +test.dependsOn rootProject.pullBallerinaModule('ballerinax','github') +test.dependsOn rootProject.pullBallerinaModule('ballerinax','snowflake') +test.dependsOn rootProject.pullBallerinaModule('ballerinax','docusign.dsadmin') +test.dependsOn rootProject.pullBallerinaModule('ballerina','sql') +test.dependsOn rootProject.pullBallerinaModule('ballerinax','wso2.controlplane') test { dependsOn { diff --git a/model-generator-commons/src/main/java/io/ballerina/modelgenerator/commons/ServiceDatabaseManager.java b/model-generator-commons/src/main/java/io/ballerina/modelgenerator/commons/ServiceDatabaseManager.java index 17d7fb590..c5b3167b2 100644 --- a/model-generator-commons/src/main/java/io/ballerina/modelgenerator/commons/ServiceDatabaseManager.java +++ b/model-generator-commons/src/main/java/io/ballerina/modelgenerator/commons/ServiceDatabaseManager.java @@ -45,6 +45,7 @@ public class ServiceDatabaseManager { private final String dbPath; private static class Holder { + private static final ServiceDatabaseManager INSTANCE = new ServiceDatabaseManager(); } @@ -111,7 +112,8 @@ public Optional getListener(String module) { null, null, rs.getBoolean("return_error"), - false); + false, + null); functionData.setPackageId(rs.getString("package_id")); return Optional.of(functionData); } @@ -200,6 +202,7 @@ public LinkedHashMap getFunctionParametersAsMap(int liste // Helper builder class private static class ParameterDataBuilder { + int parameterId; String name; String type; diff --git a/service-model-generator/modules/service-model-generator-ls-extension/build.gradle b/service-model-generator/modules/service-model-generator-ls-extension/build.gradle index 897215c81..95a381f29 100644 --- a/service-model-generator/modules/service-model-generator-ls-extension/build.gradle +++ b/service-model-generator/modules/service-model-generator-ls-extension/build.gradle @@ -106,8 +106,8 @@ task copyStdlibs() { } } -test.dependsOn rootProject.pullBallerinaModule('kafka') -test.dependsOn rootProject.pullBallerinaModule('rabbitmq') +test.dependsOn rootProject.pullBallerinaModule('ballerinax','kafka') +test.dependsOn rootProject.pullBallerinaModule('ballerinax','rabbitmq') test { dependsOn { From b1ae6703554ea109f896ee5a5a87e59e5a2da67a Mon Sep 17 00:00:00 2001 From: Nipuna Fernando Date: Wed, 5 Mar 2025 11:23:13 +0530 Subject: [PATCH 21/24] Pull the mysql module --- build.gradle | 6 +++--- .../flow-model-generator-ls-extension/build.gradle | 14 +++++++------- .../build.gradle | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/build.gradle b/build.gradle index 9965f8ad3..e6d3b839b 100644 --- a/build.gradle +++ b/build.gradle @@ -126,7 +126,7 @@ def targetSequenceDiagramGeneratorLSExt = file("$project.rootDir/sequence-model- def targetTestManagerServiceLSExt = file("$project.rootDir/test-manager-service/modules/test-manager-service-ls-extension/build/libs/test-manager-service-ls-extension-${project.version}.jar") // TODO: Remove this once the workspace manager is refactored to import modules where necessary. -def pullBallerinaModule(String org, String packageName) { +def pullBallerinaModule(String packageName) { tasks.register("pullBallerinaModule_${packageName.replace('/', '_')}") { doLast { def errOutput = new ByteArrayOutputStream() @@ -134,7 +134,7 @@ def pullBallerinaModule(String org, String packageName) { ignoreExitValue = true // Check if the package exists in the ballerina user - def centralRepoDir = new File(System.getProperty("user.home"), ".ballerina/repositories/central.ballerina.io/bala/${org}") + def centralRepoDir = new File(System.getProperty("user.home"), ".ballerina/repositories/central.ballerina.io/bala/ballerinax") if (centralRepoDir.exists()) { def pkgDir = new File(centralRepoDir, packageName) if (pkgDir.exists()) { @@ -143,7 +143,7 @@ def pullBallerinaModule(String org, String packageName) { } } - def ballPullCommand = "bal pull ${org}/${packageName}" + def ballPullCommand = "bal pull ballerinax/${packageName}" if (org.gradle.internal.os.OperatingSystem.current().isWindows()) { commandLine 'cmd', '/c', ballPullCommand } else { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/build.gradle b/flow-model-generator/modules/flow-model-generator-ls-extension/build.gradle index 2ea5e16db..d09f11cb2 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/build.gradle +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/build.gradle @@ -102,13 +102,13 @@ task copyStdlibs() { } } -test.dependsOn rootProject.pullBallerinaModule('ballerinax','redis') -test.dependsOn rootProject.pullBallerinaModule('ballerinax','trigger.salesforce') -test.dependsOn rootProject.pullBallerinaModule('ballerinax','github') -test.dependsOn rootProject.pullBallerinaModule('ballerinax','snowflake') -test.dependsOn rootProject.pullBallerinaModule('ballerinax','docusign.dsadmin') -test.dependsOn rootProject.pullBallerinaModule('ballerina','sql') -test.dependsOn rootProject.pullBallerinaModule('ballerinax','wso2.controlplane') +test.dependsOn rootProject.pullBallerinaModule('redis') +test.dependsOn rootProject.pullBallerinaModule('trigger.salesforce') +test.dependsOn rootProject.pullBallerinaModule('github') +test.dependsOn rootProject.pullBallerinaModule('snowflake') +test.dependsOn rootProject.pullBallerinaModule('docusign.dsadmin') +test.dependsOn rootProject.pullBallerinaModule('mysql') +test.dependsOn rootProject.pullBallerinaModule('wso2.controlplane') test { dependsOn { diff --git a/service-model-generator/modules/service-model-generator-ls-extension/build.gradle b/service-model-generator/modules/service-model-generator-ls-extension/build.gradle index 95a381f29..897215c81 100644 --- a/service-model-generator/modules/service-model-generator-ls-extension/build.gradle +++ b/service-model-generator/modules/service-model-generator-ls-extension/build.gradle @@ -106,8 +106,8 @@ task copyStdlibs() { } } -test.dependsOn rootProject.pullBallerinaModule('ballerinax','kafka') -test.dependsOn rootProject.pullBallerinaModule('ballerinax','rabbitmq') +test.dependsOn rootProject.pullBallerinaModule('kafka') +test.dependsOn rootProject.pullBallerinaModule('rabbitmq') test { dependsOn { From dbea43b395980dcb63379cc64b94c50f8a900f27 Mon Sep 17 00:00:00 2001 From: Nipuna Fernando Date: Wed, 5 Mar 2025 12:23:43 +0530 Subject: [PATCH 22/24] Update the mysql version --- .../config/remote_action_call-mysql1.json | 12 ++++++------ .../config/remote_action_call-mysql2.json | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql1.json index 5b980e8cd..df3a2e768 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql1.json @@ -40,7 +40,7 @@ "metadata": { "label": "query", "description": "Executes the query, which may return multiple results.\nWhen processing the stream, make sure to consume all fetched data or close the stream.\n", - "icon": "https://bcentral-packageicons.azureedge.net/images/ballerinax_mysql_1.14.0.png" + "icon": "https://bcentral-packageicons.azureedge.net/images/ballerinax_mysql_1.13.1.png" }, "codedata": { "node": "REMOTE_ACTION_CALL", @@ -48,7 +48,7 @@ "module": "mysql", "object": "Client", "symbol": "query", - "version": "1.14.0", + "version": "1.13.1", "lineRange": { "fileName": "mysql.bal", "startLine": { @@ -163,7 +163,7 @@ "metadata": { "label": "query", "description": "Executes the query, which may return multiple results.\nWhen processing the stream, make sure to consume all fetched data or close the stream.\n", - "icon": "https://bcentral-packageicons.azureedge.net/images/ballerinax_mysql_1.14.0.png" + "icon": "https://bcentral-packageicons.azureedge.net/images/ballerinax_mysql_1.13.1.png" }, "codedata": { "node": "REMOTE_ACTION_CALL", @@ -171,7 +171,7 @@ "module": "mysql", "object": "Client", "symbol": "query", - "version": "1.14.0", + "version": "1.13.1", "lineRange": { "fileName": "mysql.bal", "startLine": { @@ -288,7 +288,7 @@ "metadata": { "label": "New Connection", "description": "Represents a MySQL database client.", - "icon": "https://bcentral-packageicons.azureedge.net/images/ballerinax_mysql_1.14.0.png" + "icon": "https://bcentral-packageicons.azureedge.net/images/ballerinax_mysql_1.13.1.png" }, "codedata": { "node": "NEW_CONNECTION", @@ -468,7 +468,7 @@ "typeMembers": [ { "type": "Options", - "packageInfo": "ballerinax:mysql:1.14.0", + "packageInfo": "ballerinax:mysql:1.13.1", "kind": "RECORD_TYPE", "selected": false }, diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql2.json index 56297d3a9..c33520607 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql2.json @@ -40,7 +40,7 @@ "metadata": { "label": "queryRow", "description": "Executes the query, which is expected to return at most one row of the result.\nIf the query does not return any results, `sql:NoRowsError` is returned.\n", - "icon": "https://bcentral-packageicons.azureedge.net/images/ballerinax_mysql_1.14.0.png" + "icon": "https://bcentral-packageicons.azureedge.net/images/ballerinax_mysql_1.13.1.png" }, "codedata": { "node": "REMOTE_ACTION_CALL", @@ -48,7 +48,7 @@ "module": "mysql", "object": "Client", "symbol": "queryRow", - "version": "1.14.0", + "version": "1.13.1", "lineRange": { "fileName": "mysql.bal", "startLine": { @@ -177,7 +177,7 @@ "metadata": { "label": "New Connection", "description": "Represents a MySQL database client.", - "icon": "https://bcentral-packageicons.azureedge.net/images/ballerinax_mysql_1.14.0.png" + "icon": "https://bcentral-packageicons.azureedge.net/images/ballerinax_mysql_1.13.1.png" }, "codedata": { "node": "NEW_CONNECTION", @@ -357,7 +357,7 @@ "typeMembers": [ { "type": "Options", - "packageInfo": "ballerinax:mysql:1.14.0", + "packageInfo": "ballerinax:mysql:1.13.1", "kind": "RECORD_TYPE", "selected": false }, From 83f055784271dba7fd5d694920a38dee4df5f4e2 Mon Sep 17 00:00:00 2001 From: Nipuna Fernando Date: Wed, 5 Mar 2025 12:37:06 +0530 Subject: [PATCH 23/24] Set the order in node template --- .../flowmodelgenerator/core/CodeAnalyzer.java | 20 ++--------- .../core/model/node/CallBuilder.java | 31 +++++++++++++++++ .../remote_action_call-mysql-query.json | 34 +++++++++---------- .../remote_action_call-mysql-queryRow.json | 34 +++++++++---------- 4 files changed, 67 insertions(+), 52 deletions(-) diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/CodeAnalyzer.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/CodeAnalyzer.java index 77b558a4d..9903f9132 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/CodeAnalyzer.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/CodeAnalyzer.java @@ -110,6 +110,7 @@ import io.ballerina.flowmodelgenerator.core.model.Property; import io.ballerina.flowmodelgenerator.core.model.node.AssignBuilder; import io.ballerina.flowmodelgenerator.core.model.node.BinaryBuilder; +import io.ballerina.flowmodelgenerator.core.model.node.CallBuilder; import io.ballerina.flowmodelgenerator.core.model.node.DataMapperBuilder; import io.ballerina.flowmodelgenerator.core.model.node.FailBuilder; import io.ballerina.flowmodelgenerator.core.model.node.FunctionCall; @@ -1280,24 +1281,7 @@ private void processFunctionSymbol(NonTerminalNode callNode, SeparatedNodeList param.kind().equals(ParameterData.Kind.PARAM_FOR_TYPE_INFER)) + .findFirst() + .ifPresent(param -> buildInferredTypeProperty(this, param, null)); + } + for (ParameterData paramResult : function.parameters().values()) { if (paramResult.kind().equals(ParameterData.Kind.INCLUDED_RECORD)) { continue; diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-query.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-query.json index ac654bb22..798af818a 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-query.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-query.json @@ -47,6 +47,23 @@ "editable": false, "advanced": false }, + "rowType": { + "metadata": { + "label": "rowType", + "description": "The `typedesc` of the record to which the result needs to be returned" + }, + "valueType": "TYPE", + "valueTypeConstraint": "record {|anydata...;|}", + "placeholder": "record {|anydata...;|}", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "rowType" + }, + "typeMembers": [] + }, "sqlQuery": { "metadata": { "label": "sqlQuery", @@ -72,23 +89,6 @@ } ] }, - "rowType": { - "metadata": { - "label": "rowType", - "description": "The `typedesc` of the record to which the result needs to be returned" - }, - "valueType": "TYPE", - "valueTypeConstraint": "record {|anydata...;|}", - "placeholder": "record {|anydata...;|}", - "optional": false, - "editable": true, - "advanced": false, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "rowType" - }, - "typeMembers": [] - }, "type": { "metadata": { "label": "Variable Type", diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-queryRow.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-queryRow.json index 8189d81f7..d56e573cc 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-queryRow.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-queryRow.json @@ -47,6 +47,23 @@ "editable": false, "advanced": false }, + "returnType": { + "metadata": { + "label": "returnType", + "description": "The `typedesc` of the record to which the result needs to be returned.\nIt can be a basic type if the query result contains only one column" + }, + "valueType": "TYPE", + "valueTypeConstraint": "anydata", + "placeholder": "anydata", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "returnType" + }, + "typeMembers": [] + }, "sqlQuery": { "metadata": { "label": "sqlQuery", @@ -72,23 +89,6 @@ } ] }, - "returnType": { - "metadata": { - "label": "returnType", - "description": "The `typedesc` of the record to which the result needs to be returned.\nIt can be a basic type if the query result contains only one column" - }, - "valueType": "TYPE", - "valueTypeConstraint": "anydata", - "placeholder": "anydata", - "optional": false, - "editable": true, - "advanced": false, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "returnType" - }, - "typeMembers": [] - }, "type": { "metadata": { "label": "Variable Type", From 3d2f4fd81f521f847a83d0bb66dcd002c33395fa Mon Sep 17 00:00:00 2001 From: Nipuna Fernando Date: Wed, 5 Mar 2025 12:46:15 +0530 Subject: [PATCH 24/24] Add missing fields in inferred property --- .../core/model/node/CallBuilder.java | 21 +++--- .../config/remote_action_call-mysql1.json | 2 +- .../config/remote_action_call-mysql2.json | 2 +- .../function_call-json-parseString.json | 33 +++++----- .../config/remote_action_call-http-get.json | 33 +++++----- .../config/remote_action_call-http-post.json | 65 +++++++++---------- .../remote_action_call-mysql-query.json | 3 +- .../remote_action_call-mysql-queryRow.json | 3 +- .../remote_action_call-snowflake-query.json | 33 +++++----- .../config/resource_action_call-http-get.json | 33 +++++----- 10 files changed, 112 insertions(+), 116 deletions(-) diff --git a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/CallBuilder.java b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/CallBuilder.java index da5ee180e..049d0b910 100644 --- a/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/CallBuilder.java +++ b/flow-model-generator/modules/flow-model-generator-core/src/main/java/io/ballerina/flowmodelgenerator/core/model/node/CallBuilder.java @@ -38,6 +38,8 @@ import org.ballerinalang.langserver.commons.workspace.WorkspaceManager; import java.nio.file.Path; +import java.util.HashMap; +import java.util.Map; /** * Abstract base class for function-like builders (functions, methods, resource actions). @@ -132,10 +134,9 @@ public static void buildInferredTypeProperty(NodeBuilder nodeBuilder, ParameterD .stepOut() .value(value) .placeholder(paramData.defaultValue()) + .type(Property.ValueType.TYPE) .typeConstraint(paramData.type()) - .typeMembers(paramData.typeMembers()) .editable() - .defaultable(paramData.optional()) .stepOut() .addProperty(unescapedParamName); } @@ -144,14 +145,16 @@ protected void setParameterProperties(FunctionData function) { boolean hasOnlyRestParams = function.parameters().size() == 1; // Build the inferred type property at the top if exists - if (function.inferredReturnType()) { - function.parameters().values().stream() - .filter(param -> param.kind().equals(ParameterData.Kind.PARAM_FOR_TYPE_INFER)) - .findFirst() - .ifPresent(param -> buildInferredTypeProperty(this, param, null)); - } + Map paramMap = new HashMap<>(); + function.parameters().forEach((key, paramData) -> { + if (paramData.kind() != ParameterData.Kind.PARAM_FOR_TYPE_INFER) { + paramMap.put(key, paramData); + return; + } + buildInferredTypeProperty(this, paramData, null); + }); - for (ParameterData paramResult : function.parameters().values()) { + for (ParameterData paramResult : paramMap.values()) { if (paramResult.kind().equals(ParameterData.Kind.INCLUDED_RECORD)) { continue; } diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql1.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql1.json index df3a2e768..9c0246bbc 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql1.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql1.json @@ -499,7 +499,7 @@ "typeMembers": [ { "type": "ConnectionPool", - "packageInfo": "ballerina:sql:1.15.0", + "packageInfo": "ballerina:sql:1.14.0", "kind": "RECORD_TYPE", "selected": false }, diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql2.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql2.json index c33520607..b16ae0cc9 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql2.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/diagram_generator/config/remote_action_call-mysql2.json @@ -388,7 +388,7 @@ "typeMembers": [ { "type": "ConnectionPool", - "packageInfo": "ballerina:sql:1.15.0", + "packageInfo": "ballerina:sql:1.14.0", "kind": "RECORD_TYPE", "selected": false }, diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-json-parseString.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-json-parseString.json index 5a1f419b8..05987b3c0 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-json-parseString.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/function_call-json-parseString.json @@ -30,6 +30,22 @@ }, "returning": false, "properties": { + "t": { + "metadata": { + "label": "t", + "description": "Target type" + }, + "valueType": "TYPE", + "valueTypeConstraint": "anydata", + "placeholder": "anydata", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "t" + } + }, "s": { "metadata": { "label": "s", @@ -78,23 +94,6 @@ } ] }, - "t": { - "metadata": { - "label": "t", - "description": "Target type" - }, - "valueType": "TYPE", - "valueTypeConstraint": "anydata", - "placeholder": "anydata", - "optional": false, - "editable": true, - "advanced": false, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "t" - }, - "typeMembers": [] - }, "type": { "metadata": { "label": "Variable Type", diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-http-get.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-http-get.json index a6dc2e1e2..6a9641075 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-http-get.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-http-get.json @@ -45,6 +45,22 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -99,23 +115,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "TYPE", - "valueTypeConstraint": "http:Response|anydata|stream", - "placeholder": "http:Response|anydata|stream", - "optional": false, - "editable": true, - "advanced": false, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "type": { "metadata": { "label": "Variable Type", diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-http-post.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-http-post.json index 31c69b51f..6b4ca4b7d 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-http-post.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-http-post.json @@ -45,6 +45,22 @@ "editable": false, "advanced": false }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "path": { "metadata": { "label": "path", @@ -69,30 +85,6 @@ } ] }, - "message": { - "metadata": { - "label": "message", - "description": "An HTTP outbound request or any allowed payload" - }, - "valueType": "EXPRESSION", - "valueTypeConstraint": "http:RequestMessage", - "placeholder": "{}", - "optional": false, - "editable": true, - "advanced": false, - "codedata": { - "kind": "REQUIRED", - "originalName": "message" - }, - "typeMembers": [ - { - "type": "RequestMessage", - "packageInfo": "ballerina:http:2.12.2", - "kind": "OTHER", - "selected": false - } - ] - }, "headers": { "metadata": { "label": "headers", @@ -153,22 +145,29 @@ } ] }, - "targetType": { + "message": { "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + "label": "message", + "description": "An HTTP outbound request or any allowed payload" }, - "valueType": "TYPE", - "valueTypeConstraint": "http:Response|anydata|stream", - "placeholder": "http:Response|anydata|stream", + "valueType": "EXPRESSION", + "valueTypeConstraint": "http:RequestMessage", + "placeholder": "{}", "optional": false, "editable": true, "advanced": false, "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" + "kind": "REQUIRED", + "originalName": "message" }, - "typeMembers": [] + "typeMembers": [ + { + "type": "RequestMessage", + "packageInfo": "ballerina:http:2.12.2", + "kind": "OTHER", + "selected": false + } + ] }, "type": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-query.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-query.json index 798af818a..f61a1c501 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-query.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-query.json @@ -61,8 +61,7 @@ "codedata": { "kind": "PARAM_FOR_TYPE_INFER", "originalName": "rowType" - }, - "typeMembers": [] + } }, "sqlQuery": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-queryRow.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-queryRow.json index d56e573cc..d36ef2903 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-queryRow.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-mysql-queryRow.json @@ -61,8 +61,7 @@ "codedata": { "kind": "PARAM_FOR_TYPE_INFER", "originalName": "returnType" - }, - "typeMembers": [] + } }, "sqlQuery": { "metadata": { diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-snowflake-query.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-snowflake-query.json index 659295fb0..ebb43a2c2 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-snowflake-query.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/remote_action_call-snowflake-query.json @@ -45,6 +45,22 @@ "editable": false, "advanced": false }, + "rowType": { + "metadata": { + "label": "rowType", + "description": "The `typedesc` of the record to which the result needs to be returned" + }, + "valueType": "TYPE", + "valueTypeConstraint": "record {|anydata...;|}", + "placeholder": "record {|anydata...;|}", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "rowType" + } + }, "sqlQuery": { "metadata": { "label": "sqlQuery", @@ -70,23 +86,6 @@ } ] }, - "rowType": { - "metadata": { - "label": "rowType", - "description": "The `typedesc` of the record to which the result needs to be returned" - }, - "valueType": "TYPE", - "valueTypeConstraint": "record {|anydata...;|}", - "placeholder": "record {|anydata...;|}", - "optional": false, - "editable": true, - "advanced": false, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "rowType" - }, - "typeMembers": [] - }, "type": { "metadata": { "label": "Variable Type", diff --git a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/resource_action_call-http-get.json b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/resource_action_call-http-get.json index efc8dcf90..cef0a47e9 100644 --- a/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/resource_action_call-http-get.json +++ b/flow-model-generator/modules/flow-model-generator-ls-extension/src/test/resources/node_template/config/resource_action_call-http-get.json @@ -58,6 +58,22 @@ "originalName": "/path/to/subdirectory" } }, + "targetType": { + "metadata": { + "label": "targetType", + "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" + }, + "valueType": "TYPE", + "valueTypeConstraint": "http:Response|anydata|stream", + "placeholder": "http:Response|anydata|stream", + "optional": false, + "editable": true, + "advanced": false, + "codedata": { + "kind": "PARAM_FOR_TYPE_INFER", + "originalName": "targetType" + } + }, "headers": { "metadata": { "label": "headers", @@ -88,23 +104,6 @@ } ] }, - "targetType": { - "metadata": { - "label": "targetType", - "description": "HTTP response, `anydata` or stream of HTTP SSE, which is expected to be returned after data binding" - }, - "valueType": "TYPE", - "valueTypeConstraint": "http:Response|anydata|stream", - "placeholder": "http:Response|anydata|stream", - "optional": false, - "editable": true, - "advanced": false, - "codedata": { - "kind": "PARAM_FOR_TYPE_INFER", - "originalName": "targetType" - }, - "typeMembers": [] - }, "additionalValues": { "metadata": { "label": "Additional Values",