`
+ font-size: 28px;
+ color: ${(props: RequiredFormInputProps) => props.color || "var(--vscode-editor-foreground)"};
+ font-weight: bold;
+ line-height: 24px;
+ cursor: pointer;
+`;
+const RequiredElementWrapper = styled.div`
+ height: 15px;
+ padding: 2px;
+ border-radius: 4px;
+ &:hover {
+ background-color: var(--button-icon-hover-background)
+ }
+`;
+
+export function Parameter(props: ParameterProps) {
+ const { id, parameter, paramTypes = BaseTypes, onRemoveParameter, onParameterChange } = props;
+
+ const paramTypeOptions = paramTypes.map((type) => ({ id: type, content: type, value: type }));
+ const handleParameterChange = (parameter: P) => {
+ onParameterChange(parameter);
+ };
+
+ return (
+
+ handleParameterChange({ ...parameter, name: evt.target.value })}
+ />
+ handleParameterChange({ ...parameter, schema: { type: value as ParameterSchemaTypes } })}
+ />
+ handleParameterChange({ ...parameter, description: evt.target.value })}
+ />
+
+
+ handleParameterChange({ ...parameter, required: !parameter.required })}>
+
+ *
+
+
+
+
+
+
+ )
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Parameter/ReadOnlyParameter.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Parameter/ReadOnlyParameter.tsx
new file mode 100644
index 00000000000..52d89d15063
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Parameter/ReadOnlyParameter.tsx
@@ -0,0 +1,58 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import styled from "@emotion/styled";
+import { Parameter } from '../../../Definitions/ServiceDefinitions';
+import { resolveTypeFormSchema } from '../../Utils/OpenAPIUtils';
+import { ParameterGridCell, ParamGridRow } from '../Parameters/Parameters';
+
+interface ReadOnlyParameterProps {
+ parameter: Parameter;
+}
+
+const ParamContainer = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+`;
+
+const ParamWrapper = styled.div`
+ display: flex;
+ flex-direction: row;
+ gap: 10px;
+`;
+
+export function ReadOnlyParameter(props: ReadOnlyParameterProps) {
+ const { parameter } = props;
+
+ const type = resolveTypeFormSchema(parameter.schema);
+
+ return (
+ //
+ //
+ // {parameter.name}
+ // {`${resolveTypeFormSchema(parameter.schema)} ${parameter.schema.format ? `<${parameter.schema.format}>` : ""}`}
+ //
+ // {parameter.description}
+ //
+
+ {parameter.name ? parameter.name : "-"}
+ {type ? type : "-"}
+ {parameter.schema.description ? parameter.schema.description : "-"}
+
+ )
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Parameters/Parameters.stories.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Parameters/Parameters.stories.tsx
new file mode 100644
index 00000000000..9e49827c08d
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Parameters/Parameters.stories.tsx
@@ -0,0 +1,88 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { useState } from "react";
+import { Parameter as P, ReferenceObject as R } from "../../../Definitions/ServiceDefinitions";
+import { Parameters } from "./Parameters";
+import { ReadOnlyParameters } from "./ReadOnlyParameters";
+
+export default {
+ component: Parameters,
+ title: 'New Parameters',
+};
+
+const parameter: P = {
+ name: "name",
+ in: "query",
+ description: "description",
+ required: true,
+ schema: {
+ type: "string",
+ },
+};
+
+const parameters: P[] = [parameter];
+
+export const ParametersStory = () => {
+ const [parameters, setParameters] = useState([parameter]);
+ const onParametersChange = (parameters: (P | R) []) => {
+ console.log(parameters);
+ setParameters(parameters as P[]);
+ }
+ return (
+
+ );
+};
+
+const referenceObj: R = {
+ $ref: "http://example.com",
+ description: "description",
+ summary: "summary",
+};
+
+const currentReferenceObjects: R[] = [
+ {
+ $ref: "http://example1.com",
+ description: "description",
+ summary: "summary",
+ },
+ {
+ $ref: "http://example2.com",
+ description: "description",
+ summary: "summary",
+ },
+];
+
+const referenceObject: R[] = [referenceObj];
+
+export const ParametersStoryWithReferenceObject = () => {
+ const [referenceObjects, setReferenceObjects] = useState([referenceObj]);
+ const onReferenceObjectsChange = (referenceObjects: (P | R) []) => {
+ console.log(referenceObjects);
+ setReferenceObjects(referenceObjects as R[]);
+ }
+ return (
+
+ );
+}
+
+export const ReadOnlyParametersStory = () => {
+ return (
+
+ );
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Parameters/Parameters.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Parameters/Parameters.tsx
new file mode 100644
index 00000000000..3fc99e558df
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Parameters/Parameters.tsx
@@ -0,0 +1,201 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { Button, Codicon, Typography } from '@wso2/ui-toolkit';
+import styled from "@emotion/styled";
+import { Parameter as P, ReferenceObject as R } from '../../../Definitions/ServiceDefinitions';
+import { BaseTypes } from '../../../constants';
+import SectionHeader from '../SectionHeader/SectionHeader';
+import { Parameter } from '../Parameter/Parameter';
+import { ReferenceObject } from '../ReferenceObject/ReferenceObject';
+import { getUpdatedObjects } from '../Utils/OpenAPIUtils';
+import { useContext } from 'react';
+import { APIDesignerContext } from '../../../APIDesignerContext';
+import { RefComponent } from '../RefComponent/RefComponent';
+import { VSCodeDataGridCell, VSCodeDataGridRow } from '@vscode/webview-ui-toolkit/react';
+
+export const PanelBody = styled.div`
+ padding: 16px;
+ gap: 15px;
+ display: flex;
+ flex-direction: column;
+`;
+
+export const ParameterGridCell = styled(VSCodeDataGridCell)`
+ padding-left: 0px;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ &:is(:active, :focus, :focus-visible) {
+ background-color: var(--vscode-background);
+ color: var(--vscode-foreground);
+ border-color: transparent;
+ }
+`;
+
+export const ParamGridRow = styled(VSCodeDataGridRow)`
+ &:hover {
+ background-color: var(--vscode-background);
+ color: var(--vscode-foreground);
+ }
+`;
+
+interface ParameterProps {
+ parameters: (P | R)[];
+ paramTypes?: string[];
+ currentReferences?: R[];
+ title?: string;
+ type: "query" | "header" | "path" | "cookie";
+ onParametersChange: (parameter: (P | R)[]) => void;
+}
+
+enum ParameterTypes {
+ DEFAULT_PARAM = "Default Parameter",
+ REFERENCE_OBJECT = "Reference Object"
+}
+
+function isReferenceObject(obj: (P | R)): obj is R {
+ return obj && typeof obj === 'object' && '$ref' in obj;
+}
+
+export function Parameters(props: ParameterProps) {
+ const { parameters, paramTypes = BaseTypes, title, type, currentReferences, onParametersChange } = props;
+ const {
+ props: { openAPI },
+ } = useContext(APIDesignerContext);
+
+ const componentParameterNames = openAPI?.components?.parameters ? Object.keys(openAPI?.components?.parameters) : [];
+ const componentQueryParamNames = componentParameterNames.filter((name) => openAPI?.components?.parameters[name].in === "query");
+ const componentHeaderParamNames = componentParameterNames.filter((name) => openAPI?.components?.parameters[name].in === "header");
+ const componentPathParamNames = componentParameterNames.filter((name) => openAPI?.components?.parameters[name].in === "path");
+
+ const handleParameterChange = (parameters: (P | R)[]) => {
+ onParametersChange(parameters);
+ };
+
+ const addNewReferenceObject = () => {
+ const newParam: R = {
+ $ref: `#/components/parameters/${type === "query" ? componentQueryParamNames[0] : type === "header" ? componentHeaderParamNames[0] : type === "path" ? componentPathParamNames[0] : ""}`,
+ summary: "",
+ description: ""
+ };
+ const newParameters = getUpdatedObjects(parameters, newParam);
+ handleParameterChange([...newParameters]);
+ };
+
+ const addReferenceParamButton = () => {
+ return (
+
+ );
+ };
+
+ const addNewParam = () => {
+ const newParam: P = {
+ name: parameters?.length > 0 ? `param${parameters.length}` : "param1",
+ in: type,
+ required: true,
+ description: "",
+ schema: {
+ type: "string"
+ }
+ };
+ const newParameters = getUpdatedObjects
(parameters, newParam);
+ handleParameterChange([...newParameters]);
+ };
+ const getAddParamButton = () => (
+
+ );
+
+ const actionButtons = [
+ getAddParamButton()
+ ];
+ if (type === "query" && componentQueryParamNames.length > 0 || (type === "header" && componentHeaderParamNames.length > 0) || (type === "path" && componentPathParamNames.length > 0)) {
+ actionButtons.push(addReferenceParamButton());
+ }
+
+ const paramsToGivenType = parameters?.filter((param) => {
+ if (isReferenceObject(param)) {
+ const paramName = param.$ref.replace("#/components/parameters/", "");
+ const parameterType = openAPI?.components?.parameters[paramName].in;
+ return parameterType === type;
+ } else {
+ return param.in === type;
+ }
+ });
+
+ return (
+
+
+ {paramsToGivenType?.length > 0 ? (
+ <>
+ {parameters?.map((parameter, index) => {
+ if (type === parameter.in || isReferenceObject(parameter)) {
+ if (isReferenceObject(parameter) && (type === "query" ? componentQueryParamNames.includes(parameter.$ref.replace("#/components/parameters/", "")) : type === "header" ? componentHeaderParamNames.includes(parameter.$ref.replace("#/components/parameters/", "")) : type === "path" ? componentPathParamNames.includes(parameter.$ref.replace("#/components/parameters/", "")) : false)) {
+ return (
+
{
+ const parametersCopy = [...parameters];
+ parametersCopy.splice(id, 1);
+ handleParameterChange(parametersCopy as P[]);
+ }}
+ onRefernceObjectChange={(parameter) => {
+ const parametersCopy = [...parameters];
+ parametersCopy[index] = parameter;
+ handleParameterChange(parametersCopy as P[]);
+ }}
+ />
+ );
+ } else if (!isReferenceObject(parameter)) {
+ return (
+ {
+ const parametersCopy = [...parameters];
+ parametersCopy.splice(id, 1);
+ handleParameterChange(parametersCopy as P[]);
+ }}
+ onParameterChange={(parameter) => {
+ const parametersCopy = [...parameters];
+ parametersCopy[index] = parameter;
+ handleParameterChange(parametersCopy as P[]);
+ }}
+ />
+ );
+ }
+ }
+ })}
+ >
+ ) : (
+ No {title}.
+ )}
+
+ )
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Parameters/ReadOnlyParameters.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Parameters/ReadOnlyParameters.tsx
new file mode 100644
index 00000000000..4b505e65c07
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Parameters/ReadOnlyParameters.tsx
@@ -0,0 +1,102 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { Typography } from '@wso2/ui-toolkit';
+import styled from "@emotion/styled";
+import { Parameter as P, ReferenceObject as R } from '../../../Definitions/ServiceDefinitions';
+import { ReadOnlyParameter } from '../Parameter/ReadOnlyParameter';
+import { ReadOnlyReferenceObject } from '../ReferenceObject/ReadOnlyReferenceObject';
+import { useContext } from 'react';
+import { APIDesignerContext } from '../../../APIDesignerContext';
+import { VSCodeDataGrid } from '@vscode/webview-ui-toolkit/react';
+import { ParameterGridCell, ParamGridRow } from './Parameters';
+
+interface ReadOnlyParameterProps {
+ parameters: (P | R)[];
+ paramTypes?: string[];
+ currentReferences?: R[];
+ title?: string;
+ type: "query" | "header" | "path" | "cookie";
+}
+export const ContentTypeWrapper = styled.div`
+ display: flex;
+ flex-direction: row;
+ gap: 10px;
+`;
+
+function isReferenceObject(obj: (P | R)): obj is R {
+ return obj && typeof obj === 'object' && '$ref' in obj;
+}
+
+export function ReadOnlyParameters(props: ReadOnlyParameterProps) {
+ const { parameters, title, type } = props;
+ const {
+ props: { openAPI },
+ } = useContext(APIDesignerContext);
+
+ const paramsToGivenType = parameters?.filter((param) => {
+ if (isReferenceObject(param)) {
+ const paramName = param.$ref.replace("#/components/parameters/", "");
+ const parameterType = openAPI?.components?.parameters[paramName].in;
+ return parameterType === type;
+ } else {
+ return param.in === type;
+ }
+ });
+
+ return (
+ <>
+ {title}
+ {paramsToGivenType?.length > 0 ? (
+
+
+
+ Name
+
+
+ Type
+
+
+ Description
+
+
+ {parameters?.map((parameter) => {
+ if (type === parameter.in || isReferenceObject(parameter)) {
+ if (isReferenceObject(parameter)) {
+ const paramName = parameter.$ref.replace("#/components/parameters/", "");
+ const parameterType = openAPI?.components?.parameters[paramName].in;
+ return (
+ <>
+ {parameterType === type && }
+ >
+ );
+ } else {
+ return (
+ <>
+ {parameter.in === type && }
+ >
+ );
+ }
+ }
+ })}
+
+ ) : (
+ No {title}.
+ )}
+ >
+ )
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/PathItem/PathItem.stories.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/PathItem/PathItem.stories.tsx
new file mode 100644
index 00000000000..f23a859b2f8
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/PathItem/PathItem.stories.tsx
@@ -0,0 +1,116 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { useState } from "react";
+import { PathItem as P } from "../../../Definitions/ServiceDefinitions";
+import { PathItem } from "./PathItem";
+import { ReadOnlyPathItem } from "./ReadOnlyPathItem";
+
+export default {
+ component: PathItem,
+ title: 'New PathItem',
+};
+
+const pathItem: P = {
+ summary: "summary",
+ description: "description",
+ post: {
+ summary: "summary",
+ description: "description",
+ operationId: "operationId",
+ requestBody: {
+ content: {
+ "application/json": {
+ schema: {
+ type: "object",
+ required: ["name"],
+ properties: {
+ name: {
+ type: "string",
+ },
+ age: {
+ type: "integer",
+ format: "int32",
+ },
+ },
+ },
+ },
+ },
+ },
+ responses: {
+ "200": {
+ description: "description",
+ content: {
+ "application/json": {
+ schema: {
+ type: "object",
+ required: ["name"],
+ properties: {
+ name: {
+ type: "string",
+ },
+ age: {
+ type: "integer",
+ format: "int32",
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ parameters: [
+ {
+ name: "name",
+ in: "query",
+ description: "description",
+ required: true,
+ schema: {
+ type: "string",
+ },
+ },
+ {
+ name: "id",
+ in: "path",
+ description: "description",
+ required: true,
+ schema: {
+ type: "string",
+ },
+ },
+ ],
+};
+
+export const PathItemStory = () => {
+ const [pi, setPI] = useState(pathItem);
+ const [path, setPath] = useState("/path");
+ const handlePathItemChange = (pathItem: P, path: string) => {
+ setPath(path);
+ setPI(pathItem);
+ }
+ return (
+
+ );
+};
+
+export const ReadOnlyPathItemStory = () => {
+ return (
+
+ );
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/PathItem/PathItem.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/PathItem/PathItem.tsx
new file mode 100644
index 00000000000..b56a4022b84
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/PathItem/PathItem.tsx
@@ -0,0 +1,238 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { Button, CheckBox, CheckBoxGroup, Codicon, TextField } from '@wso2/ui-toolkit';
+import styled from "@emotion/styled";
+import { PathItem as P, Parameter, ReferenceObject } from '../../../Definitions/ServiceDefinitions';
+import { useVisualizerContext } from '@wso2/api-designer-rpc-client';
+import { useContext } from 'react';
+import { getColorByMethod } from '../../Utils/OpenAPIUtils';
+import { Parameters } from '../Parameters/Parameters';
+import { APIDesignerContext } from '../../../APIDesignerContext';
+
+const PanelBody = styled.div`
+ height: calc(100% - 87px);
+ overflow-y: auto;
+ padding: 16px;
+ gap: 15px;
+ display: flex;
+ flex-direction: column;
+`;
+
+const ButtonWrapper = styled.div`
+ display: flex;
+ flex-direction: flex-grow;
+ justify-content: flex-end;
+`;
+
+interface PathItemProps {
+ pathItem: P;
+ path: string;
+ onPathItemChange: (pathItem: P, path: string) => void;
+}
+
+const httpMethods = ["get", "post", "put", "delete", "options", "head", "patch", "trace"];
+const moreOptions = ["Summary", "Description"];
+
+const getAllOperationsFromPathItem = (pathItem: P) => {
+ return Object.keys(pathItem).filter(key => httpMethods.includes(key));
+}
+
+export function PathItem(props: PathItemProps) {
+ const { pathItem, path, onPathItemChange } = props;
+ const { rpcClient } = useVisualizerContext();
+ const {
+ props: { pathInitiated },
+ api: { onPathInitiatedChange }
+ } = useContext(APIDesignerContext);
+ let selectedOptions: string[] = [];
+ if (pathItem && pathItem.summary === "" || pathItem.summary) {
+ selectedOptions.push("Summary");
+ }
+ if (pathItem && pathItem.description === "" || pathItem.description) {
+ selectedOptions.push("Description");
+ }
+
+ const handlePathItemChange = (pathItem: P, path: string) => {
+ onPathItemChange(pathItem, path);
+ };
+ const handlePathFieldChange = (e: any) => {
+ const matches = e.target.value.match(/{(.*?)}/g); // Match all segments within curly braces
+ const pathSegments = matches ? matches.map((match: string) => match.replace(/[{}]/g, '')) : [];
+ // Update the path item with the new path parameters if it is not included
+ let updatedPathItem = { ...pathItem };
+ updatedPathItem.parameters = pathSegments.map((segment: string) => {
+ return {
+ name: segment,
+ in: "path",
+ required: true,
+ description: "",
+ schema: {
+ type: "string",
+ },
+ };
+ });
+ onPathInitiatedChange(false);
+ handlePathItemChange({ ...updatedPathItem }, e.target.value ? e.target.value : '/');
+ };
+ const handlePathParametersChange = (parameters: (Parameter | ReferenceObject)[]) => {
+ // Construct the new path item with the updated path parameters
+ const newPathParamString = parameters
+ .filter((param) => param.in === 'path')
+ .map((param) => `{${param.name}}`)
+ .join('/');
+ const pathWithoutParams = path.replace(/{(.*?)}/g, '').replace(/\/+$/, ''); // Remove existing path parameters and trailing slashes
+ const newPath = `${pathWithoutParams}/${newPathParamString}`;
+ handlePathItemChange({ ...pathItem, parameters }, newPath);
+ };
+
+ const handleOptionChange = (options: string[]) => {
+ // Update the path item with the selected options
+ let updatedPathItem = { ...pathItem };
+ if (options.includes("Summary")) {
+ updatedPathItem.summary = "";
+ } else {
+ delete updatedPathItem.summary;
+ }
+ if (options.includes("Description")) {
+ updatedPathItem.description = "";
+ } else {
+ delete updatedPathItem.description;
+ }
+ handlePathItemChange(updatedPathItem, path);
+ }
+ const onConfigureClick = () => {
+ rpcClient.selectQuickPickItems({
+ title: "Select sections",
+ items: moreOptions.map(item => ({ label: item, picked: selectedOptions.includes(item) }))
+ }).then(resp => {
+ if (resp) {
+ handleOptionChange(resp.map(item => item.label))
+ }
+ })
+ };
+ const handleDescriptionChange = (e: any) => {
+ handlePathItemChange({ ...pathItem, description: e.target.value }, path);
+ };
+ const handleOperationChange = (isChecked: boolean, method: string) => {
+ let updatedPathItem = { ...pathItem };
+ if (isChecked) {
+ updatedPathItem[method] = {
+ parameters: [],
+ responses: {
+ 200: {
+ description: "OK",
+ content: {
+ "application/json": {
+ schema: {
+ type: "string",
+ },
+ },
+ },
+ },
+ },
+ };
+ // If the method is post, put or patch, add a request body
+ if (method === 'post' || method === 'put' || method === 'patch') {
+ updatedPathItem[method].requestBody = {
+ content: {
+ "application/json": {
+ schema: {
+ type: "object",
+ },
+ },
+ },
+ };
+ }
+ } else {
+ delete updatedPathItem[method];
+ }
+ handlePathItemChange(updatedPathItem, path);
+ };
+
+ const operations = getAllOperationsFromPathItem(pathItem);
+
+ return (
+
+
+
+
+
+ {selectedOptions.includes("Summary") && (
+ handlePathItemChange({ ...pathItem, summary: e.target.value }, path)}
+ />
+ )}
+ {selectedOptions.includes("Description") && (
+
+ )}
+
+
+ {httpMethods && httpMethods.map((method: string) => (
+ handleOperationChange(isChecked, method)}
+ sx={{ "--foreground": getColorByMethod(method) }}
+ />
+ ))}
+
+ handlePathParametersChange(parameters)}
+ />
+ handlePathItemChange({ ...pathItem, parameters }, path)}
+ />
+ handlePathItemChange({ ...pathItem, parameters }, path)}
+ />
+
+ )
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/PathItem/ReadOnlyPathItem.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/PathItem/ReadOnlyPathItem.tsx
new file mode 100644
index 00000000000..59ab5e5f890
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/PathItem/ReadOnlyPathItem.tsx
@@ -0,0 +1,115 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { Typography } from '@wso2/ui-toolkit';
+import styled from "@emotion/styled";
+import { PathItem as P } from '../../../Definitions/ServiceDefinitions';
+import { getColorByMethod } from '../../Utils/OpenAPIUtils';
+import { MarkdownRenderer } from '../Info/ReadOnlyInfo';
+import { ReadOnlyParameters } from '../Parameters/ReadOnlyParameters';
+
+const PanelBody = styled.div`
+ height: calc(100% - 87px);
+ overflow-y: auto;
+ padding: 16px;
+ gap: 15px;
+ display: flex;
+ flex-direction: column;
+`;
+
+const PathWrapper = styled.div`
+ display: flex;
+ flex-direction: row;
+ gap: 10px;
+`;
+interface MethodWrapperProps {
+ color: string;
+}
+const MethodWrapper = styled.div`
+ display: flex;
+ width: fit-content;
+ color: white;
+ border-radius: 2px;
+ background-color: ${(props: MethodWrapperProps) => props.color};
+`;
+
+interface PathItemProps {
+ pathItem: P;
+ path: string;
+}
+
+const httpMethods = ["get", "post", "put", "delete", "options", "head", "patch", "trace"];
+
+const getAllOperationsFromPathItem = (pathItem: P) => {
+ return Object.keys(pathItem).filter(key => httpMethods.includes(key));
+}
+
+export function ReadOnlyPathItem(props: PathItemProps) {
+ const { pathItem, path } = props;
+
+ const operations = getAllOperationsFromPathItem(pathItem);
+ const filteredOperations = operations.filter((operation) => operation !== "summary" &&
+ operation !== "description" && operation !== "parameters" && operation !== "servers" &&
+ operation !== "tags" && operation !== "externalDocs");
+
+ return (
+
+ {path}
+ {pathItem.summary && (
+ <>
+ Summary
+ {pathItem.summary}
+ >
+ )}
+ {pathItem.description && (
+ <>
+ Description
+
+
+
+ >
+ )}
+ Operations
+
+ {filteredOperations?.length > 0 && filteredOperations.map((operation) => (
+
+
+ {operation.toUpperCase()}
+
+
+ ))}
+
+ {pathItem.parameters?.length > 0 && (
+ <>
+ Parameters
+
+
+
+ >
+ )}
+
+ )
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Paths/Paths.stories.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Paths/Paths.stories.tsx
new file mode 100644
index 00000000000..51af38ff19a
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Paths/Paths.stories.tsx
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { useState } from "react";
+import { Paths as P } from "../../../Definitions/ServiceDefinitions";
+import { Paths } from "./Paths";
+import petstoreJSON from "../../Data/petstoreJSON.json";
+import { ReadOnlyPaths } from "./ReadOnlyPaths";
+
+export default {
+ component: Paths,
+ title: 'New Paths',
+};
+
+const paths: P = petstoreJSON.paths as unknown as P;
+
+export const PathsStory = () => {
+ const [pi, setPI] = useState(paths);
+ const handlePathItemChange = (pathItem: P) => {
+ console.log("PathItem changed", pathItem);
+ setPI(pathItem);
+ }
+ return (
+
+ );
+};
+
+export const ReadOnlyPathsStory = () => {
+ return (
+
+ );
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Paths/Paths.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Paths/Paths.tsx
new file mode 100644
index 00000000000..005d87e5cd2
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Paths/Paths.tsx
@@ -0,0 +1,93 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { Paths as P, PathItem as PI, Operation as O } from '../../../Definitions/ServiceDefinitions';
+import { PathItem } from '../PathItem/PathItem';
+import { Operation } from "../Operation/Operation";
+import { useContext, useState } from 'react';
+import { APIDesignerContext } from '../../../APIDesignerContext';
+import { PathID } from '../../../constants';
+
+interface PathsProps {
+ paths: P;
+ onPathsChange: (path: P, newPath?: string) => void;
+}
+
+export function Paths(props: PathsProps) {
+ const { paths, onPathsChange } = props;
+ const {
+ props: { selectedComponentID },
+ api: { onSelectedComponentIDChange }
+ } = useContext(APIDesignerContext);
+ const [prevSelectedPath, setPrevSelectedPath] = useState(selectedComponentID.split("#-")[2]);
+ const handlePathsChange = (pathItem: PI, path: string) => {
+ const previousPath = selectedComponentID.split("#-")[2];
+ setPrevSelectedPath(previousPath);
+ if (previousPath !== path) {
+ const newPaths = Object.keys(paths).reduce((acc, key) => {
+ if (key === previousPath) {
+ // Add new path item
+ acc[path] = pathItem;
+ return acc;
+ }
+ acc[key] = paths[key];
+ return acc;
+ }, {} as P);
+ onPathsChange(newPaths, path); // Call onPathsChange with the updated paths
+ onSelectedComponentIDChange(`${PathID.PATHS_COMPONENTS}${PathID.SEPERATOR}${path}`);
+ } else {
+ onPathsChange({ ...paths, [path]: pathItem });
+ }
+ };
+ const handleOperationsChange = (operation: O) => {
+ onPathsChange({
+ ...paths,
+ [selectedPath]: {
+ ...paths[selectedPath],
+ [selectedMethod]: operation
+ }
+ });
+ };
+ const selectedPath = selectedComponentID.split("#-")[2];
+ const selectedMethod = selectedComponentID.split("#-")[3];
+ const selectedOperation: O = selectedPath && selectedMethod && paths[selectedPath] && paths[selectedPath][selectedMethod] as O;
+ const selectedPathInPaths = Object.keys(paths).includes(selectedPath);
+ return (
+ <>
+ {Object.keys(paths).map((key) => {
+ if (key !== "$ref" && key !== "summary" && key !== "description" && key !== "servers" && !selectedMethod && (selectedPathInPaths ? selectedPath === key : key === prevSelectedPath)) {
+ return (
+
+ )
+ } else if (key !== "$ref" && key !== "summary" && key !== "description" && key !== "servers" && selectedPath === key && selectedMethod) {
+ return (
+
+ )
+ }
+ })}
+ >
+ )
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Paths/ReadOnlyPaths.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Paths/ReadOnlyPaths.tsx
new file mode 100644
index 00000000000..5137f1aca27
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Paths/ReadOnlyPaths.tsx
@@ -0,0 +1,58 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { Paths as P, PathItem as PI, Operation as O } from '../../../Definitions/ServiceDefinitions';
+import { useContext } from 'react';
+import { APIDesignerContext } from '../../../APIDesignerContext';
+import { ReadOnlyOperation } from '../Operation/ReadOnlyOperation';
+import { ReadOnlyPathItem } from '../PathItem/ReadOnlyPathItem';
+
+interface PathsProps {
+ paths: P;
+}
+
+export function ReadOnlyPaths(props: PathsProps) {
+ const { paths } = props;
+ const {
+ props: { selectedComponentID },
+ } = useContext(APIDesignerContext);
+ const selectedPath = selectedComponentID.split("#-")[2];
+ const selectedMethod = selectedComponentID.split("#-")[3];
+ const selectedOperation: O = selectedPath && selectedMethod && paths[selectedPath] && paths[selectedPath][selectedMethod] as O;
+ return (
+ <>
+ {Object.keys(paths).map((key) => {
+ if (key !== "$ref" && key !== "summary" && key !== "description" && key !== "servers" && selectedPath === key && selectedMethod && selectedOperation) {
+ return (
+
+ )
+ } else if (key !== "$ref" && key !== "summary" && key !== "description" && key !== "servers" && selectedPath === key) {
+ return (
+
+ )
+ }
+ })}
+ >
+ )
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefComponent/RefComponent.stories.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefComponent/RefComponent.stories.tsx
new file mode 100644
index 00000000000..19935f2664f
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefComponent/RefComponent.stories.tsx
@@ -0,0 +1,45 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { RefComponent } from "./RefComponent";
+
+// const RefComponentMenuStrory = () => {
+// const [values, setValues] = useState([]);
+
+// const onChangeValues = (values: string[]) => {
+// setValues(values);
+// };
+
+// return (
+//
+// );
+// };
+// storiesOf("RefComponentMenuStrory").add("RefComponent Menu Strory", () => );
+export default {
+ component: RefComponent,
+ title: 'New Add RefComponent',
+};
+
+export const RefComponentMenuStory = () => {
+ return (
+ {}}
+ />
+ );
+};
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefComponent/RefComponent.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefComponent/RefComponent.tsx
new file mode 100644
index 00000000000..d18fb045704
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefComponent/RefComponent.tsx
@@ -0,0 +1,136 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React, { ReactNode, useRef } from "react";
+import styled from "@emotion/styled";
+import { createPortal } from "react-dom";
+import { Button, Codicon, Overlay } from "@wso2/ui-toolkit";
+
+interface RefComponentContainerProps {
+ sx?: any;
+}
+
+const RefComponentContainer = styled.div`
+ ${(props: RefComponentContainerProps) => props.sx};
+`;
+
+interface ContainerProps {
+ isOpen: boolean;
+ dropdownSx?: any;
+}
+
+const ValueContainer = styled.div`
+ display: flex;
+ flex-direction: row;
+ align-items: flex-start;
+ cursor: pointer;
+ background-color: var(--vscode-background);
+ margin-top: 2px;
+ flex-wrap: wrap;
+ width: fit-content;
+`;
+
+const Dropdown = styled.div`
+ display: flex;
+ flex-direction: column;
+ position: absolute;
+ width: fit-content;
+ z-index: 1001;
+ background-color: var(--vscode-dropdown-background);
+ border: 1px solid var(--vscode-dropdown-border);
+ border-color: ${(props: ContainerProps) => (props.isOpen ? "var(--vscode-focusBorder)" : "var(--vscode-dropdown-border)")};
+ padding: 8px;
+ box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);
+ max-height: 200px;
+ overflow-y: auto;
+ &:hover {
+ cursor: pointer;
+ background-color: var(--vscode-editorHoverWidget-background);
+ }
+ ${(props: ContainerProps) => props.dropdownSx};
+`;
+
+export interface RefComponentProps {
+ id?: string;
+ className?: string;
+ displayValue?: ReactNode;
+ sx?: any;
+ iconSx?: any;
+ buttonSx?: any;
+ dropdownSx?: any;
+ dropdownWidth?: number;
+ componnetHeight?: number;
+ onChange?: () => void;
+}
+
+export const RefComponent: React.FC = (props: RefComponentProps) => {
+ const { id, className, displayValue, sx, dropdownSx, buttonSx, onChange,
+ componnetHeight = 0, dropdownWidth = 0 } = props;
+ const [isComponentOpen, setIsComponentOpen] = React.useState(false);
+ const [valueContainerPosition, setValueContainerPosition] = React.useState(null);
+ const containerRef = useRef(null); // Reference to the container
+ const valueContainerRef = useRef(null); // Reference to the value container
+
+ const handleComponentClick = () => {
+ setValueContainerPosition(valueContainerRef.current?.getBoundingClientRect());
+ setIsComponentOpen(!isComponentOpen);
+ };
+
+ const handleChange = () => {
+ setIsComponentOpen(false);
+ onChange();
+ };
+
+ const handleCloseComponent = () => {
+ setIsComponentOpen(false);
+ };
+
+ return (
+
+ {displayValue ? {displayValue}
: (
+
+
+
+ )}
+ {isComponentOpen &&
+ <>
+ {createPortal(
+ window.innerHeight
+ ? valueContainerPosition?.top + window.scrollY - componnetHeight - 5 // Adjust if it goes beyond the bottom of the window
+ : valueContainerPosition?.bottom, // Position below the value container
+ left: ((valueContainerPosition?.right + 200) > window.innerWidth)
+ ? valueContainerPosition?.right - dropdownWidth // Adjust if it goes beyond the right of the window
+ : valueContainerPosition?.left, // Align with the left of the value container
+ }}
+ >
+ Add Reference Object
+
+ , document.body
+ )}
+ <>
+ {isComponentOpen && }
+ >
+ >
+ }
+
+ );
+};
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefParameter/ReadOnlyRefParameter.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefParameter/ReadOnlyRefParameter.tsx
new file mode 100644
index 00000000000..9b39d55e69b
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefParameter/ReadOnlyRefParameter.tsx
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { Typography } from '@wso2/ui-toolkit';
+import { Parameter } from '../../../Definitions/ServiceDefinitions';
+import styled from '@emotion/styled';
+import { ReadOnlyParameter } from '../Parameter/ReadOnlyParameter';
+
+const PanelBody = styled.div`
+ height: calc(100% - 87px);
+ overflow-y: auto;
+ padding: 16px;
+ gap: 15px;
+ display: flex;
+ flex-direction: column;
+`;
+const MethodWrapper = styled.div`
+ display: flex;
+ width: fit-content;
+ color: white;
+ background-color: var(--vscode-editorHoverWidget-border);
+`;
+const PathWrapper = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+`;
+
+export interface ReadOnlyReferenceObjectsProps {
+ name: string;
+ parameter: Parameter;
+}
+
+export function ReadOnlyRefParameters(props: ReadOnlyReferenceObjectsProps) {
+ const { parameter, name } = props;
+
+ return (
+
+ Parameter
+
+ {name}
+
+
+
+ )
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefParameter/RefParameter.stories.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefParameter/RefParameter.stories.tsx
new file mode 100644
index 00000000000..401b2c40db5
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefParameter/RefParameter.stories.tsx
@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { useState } from "react";
+import { Parameter } from "../../../Definitions/ServiceDefinitions";
+import { RefParameter } from "./RefParameter";
+
+export default {
+ component: RefParameter,
+ title: 'New Ref Parameter',
+};
+
+const p: Parameter = {
+ name: "test",
+ in: "query",
+ description: "Test Description",
+ required: true,
+ schema: {
+ type: "string",
+ },
+};
+
+export const RefParameterStory = () => {
+ const [param, setParam] = useState(p);
+ const [name, setName] = useState("Test");
+ const onParameterChange = (parameter: Parameter, name: string) => {
+ setParam(parameter);
+ setName(name);
+ }
+ return (
+
+ );
+};
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefParameter/RefParameter.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefParameter/RefParameter.tsx
new file mode 100644
index 00000000000..0071cdd7499
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefParameter/RefParameter.tsx
@@ -0,0 +1,121 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { Dropdown, TextField, Typography } from '@wso2/ui-toolkit';
+import { Parameter, SchemaTypes } from '../../../Definitions/ServiceDefinitions';
+import { PanelBody } from '../Parameters/Parameters';
+import { useContext } from 'react';
+import { APIDesignerContext } from '../../../APIDesignerContext';
+import { PathID } from '../../../constants';
+
+interface RefParamaterProps {
+ paramerName: string;
+ parameter: Parameter;
+ onParameterChange: (parameter: Parameter, name: string, initialName?: string) => void;
+}
+
+const DataTypes = [
+ "string",
+ "number",
+ "integer",
+ "boolean",
+ "array",
+ "any"
+];
+
+export function RefParameter(props: RefParamaterProps) {
+ const { paramerName, parameter, onParameterChange } = props;
+ const {
+ api: { onSelectedComponentIDChange }
+ } = useContext(APIDesignerContext);
+ const handleParameterChange = (parameter: Parameter) => {
+ onParameterChange(parameter, paramerName, paramerName);
+ };
+ const hanleParameterNameChange = (e: React.ChangeEvent) => {
+ onParameterChange(parameter, e.target.value, paramerName);
+ onSelectedComponentIDChange(`${PathID.PARAMETERS_COMPONENTS}${PathID.SEPERATOR}${e.target.value}`);
+ };
+
+ const dataTypes = DataTypes.map((type) => {
+ return { content: type, value: type };
+ });
+
+ return (
+
+ Parameter
+ hanleParameterNameChange(e)}
+ />
+ handleParameterChange(
+ {
+ ...parameter,
+ in: e.target.value as "header" | "path" | "query" | "cookie",
+ }
+ )}
+ />
+ handleParameterChange(
+ {
+ ...parameter,
+ name: e.target.value,
+ }
+ )}
+ />
+ handleParameterChange(
+ {
+ ...parameter,
+ schema: {
+ ...parameter.schema,
+ type: e.target.value as SchemaTypes,
+ }
+ }
+ )}
+ />
+ handleParameterChange(
+ {
+ ...parameter,
+ description: e.target.value,
+ }
+ )}
+ />
+
+ )
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefRequestBody/ReadOnlyRefRequestBody.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefRequestBody/ReadOnlyRefRequestBody.tsx
new file mode 100644
index 00000000000..c394296cade
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefRequestBody/ReadOnlyRefRequestBody.tsx
@@ -0,0 +1,54 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { Typography } from '@wso2/ui-toolkit';
+import { RequestBody } from '../../../Definitions/ServiceDefinitions';
+import styled from '@emotion/styled';
+import { ReadOnlyRequestBody } from '../RequestBody/ReadOnlyRequestBody';
+
+const PanelBody = styled.div`
+ height: calc(100% - 87px);
+ overflow-y: auto;
+ padding: 16px;
+ gap: 15px;
+ display: flex;
+ flex-direction: column;
+`;
+const PathWrapper = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+`;
+
+export interface ReadOnlyReferenceObjectsProps {
+ name: string;
+ requestBody: RequestBody;
+}
+
+export function ReadOnlyRefRequestBody(props: ReadOnlyReferenceObjectsProps) {
+ const { requestBody, name } = props;
+
+ return (
+
+ Request Body
+
+ {name}
+
+
+
+ )
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefRequestBody/RefRequestBody.stories.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefRequestBody/RefRequestBody.stories.tsx
new file mode 100644
index 00000000000..f484ca74b95
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefRequestBody/RefRequestBody.stories.tsx
@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { useState } from "react";
+import { ReferenceObject, RequestBody } from "../../../Definitions/ServiceDefinitions";
+import { RefRequestBody } from "./RefRequestBody";
+
+export default {
+ component: RefRequestBody,
+ title: 'New Ref Request Body',
+};
+
+const r: RequestBody = {
+ description: "Test",
+ content: {
+ "application/json": {
+ schema: {
+ type: "object",
+ properties: {
+ name: {
+ type: "string"
+ },
+ age: {
+ type: "number"
+ }
+ }
+ }
+ }
+ }
+};
+
+export const RefRequestBodyStory = () => {
+ const [requestBody, setRequestBody] = useState(r);
+ const [name, setName] = useState("Test");
+ const onParameterChange = (requestBody: RequestBody | ReferenceObject, name: string) => {
+ setRequestBody(requestBody);
+ setName(name);
+ }
+ return (
+
+ );
+};
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefRequestBody/RefRequestBody.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefRequestBody/RefRequestBody.tsx
new file mode 100644
index 00000000000..25e23fe0e50
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefRequestBody/RefRequestBody.tsx
@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { TextField, Typography } from '@wso2/ui-toolkit';
+import { RequestBody as R, ReferenceObject } from '../../../Definitions/ServiceDefinitions';
+import { PanelBody } from '../Parameters/Parameters';
+import { RequestBody } from '../RequestBody/RequestBody';
+import { PathID } from '../../../constants';
+import { useContext } from 'react';
+import { APIDesignerContext } from '../../../APIDesignerContext';
+
+interface RefRequestBodyProps {
+ requestBodyName: string;
+ requestBody: R | ReferenceObject;
+ onRequestBodyChange: (requestBody: R | ReferenceObject, name: string, initialName?: string) => void;
+}
+
+export function RefRequestBody(props: RefRequestBodyProps) {
+ const { requestBodyName, requestBody, onRequestBodyChange } = props;
+ const {
+ api: { onSelectedComponentIDChange }
+ } = useContext(APIDesignerContext);
+ const handleRequestBodyChangeChange = (parameter: R | ReferenceObject) => {
+ onRequestBodyChange(parameter, requestBodyName, requestBodyName);
+ };
+ const handleRequestBodyNameChange = (e: React.ChangeEvent) => {
+ onRequestBodyChange(requestBody, e.target.value, requestBodyName);
+ onSelectedComponentIDChange(`${PathID.REQUEST_BODY_COMPONENTS}${PathID.SEPERATOR}${e.target.value}`);
+ };
+
+ return (
+
+ Request Body
+ handleRequestBodyNameChange(e)}
+ />
+
+
+ )
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefResponse/ReadOnlyRefResponse.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefResponse/ReadOnlyRefResponse.tsx
new file mode 100644
index 00000000000..bf2d02ce534
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefResponse/ReadOnlyRefResponse.tsx
@@ -0,0 +1,54 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { Typography } from '@wso2/ui-toolkit';
+import { Response as R } from '../../../Definitions/ServiceDefinitions';
+import styled from '@emotion/styled';
+import { ReadOnlyResponse } from '../Response/ReadOnlyResponse';
+
+const PanelBody = styled.div`
+ height: calc(100% - 87px);
+ overflow-y: auto;
+ padding: 16px;
+ gap: 15px;
+ display: flex;
+ flex-direction: column;
+`;
+const PathWrapper = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+`;
+
+export interface ReadOnlyResponseProps {
+ name: string;
+ response: R;
+}
+
+export function ReadOnlyRefResponse(props: ReadOnlyResponseProps) {
+ const { response, name } = props;
+
+ return (
+
+ Response
+
+ {name}
+
+
+
+ )
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefResponse/RefResponse.stories.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefResponse/RefResponse.stories.tsx
new file mode 100644
index 00000000000..20bbee0e4b5
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefResponse/RefResponse.stories.tsx
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { useState } from "react";
+import { Response } from "../../../Definitions/ServiceDefinitions";
+import { RefResponse } from "./RefResponse";
+
+export default {
+ component: RefResponse,
+ title: 'New Ref Request Body',
+};
+
+const r: Response = {
+ description: "Test",
+ content: {
+ "application/json": {
+ schema: {
+ type: "object",
+ properties: {
+ name: {
+ type: "string"
+ },
+ age: {
+ type: "number"
+ }
+ }
+ }
+ }
+ }
+};
+
+
+export const RefResponseStory = () => {
+ const [response, setResponse] = useState(r);
+ const [name, setName] = useState("Test");
+ const onParameterChange = (requestBody: Response, name: string) => {
+ setResponse(requestBody);
+ setName(name);
+ }
+ return (
+
+ );
+};
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefResponse/RefResponse.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefResponse/RefResponse.tsx
new file mode 100644
index 00000000000..986322770d5
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RefResponse/RefResponse.tsx
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { TextField, Typography } from '@wso2/ui-toolkit';
+import { Response as R } from '../../../Definitions/ServiceDefinitions';
+import { PanelBody } from '../Parameters/Parameters';
+import { Response } from '../Response/Response';
+import { APIDesignerContext } from '../../../APIDesignerContext';
+import { useContext } from 'react';
+import { PathID } from '../../../constants';
+
+interface RefRequestBodyProps {
+ responseName: string;
+ response: R;
+ onResponseChange: (response: R, name: string, initialName?: string) => void;
+}
+
+export function RefResponse(props: RefRequestBodyProps) {
+ const { responseName, response, onResponseChange } = props;
+ const {
+ api: { onSelectedComponentIDChange }
+ } = useContext(APIDesignerContext);
+ const handleResponseChangeChange = (response: R) => {
+ onResponseChange(response, responseName, responseName);
+ };
+ const handleResponseNameChange = (e: React.ChangeEvent) => {
+ onResponseChange(response, e.target.value, responseName);
+ onSelectedComponentIDChange(`${PathID.RESPONSE_COMPONENTS}${PathID.SEPERATOR}${e.target.value}`);
+ };
+
+ return (
+
+ Response
+ handleResponseNameChange(e)}
+ />
+
+
+ )
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/ReferenceObject/ReadOnlyReferenceObject.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/ReferenceObject/ReadOnlyReferenceObject.tsx
new file mode 100644
index 00000000000..a1575e71a65
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/ReferenceObject/ReadOnlyReferenceObject.tsx
@@ -0,0 +1,67 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { Typography } from '@wso2/ui-toolkit';
+import styled from "@emotion/styled";
+import { ReferenceObject as R } from '../../../Definitions/ServiceDefinitions';
+import { useContext } from 'react';
+import { APIDesignerContext } from '../../../APIDesignerContext';
+import { resolveTypeFormSchema } from '../../Utils/OpenAPIUtils';
+import { VSCodeDataGridRow } from '@vscode/webview-ui-toolkit/react';
+import { ParameterGridCell, ParamGridRow } from '../Parameters/Parameters';
+
+interface ReadOnlyReferenceObjectsProps {
+ referenceObject: R;
+ type?: string;
+}
+const ParamContainer = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+`;
+
+const ParamWrapper = styled.div`
+ display: flex;
+ flex-direction: row;
+ gap: 10px;
+`;
+export function ReadOnlyReferenceObject(props: ReadOnlyReferenceObjectsProps) {
+ const { referenceObject, type } = props;
+ const {
+ props: { openAPI },
+ } = useContext(APIDesignerContext);
+
+ const refObject = (type === "query" || type === "path" || type === "header" ) ? openAPI?.components?.parameters[referenceObject?.$ref?.replace("#/components/parameters/", "")] : type === "response" ? openAPI?.components?.responses[referenceObject.$ref.replace("#/components/response/", "")] : openAPI?.components?.requestBodies[referenceObject.$ref];
+ const refObjectName = refObject?.name;
+ const refObjectType = resolveTypeFormSchema(refObject?.schema);
+ const refObjectDescription = refObject?.description;
+
+ return (
+ //
+ //
+ // {refObjectName}
+ // {`${refObjectType} ${refObject.schema.format ? `<${refObject.schema.format}>` : ""}`}
+ //
+ // {refObjectDescription}
+ //
+
+ Reference
+ {refObjectType ? refObjectType : "-"}
+ {refObjectDescription ? refObjectDescription : "-"}
+
+ )
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/ReferenceObject/ReferenceObject.stories.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/ReferenceObject/ReferenceObject.stories.tsx
new file mode 100644
index 00000000000..de8e1efccc3
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/ReferenceObject/ReferenceObject.stories.tsx
@@ -0,0 +1,38 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { ReferenceObject as R } from "../../../Definitions/ServiceDefinitions";
+import { ReferenceObject } from "./ReferenceObject";
+
+export default {
+ component: ReferenceObject,
+ title: 'New Reference Object',
+};
+
+const referenceObj: R = {
+ $ref: "http://example.com",
+ description: "description",
+ summary: "summary",
+};
+
+
+export const ParameterStory = () => {
+ return (
+ {}} />
+ );
+};
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/ReferenceObject/ReferenceObject.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/ReferenceObject/ReferenceObject.tsx
new file mode 100644
index 00000000000..bb5cbac6722
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/ReferenceObject/ReferenceObject.tsx
@@ -0,0 +1,127 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { Button, Codicon, Dropdown, TextField, Typography } from '@wso2/ui-toolkit';
+import styled from "@emotion/styled";
+import { ReferenceObject as R } from '../../../Definitions/ServiceDefinitions';
+import { useContext } from 'react';
+import { APIDesignerContext } from '../../../APIDesignerContext';
+
+const HorizontalFieldWrapper = styled.div`
+ display: flex;
+ flex-direction: row;
+ gap: 10px;
+`;
+
+interface ReferenceObjectsProps {
+ id: number;
+ referenceObject: R;
+ type?: string;
+ onRemoveReferenceObject?: (id: number) => void;
+ onRefernceObjectChange: (parameter: R) => void;
+}
+const ButtonWrapperParams = styled.div`
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ min-width: 40px;
+ flex-grow: 1;
+ gap: 5px;
+ justify-content: flex-end;
+`;
+
+const LabelContainer = styled.div`
+ display: flex;
+ align-items: center;
+ width: 25%;
+`;
+
+export function ReferenceObject(props: ReferenceObjectsProps) {
+ const { id, referenceObject, type, onRemoveReferenceObject, onRefernceObjectChange } = props;
+ const {
+ props: { openAPI },
+ } = useContext(APIDesignerContext);
+
+ const existingComponents: string[] = [];
+ if (type === "query" && openAPI?.components?.parameters) {
+ Object.keys(openAPI.components.parameters).forEach((key) => {
+ if (openAPI.components.parameters[key].in === "query") {
+ existingComponents.push(key as string);
+ }
+ });
+ } else if (type === "header" && openAPI?.components?.parameters) {
+ Object.keys(openAPI.components.parameters).forEach((key) => {
+ if (openAPI.components.parameters[key].in === "header") {
+ existingComponents.push(key as string);
+ }
+ });
+ } else if (type === "path" && openAPI?.components?.parameters) {
+ Object.keys(openAPI.components.parameters).forEach((key) => {
+ if (openAPI.components.parameters[key].in === "path") {
+ existingComponents.push(key as string);
+ }
+ });
+ } else if (type === "response" && openAPI?.components.responses) {
+ Object.keys(openAPI.components.responses).forEach((key) => {
+ existingComponents.push(key as string);
+ });
+ } else if (type === "requestBody" && openAPI?.components.requestBodies) {
+ Object.keys(openAPI.components.requestBodies).forEach((key) => {
+ existingComponents.push(key as string);
+ });
+ }
+
+ const handleParameterChange = (parameter: R) => {
+ onRefernceObjectChange(parameter);
+ };
+
+ const referenceObjectsList = existingComponents ? existingComponents?.map((item) => ({
+ value: type === "response"
+ ? `#/components/responses/${item}`
+ : type === "requestBody"
+ ? `#/components/requestBodies/${item}`
+ : `#/components/parameters/${item}`,
+ content: item
+ })) : [];
+
+ return (
+
+
+ Reference
+
+ handleParameterChange({ ...referenceObject, $ref: value })}
+ />
+ handleParameterChange({ ...referenceObject, description: evt.target.value })}
+ />
+
+
+
+
+ )
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RequestBody/ReadOnlyRequestBody.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RequestBody/ReadOnlyRequestBody.tsx
new file mode 100644
index 00000000000..005d4327a67
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RequestBody/ReadOnlyRequestBody.tsx
@@ -0,0 +1,73 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { Dropdown } from '@wso2/ui-toolkit';
+import { RequestBody as R, ReferenceObject } from '../../../Definitions/ServiceDefinitions';
+import SectionHeader from '../SectionHeader/SectionHeader';
+import { useState } from 'react';
+import styled from '@emotion/styled';
+import { ReadOnlyMediaType } from '../MediaType/ReadOnlyMediaType';
+
+interface RequestBodyProps {
+ requestBody: R | ReferenceObject;
+}
+
+const ContentWrapper = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+`;
+const SubSectionWrapper = styled.div`
+ display: flex;
+ flex-direction: column;
+ padding-top: 5px;
+ gap: 5px;
+`;
+
+export function ReadOnlyRequestBody(props: RequestBodyProps) {
+ const { requestBody } = props;
+ const [selectedMediaType, setSelectedMediaType] = useState(requestBody?.content && Object.keys(requestBody.content)[0]);
+
+ const allMediaTypes = requestBody?.content && Object.keys(requestBody.content);
+
+ return (
+ <>
+
+
+ ({ label: mediaType, value: mediaType }))}
+ onValueChange={(value) => setSelectedMediaType(value)}
+ />
+ }
+ />
+ {selectedMediaType && requestBody.content[selectedMediaType] && (
+
+ )}
+
+
+ >
+ )
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RequestBody/RequestBody.stories.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RequestBody/RequestBody.stories.tsx
new file mode 100644
index 00000000000..b50af7b499a
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RequestBody/RequestBody.stories.tsx
@@ -0,0 +1,96 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { useState } from "react";
+import { MediaType as M, RequestBody as R, ReferenceObject } from "../../../Definitions/ServiceDefinitions";
+import { RequestBody } from "./RequestBody";
+import { ReadOnlyRequestBody } from "./ReadOnlyRequestBody";
+
+export default {
+ component: RequestBody,
+ title: 'New RequestBody',
+};
+
+const MediaT: M = {
+ schema: {
+ type: "object",
+ required: ["name"],
+ properties: {
+ name: {
+ type: "string",
+ },
+ age: {
+ type: "integer",
+ format: "int32",
+ },
+ },
+ },
+};
+const RequestB: R = {
+ content: {
+ "application/json": {
+ schema: {
+ type: "object",
+ required: ["name"],
+ properties: {
+ name: {
+ type: "string",
+ },
+ age: {
+ type: "integer",
+ format: "int32",
+ },
+ },
+ },
+ },
+ "application/xml": {
+ schema: {
+ type: "object",
+ required: ["name"],
+ properties: {
+ name: {
+ type: "string",
+ },
+ age: {
+ type: "integer",
+ format: "int32",
+ },
+ city: {
+ type: "string",
+ },
+ },
+ },
+ },
+ },
+};
+
+export const RequestBodyStory = () => {
+ const [r, setR] = useState<(R | ReferenceObject)>(RequestB);
+ const handleRequestBodyChange = (requestBody: (R | ReferenceObject)) => {
+ setR(requestBody);
+ };
+ return (
+
+ );
+};
+
+export const ReadOnlyRequestBodyStory = () => {
+ return (
+
+ );
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RequestBody/RequestBody.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RequestBody/RequestBody.tsx
new file mode 100644
index 00000000000..fcd60f5f47a
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/RequestBody/RequestBody.tsx
@@ -0,0 +1,186 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { Button, Codicon, Dropdown, Typography } from '@wso2/ui-toolkit';
+import { RequestBody as R, MediaType as M, ReferenceObject as RO } from '../../../Definitions/ServiceDefinitions';
+import SectionHeader from '../SectionHeader/SectionHeader';
+import { ReactNode, useContext, useState } from 'react';
+import { useVisualizerContext } from '@wso2/api-designer-rpc-client';
+import { MediaType } from '../MediaType/MediaType';
+import { MediaTypes } from '../../../constants';
+import { APIDesignerContext } from '../../../APIDesignerContext';
+import { RefComponent } from '../RefComponent/RefComponent';
+import { ReferenceObject } from '../ReferenceObject/ReferenceObject';
+
+interface RequestBodyProps {
+ requestBody: R | RO;
+ hideTitle?: boolean;
+ onRequestBodyChange: (mediaType: R | RO) => void;
+}
+
+const isRefereceObject = (value: R | RO): value is RO => {
+ return (value as RO)?.$ref !== undefined;
+};
+
+export function RequestBody(props: RequestBodyProps) {
+ const { requestBody, hideTitle, onRequestBodyChange } = props;
+ const { rpcClient } = useVisualizerContext();
+ const {
+ props: { openAPI },
+ } = useContext(APIDesignerContext);
+
+ const [selectedMediaType, setSelectedMediaType] = useState(requestBody?.content && Object.keys(requestBody.content)[0]);
+
+ const mediaTypes = requestBody?.content && Object.keys(requestBody?.content);
+ const componentRequestBodyNames = openAPI?.components?.requestBodies ? Object.keys(openAPI?.components?.requestBodies) : [];
+
+ const handleRequestBodyChange = (mediaType: R | RO) => {
+ onRequestBodyChange(mediaType);
+ };
+
+ const handleOptionChange = (options: string[]) => {
+ const newRequestBody: R = {
+ ...requestBody,
+ content: options.reduce((acc, item) => {
+ acc[item] = requestBody?.content[item] || { schema: { type: "object" } };
+ return acc;
+ }, {} as Record)
+ };
+ setSelectedMediaType(options[0]);
+ handleRequestBodyChange(newRequestBody);
+ };
+ const onConfigureRequestClick = () => {
+ rpcClient.selectQuickPickItems({
+ title: "Select Content Types",
+ items: MediaTypes.map(item => ({ label: item, picked: mediaTypes?.includes(item) }))
+ }).then(resp => {
+ if (resp) {
+ handleOptionChange(resp.map(item => item.label))
+ }
+ })
+ };
+
+ const onSchemaChange = (updatedSchema: any) => {
+ if (selectedMediaType) {
+ // Update the schema of the selected media type
+ const newRequestBody: R = {
+ ...requestBody,
+ content: {
+ ...requestBody.content,
+ [selectedMediaType]: {
+ ...requestBody.content[selectedMediaType],
+ schema: updatedSchema
+ }
+ }
+ };
+ handleRequestBodyChange(newRequestBody);
+ }
+ };
+
+ const handleImportJSON = () => {
+ rpcClient.getApiDesignerVisualizerRpcClient().importJSON().then(resp => {
+ if (resp) {
+ onSchemaChange(resp);
+ }
+ })
+ };
+
+ const handleMediaTypeChange = (mediaType: M) => {
+ if (selectedMediaType) {
+ // Update the schema of the selected media type
+ const newRequestBody: R = {
+ ...requestBody,
+ content: {
+ ...requestBody.content,
+ [selectedMediaType]: mediaType
+ }
+ };
+ handleRequestBodyChange(newRequestBody);
+ }
+ };
+
+ const handleMoreOptionsClick = () => {
+ const ref: RO = {
+ $ref: `#/components/requestBodies/${componentRequestBodyNames[0]}`,
+ summary: "",
+ description: ""
+ };
+ handleRequestBodyChange(ref);
+ };
+ const addReferenceParamButton: ReactNode = (
+
+ );
+
+ const allMediaTypes = requestBody?.content && Object.keys(requestBody.content);
+
+ return (
+ <>
+ {!hideTitle && Request}
+
+ {!isRefereceObject(requestBody) && (
+ <>
+ {allMediaTypes?.length > 0 && (
+ <>
+
+ ({ label: mediaType, value: mediaType }))}
+ onValueChange={(value) => setSelectedMediaType(value)}
+ />
+ >
+ )}
+
+ {componentRequestBodyNames.length > 0 && addReferenceParamButton}
+ >
+ )}
+ >
+ }
+ />
+ {isRefereceObject(requestBody) && (
+ handleRequestBodyChange({ content: { "application/json": { schema: { type: "object" } } } })
+ }
+ />
+ )}
+ {selectedMediaType && requestBody?.content && (
+
+ )}
+ >
+ )
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/ResourceHeader/ResourceHeader.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/ResourceHeader/ResourceHeader.tsx
new file mode 100644
index 00000000000..e7aae506c1b
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/ResourceHeader/ResourceHeader.tsx
@@ -0,0 +1,64 @@
+import React, { ReactNode } from 'react';
+import { Typography } from '@wso2/ui-toolkit';
+import styled from "@emotion/styled";
+import { getColorByMethod } from '../../Utils/OpenAPIUtils';
+
+interface MethodWrapperProps {
+ color: string;
+}
+
+const MethodWrapper = styled.div`
+ display: flex;
+ width: fit-content;
+ color: white;
+ background-color: ${(props: MethodWrapperProps) => props.color};
+ border-radius: 2px;
+`;
+
+const PathWrapper = styled.div`
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ align-items: center;
+ width: 100%;
+`;
+
+const LeftContent = styled.div`
+ display: flex;
+ flex-direction: row;
+ gap: 10px;
+`;
+
+const RightContent = styled.div`
+ display: flex;
+ align-items: center;
+`;
+
+interface ResourceHeaderProps {
+ method: string;
+ path: string;
+ actionButtons?: ReactNode;
+}
+
+const ResourceHeader: React.FC = ({ method, path, actionButtons }) => {
+ return (
+
+
+
+
+ {method.toUpperCase()}
+
+
+ {path}
+
+
+ {actionButtons}
+
+
+ );
+};
+
+export default ResourceHeader;
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Response/ReadOnlyResponse.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Response/ReadOnlyResponse.tsx
new file mode 100644
index 00000000000..6177a0690db
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Response/ReadOnlyResponse.tsx
@@ -0,0 +1,95 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { Response as R } from '../../../Definitions/ServiceDefinitions';
+import { useState } from 'react';
+
+import SectionHeader from '../SectionHeader/SectionHeader';
+import { Dropdown, Typography } from '@wso2/ui-toolkit';
+import styled from '@emotion/styled';
+import { ReadOnlyMediaType } from '../MediaType/ReadOnlyMediaType';
+import { ReadOnlyHeaders } from '../Headers/ReadOnlyHeaders';
+
+const SubSectionWrapper = styled.div`
+ display: flex;
+ flex-direction: column;
+ padding-top: 5px;
+ gap: 5px;
+`;
+export const ContentWrapper = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+`;
+const ResponseTabContainer = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 15px;
+`;
+
+interface ResponseProps {
+ response: R;
+}
+
+export function ReadOnlyResponse(props: ResponseProps) {
+ const { response } = props;
+ const [selectedMediaType, setSelectedMediaType] = useState(response?.content && Object.keys(response?.content)[0]);
+
+ const allMediaTypes = response?.content && Object.keys(response?.content);
+
+ return (
+
+ {response.description && (
+ {response.description}
+ )}
+ {response?.headers && (
+
+ )}
+
+
+ 0 && (
+ ({ label: mediaType, value: mediaType }))}
+ onValueChange={(value) => setSelectedMediaType(value)}
+ />
+ )
+ }
+ />
+
+ {selectedMediaType && response?.content && (
+
+ )}
+
+
+
+ {allMediaTypes?.length === 0 && (
+ No content available
+ )}
+
+ )
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Response/Response.stories.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Response/Response.stories.tsx
new file mode 100644
index 00000000000..ce321d073aa
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Response/Response.stories.tsx
@@ -0,0 +1,76 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { useState } from "react";
+import { Response as R } from "../../../Definitions/ServiceDefinitions";
+import { Response } from "./Response";
+import { ReadOnlyResponse } from "./ReadOnlyResponse";
+
+export default {
+ component: Response,
+ title: 'New Response',
+};
+
+
+const response: R = {
+ description: "description",
+ content: {
+ "application/json": {
+ schema: {
+ type: "object",
+ required: ["name"],
+ properties: {
+ name: {
+ type: "string",
+ },
+ age: {
+ type: "integer",
+ format: "int32",
+ },
+ },
+ },
+ },
+ "application/xml": {
+ schema: {
+ type: "object",
+ required: ["name"],
+ properties: {
+ name: {
+ type: "string",
+ },
+ },
+ },
+ },
+ },
+};
+
+export const ResponsesStory = () => {
+ const [r, setR] = useState(response);
+ const handleResponseChange = (response: R) => {
+ setR(response);
+ }
+ return (
+
+ );
+};
+
+export const ReadOnlyResponsesStory = () => {
+ return (
+
+ );
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Response/Response.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Response/Response.tsx
new file mode 100644
index 00000000000..872bad1b7e8
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Response/Response.tsx
@@ -0,0 +1,157 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { Content, MediaType as M, Response as R, Schema } from '../../../Definitions/ServiceDefinitions';
+import { useEffect, useState } from 'react';
+import { useVisualizerContext } from '@wso2/api-designer-rpc-client';
+import { MediaType } from '../MediaType/MediaType';
+import { CodeTextArea } from '../../CodeTextArea/CodeTextArea';
+import { Headers } from '../Headers/Headers';
+import SectionHeader from '../SectionHeader/SectionHeader';
+import { Button, Codicon, Dropdown } from '@wso2/ui-toolkit';
+import styled from '@emotion/styled';
+import { MediaTypes } from '../../../constants';
+
+const SubSectionWrapper = styled.div`
+ display: flex;
+ flex-direction: column;
+ padding-top: 5px;
+ gap: 5px;
+`;
+interface ResponseProps {
+ response: R;
+ onResponseChange: (response: R) => void;
+}
+
+export function Response(props: ResponseProps) {
+ const { response, onResponseChange } = props;
+ const { rpcClient } = useVisualizerContext();
+ const [selectedMediaType, setSelectedMediaType] = useState(response?.content && Object.keys(response?.content)[0]);
+ const [description, setDescription] = useState(response?.description);
+ const responseMediaTypes = response?.content && Object.keys(response?.content);
+
+ const handleOptionChange = (options: string[]) => {
+ const newResponse: R = {
+ ...response,
+ content: options.reduce((acc, item) => {
+ acc[item] = (response?.content && response?.content[item]) || { schema: { type: "object" } };
+ return acc;
+ }, {} as Content)
+ };
+ setSelectedMediaType(options[0]);
+ onResponseChange(newResponse);
+ };
+
+ const handleConfigureClick = () => {
+ rpcClient.selectQuickPickItems({
+ title: "Select Types",
+ items: MediaTypes.map(item => ({ label: item, picked: responseMediaTypes?.includes(item) }))
+ }).then(resp => {
+ if (resp) {
+ handleOptionChange(resp.map(item => item.label))
+ }
+ })
+ };
+
+ const handleResponsesChange = (response: R) => {
+ onResponseChange(response);
+ };
+
+ const handleImportJSON = () => {
+ rpcClient.getApiDesignerVisualizerRpcClient().importJSON().then(resp => {
+ if (resp) {
+ const schema: Schema = resp;
+ const newResponse: R = {
+ ...response,
+ content: {
+ ...response.content,
+ [selectedMediaType]: {
+ schema
+ }
+ }
+ };
+ handleResponsesChange(newResponse);
+ }
+ })
+ };
+ const handleMediaTypeChange = (mediaType: M) => {
+ const newResponse: R = {
+ ...response,
+ content: {
+ ...response.content,
+ [selectedMediaType]: mediaType
+ }
+ };
+ handleResponsesChange(newResponse);
+ }
+ const handleDescriptionChange = (evt: React.ChangeEvent) => {
+ setDescription(evt.target.value);
+ handleResponsesChange({ ...response, description: evt.target.value });
+ };
+ const allMediaTypes = response?.content && Object.keys(response?.content);
+
+ useEffect(() => {
+ setDescription(response?.description);
+ }, [response?.description]);
+
+ return (
+
+
+ handleResponsesChange({ ...response, headers })}
+ title='Headers'
+ />
+
+ {allMediaTypes?.length > 0 && (
+ <>
+
+ ({ label: mediaType, value: mediaType }))}
+ onValueChange={(value) => setSelectedMediaType(value)}
+ />
+ >
+ )}
+
+ >
+ }
+ />
+ {selectedMediaType && response?.content && (
+
+ )}
+
+ )
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Responses/ReadOnlyResponses.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Responses/ReadOnlyResponses.tsx
new file mode 100644
index 00000000000..2afe13d8395
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Responses/ReadOnlyResponses.tsx
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { Tabs, Typography, ViewItem } from '@wso2/ui-toolkit';
+import { Responses as Rs, Response as R } from '../../../Definitions/ServiceDefinitions';
+import { useState } from 'react';
+import { ReadOnlyResponse } from '../Response/ReadOnlyResponse';
+
+interface ResponsesProps {
+ responses: Rs;
+}
+
+const isRefereceObject = (value: Rs | R): value is R => {
+ return value.hasOwnProperty('$ref');
+};
+
+export function ReadOnlyResponses(props: ResponsesProps) {
+ const { responses } = props;
+ const [selectedStatusCode, setSelectedStatusCode] = useState(responses && Object.keys(responses)[0]);
+
+ const statusCodes = responses && Object.keys(responses);
+ const statusTabViewItems: ViewItem[] = statusCodes && statusCodes.map(statusCode => ({ id: statusCode, name: statusCode }));
+
+ return (
+ <>
+ Responses
+ {statusTabViewItems?.length > 0 && (
+
+ {responses && Object.keys(responses)?.map((status) => (
+
+ {isRefereceObject(responses[status]) ? (
+ <>
+
+ >
+ ) : (
+
+ )}
+
+ ))}
+
+ )}
+ >
+ );
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Responses/Responses.stories.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Responses/Responses.stories.tsx
new file mode 100644
index 00000000000..02a11b6705a
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Responses/Responses.stories.tsx
@@ -0,0 +1,150 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { useState } from "react";
+import { Responses as R } from "../../../Definitions/ServiceDefinitions";
+import { Responses } from "./Responses";
+import { ReadOnlyResponses } from "./ReadOnlyResponses";
+
+export default {
+ component: Responses,
+ title: 'New Responses',
+};
+
+const responses: R = {
+ "200": {
+ description: "description",
+ content: {
+ "application/json": {
+ schema: {
+ type: "object",
+ required: ["name"],
+ properties: {
+ name: {
+ type: "string",
+ },
+ age: {
+ type: "integer",
+ format: "int32",
+ },
+ },
+ },
+ },
+ "application/xml": {
+ schema: {
+ type: "object",
+ required: ["type"],
+ properties: {
+ type: {
+ type: "string",
+ },
+ },
+ },
+ },
+ },
+ },
+ "400": {
+ description: "description",
+ content: {
+ "application/json": {
+ schema: {
+ type: "object",
+ required: ["name"],
+ properties: {
+ name: {
+ type: "string",
+ }
+ },
+ },
+ },
+ "application/xml": {
+ schema: {
+ type: "object",
+ required: ["type"],
+ properties: {
+ type: {
+ type: "string",
+ },
+ },
+ },
+ },
+ },
+ },
+};
+
+export const ResponsesStory = () => {
+ const [r, setR] = useState(responses);
+ const handleResponsesChange = (responses: R) => {
+ console.log("Responses changed", responses);
+ setR(responses);
+ };
+ return (
+
+ );
+};
+
+// Responses with reference object
+const responsesWithReferenceObject: R = {
+ "200": {
+ $ref: "#/components/responses/Success",
+ },
+ "400": {
+ description: "description",
+ content: {
+ "application/json": {
+ schema: {
+ type: "object",
+ required: ["name"],
+ properties: {
+ name: {
+ type: "string",
+ }
+ },
+ },
+ },
+ "application/xml": {
+ schema: {
+ type: "object",
+ required: ["type"],
+ properties: {
+ type: {
+ type: "string",
+ },
+ },
+ },
+ },
+ },
+ },
+};
+
+export const ResponsesWithReferenceObjectStory = () => {
+ const [r, setR] = useState(responsesWithReferenceObject);
+ const handleResponsesChange = (responses: R) => {
+ console.log("Responses changed", responses);
+ setR(responses);
+ };
+ return (
+
+ );
+};
+
+export const ReadOnlyResponsesStory = () => {
+ return (
+
+ );
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Responses/Responses.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Responses/Responses.tsx
new file mode 100644
index 00000000000..0baacfa18d8
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Responses/Responses.tsx
@@ -0,0 +1,171 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { Button, CheckBox, Codicon, Tabs, Typography, ViewItem } from '@wso2/ui-toolkit';
+import { Responses as Rs, Response as R, ReferenceObject as Ro } from '../../../Definitions/ServiceDefinitions';
+import { useContext, useEffect, useState } from 'react';
+import { Response } from '../Response/Response';
+import { ReferenceObject } from '../ReferenceObject/ReferenceObject';
+import SectionHeader from '../SectionHeader/SectionHeader';
+import { useVisualizerContext } from '@wso2/api-designer-rpc-client';
+import { StatusCodes } from '../../../constants';
+import { APIDesignerContext } from '../../../APIDesignerContext';
+
+interface ResponsesProps {
+ responses: Rs;
+ referenceObjects?: string[];
+ onResponsesChange: (contact: Rs) => void;
+}
+
+const isRefereceObject = (value: Rs | R): value is R => {
+ return value.hasOwnProperty('$ref');
+};
+
+export function Responses(props: ResponsesProps) {
+ const { responses, onResponsesChange } = props;
+ const { rpcClient } = useVisualizerContext();
+ const {
+ props: { openAPI },
+ } = useContext(APIDesignerContext);
+ const [selectedStatusCode, setSelectedStatusCode] = useState(responses && Object.keys(responses)[0]);
+
+ const statusCodes = responses && Object.keys(responses);
+ const componentResponseNames = openAPI?.components?.responses ? Object.keys(openAPI?.components?.responses) : [];
+
+ const handleResponsesChange = (responses: Rs) => {
+ onResponsesChange(responses);
+ };
+
+ const hasReferenceObjects = openAPI?.components?.responses ? Object.keys(openAPI?.components?.responses).length > 0 : false;
+
+ const statusTabViewItems: ViewItem[] = statusCodes && statusCodes.map(statusCode => ({
+ id: statusCode,
+ name: statusCode
+ }));
+ const statusCode: string[] = statusCodes && statusCodes?.map((status) => {
+ const statusValue = StatusCodes[status as keyof typeof StatusCodes]; // Type assertion added here
+ return `${status}: ${statusValue}`;
+ });
+ const statusCodeList: string[] = Object.entries(StatusCodes).map(([key, value]) => `${key}: ${value}`);
+
+ const handleResponseChange = (response: R) => {
+ const newResponses: Rs = {
+ ...responses,
+ [selectedStatusCode]: response
+ };
+ handleResponsesChange(newResponses);
+ };
+
+ const handleReferenceObjectChange = (referenceObject: Ro) => {
+ const newResponses: Rs = {
+ ...responses,
+ [selectedStatusCode]: referenceObject
+ };
+ handleResponsesChange(newResponses);
+ };
+
+ const handleStatusCodeChange = (statusCodes: string[]) => {
+ const valueRemovedStatusCodes = statusCodes.map((status) => status.split(":")[0]);
+ const newResponses: Rs = valueRemovedStatusCodes.reduce((acc, item) => {
+ acc[item] = responses ? (responses[item] || { description: "", content: {} } ) : { description: "", content: {} };
+ return acc;
+ }, {} as Rs);
+ setSelectedStatusCode(statusCodes[0]);
+ handleResponsesChange(newResponses);
+ };
+
+ const onConfigureResponsesClick = () => {
+ rpcClient.selectQuickPickItems({
+ title: "Select Responses",
+ items: statusCodeList.map(item => ({ label: item, picked: statusCode?.includes(item) }))
+ }).then(resp => {
+ if (resp) {
+ handleStatusCodeChange(resp.map(item => item.label))
+ }
+ })
+ };
+
+ const handleIsReferenceChange = (checked: boolean) => {
+ const newResponses: Rs = {
+ ...responses,
+ [selectedStatusCode]: checked ? {
+ $ref: `#/components/responses/${componentResponseNames[0]}`, summary: "", description: ""
+ } :
+ {
+ description: "", content: {}
+ }
+ };
+ handleResponsesChange(newResponses);
+ }
+
+ useEffect(() => {
+ if (statusCodes && !statusCodes.includes(selectedStatusCode)) {
+ setSelectedStatusCode(statusCodes[0]);
+ }
+ }, [statusCodes]);
+
+ return (
+ <>
+
+ Configure
+
+ }
+ />
+ {statusTabViewItems?.length > 0 ? (
+
+ {responses && Object.keys(responses)?.map((status) => (
+
+ {hasReferenceObjects && (
+ handleIsReferenceChange(checked)}
+ />
+ )}
+ {isRefereceObject(responses[status]) ? (
+ handleReferenceObjectChange(referenceObject)}
+ onRemoveReferenceObject={() => {
+ const responsesCopy = { ...responses };
+ responsesCopy[status] = { description: "", content: {} };
+ handleResponsesChange(responsesCopy);
+ }}
+ />
+ ) : (
+ handleResponseChange(response)}
+ />
+ )}
+
+ ))}
+
+ ) : (No response statuses.)}
+ >
+ );
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/SectionHeader/SectionHeader.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/SectionHeader/SectionHeader.tsx
new file mode 100644
index 00000000000..f46b106025f
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/SectionHeader/SectionHeader.tsx
@@ -0,0 +1,35 @@
+import React, { ReactNode } from 'react';
+import { Typography } from '@wso2/ui-toolkit';
+import styled from "@emotion/styled";
+
+const HeaderWrapper = styled.div`
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+`;
+
+const ActionButtonsWrapper = styled.div`
+ display: flex;
+ gap: 10px;
+`;
+
+interface SectionHeaderProps {
+ title: string;
+ actionButtons?: ReactNode;
+ variant?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "subtitle1" | "subtitle2";
+}
+
+export const SectionHeader: React.FC = ({ title, actionButtons, variant = 'h3' }) => {
+ return (
+
+ {title}
+ {actionButtons && (
+
+ {actionButtons}
+
+ )}
+
+ );
+};
+
+export default SectionHeader;
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Utils/OpenAPIUtils.ts b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Utils/OpenAPIUtils.ts
new file mode 100644
index 00000000000..45bbc80f10a
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/OpenAPIComponents/Utils/OpenAPIUtils.ts
@@ -0,0 +1,84 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { OpenAPI } from "../../../Definitions/ServiceDefinitions";
+
+export function getSelectedOverviewComponent(openAPIDefinition: OpenAPI): string[] {
+ const selectedOptions: string[] = [];
+ if (openAPIDefinition?.info?.summary || openAPIDefinition?.info?.summary === "") {
+ selectedOptions.push("Summary");
+ }
+ if (openAPIDefinition?.info?.description || openAPIDefinition?.info?.description === "") {
+ selectedOptions.push("Description");
+ }
+ if (openAPIDefinition?.info?.license) {
+ selectedOptions.push("License");
+ }
+ if (openAPIDefinition?.info?.contact) {
+ selectedOptions.push("Contact");
+ }
+ // TODO: Implement the same for other fields
+ // if (openAPIDefinition.servers) {
+ // selectedOptions.push("Servers");
+ // }
+ // if (openAPIDefinition.security) {
+ // selectedOptions.push("Security");
+ // }
+ return selectedOptions;
+}
+
+export function getChangedOverviewOperationOpenAPI(openAPIDefinition: OpenAPI, options: string[]): OpenAPI {
+ const clonedApiDefinition = { ...openAPIDefinition };
+ if (options.includes("Summary") && !openAPIDefinition.info?.summary) {
+ clonedApiDefinition.info.summary = "";
+ } else if (!options.includes("Summary") && (openAPIDefinition.info?.summary || openAPIDefinition.info?.summary === "")) {
+ delete clonedApiDefinition.info.summary;
+ }
+ if (options.includes("License") && !openAPIDefinition.info?.license) {
+ clonedApiDefinition.info.license = { name: "", url: "" };
+ } else if (!options.includes("License") && openAPIDefinition.info?.license) {
+ delete clonedApiDefinition.info.license;
+ }
+ if (options.includes("Contact") && !openAPIDefinition.info?.contact) {
+ clonedApiDefinition.info.contact = { name: "", url: "", email: "" };
+ } else if (!options.includes("Contact") && openAPIDefinition.info?.contact) {
+ delete clonedApiDefinition.info.contact;
+ }
+ if (options.includes("Description") && !openAPIDefinition.info?.description) {
+ clonedApiDefinition.info.description = "";
+ } else if (!options.includes("Description") && (openAPIDefinition.info?.description || openAPIDefinition.info?.description === "")) {
+ delete clonedApiDefinition.info.description;
+ }
+ // TODO: Implement the same for other fields
+ // if (options.includes("Servers") && !openAPIDefinition.servers) {
+ // openAPIDefinition.servers = [];
+ // } else if (!options.includes("Servers") && openAPIDefinition.servers) {
+ // delete openAPIDefinition.servers;
+ // }
+ // if (options.includes("Security") && !openAPIDefinition.security) {
+ // openAPIDefinition.security = [];
+ // } else if (!options.includes("Security") && openAPIDefinition.security) {
+ // delete openAPIDefinition.security;
+ // }
+ return openAPIDefinition;
+}
+
+export function getUpdatedObjects(existingObjects: T[], values: T): T[] {
+ const objectsCopy = existingObjects?.length > 0 ? [...existingObjects] : [];
+ objectsCopy.push(values);
+ return objectsCopy;
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/SchemaEditor/ReadOnlySchemaEditor.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/SchemaEditor/ReadOnlySchemaEditor.tsx
new file mode 100644
index 00000000000..ac4b8bb3c39
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/SchemaEditor/ReadOnlySchemaEditor.tsx
@@ -0,0 +1,261 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React, { useEffect, useRef, useState } from 'react';
+import styled from "@emotion/styled";
+import { Typography, TextField, Dropdown } from '@wso2/ui-toolkit';
+
+export interface Schema {
+ $schema?: string;
+ $id?: string;
+ title?: string;
+ description?: string;
+ type?: 'string' | 'number' | 'integer' | 'boolean' | 'array' | 'object' | 'null' | ('string' | 'number' | 'integer' | 'boolean' | 'array' | 'object' | 'null')[];
+ properties?: { [propertyName: string]: Schema };
+ items?: Schema | Schema[];
+ required?: string[];
+ enum?: any[];
+ const?: any;
+ multipleOf?: number;
+ maximum?: number;
+ exclusiveMaximum?: number;
+ minimum?: number;
+ exclusiveMinimum?: number;
+ maxLength?: number;
+ minLength?: number;
+ pattern?: string;
+ maxItems?: number;
+ minItems?: number;
+ uniqueItems?: boolean;
+ maxContains?: number;
+ minContains?: number;
+ maxProperties?: number;
+ minProperties?: number;
+ allOf?: Schema[];
+ anyOf?: Schema[];
+ oneOf?: Schema[];
+ not?: Schema;
+ if?: Schema;
+ then?: Schema;
+ else?: Schema;
+ format?: string;
+ contentMediaType?: string;
+ contentEncoding?: string;
+ definitions?: { [key: string]: Schema };
+ $ref?: string;
+ [key: string]: any; // For custom keywords and extensions
+}
+
+export interface SchemaEditorProps {
+ schema: Schema;
+ schemaName: string;
+ variant?: 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
+ sx?: any;
+}
+
+interface SchemaEditorContainerProps {
+ sx?: any;
+ propertyGap?: number;
+ height?: number;
+}
+
+const SchemaEditorContainer = styled.div`
+ padding: 10px;
+`;
+
+interface PropertyContainerProps {
+ isRootElement?: boolean;
+ height?: number;
+ width?: number;
+}
+const PropertyContainer = styled.div`
+ display: flex;
+ flex-direction: row;
+`;
+
+const VerticalBar = styled.div`
+ width: 1px;
+ height: ${(props: PropertyContainerProps) => props.height ? `${props.height}px` : '100%'};
+ background-color: var(--vscode-editorWidget-border);
+`;
+
+const HorizontalBar = styled.div`
+ height: 1px;
+ margin-top: 8px;
+ width: ${(props: PropertyContainerProps) => props.width ? `${props.width}px` : '100%'};
+ background-color: var(--vscode-editorWidget-border);
+`;
+
+const Properties = styled.div`
+ display: flex;
+ flex-direction: column;
+ gap: 5px;
+ align-items: flex-start;
+`;
+
+const ArrayHeight = 80;
+const ParameterHeight = 21;
+const calculateHeight = (schema: Schema, isParent?: boolean): number => {
+ if (schema.type === 'object' && schema.properties) {
+ const propertyKeys = Object.keys(schema.properties);
+ const propertiesHeight = propertyKeys.reduce((total, key, index) => {
+ const property = schema.properties[key];
+ const propertyHeight = calculateHeight(property); // Calculate height of the property
+ const isLastProperty = index === propertyKeys.length - 1;
+
+ // If it's the last property and of type 'object', add 20 only
+ if (isLastProperty && isParent && property.type === 'object') {
+ return total + ParameterHeight;
+ } else if (isLastProperty && isParent && property.type === 'array') {
+ return total + ArrayHeight;
+ }
+ return total + propertyHeight + (property.type === 'array' ? ArrayHeight : ParameterHeight); // Add property height and parameter height
+ }, 0);
+ return propertiesHeight; // Return total height
+ } else if (schema.type === 'array' && schema.items) {
+ // Calculate height for each item in the array
+ if (Array.isArray(schema.items)) {
+ return schema.items.reduce((total, item) => total + calculateHeight(item), 0);
+ } else {
+ return calculateHeight(schema.items); // For single item in array
+ }
+ }
+ return 0;
+};
+
+const SchemaProperties: React.FC<{ properties: { [key: string]: Schema }, isRootElement: boolean, onUpdate: (updatedProperties: { [key: string]: Schema }) => void }> = ({ properties, onUpdate, isRootElement }) => {
+ const [localProperties, setLocalProperties] = useState(properties);
+ const [newPropertyKey, setNewPropertyKey] = useState(null);
+ const inputRefs = useRef<{ [key: string]: HTMLInputElement | null }>({});
+
+ useEffect(() => {
+ setLocalProperties(properties);
+ }, [properties]);
+
+ useEffect(() => {
+ if (newPropertyKey && inputRefs.current[newPropertyKey]) {
+ inputRefs.current[newPropertyKey]?.focus();
+ setNewPropertyKey(null);
+ }
+ }, [newPropertyKey]);
+
+ const handlePropertyChange = (oldKey: string, newKey: string, newValue: Schema) => {
+ const updatedProperties = { ...localProperties };
+ if (oldKey !== newKey) {
+ const entries = Object.entries(updatedProperties);
+ const index = entries.findIndex(([key]) => key === oldKey);
+ if (index !== -1) {
+ entries.splice(index, 1, [newKey, newValue]);
+ const reorderedProperties = Object.fromEntries(entries);
+ setLocalProperties(reorderedProperties);
+ onUpdate(reorderedProperties);
+ }
+ } else {
+ updatedProperties[newKey] = newValue;
+ setLocalProperties(updatedProperties);
+ onUpdate(updatedProperties);
+ }
+ };
+ return (
+
+
+
+ {Object.entries(localProperties).map(([key, value]) => (
+
+
+
+ {key}
+ {value?.type}
+
+ {value.type === 'object' && value.properties && (
+
+ handlePropertyChange(key, key, { ...value, properties: updatedProperties })}
+ />
+
+ )}
+ {value.type === 'array' && value.items && (
+
+ {Array.isArray(value.items) ? (
+ value.items.map((item, index) => (
+
+ Item {index + 1}
+
+
+ ))
+ ) : (
+
+ )}
+
+ )}
+
+ ))}
+
+
+ );
+};
+
+export const ReadOnlySchemaEditor: React.FC = (props: SchemaEditorProps) => {
+ const { schema: initialSchema, schemaName, sx, variant = 'h4' } = props;
+ const [schema, setSchema] = useState(initialSchema);
+
+ const handleSchemaUpdate = (updatedProperties: { [key: string]: Schema }) => {
+ const updatedSchema = {
+ ...schema,
+ properties: updatedProperties
+ };
+ setSchema(updatedSchema);
+ };
+
+ useEffect(() => {
+ // Update the schema when the initial schema changes
+ setSchema(initialSchema);
+ }, [initialSchema]);
+
+ return (
+
+ {schema?.$ref && {schema.$ref.replace('#/components/schemas/', '')}}
+
+ {schemaName}
+ {schema?.type && {`<${schema.type}>`}}
+
+ {schema?.type === 'object' && schema.properties && (
+
+ )}
+ {schema?.type === 'array' && schema.items && (
+
+
+
+ )}
+
+ );
+};
+
+
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/SchemaEditor/SchemaEditor.stories.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/SchemaEditor/SchemaEditor.stories.tsx
new file mode 100644
index 00000000000..7e54c7faa2b
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/SchemaEditor/SchemaEditor.stories.tsx
@@ -0,0 +1,151 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { Schema, SchemaEditor } from './SchemaEditor';
+import { useState } from 'react';
+import { ReadOnlySchemaEditor } from './ReadOnlySchemaEditor';
+import { OpenAPI } from '../../Definitions/ServiceDefinitions';
+
+
+export default {
+ component: SchemaEditor,
+ title: 'SchemaEditor',
+};
+
+const schema: Schema = {
+ title: "Person",
+ description: "This is a person",
+ type: "object",
+ properties: {
+ name: {
+ type: "string"
+ },
+ age: {
+ type: "number"
+ },
+ address: {
+ type: "object",
+ properties: {
+ street: {
+ type: "string"
+ },
+ city: {
+ type: "string"
+ }
+ }
+ },
+ friends: {
+ type: "array",
+ items: {
+ type: "object",
+ properties: {
+ name: {
+ type: "string"
+ },
+ age: {
+ type: "number"
+ },
+ type: {
+ type: "string"
+ },
+ }
+ }
+ },
+ spouse: {
+ type: "object",
+ properties: {
+ name: {
+ type: "string"
+ },
+ age: {
+ type: "number"
+ },
+ address: {
+ type: "object",
+ properties: {
+ street: {
+ type: "string"
+ },
+ city: {
+ type: "string"
+ },
+ country: {
+ type: "string"
+ }
+ }
+ }
+ }
+ },
+ test: {
+ type: "object",
+ properties: {
+ name: {
+ type: "string"
+ },
+ age: {
+ type: "number"
+ },
+ address: {
+ type: "object",
+ properties: {
+ street: {
+ type: "string"
+ },
+ city: {
+ type: "string"
+ },
+ country: {
+ type: "string"
+ }
+ }
+ }
+ }
+ }
+ }
+};
+
+const openAPIDefinition: OpenAPI = {
+ openapi: '3.0.0',
+ info: {
+ title: 'Test',
+ version: '1.0.0'
+ },
+ paths: {},
+ components: {
+ schemas: {
+ Person: schema
+ }
+ }
+};
+
+export const SchemaEditorStory = () => {
+ const [selectedId, setSelectedId] = useState("1");
+ const handleClick = (id: string) => {
+ setSelectedId(id);
+ };
+
+ return (
+ { console.log('schema change', schema) }} />
+ );
+};
+
+export const ReadonlySchemaEditorStory = () => {
+ return (
+
+ );
+}
\ No newline at end of file
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/SchemaEditor/SchemaEditor.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/SchemaEditor/SchemaEditor.tsx
new file mode 100644
index 00000000000..fa31b1dd277
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/SchemaEditor/SchemaEditor.tsx
@@ -0,0 +1,425 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React, { useEffect, useRef, useState } from 'react';
+import styled from "@emotion/styled";
+import { Typography, TextField, Button, Codicon, Dropdown, OptionProps } from '@wso2/ui-toolkit';
+import { SchemaTypes } from '../../constants';
+import { OpenAPI } from '../../Definitions/ServiceDefinitions';
+import { css } from '@emotion/react';
+
+
+export interface Schema {
+ $schema?: string;
+ $id?: string;
+ title?: string;
+ description?: string;
+ type?: 'string' | 'number' | 'integer' | 'boolean' | 'array' | 'object' | 'null' | ('string' | 'number' | 'integer' | 'boolean' | 'array' | 'object' | 'null')[];
+ properties?: { [propertyName: string]: Schema };
+ items?: Schema | Schema[];
+ required?: string[];
+ enum?: any[];
+ const?: any;
+ multipleOf?: number;
+ maximum?: number;
+ exclusiveMaximum?: number;
+ minimum?: number;
+ exclusiveMinimum?: number;
+ maxLength?: number;
+ minLength?: number;
+ pattern?: string;
+ maxItems?: number;
+ minItems?: number;
+ uniqueItems?: boolean;
+ maxContains?: number;
+ minContains?: number;
+ maxProperties?: number;
+ minProperties?: number;
+ allOf?: Schema[];
+ anyOf?: Schema[];
+ oneOf?: Schema[];
+ not?: Schema;
+ if?: Schema;
+ then?: Schema;
+ else?: Schema;
+ format?: string;
+ contentMediaType?: string;
+ contentEncoding?: string;
+ definitions?: { [key: string]: Schema };
+ $ref?: string;
+ [key: string]: any; // For custom keywords and extensions
+}
+
+export interface SchemaEditorProps {
+ schema: Schema;
+ schemaName: string;
+ variant?: 'h2' | 'h3' | 'h4' | 'h5' | 'h6';
+ sx?: any;
+ openAPI: OpenAPI;
+ isRoot?: boolean;
+ onNameChange?: (newName: string, oldName: string) => void;
+ onSchemaChange: (updatedSchema: Schema) => void;
+}
+
+interface SchemaEditorContainerProps {
+ sx?: any;
+ propertyGap?: number;
+ height?: number;
+}
+
+const SchemaEditorContainer = styled.div`
+ background-color: var(--vscode-welcomePage-tileBackground);
+ border-radius: 8px;
+ ${(props: SchemaEditorContainerProps) => css(props.sx)}
+`;
+
+const SchemaProperties: React.FC<{ properties: { [key: string]: Schema }, onUpdate: (updatedProperties: { [key: string]: Schema }) => void, openAPI: OpenAPI }> = ({ properties, onUpdate, openAPI }) => {
+ const [localProperties, setLocalProperties] = useState(properties);
+ const [newPropertyKey, setNewPropertyKey] = useState(null);
+ const inputRefs = useRef<{ [key: string]: HTMLInputElement | null }>({});
+
+ useEffect(() => {
+ setLocalProperties(properties);
+ }, [properties]);
+
+ useEffect(() => {
+ if (newPropertyKey && inputRefs.current[newPropertyKey]) {
+ inputRefs.current[newPropertyKey]?.focus();
+ setNewPropertyKey(null);
+ }
+ }, [newPropertyKey]);
+
+ const handlePropertyTypeChange = (key: string, newType: Schema['type']) => {
+ const updatedProperties = { ...localProperties };
+ const currentProperty = updatedProperties[key];
+
+ let updatedProperty: Schema;
+
+ if (typeof newType === 'string' && newType.startsWith('#/components/schemas/')) {
+ updatedProperty = {
+ $ref: newType
+ };
+ delete updatedProperty.type;
+ } else {
+ if (currentProperty.$ref) {
+ delete currentProperty.$ref;
+ }
+ updatedProperty = {
+ ...currentProperty,
+ type: newType,
+ };
+
+ if (newType === 'array') {
+ updatedProperty.items = { type: 'string' };
+ delete updatedProperty.properties;
+ } else if (newType === 'object') {
+ updatedProperty.properties = updatedProperty.properties || {};
+ delete updatedProperty.items;
+ } else {
+ delete updatedProperty.items;
+ delete updatedProperty.properties;
+ }
+ }
+
+ updatedProperties[key] = updatedProperty;
+ setLocalProperties(updatedProperties);
+ onUpdate(updatedProperties);
+ };
+
+ const handlePropertyChange = (oldKey: string, newKey: string, newValue: Schema) => {
+ const updatedProperties = { ...localProperties };
+ if (oldKey !== newKey) {
+ const entries = Object.entries(updatedProperties);
+ const index = entries.findIndex(([key]) => key === oldKey);
+ if (index !== -1) {
+ entries.splice(index, 1, [newKey, newValue]);
+ const reorderedProperties = Object.fromEntries(entries);
+ setLocalProperties(reorderedProperties);
+ onUpdate(reorderedProperties);
+ }
+ } else {
+ updatedProperties[newKey] = newValue;
+ setLocalProperties(updatedProperties);
+ onUpdate(updatedProperties);
+ }
+ };
+
+ const handleAddProperty = (key: string) => {
+ const newKey = `property${Object.keys(localProperties[key].properties || {}).length + 1}`;
+ const newProperties = {
+ ...(localProperties[key].properties || {}),
+ [newKey]: { type: 'string' as const }
+ };
+ handlePropertyChange(key, key, { ...localProperties[key], properties: newProperties });
+ };
+
+ const handleDeleteProperty = (keyToDelete: string) => {
+ const updatedProperties = { ...localProperties };
+ delete updatedProperties[keyToDelete];
+ setLocalProperties(updatedProperties);
+ onUpdate(updatedProperties);
+ };
+
+ const getSchemas = (): OptionProps[] => {
+ const componentSchemas = openAPI?.components?.schemas || {};
+ const schemaOptions = Object.keys(componentSchemas).map(schemaName => ({
+ id: schemaName,
+ content: schemaName,
+ value: `#/components/schemas/${schemaName}`
+ }));
+
+ return [
+ ...SchemaTypes.map((type) => ({ id: type, content: type, value: type })),
+ ...schemaOptions
+ ];
+ }
+
+ return (
+
+ {Object.entries(localProperties).map(([key, value]) => (
+
+
+ handlePropertyChange(key, e.target.value, value)}
+ ref={(el) => inputRefs.current[key] = el}
+ />
+ handlePropertyTypeChange(key, e.target.value as Schema['type'])}
+ />
+ handlePropertyChange(key, key, { ...value, description: e.target.value })}
+ />
+
+ {value.type === 'object' && (
+
+ )}
+
+ {value.type === 'object' && value.properties && (
+
+ handlePropertyChange(key, key, { ...value, properties: updatedProperties })}
+ openAPI={openAPI}
+ />
+
+ )}
+ {value.type === 'array' && value.items && (
+
+ {Array.isArray(value.items) ? (
+ value.items.map((item, index) => (
+
+ Item {index + 1}
+ {
+ const updatedItems = Array.isArray(value.items) ? [...value.items] : [value.items];
+ updatedItems[index] = updatedItemSchema;
+ handlePropertyChange(key, key, { ...value, items: updatedItems });
+ }}
+ openAPI={openAPI}
+ />
+
+ ))
+ ) : (
+
{
+ handlePropertyChange(key, key, { ...value, items: updatedItemSchema });
+ }}
+ openAPI={openAPI}
+ sx={{ margin: '0px' }}
+ />
+ )}
+
+ )}
+
+ ))}
+
+ );
+};
+
+export const SchemaEditor: React.FC = (props: SchemaEditorProps) => {
+ const { schema: initialSchema, schemaName, sx, onSchemaChange, variant = 'h4', openAPI, onNameChange, isRoot = true } = props;
+ const [schema, setSchema] = useState(initialSchema);
+
+ const handleSchemaUpdate = (updatedProperties: { [key: string]: Schema }) => {
+ const updatedSchema = {
+ ...schema,
+ properties: updatedProperties
+ };
+ setSchema(updatedSchema);
+ onSchemaChange(updatedSchema);
+ };
+
+ const handleAddProperty = () => {
+ const newKey = `property${Object.keys(schema.properties || {}).length + 1}`;
+ const newProperties = {
+ ...(schema.properties || {}),
+ [newKey]: { type: 'string' as const }
+ };
+ const updatedSchema = {
+ ...schema,
+ properties: newProperties
+ };
+ setSchema(updatedSchema);
+ onSchemaChange(updatedSchema);
+ };
+
+ const handleTypeChange = (newType: Schema['type']) => {
+ let updatedSchema: Schema;
+ if (typeof newType === 'string' && newType.startsWith('#/components/schemas/')) {
+ updatedSchema = { $ref: newType };
+ } else {
+ if (schema.$ref) {
+ delete schema.$ref;
+ }
+ updatedSchema = {
+ ...schema,
+ type: newType,
+ properties: newType === 'object' ? schema.properties || {} : undefined,
+ items: newType === 'array' ? { type: 'string' } : undefined
+ };
+ }
+ setSchema(updatedSchema);
+ onSchemaChange(updatedSchema);
+ };
+
+ const handleAddSchema = () => {
+ const newSchema: Schema = {
+ type: 'object',
+ properties: {}
+ };
+ setSchema(newSchema);
+ onSchemaChange(newSchema);
+ };
+
+ useEffect(() => {
+ // Update the schema when the initial schema changes
+ setSchema(initialSchema);
+ }, [initialSchema]);
+
+ if (!schema) {
+ return (
+
+
+ {schemaName}
+
+
+
+ );
+ }
+
+ const getSchemas = (): OptionProps[] => {
+ const componentSchemas = openAPI?.components?.schemas || {};
+ const schemaOptions = Object.keys(componentSchemas).map(schemaName => ({
+ id: schemaName,
+ content: schemaName,
+ value: `#/components/schemas/${schemaName}`
+ }));
+
+ return [
+ ...SchemaTypes.map((type) => ({ id: type, content: type, value: type })),
+ ...schemaOptions
+ ];
+ }
+
+ return (
+
+
+ {onNameChange && (
+ onNameChange(e.target.value, schemaName)}
+ sx={{ marginRight: '10px', width: '200px' }}
+ />
+ )}
+ handleTypeChange(e.target.value as Schema['type'])}
+ />
+ {schema.type === 'object' && (
+
+ )}
+
+ {schema.type === 'object' && schema.properties && (
+
+ )}
+ {schema.type === 'array' && schema.items && (
+
+ {
+ const updatedSchema = {
+ ...schema,
+ items: updatedItemSchema
+ };
+ setSchema(updatedSchema);
+ onSchemaChange(updatedSchema);
+ }}
+ />
+
+ )}
+
+ );
+};
+
+
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/Utils/OpenAPIUtils.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/Utils/OpenAPIUtils.tsx
new file mode 100644
index 00000000000..2805d7ce7a5
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/Utils/OpenAPIUtils.tsx
@@ -0,0 +1,368 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import yaml from 'js-yaml';
+
+import { OpenAPI, Operation, Param, Parameter, PathItem, Schema, Response, Header } from '../../Definitions/ServiceDefinitions';
+import { colors, darkerColors } from '../../constants';
+
+export function resolveResponseType(response: Response): string {
+ const contentType = Object.keys(response.content)[0];
+ if (!response.content || Object.keys(response.content).length === 0) {
+ return response.description;
+ } else if (response.content["application/json"].schema.type === "array") {
+ const items = response.content["application/json"].schema.items;
+ if (Array.isArray(items)) {
+ // Handle case where items is an array of Schema
+ return "array[]"; // Adjust as needed for your logic
+ } else if (items.$ref) {
+ return items.$ref.replace("#/components/schemas/", "") + "[]";
+ } else if (items.type) {
+ return items.type + "[]";
+ }
+ } else if (response.content["application/json"].schema.type) {
+ return response.content["application/json"].schema.type as string;
+ } else if (response.content["application/json"].schema.$ref) {
+ return response.content["application/json"].schema.$ref.replace("#/components/schemas/", "");
+ } else {
+ return "string";
+ }
+}
+
+export function resolveTypeFormSchema(schema: Schema): string {
+ // if (schema?.type === "array") {
+ // return resolveTypeFormSchema(schema.items) + "[]";
+ // }
+ return schema.type as string;
+}
+
+// export function convertOpenAPItoService(openAPIDefinition: OpenAPI): Service {
+// let service: Service = {
+// path: "",
+// resources: [],
+// };
+// service.port = 0;
+// if (openAPIDefinition.paths !== undefined) {
+// for (const [path, pathItem] of Object?.entries(openAPIDefinition.paths)) {
+// const pathSegemnent = path.match(/\/\{.*?\}/g);
+// for (const [method, operation] of Object.entries(pathItem)) {
+// let resource: Resource = {
+// methods: [method],
+// path: path,
+// pathSegments: pathSegemnent ? pathSegemnent.map((segment, index) => ({
+// id: index, name: segment.replace("/", "").replace("{", "").replace("}", ""),
+// })) : [],
+// params: getParametersFromOperation(operation),
+// responses: resolveResponseFromOperation(operation),
+
+// };
+// service.resources.push(resource);
+// }
+
+// }
+// }
+// return service;
+// }
+
+export function convertJSONtoOpenAPI(json: string): OpenAPI {
+ return JSON.parse(json);
+}
+
+export function convertYAMLtoOpenAPI(yamlString: string): OpenAPI {
+ return yaml.load(yamlString) as OpenAPI;
+}
+
+// export function convertOpenAPIStringToObject(openAPIString: string, type: "yaml" | "json"): Service {
+// if (type === "yaml") {
+// return convertOpenAPItoService(convertYAMLtoOpenAPI(openAPIString));
+// } else {
+// return convertOpenAPItoService(convertJSONtoOpenAPI(openAPIString));
+// }
+// }
+
+export function convertOpenAPIStringToOpenAPI(openAPIString: string, type: "yaml" | "json"): OpenAPI {
+ if (type === "yaml") {
+ return convertYAMLtoOpenAPI(openAPIString);
+ } else {
+ return convertJSONtoOpenAPI(openAPIString);
+ }
+}
+
+export function getColorByMethod(method: string) {
+ switch (method.toUpperCase()) {
+ case "GET":
+ return colors.GET;
+ case "PUT":
+ return colors.PUT;
+ case "POST":
+ return colors.POST;
+ case "DELETE":
+ return colors.DELETE;
+ case "PATCH":
+ return colors.PATCH;
+ case "OPTIONS":
+ return colors.OPTIONS;
+ case "HEAD":
+ return colors.HEAD;
+ default:
+ return '#876036'; // Default color
+ }
+}
+
+export function getBackgroundColorByMethod(method: string) {
+ switch (method.toUpperCase()) {
+ case "GET":
+ return darkerColors.GET;
+ case "PUT":
+ return darkerColors.PUT;
+ case "POST":
+ return darkerColors.POST;
+ case "DELETE":
+ return darkerColors.DELETE;
+ case "PATCH":
+ return darkerColors.PATCH;
+ case "OPTIONS":
+ return darkerColors.OPTIONS;
+ case "HEAD":
+ return darkerColors.HEAD;
+ default:
+ return '#876036'; // Default color
+ }
+}
+
+export function getResourceID(path: string, method: string): string {
+ return `${method.toUpperCase()}$${path}`;
+}
+
+export function getMethodFromResourceID(resourceID: string): string {
+ return (resourceID.split("$")[0]).toLowerCase();
+}
+
+export function getPathFromResourceID(resourceID: string): string {
+ return resourceID?.split("$")[1];
+}
+
+export function getPathParametersFromParameters(parameters: Parameter[]): Param[] {
+ return parameters?.filter((param) => param.in === "path").map((param) => ({
+ ...param,
+ name: param.name,
+ type: param?.schema?.type as string,
+ description: param.description,
+ isArray: param.schema ? param.schema.type === "array" : false,
+ isRequired: param.required || false,
+ }));
+}
+
+export function getPathParametersFromPath(path: string): Param[] {
+ const pathSegments = path.split("/");
+ let pathParams: Param[] = [];
+ pathSegments.forEach((segment) => {
+ if (segment.startsWith("{") && segment.endsWith("}")) {
+ pathParams.push({
+ name: segment.replace("{", "").replace("}", ""),
+ type: "string",
+ isArray: false,
+ isRequired: true,
+ });
+ }
+ });
+ return pathParams;
+}
+
+export function isNameNotInParams(name: string, params: Param[]): boolean {
+ return !params.some((param) => param.name === name);
+}
+
+export function getQueryParametersFromParameters(parameters: Parameter[]): Param[] {
+ return parameters?.filter((param) => param.in === "query").map((param) => ({
+ ...param,
+ name: param.name,
+ type: param.schema ? ( param.schema.type === "array" ? ((param.schema.items as Schema).type) as string : (param.schema.type as string) ) : "string",
+ description: param.description,
+ isArray: param.schema ? param.schema.type === "array" : false,
+ isRequired: param.required,
+ }));
+}
+
+export function getHeaderParametersFromParameters(parameters: Parameter[]): Param[] {
+ return parameters?.filter((param) => param.in === "header").map((param) => ({
+ ...param,
+ name: param.name,
+ type: param.schema ? ( param.schema.type === "array" ? ((param.schema.items as Schema).type as string) : (param.schema.type as string) ) : "string",
+ description: param.description,
+ isArray: param.schema ? param.schema.type === "array" : false,
+ isRequired: param.required,
+ }));
+}
+
+export function getResponseHeadersFromResponse(response: Header[]): Param[] {
+ return Object.entries(response).map(([name, header]) => ({
+ name: header.name,
+ type: header.schema ? ( header.schema.type === "array" ? ((header.schema.items as Schema).type as string) : (header.schema.type as string)) : "string",
+ description: header.description,
+ isArray: header.schema ? header.schema.type === "array" : false,
+ isRequired: header.required,
+ }));
+}
+
+export function getOperationFromPathItem(pathItem: PathItem, method: string): Operation {
+ const operation = pathItem[method];
+ return typeof operation === 'object' ? operation : undefined; // Ensure it's an Operation
+}
+
+export function getOperationFromOpenAPI(path: string, method: string, openAPI: OpenAPI): Operation {
+ const pathItem = openAPI.paths[path] as PathItem;
+ if (pathItem) {
+ if (pathItem && typeof pathItem === 'object') { // Ensure pathItem is an object
+ return getOperationFromPathItem(pathItem, method);
+ } else {
+ return undefined;
+ }
+ } else {
+ return undefined;
+ }
+}
+
+// Convert Param[] to Parameter[]
+export function convertParamsToParameters(params: Param[], type: "path" | "query" | "header"): Parameter[] {
+ let parameters: Parameter[] = [];
+ params?.forEach((param) => {
+ const newParam = { ...param };
+ delete newParam.isArray;
+ delete newParam.isRequired;
+ delete newParam.type;
+ if (newParam?.isArray) {
+ parameters.push({
+ ...newParam,
+ name: param.name,
+ in: type,
+ required: param.isRequired,
+ schema: {
+ ...newParam.schema,
+ type: "array",
+ items: {
+ type: param.type,
+ }
+ },
+ });
+ } else {
+ parameters.push({
+ ...newParam,
+ name: param.name,
+ in: type,
+ required: param.isRequired,
+ schema: {
+ ...newParam.schema,
+ type: param.type,
+ }
+ });
+ }
+ });
+ return parameters;
+}
+
+export function resolveTypeFromSchema(schema: Schema): string {
+ // Add [] if the schema is an array
+ if (schema.type === "array") {
+ return resolveTypeFromSchema(schema.items);
+ } else if (schema.$ref) {
+ return schema.$ref.replace("#/components/schemas/", "");
+ } else if ((schema.items && schema.items as Schema)?.$ref) {
+ return (schema.items && schema.items as Schema).$ref.replace("#/components/schemas/", "");
+ } else {
+ return schema.type as string;
+ }
+}
+
+export function resolveResonseColor(responseCode: string): string {
+ if (responseCode.startsWith("2")) {
+ return 'var(--vscode-statusBarItem-remoteBackground)';
+ } else if (responseCode.startsWith("4")) {
+ return 'var(--vscode-debugExceptionWidget-border)';
+ } else {
+ return 'var(--vscode-symbolIcon-variableForeground)';
+ }
+}
+
+export function resolveResonseHoverColor(responseCode: string): string {
+ if (responseCode.startsWith("2")) {
+ return 'var(--vscode-editorGutter-addedBackground)';
+ } else if (responseCode.startsWith("4")) {
+ return 'var(--vscode-errorForeground)';
+ } else {
+ return 'var(--vscode-minimap-selectionHighlight)';
+ }
+}
+
+export function addNewParamToPath(params: Param, path: string): string {
+ return `${path}/{${params.name}}`;
+};
+
+export function convertParamsToPath(params: Param[], path: string): string {
+ let newPath = path;
+ params.forEach((param) => {
+ newPath = addNewParamToPath(param, newPath);
+ });
+ return newPath;
+};
+
+export function getDeletedParamPath(newParams: Param[], path: string): string {
+ let newPath = path;
+ const prevParams = getPathParametersFromPath(path);
+ prevParams.forEach((param) => {
+ if (isNameNotInParams(param.name, newParams)) {
+ newPath = newPath.replace(`/{${param.name}}`, "");
+ }
+ });
+ return newPath;
+}
+
+export function syncPathParamsWithParams(pathParams: Param[], params: Param[]): Param[] { // Added return type annotation
+ return pathParams.map((pathParam) => {
+ const param = params?.find((param) => param.name === pathParam.name);
+ if (param) {
+ return {
+ ...pathParam,
+ ...param,
+ };
+ } else {
+ return pathParam;
+ }
+ });
+}
+
+// To Provide the identical param name for a new param by appending a number to the name
+export function getIdenticalParamName(params: Param[], prefix: string): string {
+ let newName = prefix;
+ let count = 1;
+ while (!isNameNotInParams(newName, params)) {
+ newName = `${prefix}${count}`;
+ count++;
+ }
+ return newName;
+}
+
+export function getAllComponents(openApi: OpenAPI): string[] {
+ const schemas = openApi?.components?.schemas ? Object.keys(openApi.components.schemas) : [];
+ const parameters = openApi?.components?.parameters ? Object.keys(openApi.components.parameters) : [];
+ const headers = openApi?.components?.headers ? Object.keys(openApi.components.headers) : [];
+ const responses = openApi?.components?.responses ? Object.keys(openApi.components.responses) : [];
+ const requestBodies = openApi?.components?.requestBodies ? Object.keys(openApi.components.requestBodies) : [];
+
+ return [...schemas, ...parameters, ...headers, ...responses, ...requestBodies];
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/View/View.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/View/View.tsx
new file mode 100644
index 00000000000..6ff36339e1f
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/View/View.tsx
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import React, { ReactNode } from 'react';
+import styled from "@emotion/styled";
+
+
+const ViewWrapper = styled.div({
+ display: 'flex',
+ flexDirection: 'column',
+ height: '100vh',
+});
+
+const View: React.FC<{ children: ReactNode }> = ({ children }) => {
+ return (
+
+ {children}
+
+ );
+};
+
+export default View;
\ No newline at end of file
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/View/ViewContent.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/View/ViewContent.tsx
new file mode 100644
index 00000000000..c49c7be19d1
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/View/ViewContent.tsx
@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React, { ReactNode } from 'react';
+import styled from "@emotion/styled";
+
+const ViewContentWrapper = styled.div({
+ display: 'flex',
+ flexDirection: 'column',
+ flexGrow: 1,
+ overflowY: 'auto',
+});
+
+type ViewContentProps = {
+ children: ReactNode;
+ padding?: boolean;
+};
+
+const ViewContent: React.FC = ({ children, padding = false }) => {
+ return (
+
+ {children}
+
+ );
+};
+
+export default ViewContent;
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/View/ViewHeader.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/View/ViewHeader.tsx
new file mode 100644
index 00000000000..ec97d0eedfa
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/View/ViewHeader.tsx
@@ -0,0 +1,93 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+import styled from '@emotion/styled';
+import { Button, Icon, Codicon } from "@wso2/ui-toolkit";
+
+
+type ViewHeaderProps = {
+ title: string | React.ReactNode;
+ children?: React.ReactNode;
+ codicon?: string;
+ icon?: string;
+ iconSx?: any;
+ onEdit?: () => void;
+};
+
+// Emotion styled components
+const Header = styled.div({
+ backgroundColor: 'var(--vscode-editor-background)',
+});
+
+const HeaderContentWrapper = styled.div({
+ display: 'flex',
+ justifyContent: 'space-between',
+ alignItems: 'center',
+ padding: '0 20px', // Set padding on left and right to 20px
+});
+
+const TitleContainer = styled.div({
+ display: 'flex',
+ alignItems: 'center',
+ '& > *:not(:last-child)': { // Apply margin right to all children except the last one
+ marginRight: '5px',
+ },
+});
+
+const Title = styled.h3({
+ /* Style for title */
+ display: 'flex',
+ alignItems: 'center',
+ gap: '5px'
+});
+
+const Actions = styled.div({
+ /* Style for actions */
+ display: 'flex',
+ alignItems: 'center',
+ gap: '5px'
+});
+
+const ViewHeader: React.FC = ({ title, children, codicon, icon, iconSx, onEdit }) => {
+ return (
+
+
+
+ {codicon && }
+ {icon && }
+ {typeof title === 'string' ? {title} : title}
+ {onEdit && (
+
+ )}
+
+ {children}
+
+
+ );
+};
+
+export default ViewHeader;
diff --git a/workspaces/api-designer/api-designer-visualizer/src/components/View/index.tsx b/workspaces/api-designer/api-designer-visualizer/src/components/View/index.tsx
new file mode 100644
index 00000000000..4fc47e027f2
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/components/View/index.tsx
@@ -0,0 +1,21 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import View from './View';
+import ViewHeader from './ViewHeader';
+import ViewContent from './ViewContent';
+export { View, ViewHeader, ViewContent };
diff --git a/workspaces/api-designer/api-designer-visualizer/src/constants/index.ts b/workspaces/api-designer/api-designer-visualizer/src/constants/index.ts
new file mode 100644
index 00000000000..3fb6026a54e
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/constants/index.ts
@@ -0,0 +1,184 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+export const colors = {
+ "GET": '#3d7eff',
+ "PUT": '#fca130',
+ "POST": '#49cc90',
+ "DELETE": '#f93e3e',
+ "PATCH": '#986ee2',
+ "OPTIONS": '#0d5aa7',
+ "HEAD": '#9012fe'
+};
+
+// Slighly darker shades of the above colors
+export const darkerColors = {
+ "GET": '#2b5aa6',
+ "PUT": '#d08e0f',
+ "POST": '#3c9e6f',
+ "DELETE": '#d12d2d',
+ "PATCH": '#7d4dbb',
+ "OPTIONS": '#0b3f7d',
+ "HEAD": '#6d0fcb'
+};
+
+// Media Types used in postman
+export const MediaTypes = [
+ "application/json",
+ "application/xml",
+ "application/vnd.api+json",
+ "application/x-www-form-urlencoded",
+ "application/octet-stream",
+ "multipart/form-data",
+ "text/plain",
+ "text/html",
+ "application/EDI-X12",
+ "application/EDIFACT",
+ "application/atom+xml",
+ "application/font-woff",
+ "application/gzip",
+ "application/javascript",
+ "application/ogg",
+ "application/pdf",
+ "application/postscript",
+ "application/soap+xml",
+ "application/bitTorrent",
+ "application/x-tex",
+ "application/xhtml+xml",
+ "application/xslt+xml",
+ "application/xml-dtd",
+ "application/xop+xml",
+ "application/zip",
+ "application/x-www-form-urlencoded"
+];
+
+// https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
+// Add status codes accroding to the above link
+export const StatusCodes = {
+ "100": "Continue",
+ "101": "Switching Protocols",
+ "102": "Processing",
+ "103": "Early Hints",
+ "200": "OK",
+ "201": "Created",
+ "202": "Accepted",
+ "203": "Non-Authoritative Information",
+ "204": "No Content",
+ "205": "Reset Content",
+ "206": "Partial Content",
+ "207": "Multi-Status",
+ "208": "Already Reported",
+ "226": "IM Used",
+ "300": "Multiple Choices",
+ "301": "Moved Permanently",
+ "302": "Found",
+ "303": "See Other",
+ "304": "Not Modified",
+ "305": "Use Proxy",
+ "306": "(Unused)",
+ "307": "Temporary Redirect",
+ "308": "Permanent Redirect",
+ "400": "Bad Request",
+ "401": "Unauthorized",
+ "402": "Payment Required",
+ "403": "Forbidden",
+ "404": "Not Found",
+ "405": "Method Not Allowed",
+ "406": "Not Acceptable",
+ "407": "Proxy Authentication Required",
+ "408": "Request Timeout",
+ "409": "Conflict",
+ "410": "Gone",
+ "411": "Length Required",
+ "412": "Precondition Failed",
+ "413": "Payload Too Large",
+ "414": "URI Too Long",
+ "415": "Unsupported Media Type",
+ "416": "Range Not Satisfiable",
+ "417": "Expectation Failed",
+ "418": "I'm a teapot",
+ "421": "Misdirected Request",
+ "422": "Unprocessable Entity",
+ "423": "Locked",
+ "424": "Failed Dependency",
+ "425": "Too Early",
+ "426": "Upgrade Required",
+ "428": "Precondition Required",
+ "429": "Too Many Requests",
+ "431": "Request Header Fields Too Large",
+ "451": "Unavailable For Legal Reasons",
+ "500": "Internal Server Error",
+ "501": "Not Implemented",
+ "502": "Bad Gateway",
+ "503": "Service Unavailable",
+ "504": "Gateway Timeout",
+ "505": "HTTP Version Not Supported",
+ "506": "Variant Also Negotiates",
+ "507": "Insufficient Storage",
+ "508": "Loop Detected",
+ "510": "Not Extended",
+ "511": "Network Authentication Required"
+};
+
+export const BaseTypes = [
+ "string",
+ "number",
+ "integer",
+ "boolean",
+ "array",
+ "object",
+];
+
+export type ParameterSchemaTypes = 'string' | 'number' | 'integer' | 'boolean' | 'array' | 'object' | 'null' | ('string' | 'number' | 'integer' | 'boolean' | 'array' | 'object' | 'null')[];
+
+export const SchemaTypes = [
+ "string",
+ "number",
+ "integer",
+ "boolean",
+ "array",
+ "object",
+ "any",
+];
+
+export const APIResources = [
+ "get", "post", "put", "delete", "patch", "head", "options", "trace"
+];
+
+export enum Views {
+ READ_ONLY = "READ_ONLY",
+ EDIT = "EDIT"
+}
+
+export enum PathID {
+ OVERVIEW = "Overview",
+ PATHS = "Paths",
+ SCHEMAS = "Schemas",
+ PARAMETERS = "Parameters",
+ REQUEST_BODY = "RequestBody",
+ RESPONSES = "Responses",
+ PATHS_RESOURCES = "Paths#-Resources",
+ PATHS_COMPONENTS = "Paths#-Components",
+ OVERVIEW_COMPONENT = "Overview#-Component",
+ COMPONENTS_COMPONENTS = "Components#-Components",
+ SCHEMA_COMPONENTS = "Schemas#-Components",
+ PARAMETERS_COMPONENTS = "Parameters#-Components",
+ REQUEST_BODY_COMPONENTS = "RequestBody#-Components",
+ RESPONSE_COMPONENTS = "Responses#-Components",
+ SEPERATOR = "#-",
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/index.tsx b/workspaces/api-designer/api-designer-visualizer/src/index.tsx
new file mode 100644
index 00000000000..8d1f05837f3
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/index.tsx
@@ -0,0 +1,44 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
+import { createRoot } from "react-dom/client";
+import { VisualizerContextProvider } from "./Context";
+import { Visualizer } from "./Visualizer";
+
+const queryClient = new QueryClient({
+ defaultOptions: {
+ queries: {
+ retry: false,
+ refetchOnWindowFocus: false,
+ staleTime: 1000,
+ cacheTime: 1000,
+ },
+ },
+ });
+
+export function renderWebview(target: HTMLElement, mode: string) {
+ const root = createRoot(target);
+ root.render(
+
+
+
+
+
+ );
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/src/views/APIDesignerView/APIDesigner.tsx b/workspaces/api-designer/api-designer-visualizer/src/views/APIDesignerView/APIDesigner.tsx
new file mode 100644
index 00000000000..72a660ba681
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/src/views/APIDesignerView/APIDesigner.tsx
@@ -0,0 +1,94 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { useEffect, useState } from "react";
+import { useVisualizerContext } from "@wso2/api-designer-rpc-client";
+import { convertOpenAPIStringToOpenAPI } from "../../components/Utils/OpenAPIUtils";
+import { OpenAPI } from "../../Definitions/ServiceDefinitions";
+import { debounce } from "lodash";
+import { MachineStateValue } from "@wso2/api-designer-core";
+import { ApiDesigner } from "../../components/OpenAPIComponents/ApiDesigner/ApiDesigner";
+
+interface ServiceDesignerProps {
+ fileUri: string;
+}
+
+export function APIDesignerView(props: ServiceDesignerProps) {
+ const { fileUri } = props;
+ const { rpcClient } = useVisualizerContext();
+ const [ apiDefinition, setApiDefinition ] = useState(undefined);
+ const [ documentType, setDocumentType ] = useState(undefined);
+ const [ isNewFile, setIsNewFile ] = useState(false);
+
+ rpcClient?.onStateChanged((newState: MachineStateValue) => {
+ if (typeof newState === 'object' && 'ready' in newState && newState.ready === 'viewReady') {
+ fetchData();
+ }
+ });
+
+ const writeToFile = async (openApiDefinition: OpenAPI) => {
+ rpcClient.getApiDesignerVisualizerRpcClient().writeOpenApiContent({
+ filePath: fileUri,
+ content: JSON.stringify(openApiDefinition),
+ });
+ };
+ const debouncedFileWrite = debounce(writeToFile, 300);
+ const handleOpenApiDefinitionChange = async (openApiDefinition: OpenAPI) => {
+ setApiDefinition(openApiDefinition);
+ debouncedFileWrite(openApiDefinition);
+ };
+
+ const fetchData = async () => {
+ const resp = await rpcClient.getApiDesignerVisualizerRpcClient().getOpenApiContent({
+ filePath: fileUri,
+ });
+ let convertedApiDefinition = convertOpenAPIStringToOpenAPI(resp.content, resp.type);
+ if (!convertedApiDefinition) {
+ convertedApiDefinition = {
+ openapi: "3.0.1",
+ info: {
+ title: "",
+ version: "",
+ },
+ paths: {},
+ };
+ setIsNewFile(true);
+ }
+ // If no Info field is present in the response, then set the Info field
+ if (!convertedApiDefinition.info) {
+ convertedApiDefinition.info = {
+ title: "",
+ version: "",
+ };
+ }
+ setApiDefinition(convertedApiDefinition);
+ setDocumentType(resp.type);
+ };
+
+ useEffect(() => {
+ fetchData();
+ }, [fileUri]);
+ return (
+
+ )
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/tsconfig.json b/workspaces/api-designer/api-designer-visualizer/tsconfig.json
new file mode 100644
index 00000000000..af9cb3e475c
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/tsconfig.json
@@ -0,0 +1,45 @@
+{
+ "compilerOptions": {
+
+ "target": "ESNext",
+ "useDefineForClassFields": true,
+ "lib": ["ESNext", "DOM", "DOM.Iterable"],
+ "module": "ESNext",
+ "skipLibCheck": true,
+ "outDir": "./lib",
+ "rootDir": "./src",
+
+
+ "moduleResolution": "node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "sourceMap": true,
+ "jsx": "react-jsx",
+ "declaration": true,
+ "declarationDir": "./lib",
+ "esModuleInterop": true,
+
+ "strict": true,
+ "noUnusedLocals": false,
+ "noUnusedParameters": false,
+ "noFallthroughCasesInSwitch": true,
+ "allowJs": false,
+ "allowSyntheticDefaultImports": true,
+ "forceConsistentCasingInFileNames": true,
+ "strictNullChecks": false,
+ "preserveSymlinks": true,
+ "noImplicitReturns": false,
+ "noImplicitAny": true,
+ "typeRoots": [
+ "node_modules/@types"
+ ],
+ "paths": {
+ "react": ["./node_modules/@types/react"]
+ }
+ },
+ "include": ["src"],
+ "exclude": [
+ "node_modules",
+ "build"
+ ]
+}
diff --git a/workspaces/api-designer/api-designer-visualizer/webpack.config.js b/workspaces/api-designer/api-designer-visualizer/webpack.config.js
new file mode 100644
index 00000000000..0128d5dafcb
--- /dev/null
+++ b/workspaces/api-designer/api-designer-visualizer/webpack.config.js
@@ -0,0 +1,74 @@
+const path = require("path");
+const webpack = require("webpack");
+module.exports = {
+ entry: "./src/index.tsx",
+ target: "web",
+ devtool: "source-map",
+ mode: "development",
+ output: {
+ path: path.resolve(__dirname, "build"),
+ filename: "Visualizer.js",
+ library: "visualizerWebview",
+ },
+ resolve: {
+ extensions: [".js", ".jsx", ".json", ".ts", ".tsx"],
+ alias: {
+ 'react': path.resolve(__dirname, 'node_modules/react'),
+ 'react-dom': path.resolve(__dirname, 'node_modules/react-dom')
+ },
+ fallback: { 'process/browser': require.resolve('process/browser'), }
+ },
+ module: {
+ rules: [
+ {
+ test: /\.(ts|tsx)$/,
+ loader: "ts-loader",
+ exclude: '/node_modules/',
+ },
+ {
+ enforce: "pre",
+ test: /\.js$/,
+ exclude: /node_modules\/(?!typescript)/, // Exclude all node_modules except typescript,
+ loader: "source-map-loader"
+ },
+ {
+ test: /\.css$/,
+ use: [
+ 'style-loader',
+ 'css-loader'
+ ]
+ },
+ {
+ test: /\.s[ac]ss$/i,
+ use: ["style-loader", "css-loader", "sass-loader"],
+ },
+ {
+ test: /\.(woff|woff2|ttf|eot)$/,
+ type: 'asset/inline',
+ },
+ {
+ test: /\.(svg|png)$/,
+ type: 'asset/resource',
+ generator: {
+ filename: './images/[name][ext]',
+ },
+ }
+ ],
+ noParse: [require.resolve("@ts-morph/common/dist/typescript.js")],
+ },
+ devServer: {
+ allowedHosts: 'all',
+ port: 9000,
+ headers: {
+ 'Access-Control-Allow-Origin': '*',
+ },
+ devMiddleware: {
+ mimeTypes: { 'text/css': ['css'] },
+ },
+ },
+ plugins: [
+ new webpack.ProvidePlugin({
+ process: "process/browser",
+ }),
+ ],
+};
diff --git a/workspaces/apk/apk-extension/.vscode/.vscodeignore b/workspaces/apk/apk-extension/.vscode/.vscodeignore
new file mode 100644
index 00000000000..e6b69c364d1
--- /dev/null
+++ b/workspaces/apk/apk-extension/.vscode/.vscodeignore
@@ -0,0 +1,15 @@
+.vscode/**
+.vscode-test/**
+src/**
+.gitignore
+.yarnrc
+vsc-extension-quickstart.md
+**/tsconfig.json
+**/.eslintrc.json
+**/*.map
+**/*.ts
+.env
+.env.example
+scripts/**
+*.log
+rush-logs
diff --git a/workspaces/apk/apk-extension/.vscode/CHANGELOG.md b/workspaces/apk/apk-extension/.vscode/CHANGELOG.md
new file mode 100644
index 00000000000..22cceb14d4a
--- /dev/null
+++ b/workspaces/apk/apk-extension/.vscode/CHANGELOG.md
@@ -0,0 +1,9 @@
+# Change Log
+
+All notable changes to the "apk" extension will be documented in this file.
+
+Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file.
+
+## [Unreleased]
+
+- Initial release
diff --git a/workspaces/apk/apk-extension/.vscode/launch.json b/workspaces/apk/apk-extension/.vscode/launch.json
new file mode 100644
index 00000000000..3a4f9292241
--- /dev/null
+++ b/workspaces/apk/apk-extension/.vscode/launch.json
@@ -0,0 +1,35 @@
+// A launch configuration that compiles the extension and then opens it inside a new window
+// Use IntelliSense to learn about possible attributes.
+// Hover to view descriptions of existing attributes.
+// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Run Extension",
+ "type": "extensionHost",
+ "request": "launch",
+ "args": [
+ "--extensionDevelopmentPath=${workspaceFolder}"
+ ],
+ "outFiles": [
+ "${workspaceFolder}/out/**/*.js"
+ ],
+ "preLaunchTask": "${defaultBuildTask}",
+ "envFile": "${workspaceFolder}/workspaces/apk/apk-extension/.env"
+ },
+ {
+ "name": "Extension Tests",
+ "type": "extensionHost",
+ "request": "launch",
+ "args": [
+ "--extensionDevelopmentPath=${workspaceFolder}",
+ "--extensionTestsPath=${workspaceFolder}/out/test/suite/index"
+ ],
+ "outFiles": [
+ "${workspaceFolder}/out/test/**/*.js"
+ ],
+ "preLaunchTask": "${defaultBuildTask}"
+ }
+ ]
+}
diff --git a/workspaces/apk/apk-extension/.vscode/settings.json b/workspaces/apk/apk-extension/.vscode/settings.json
new file mode 100644
index 00000000000..fa0a104874f
--- /dev/null
+++ b/workspaces/apk/apk-extension/.vscode/settings.json
@@ -0,0 +1,11 @@
+// Place your settings in this file to overwrite default and user settings.
+{
+ "files.exclude": {
+ "out": false // set this to true to hide the "out" folder with the compiled JS files
+ },
+ "search.exclude": {
+ "out": true // set this to false to include "out" folder in search results
+ },
+ // Turn off tsc task auto detection since we have the necessary tasks as npm scripts
+ "typescript.tsc.autoDetect": "off"
+}
diff --git a/workspaces/apk/apk-extension/.vscode/tasks.json b/workspaces/apk/apk-extension/.vscode/tasks.json
new file mode 100644
index 00000000000..efe7a340dec
--- /dev/null
+++ b/workspaces/apk/apk-extension/.vscode/tasks.json
@@ -0,0 +1,20 @@
+// See https://go.microsoft.com/fwlink/?LinkId=733558
+// for the documentation about the tasks.json format
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "type": "npm",
+ "script": "watch-apk",
+ "problemMatcher": "$tsc-watch",
+ "isBackground": true,
+ "presentation": {
+ "reveal": "never"
+ },
+ "group": {
+ "kind": "build",
+ "isDefault": true
+ }
+ }
+ ]
+}
diff --git a/workspaces/apk/apk-extension/LICENSE b/workspaces/apk/apk-extension/LICENSE
new file mode 100644
index 00000000000..48ec828653e
--- /dev/null
+++ b/workspaces/apk/apk-extension/LICENSE
@@ -0,0 +1,97 @@
+ KUBERNETES GATEWAY CONFIG LANGUAGE SUPPORT VSCODE EXTENSION LICENSE TERMS
+
+ These license terms are an agreement between you and WSO2, LLC. These terms apply to the
+ Kubernetes Gateway Config Language Support VSCode extension ("the software") and any revisions to that software. By installing the
+ software, you agree to comply with these terms. If you are an individual accepting this
+ agreement on behalf of a company or other legal entity, you represent that you are authorized
+ to bind the entity to the terms of this agreement and "you" or "your" will refer to the entity
+ bound to this agreement, not to you as an individual.
+
+
+ Article 1
+ THE SOFTWARE
+
+ 1.1 License Grant
+
+ WSO2 grants you a worldwide, non-exclusive right to copy and use the software in
+ accordance with these terms. If you violate these terms, your right to copy and use the
+ software will automatically terminate.
+
+ 1.2 Use Restrictions
+
+ You may not:
+
+ (1) remove or alter any copyright or license notices that appear in or on the software;
+
+ (2) modify, create a derivative work of, reverse engineer, decompile, translate,
+ disassemble, or otherwise attempt to extract any of the source code of the software;
+
+ (3) sublicense, transfer, or distribute any of the software;
+
+ (4) sell, resell, or otherwise make the software available to a third party as part of a
+ commercial offering, unless you obtain WSO2’s consent; or
+
+ (5) use the software in a manner that violates any law.
+
+ 1.3 Information Sent from the Software
+
+ The software may send data, including code and code metadata, to WSO2 to provide additional
+ functionality. WSO2 does not collect personally identifiable information through the
+ software.
+
+ 1.4 Ownership
+
+ WSO2 owns the software. Any content accessed or generated through use of the software is
+ the property of the respective content owner. All rights not expressly granted are reserved
+ by WSO2.
+
+ 1.5 Support Services
+
+ As this software is "as-is," WSO2 may not provide support services for it.
+
+
+ Article 2
+ DISCLAIMERS
+
+ 2.1 Warranties
+
+ WSO2 is not making any warranty of merchantability or fitness for a particular purchase in
+ connection with the software. The software is licensed "as-is."
+
+ 2.2 Limitation of Liability
+
+ You can recover from WSO2 only direct damages up to U.S. $5.00. WSO2 will not be liable for
+ any other damages, even if WSO2 knew or should have known about the possibility of the
+ damages, except where this limitation is prohibited by law.
+
+
+ Article 3
+ INDEMNIFICATION
+
+ You shall be liable to WSO2 for all pecuniary losses (including legal fees), whether
+ actually, currently, or required to be incurred by WSO2 (the "Indemnifiable Losses") that
+ arise from your use of the software.
+
+
+ Article 4
+ MISCELLANEOUS
+
+ 4.1 Export Controls
+
+ The software may be subject to export laws and regulations of the United States and other
+ jurisdictions. You will not use the software in violation of any of these laws.
+
+ 4.2 Entire Agreement
+
+ This agreement, and any terms, policies, or writings referenced within it, constitutes the
+ final and complete agreement between you and WSO2 with respect to the software.
+
+ 4.3 Binding Arbitration
+
+ (1) All claims relating to this agreement ("dispute") will be governed by the laws of the
+ state of California, USA, excluding California’s conflicts of laws rules.
+
+ (2) Any dispute not resolved by good faith discussion must be resolved by arbitration
+ according to the American Arbitration Association’s Expedited Commercial Rules.
+
+ (3) Arbitration will be conducted in English in Santa Clara County, California, USA.
diff --git a/workspaces/apk/apk-extension/README.md b/workspaces/apk/apk-extension/README.md
new file mode 100644
index 00000000000..46e5354241e
--- /dev/null
+++ b/workspaces/apk/apk-extension/README.md
@@ -0,0 +1,79 @@
+# Kubernetes Gateway Config Language Support
+
+A Visual Studio Code extension for providing language support for APK configuration YAML files.
+
+## Features
+- Syntax highlighting for APK configuration YAML files.
+
+
+- Auto-completion for APK configuration YAML properties and values.
+- Validation and error checking for APK configuration YAML files.
+- Create new apk configuration files with provided templates.
+
+
+
+## Requirements
+
+- Visual Studio Code version 1.63.0 or newer.
+
+## Installation
+
+1. Launch Visual Studio Code.
+2. Go to the Extensions view by clicking on the square icon in the sidebar or pressing `Ctrl+Shift+X`.
+3. Search for "Kubernetes Gateway Config Language Support".
+4. Click on the "Install" button for the extension published by "Kubernetes Gateway Config Language Support".
+5. The extension will be installed and activated automatically. ( This extension is depending on the YAML Language Support by Red Hat extension). If it's not installed, this will install it automatically.
+
+## Usage
+
+1. Open a APK Configuration file (.apk-conf).
+2. The extension will automatically provide syntax highlighting and code completion for APK configuration properties and values.
+3. Errors and warnings will be displayed if there are any issues with the YAML structure or values.
+4. Use the provided code snippets to quickly insert common APK configuration patterns.
+5. Create new APK Configuration will provide you with set of templates to get started.
+
+## Contributing
+
+Contributions are welcome! Here's how you can get involved:
+
+1. Fork the repository.
+2. Create a new branch for your feature or bug fix.
+3. Make your changes and commit them.
+4. Push your changes to your fork.
+5. Submit a pull request describing your changes.
+
+### Extension Packaging Guide
+
+This guide provides instructions on how to package the extension.
+
+#### Prerequisites
+
+- Node.js 16+ (https://nodejs.org)
+- Yarn (https://yarnpkg.com)
+
+#### Installation
+
+1. Install Node.js 16+ from the official website.
+2. Install Yarn globally by following the instructions on the official Yarn website.
+
+#### Usage
+
+1. Open your terminal or command prompt and navigate to the project's root directory.
+2. Run the following command to install the project dependencies:
+
+ ```shell
+ yarn
+ ```
+3. Once the dependencies are installed, run the following command to build the extension:
+
+ ``` shell
+ yarn run build
+ ```
+ This command triggers the build process, which compiles the source code, optimizes assets, and generates the final packaged extension.
+
+ After running the build command, you should find the packaged extension files in the designated build output directory.
+
+
+## License
+
+This extension is licensed under the [Apache 2.0 License](https://github.com/wso2/apk/blob/HEAD/LICENSE).
\ No newline at end of file
diff --git a/workspaces/apk/apk-extension/config/rush-project.json b/workspaces/apk/apk-extension/config/rush-project.json
new file mode 100644
index 00000000000..8b51f8c41f1
--- /dev/null
+++ b/workspaces/apk/apk-extension/config/rush-project.json
@@ -0,0 +1,3 @@
+{
+ "extends": "../../../rush-config.json"
+}
\ No newline at end of file
diff --git a/workspaces/apk/apk-extension/icon/icon128.png b/workspaces/apk/apk-extension/icon/icon128.png
new file mode 100644
index 00000000000..a496b22b6bf
Binary files /dev/null and b/workspaces/apk/apk-extension/icon/icon128.png differ
diff --git a/workspaces/apk/apk-extension/images/demo1.gif b/workspaces/apk/apk-extension/images/demo1.gif
new file mode 100644
index 00000000000..628fa131427
Binary files /dev/null and b/workspaces/apk/apk-extension/images/demo1.gif differ
diff --git a/workspaces/apk/apk-extension/images/demo2.gif b/workspaces/apk/apk-extension/images/demo2.gif
new file mode 100644
index 00000000000..628fa131427
Binary files /dev/null and b/workspaces/apk/apk-extension/images/demo2.gif differ
diff --git a/workspaces/apk/apk-extension/language-configuration.json b/workspaces/apk/apk-extension/language-configuration.json
new file mode 100644
index 00000000000..c481bf5e727
--- /dev/null
+++ b/workspaces/apk/apk-extension/language-configuration.json
@@ -0,0 +1,39 @@
+{
+ "comments": {
+ "lineComment": "#"
+ },
+ "brackets": [
+ ["{", "}"],
+ ["[", "]"],
+ ["(", ")"]
+ ],
+ "autoClosingPairs": [
+ ["{", "}"],
+ ["[", "]"],
+ ["(", ")"],
+ ["\"", "\""],
+ ["'", "'"],
+ ["`", "`"]
+ ],
+ "surroundingPairs": [
+ ["{", "}"],
+ ["[", "]"],
+ ["(", ")"],
+ ["\"", "\""],
+ ["'", "'"],
+ ["`", "`"]
+ ],
+ "folding": {
+ "offSide": true,
+ "markers": {
+ "start": "^\\s*#\\s*region\\b",
+ "end": "^\\s*#\\s*endregion\\b"
+ }
+ },
+ "indentationRules": {
+ "increaseIndentPattern": "^\\s*.*(:|-) ?(&\\w+)?(\\{[^}\"']*|\\([^)\"']*)?$",
+ "decreaseIndentPattern": "^\\s+\\}$"
+ },
+ "wordPattern": "(^.?[^\\s]+)+|([^\\s\n={[][\\w\\-\\.\/$%&*:\"']+)"
+ }
+
\ No newline at end of file
diff --git a/workspaces/apk/apk-extension/package-lock.json b/workspaces/apk/apk-extension/package-lock.json
new file mode 100644
index 00000000000..2ae7b2bc786
--- /dev/null
+++ b/workspaces/apk/apk-extension/package-lock.json
@@ -0,0 +1,4378 @@
+{
+ "name": "apk-config-language-support",
+ "version": "1.3.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "apk-config-language-support",
+ "version": "1.3.0",
+ "license": "Apache 2.0",
+ "devDependencies": {
+ "@types/glob": "^8.0.0",
+ "@types/mocha": "^10.0.1",
+ "@types/node": "^18.11.19",
+ "@types/vscode": "^1.63.0",
+ "@typescript-eslint/eslint-plugin": "~5.48.2",
+ "@typescript-eslint/parser": "~5.48.2",
+ "@vscode/test-electron": "^2.3.2",
+ "copyfiles": "^2.4.1",
+ "eslint": "^8.32.0",
+ "glob": "^8.1.0",
+ "mocha": "^10.2.0",
+ "typescript": "^4.9.4",
+ "vsce": "^2.15.0"
+ },
+ "engines": {
+ "npm": ">=7.0.0",
+ "vscode": "^1.63.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
+ "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
+ "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
+ "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^2.0.3",
+ "debug": "^4.3.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@types/glob": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz",
+ "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/minimatch": "^5.1.2",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/glob/node_modules/@types/node": {
+ "version": "22.13.8",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.8.tgz",
+ "integrity": "sha512-G3EfaZS+iOGYWLLRCEAXdWK9my08oHNZ+FHluRiggIYJPOXzhOiDgpVCUHaUvyIC5/fj7C/p637jdzC666AOKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~6.20.0"
+ }
+ },
+ "node_modules/@types/glob/node_modules/undici-types": {
+ "version": "6.20.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz",
+ "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/minimatch": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz",
+ "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/mocha": {
+ "version": "10.0.10",
+ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz",
+ "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "18.19.78",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.78.tgz",
+ "integrity": "sha512-m1ilZCTwKLkk9rruBJXFeYN0Bc5SbjirwYX/Td3MqPfioYbgun3IvK/m8dQxMCnrPGZPg1kvXjp3SIekCN/ynw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "node_modules/@types/semver": {
+ "version": "7.5.8",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
+ "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/vscode": {
+ "version": "1.97.0",
+ "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.97.0.tgz",
+ "integrity": "sha512-ueE73loeOTe7olaVyqP9mrRI54kVPJifUPjblZo9fYcv1CuVLPOEKEkqW0GkqPC454+nCEoigLWnC2Pp7prZ9w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "5.48.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.48.2.tgz",
+ "integrity": "sha512-sR0Gja9Ky1teIq4qJOl0nC+Tk64/uYdX+mi+5iB//MH8gwyx8e3SOyhEzeLZEFEEfCaLf8KJq+Bd/6je1t+CAg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "5.48.2",
+ "@typescript-eslint/type-utils": "5.48.2",
+ "@typescript-eslint/utils": "5.48.2",
+ "debug": "^4.3.4",
+ "ignore": "^5.2.0",
+ "natural-compare-lite": "^1.4.0",
+ "regexpp": "^3.2.0",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^5.0.0",
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "5.48.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.48.2.tgz",
+ "integrity": "sha512-38zMsKsG2sIuM5Oi/olurGwYJXzmtdsHhn5mI/pQogP+BjYVkK5iRazCQ8RGS0V+YLk282uWElN70zAAUmaYHw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "5.48.2",
+ "@typescript-eslint/types": "5.48.2",
+ "@typescript-eslint/typescript-estree": "5.48.2",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "5.48.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.2.tgz",
+ "integrity": "sha512-zEUFfonQid5KRDKoI3O+uP1GnrFd4tIHlvs+sTJXiWuypUWMuDaottkJuR612wQfOkjYbsaskSIURV9xo4f+Fw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "5.48.2",
+ "@typescript-eslint/visitor-keys": "5.48.2"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "5.48.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.2.tgz",
+ "integrity": "sha512-QVWx7J5sPMRiOMJp5dYshPxABRoZV1xbRirqSk8yuIIsu0nvMTZesKErEA3Oix1k+uvsk8Cs8TGJ6kQ0ndAcew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "5.48.2",
+ "@typescript-eslint/utils": "5.48.2",
+ "debug": "^4.3.4",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "5.48.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.2.tgz",
+ "integrity": "sha512-hE7dA77xxu7ByBc6KCzikgfRyBCTst6dZQpwaTy25iMYOnbNljDT4hjhrGEJJ0QoMjrfqrx+j1l1B9/LtKeuqA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "5.48.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.2.tgz",
+ "integrity": "sha512-bibvD3z6ilnoVxUBFEgkO0k0aFvUc4Cttt0dAreEr+nrAHhWzkO83PEVVuieK3DqcgL6VAK5dkzK8XUVja5Zcg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@typescript-eslint/types": "5.48.2",
+ "@typescript-eslint/visitor-keys": "5.48.2",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "5.48.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.2.tgz",
+ "integrity": "sha512-2h18c0d7jgkw6tdKTlNaM7wyopbLRBiit8oAxoP89YnuBOzCZ8g8aBCaCqq7h208qUTroL7Whgzam7UY3HVLow==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "@types/semver": "^7.3.12",
+ "@typescript-eslint/scope-manager": "5.48.2",
+ "@typescript-eslint/types": "5.48.2",
+ "@typescript-eslint/typescript-estree": "5.48.2",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^3.0.0",
+ "semver": "^7.3.7"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "5.48.2",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.2.tgz",
+ "integrity": "sha512-z9njZLSkwmjFWUelGEwEbdf4NwKvfHxvGC0OcGN1Hp/XNDIcJ7D5DpPNPv6x6/mFvc1tQHsaWmpD/a4gOvvCJQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "5.48.2",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
+ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/@vscode/test-electron": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.4.1.tgz",
+ "integrity": "sha512-Gc6EdaLANdktQ1t+zozoBVRynfIsMKMc94Svu1QreOBC8y76x4tvaK32TljrLi1LI2+PK58sDVbL7ALdqf3VRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "http-proxy-agent": "^7.0.2",
+ "https-proxy-agent": "^7.0.5",
+ "jszip": "^3.10.1",
+ "ora": "^7.0.1",
+ "semver": "^7.6.2"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz",
+ "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/azure-devops-node-api": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-11.2.0.tgz",
+ "integrity": "sha512-XdiGPhrpaT5J8wdERRKs5g8E0Zy1pvOYTli7z9E8nmOn3YGp4FhtjhrOyFmX/8veWCwdI69mCHKJw6l+4J/bHA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tunnel": "0.0.6",
+ "typed-rest-client": "^1.8.4"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bl": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz",
+ "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer": "^6.0.3",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browser-stdout": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/buffer": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.2.1"
+ }
+ },
+ "node_modules/buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz",
+ "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "get-intrinsic": "^1.2.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/cheerio": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz",
+ "integrity": "sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cheerio-select": "^2.1.0",
+ "dom-serializer": "^2.0.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.1.0",
+ "encoding-sniffer": "^0.2.0",
+ "htmlparser2": "^9.1.0",
+ "parse5": "^7.1.2",
+ "parse5-htmlparser2-tree-adapter": "^7.0.0",
+ "parse5-parser-stream": "^7.1.2",
+ "undici": "^6.19.5",
+ "whatwg-mimetype": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=18.17"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
+ }
+ },
+ "node_modules/cheerio-select": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
+ "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-select": "^5.1.0",
+ "css-what": "^6.1.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
+ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/cli-cursor": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz",
+ "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "restore-cursor": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-spinners": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
+ "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/commander": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
+ "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/copyfiles": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz",
+ "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "glob": "^7.0.5",
+ "minimatch": "^3.0.3",
+ "mkdirp": "^1.0.4",
+ "noms": "0.0.0",
+ "through2": "^2.0.1",
+ "untildify": "^4.0.0",
+ "yargs": "^16.1.0"
+ },
+ "bin": {
+ "copyfiles": "copyfiles",
+ "copyup": "copyfiles"
+ }
+ },
+ "node_modules/copyfiles/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
+ "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decamelize": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
+ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-response": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/detect-libc": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
+ "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/diff": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
+ "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/encoding-sniffer": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz",
+ "integrity": "sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "iconv-lite": "^0.6.3",
+ "whatwg-encoding": "^3.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/encoding-sniffer?sponsor=1"
+ }
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
+ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.57.1",
+ "@humanwhocodes/config-array": "^0.13.0",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "@ungap/structured-clone": "^1.2.0",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "engines": {
+ "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=5"
+ }
+ },
+ "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expand-template": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
+ "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
+ "dev": true,
+ "license": "(MIT OR WTFPL)",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.8"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fastq": {
+ "version": "1.19.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+ "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fd-slicer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+ "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "pend": "~1.2.0"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "bin": {
+ "flat": "cli.js"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+ "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/fs-constants": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/github-from-package": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
+ "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/glob": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+ "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/hosted-git-info": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
+ "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/htmlparser2": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz",
+ "integrity": "sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==",
+ "dev": true,
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.1.0",
+ "entities": "^4.5.0"
+ }
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/immediate": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
+ "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-interactive": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz",
+ "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz",
+ "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jszip": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
+ "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
+ "dev": true,
+ "license": "(MIT OR GPL-3.0-or-later)",
+ "dependencies": {
+ "lie": "~3.3.0",
+ "pako": "~1.0.2",
+ "readable-stream": "~2.3.6",
+ "setimmediate": "^1.0.5"
+ }
+ },
+ "node_modules/jszip/node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jszip/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/jszip/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jszip/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/keytar": {
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz",
+ "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "node-addon-api": "^4.3.0",
+ "prebuild-install": "^7.0.1"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lie": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
+ "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "immediate": "~3.0.5"
+ }
+ },
+ "node_modules/linkify-it": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz",
+ "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "uc.micro": "^1.0.1"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/log-symbols/node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/markdown-it": {
+ "version": "12.3.2",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz",
+ "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1",
+ "entities": "~2.1.0",
+ "linkify-it": "^3.0.1",
+ "mdurl": "^1.0.1",
+ "uc.micro": "^1.0.5"
+ },
+ "bin": {
+ "markdown-it": "bin/markdown-it.js"
+ }
+ },
+ "node_modules/markdown-it/node_modules/entities": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
+ "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/mdurl": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
+ "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/mimic-response": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/mkdirp-classic": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/mocha": {
+ "version": "10.8.2",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz",
+ "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-colors": "^4.1.3",
+ "browser-stdout": "^1.3.1",
+ "chokidar": "^3.5.3",
+ "debug": "^4.3.5",
+ "diff": "^5.2.0",
+ "escape-string-regexp": "^4.0.0",
+ "find-up": "^5.0.0",
+ "glob": "^8.1.0",
+ "he": "^1.2.0",
+ "js-yaml": "^4.1.0",
+ "log-symbols": "^4.1.0",
+ "minimatch": "^5.1.6",
+ "ms": "^2.1.3",
+ "serialize-javascript": "^6.0.2",
+ "strip-json-comments": "^3.1.1",
+ "supports-color": "^8.1.1",
+ "workerpool": "^6.5.1",
+ "yargs": "^16.2.0",
+ "yargs-parser": "^20.2.9",
+ "yargs-unparser": "^2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/mocha/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/mocha/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/mocha/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/mute-stream": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/napi-build-utils": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz",
+ "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/natural-compare-lite": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz",
+ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/node-abi": {
+ "version": "3.74.0",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.74.0.tgz",
+ "integrity": "sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/node-addon-api": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz",
+ "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/noms": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz",
+ "integrity": "sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "readable-stream": "~1.0.31"
+ }
+ },
+ "node_modules/noms/node_modules/readable-stream": {
+ "version": "1.0.34",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
+ "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
+ }
+ },
+ "node_modules/noms/node_modules/string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/ora": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-7.0.1.tgz",
+ "integrity": "sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^5.3.0",
+ "cli-cursor": "^4.0.0",
+ "cli-spinners": "^2.9.0",
+ "is-interactive": "^2.0.0",
+ "is-unicode-supported": "^1.3.0",
+ "log-symbols": "^5.1.0",
+ "stdin-discarder": "^0.1.0",
+ "string-width": "^6.1.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ora/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ora/node_modules/chalk": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
+ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/ora/node_modules/emoji-regex": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
+ "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ora/node_modules/log-symbols": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz",
+ "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^5.0.0",
+ "is-unicode-supported": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ora/node_modules/string-width": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz",
+ "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^10.2.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ora/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pako": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+ "dev": true,
+ "license": "(MIT AND Zlib)"
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-semver": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz",
+ "integrity": "sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^5.1.0"
+ }
+ },
+ "node_modules/parse-semver/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/parse5": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz",
+ "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "entities": "^4.5.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parse5-htmlparser2-tree-adapter": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz",
+ "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "domhandler": "^5.0.3",
+ "parse5": "^7.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parse5-parser-stream": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz",
+ "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parse5": "^7.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/prebuild-install": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz",
+ "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "detect-libc": "^2.0.0",
+ "expand-template": "^2.0.3",
+ "github-from-package": "0.0.0",
+ "minimist": "^1.2.3",
+ "mkdirp-classic": "^0.5.3",
+ "napi-build-utils": "^2.0.0",
+ "node-abi": "^3.3.0",
+ "pump": "^3.0.0",
+ "rc": "^1.2.7",
+ "simple-get": "^4.0.0",
+ "tar-fs": "^2.0.0",
+ "tunnel-agent": "^0.6.0"
+ },
+ "bin": {
+ "prebuild-install": "bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/pump": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz",
+ "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.14.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
+ "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "dev": true,
+ "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
+ "dependencies": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ },
+ "bin": {
+ "rc": "cli.js"
+ }
+ },
+ "node_modules/rc/node_modules/strip-json-comments": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+ "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/read": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
+ "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "mute-stream": "~0.0.4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/restore-cursor": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz",
+ "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rimraf/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/sax": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
+ "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/semver": {
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
+ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/setimmediate": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/simple-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/simple-get": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
+ "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "decompress-response": "^6.0.0",
+ "once": "^1.3.1",
+ "simple-concat": "^1.0.0"
+ }
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/stdin-discarder": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz",
+ "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bl": "^5.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tar-fs": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz",
+ "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chownr": "^1.1.1",
+ "mkdirp-classic": "^0.5.2",
+ "pump": "^3.0.0",
+ "tar-stream": "^2.1.4"
+ }
+ },
+ "node_modules/tar-stream": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
+ "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bl": "^4.0.3",
+ "end-of-stream": "^1.4.1",
+ "fs-constants": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tar-stream/node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "node_modules/tar-stream/node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ }
+ },
+ "node_modules/through2/node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/through2/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/through2/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/through2/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/tmp": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz",
+ "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true,
+ "license": "0BSD"
+ },
+ "node_modules/tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^1.8.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "peerDependencies": {
+ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
+ }
+ },
+ "node_modules/tunnel": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
+ "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6.11 <=0.7.0 || >=0.7.3"
+ }
+ },
+ "node_modules/tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "safe-buffer": "^5.0.1"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typed-rest-client": {
+ "version": "1.8.11",
+ "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz",
+ "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "qs": "^6.9.1",
+ "tunnel": "0.0.6",
+ "underscore": "^1.12.1"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "4.9.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
+ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
+ "node_modules/uc.micro": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
+ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/underscore": {
+ "version": "1.13.7",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz",
+ "integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/undici": {
+ "version": "6.21.1",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.1.tgz",
+ "integrity": "sha512-q/1rj5D0/zayJB2FraXdaWxbhWiNKDvu8naDT2dl1yTlvJp4BLtOcp2a5BvgGNQpYYJzau7tf1WgKv3b+7mqpQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.17"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/untildify": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz",
+ "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/url-join": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz",
+ "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/vsce": {
+ "version": "2.15.0",
+ "resolved": "https://registry.npmjs.org/vsce/-/vsce-2.15.0.tgz",
+ "integrity": "sha512-P8E9LAZvBCQnoGoizw65JfGvyMqNGlHdlUXD1VAuxtvYAaHBKLBdKPnpy60XKVDAkQCfmMu53g+gq9FM+ydepw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "azure-devops-node-api": "^11.0.1",
+ "chalk": "^2.4.2",
+ "cheerio": "^1.0.0-rc.9",
+ "commander": "^6.1.0",
+ "glob": "^7.0.6",
+ "hosted-git-info": "^4.0.2",
+ "keytar": "^7.7.0",
+ "leven": "^3.1.0",
+ "markdown-it": "^12.3.2",
+ "mime": "^1.3.4",
+ "minimatch": "^3.0.3",
+ "parse-semver": "^1.1.1",
+ "read": "^1.0.7",
+ "semver": "^5.1.0",
+ "tmp": "^0.2.1",
+ "typed-rest-client": "^1.8.4",
+ "url-join": "^4.0.1",
+ "xml2js": "^0.4.23",
+ "yauzl": "^2.3.1",
+ "yazl": "^2.2.2"
+ },
+ "bin": {
+ "vsce": "vsce"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/vsce/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/vsce/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/vsce/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/vsce/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/vsce/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/vsce/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/vsce/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/vsce/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/vsce/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/whatwg-encoding": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
+ "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "iconv-lite": "0.6.3"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/whatwg-mimetype": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
+ "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/workerpool": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz",
+ "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/xml2js": {
+ "version": "0.4.23",
+ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
+ "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "sax": ">=0.6.0",
+ "xmlbuilder": "~11.0.0"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/xmlbuilder": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
+ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-unparser": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
+ "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "camelcase": "^6.0.0",
+ "decamelize": "^4.0.0",
+ "flat": "^5.0.2",
+ "is-plain-obj": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-crc32": "~0.2.3",
+ "fd-slicer": "~1.1.0"
+ }
+ },
+ "node_modules/yazl": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz",
+ "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-crc32": "~0.2.3"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/workspaces/apk/apk-extension/package.json b/workspaces/apk/apk-extension/package.json
new file mode 100644
index 00000000000..eabee0bcc55
--- /dev/null
+++ b/workspaces/apk/apk-extension/package.json
@@ -0,0 +1,75 @@
+{
+ "name": "apk-config-language-support",
+ "displayName": "Kubernetes Gateway Config Language Support",
+ "description": "Kubernetes Gateway Config Language Support",
+ "author": "WSO2",
+ "license": "Apache 2.0",
+ "version": "1.3.0",
+ "publisher": "WSO2",
+ "bugs": "https://github.com/wso2/apk/issues",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/wso2/apk"
+ },
+ "icon": "icon/icon128.png",
+ "engines": {
+ "npm": ">=7.0.0",
+ "vscode": "^1.63.0"
+ },
+ "keywords": [
+ "apk",
+ "yaml",
+ "autocompletion",
+ "validation",
+ "wso2"
+ ],
+ "categories": [
+ "Programming Languages",
+ "Linters",
+ "Snippets",
+ "Formatters"
+ ],
+ "activationEvents": [
+ "workspaceContains:**/*.apk-conf"
+ ],
+ "main": "./out/extension.js",
+ "extensionDependencies": ["redhat.vscode-yaml"],
+ "contributes": {
+ "languages": [
+ {
+ "id": "yaml",
+ "aliases": ["APK Configuration"],
+ "extensions": [".apk-conf"],
+ "configuration": "./language-configuration.json"
+ }
+ ]
+ },
+ "scripts": {
+ "vscode:prepublish": "npm run compile",
+ "compile": "tsc -p ./",
+ "watch-apk": "tsc -watch -p ./",
+ "pretest": "npm run compile && npm run lint",
+ "lint": "eslint src --ext ts",
+ "test": "node ./out/test/runTest.js",
+ "build": "if [ $isPreRelease = true ]; then vsce package --no-dependencies --pre-release; else vsce package --no-dependencies; fi && pnpm run postbuild",
+ "postbuild": "pnpm run copyVSIX",
+ "copyVSIX": "copyfiles *.vsix ./vsix",
+ "copyVSIXToRoot": "copyfiles -f ./vsix/* ../../.."
+ },
+ "devDependencies": {
+ "@types/glob": "^8.0.0",
+ "@types/mocha": "^10.0.1",
+ "@types/node": "^18.11.19",
+ "@types/vscode": "^1.63.0",
+ "@typescript-eslint/eslint-plugin": "~5.48.2",
+ "@typescript-eslint/parser": "~5.48.2",
+ "@vscode/test-electron": "^2.3.2",
+ "eslint": "^8.32.0",
+ "glob": "^8.1.0",
+ "mocha": "^10.2.0",
+ "typescript": "5.8.3",
+ "vsce": "^2.15.0",
+ "copyfiles": "^2.4.1"
+ }
+ }
+
diff --git a/workspaces/apk/apk-extension/schema/apk-conf.yaml b/workspaces/apk/apk-extension/schema/apk-conf.yaml
new file mode 100644
index 00000000000..036cfaa0095
--- /dev/null
+++ b/workspaces/apk/apk-extension/schema/apk-conf.yaml
@@ -0,0 +1,748 @@
+---
+type: object
+properties:
+ id:
+ type: string
+ title: UUID of the API
+ name:
+ type: string
+ title: Name of the API
+ maxLength: 60
+ minLength: 1
+ basePath:
+ type: string
+ title: Base Path of the API
+ maxLength: 256
+ minLength: 1
+ version:
+ type: string
+ title: Version of the API
+ maxLength: 30
+ minLength: 1
+ pattern: '^[^~!@#;:%^*()+={}|\\<>"'',&/$\[\]\s+\/]+$'
+ description: |
+ A string representing the version of the API. It should not contain
+ special characters or spaces.
+ type:
+ type: string
+ default: REST
+ enum:
+ - REST
+ - GRAPHQL
+ - GRPC
+ description: "The type of the API. Can be one of: REST, GraphQL, GRPC."
+ definitionPath:
+ type: string
+ description: Endpoint to expose API Definition
+ defaultVersion:
+ type: boolean
+ description: Is this the default version of the API
+ subscriptionValidation:
+ type: boolean
+ description: Is subscription validation enabled for the API
+ environment:
+ type: string
+ description: Environment of the API
+ endpointConfigurations:
+ "$ref": "#/schemas/EndpointConfigurations"
+ description: Configuration for different endpoints of the API.
+ aiProvider:
+ $ref: "#/schemas/AIProvider"
+ operations:
+ type: array
+ items:
+ "$ref": "#/schemas/APKOperations"
+ description: Operations supported by the API.
+ apiPolicies:
+ "$ref": "#/schemas/APIOperationPolicies"
+ description: Policies applied to API-level operations.
+ rateLimit:
+ "$ref": "#/schemas/RateLimit"
+ description: Rate limiting configuration for the API.
+ authentication:
+ type: array
+ items:
+ oneOf:
+ - $ref: "#/schemas/OAuth2Authentication"
+ - $ref: "#/schemas/MTLSAuthentication"
+ - $ref: "#/schemas/JWTAuthentication"
+ - $ref: "#/schemas/APIKeyAuthentication"
+ additionalProperties:
+ type: array
+ description: Map of custom properties of API
+ items:
+ type: object
+ properties:
+ name:
+ type: string
+ value:
+ type: string
+ corsConfiguration:
+ "$ref": "#/schemas/CORSConfiguration"
+ description: Cross-Origin Resource Sharing (CORS) configuration for the API.
+additionalProperties: false
+schemas:
+ OAuth2Authentication:
+ type: object
+ properties:
+ required:
+ type: string
+ default: mandatory
+ enum:
+ - mandatory
+ - optional
+ description: Specifies whether OAuth2 is mandatory or optional
+ authType:
+ type: string
+ enum: [OAuth2]
+ description: The type of authentication to be used, e.g., OAuth2, etc.
+ sendTokenToUpstream:
+ type: boolean
+ default: false
+ description: Specifies whether to send the authentication token to the upstream service.
+ enabled:
+ type: boolean
+ example: true
+ description: Specifies whether OAuth2 authentication is enabled for the API.
+ headerName:
+ type: string
+ example: Authorization
+ description: The name of the header field used to send the authentication token.
+ headerEnable:
+ type: boolean
+ description: Specifies whether the authentication token can be sent in the header.
+ additionalProperties: false
+ JWTAuthentication:
+ type: object
+ properties:
+ required:
+ type: string
+ default: mandatory
+ enum:
+ - mandatory
+ - optional
+ description: Specifies whether JWT is mandatory or optional
+ authType:
+ type: string
+ enum: [JWT]
+ description: The type of authentication to be used, e.g., JWT, etc.
+ sendTokenToUpstream:
+ type: boolean
+ default: false
+ description: Specifies whether to send the authentication token to the upstream service.
+ enabled:
+ type: boolean
+ example: true
+ description: Specifies whether JWT authentication is enabled for the API.
+ headerName:
+ type: string
+ example: Authorization
+ description: The name of the header field used to send the authentication token.
+ headerEnable:
+ type: boolean
+ description: Specifies whether the authentication token can be sent in the header.
+ audience:
+ type: array
+ default: []
+ items:
+ type: string
+ additionalProperties: false
+ APIKeyAuthentication:
+ type: object
+ properties:
+ required:
+ type: string
+ default: mandatory
+ enum:
+ - mandatory
+ - optional
+ description: Specifies whether API Key is mandatory or optional
+ authType:
+ type: string
+ enum: [APIKey]
+ description: The type of authentication to be used, e.g., APIKey, etc.
+ sendTokenToUpstream:
+ type: boolean
+ default: false
+ description: Specifies whether to send the authentication token to the upstream service.
+ enabled:
+ type: boolean
+ example: true
+ description: Specifies whether API Key authentication is enabled for the API.
+ headerName:
+ type: string
+ example: APIKey
+ description: The name of the header field used to send the API key.
+ headerEnable:
+ type: boolean
+ description: Specifies whether the API key can be sent in the header.
+ queryParamName:
+ type: string
+ example: apikey
+ default: apikey
+ queryParamEnable:
+ type: boolean
+ default: true
+ description: Specifies whether the API key can be sent as a query parameter.
+ additionalProperties: false
+ MTLSAuthentication:
+ type: object
+ properties:
+ authType:
+ type: string
+ example: mTLS
+ enum: [mTLS]
+ description: The type of authentication to be used, e.g., mTLS, etc.
+ enabled:
+ type: boolean
+ example: true
+ default: true
+ description: Specifies whether mTLS authentication is enabled for the API.
+ required:
+ type: string
+ default: optional
+ enum:
+ - mandatory
+ - optional
+ description: Specifies whether mTLS is mandatory or optional
+ certificates:
+ type: array
+ description: The names and keys of the secrets containing the mTLS certificates of that API
+ items:
+ type: object
+ properties:
+ name:
+ type: string
+ key:
+ type: string
+ additionalProperties: false
+ CORSConfiguration:
+ type: object
+ description: Cross-Origin Resource Sharing (CORS) configuration for the API.
+ properties:
+ corsConfigurationEnabled:
+ type: boolean
+ default: false
+ description: Specifies whether CORS configuration is enabled.
+ accessControlAllowOrigins:
+ type: array
+ items:
+ type: string
+ description: Allowed origins for CORS requests.
+ accessControlAllowCredentials:
+ type: boolean
+ default: false
+ description: |
+ Specifies whether credentials are allowed to be sent for CORS
+ requests.
+ accessControlAllowHeaders:
+ type: array
+ items:
+ type: string
+ description: Allowed headers for CORS requests.
+ accessControlAllowMethods:
+ type: array
+ items:
+ type: string
+ description: Allowed HTTP methods for CORS requests.
+ accessControlAllowMaxAge:
+ type: integer
+ default: 0
+ description: |
+ Maximum age (in seconds) for which the CORS preflight response can be
+ cached.
+ accessControlExposeHeaders:
+ type: array
+ items:
+ type: string
+ description: The headers that are safe to expose to the API.
+ additionalProperties: false
+ APIOperationPolicies:
+ title: API Operation Level Policies
+ properties:
+ request:
+ type: array
+ items:
+ $ref: "#/schemas/APKRequestOperationPolicy"
+ description: Policies applied to request operations.
+ response:
+ type: array
+ items:
+ $ref: "#/schemas/APKResponseOperationPolicy"
+ description: Policies applied to response operations.
+ additionalProperties: false
+ APKRequestOperationPolicy:
+ title: API Operation Policy
+ required:
+ - policyName
+ type: object
+ properties:
+ policyName:
+ type: string
+ description: The name of the operation policy.
+ enum:
+ - AddHeader
+ - RemoveHeader
+ - SetHeader
+ - Interceptor
+ - BackendJwt
+ - RequestMirror
+ - RequestRedirect
+ - ModelBasedRoundRobin
+ policyVersion:
+ type: string
+ default: v1
+ description: The version of the operation policy.
+ policyId:
+ type: string
+ description: The ID of the operation policy.
+ parameters:
+ type: object
+ oneOf:
+ - "$ref": "#/schemas/InterceptorProperties"
+ - "$ref": "#/schemas/BackendJWTProperties"
+ - "$ref": "#/schemas/HeaderModifierProperties"
+ - "$ref": "#/schemas/RequestMirrorProperties"
+ - "$ref": "#/schemas/RequestRedirectProperties"
+ - "$ref": "#/schemas/ModelBasedRoundRobinProperties"
+ additionalProperties: false
+ APKResponseOperationPolicy:
+ title: API Operation Policy
+ required:
+ - policyName
+ type: object
+ properties:
+ policyName:
+ type: string
+ description: The name of the operation policy.
+ enum:
+ - AddHeader
+ - RemoveHeader
+ - SetHeader
+ - Interceptor
+ - BackendJwt
+ policyVersion:
+ type: string
+ default: v1
+ description: The version of the operation policy.
+ policyId:
+ type: string
+ description: The ID of the operation policy.
+ parameters:
+ type: object
+ oneOf:
+ - "$ref": "#/schemas/InterceptorProperties"
+ - "$ref": "#/schemas/BackendJWTProperties"
+ - "$ref": "#/schemas/HeaderModifierProperties"
+ additionalProperties: false
+ HeaderModifierProperties:
+ title: Header Modifier Parameters
+ type: object
+ properties:
+ headerName:
+ type: string
+ description: The name of the header.
+ headerValue:
+ type: string
+ description: The value of the header.
+ required:
+ - headerName
+ additionalProperties: false
+ RequestMirrorProperties:
+ title: Request Mirror Parameters
+ type: object
+ properties:
+ urls:
+ type: array
+ items:
+ type: string
+ description: The urls to mirror the request to.
+ additionalProperties: false
+ RequestRedirectProperties:
+ title: Request Redirect Parameters
+ type: object
+ properties:
+ url:
+ type: string
+ description: The URL to redirect the request to.
+ statusCode:
+ type: integer
+ description: The status code to show upon redirecting the request.
+ default: 302
+ enum:
+ - 301
+ - 302
+ additionalProperties: false
+ RateLimit:
+ title: API Rate Limit Details
+ type: object
+ required:
+ - requestsPerUnit
+ - unit
+ properties:
+ requestsPerUnit:
+ type: integer
+ description: The number of requests allowed per specified unit of time.
+ example: 30
+ unit:
+ type: string
+ description: The unit of time for rate limiting.
+ enum:
+ - Minute
+ - Hour
+ - Day
+ example: Minute
+ additionalProperties: false
+ AIProvider:
+ title: AI Provider
+ properties:
+ name:
+ type: string
+ apiVersion:
+ type: string
+ additionalProperties: false
+ EndpointConfigurations:
+ title: Endpoint Configurations
+ properties:
+ production:
+ type: array
+ items:
+ $ref: "#/schemas/EndpointConfiguration"
+ sandbox:
+ type: array
+ items:
+ $ref: "#/schemas/EndpointConfiguration"
+ additionalProperties: false
+ EndpointConfiguration:
+ required:
+ - endpoint
+ type: object
+ properties:
+ endpoint:
+ oneOf:
+ - type: string
+ - $ref: "#/schemas/K8sService"
+ endpointSecurity:
+ $ref: "#/schemas/EndpointSecurity"
+ description: Security configuration for the API endpoint.
+ certificate:
+ type: object
+ $ref: "#/schemas/Certificate"
+ description: Certificate information for secure communication.
+ resiliency:
+ $ref: "#/schemas/Resiliency"
+ description: Resiliency configuration for the API endpoint.
+ aiRatelimit:
+ $ref: "#/schemas/AIRatelimit"
+ weight:
+ type: integer
+ additionalProperties: false
+ Certificate:
+ type: object
+ properties:
+ secretName:
+ type: string
+ description: The name of the secret containing the certificate.
+ secretKey:
+ type: string
+ description: The key within the secret that holds the certificate.
+ additionalProperties: false
+ EndpointSecurity:
+ type: object
+ properties:
+ enabled:
+ type: boolean
+ default: false
+ description: Specifies whether endpoint security is enabled.
+ securityType:
+ oneOf:
+ - $ref: "#/schemas/BasicEndpointSecurity"
+ - $ref: "#/schemas/APIKeyEndpointSecurity"
+ description: The type of security to be applied to the API endpoint.
+ additionalProperties: false
+ BasicEndpointSecurity:
+ type: object
+ properties:
+ secretName:
+ type: string
+ description: |
+ The name of the secret containing the credentials for basic
+ authentication.
+ userNameKey:
+ type: string
+ description: |
+ The key within the secret that holds the username for basic
+ authentication.
+ passwordKey:
+ type: string
+ description: |
+ The key within the secret that holds the password for basic
+ authentication.
+ additionalProperties: false
+ APIKeyEndpointSecurity:
+ type: object
+ properties:
+ secretName:
+ type: string
+ in:
+ type: string
+ enum:
+ - Header
+ - Query
+ default: Header
+ apiKeyNameKey:
+ type: string
+ apiKeyValueKey:
+ type: string
+ additionalProperties: false
+ Resiliency:
+ type: object
+ description: Endpoint resiliency related configurations of the API
+ properties:
+ timeout:
+ $ref: "#/schemas/Timeout"
+ retryPolicy:
+ $ref: "#/schemas/RetryPolicy"
+ circuitBreaker:
+ $ref: "#/schemas/CircuitBreaker"
+ additionalProperties: false
+ CircuitBreaker:
+ type: object
+ properties:
+ maxConnectionPools:
+ type: integer
+ example: 100
+ maxConnections:
+ type: integer
+ example: 100
+ maxPendingRequests:
+ type: integer
+ example: 100
+ maxRequests:
+ type: integer
+ example: 100
+ maxRetries:
+ type: integer
+ example: 3
+ additionalProperties: false
+ Timeout:
+ type: object
+ properties:
+ downstreamRequestIdleTimeout:
+ type: integer
+ example: 400
+ upstreamResponseTimeout:
+ type: integer
+ example: 40
+ additionalProperties: false
+ RetryPolicy:
+ type: object
+ properties:
+ count:
+ type: integer
+ example: 3
+ baseIntervalMillis:
+ type: integer
+ example: 1000
+ statusCodes:
+ type: array
+ items:
+ type: integer
+ additionalProperties: false
+ AIRatelimit:
+ type: object
+ required:
+ - enabled
+ - token
+ - request
+ properties:
+ enabled:
+ type: boolean
+ default: true
+ token:
+ $ref: "#/schemas/TokenAIRL"
+ request:
+ $ref: "#/schemas/RequestAIRL"
+ TokenAIRL:
+ type: object
+ required:
+ - promptLimit
+ - completionLimit
+ - totalLimit
+ - unit
+ properties:
+ promptLimit:
+ type: integer
+ default: 0
+ completionLimit:
+ type: integer
+ default: 0
+ totalLimit:
+ type: integer
+ default": 0
+ unit:
+ type: string
+ default: Minute
+ enum:
+ - Minute
+ - Hour
+ - Day
+ RequestAIRL:
+ type: object
+ required:
+ - requestLimit
+ - unit
+ properties:
+ requestLimit:
+ type: integer
+ default: 0
+ unit:
+ type: string
+ default: Minute
+ enum:
+ - Minute
+ - Hour
+ - Day
+ APKOperations:
+ title: Operation
+ type: object
+ required:
+ - target
+ - verb
+ properties:
+ target:
+ type: string
+ example: "/order/{orderId}"
+ verb:
+ type: string
+ example: POST
+ secured:
+ type: boolean
+ example: true
+ default: true
+ description: Authentication mode for resource (true/false)
+ endpointConfigurations:
+ $ref: "#/schemas/EndpointConfigurations"
+ operationPolicies:
+ $ref: "#/schemas/APIOperationPolicies"
+ rateLimit:
+ $ref: "#/schemas/RateLimit"
+ scopes:
+ type: array
+ example: []
+ items:
+ type: string
+ additionalProperties: false
+ K8sService:
+ type: object
+ properties:
+ name:
+ type: string
+ example: pizzashack-service
+ namespace:
+ type: string
+ example: apk-platform
+ port:
+ type: integer
+ example: 8080
+ protocol:
+ type: string
+ example: http
+ additionalProperties: false
+ InterceptorProperties:
+ title: Interceptor Parameters
+ type: object
+ properties:
+ backendUrl:
+ type: string
+ headersEnabled:
+ type: boolean
+ bodyEnabled:
+ type: boolean
+ trailersEnabled:
+ type: boolean
+ contextEnabled:
+ type: boolean
+ tlsSecretName:
+ type: string
+ tlsSecretKey:
+ type: string
+ required:
+ - backendUrl
+ additionalProperties: false
+ ModelBasedRoundRobinProperties:
+ title: "Model Based Round Robin Policy Parameters"
+ type: "object"
+ properties:
+ onQuotaExceedSuspendDuration:
+ type: "integer"
+ description: "The duration for which the model routing is suspended for a particular model upon exceeding the quota for that model."
+ productionModels:
+ type: "array"
+ items:
+ $ref: "#/schemas/AIModel"
+ sandboxModels:
+ type: "array"
+ items:
+ $ref: "#/schemas/AIModel"
+ required:
+ - "onQuotaExceedSuspendDuration"
+ - "productionModels"
+ additionalProperties: false
+ AIModel:
+ title: "AI Model"
+ type: "object"
+ properties:
+ model:
+ type: "string"
+ description: "The Name of the model."
+ endpoint:
+ type: "string"
+ description: "The endpoint of the model."
+ weight:
+ type: "integer"
+ description: "The weight of the model."
+ required:
+ - "model"
+ - "endpoint"
+ additionalProperties: false
+ BackendJWTProperties:
+ title: Backend JWT Parameters
+ type: object
+ properties:
+ encoding:
+ type: string
+ signingAlgorithm:
+ type: string
+ header:
+ type: string
+ tokenTTL:
+ type: integer
+ customClaims:
+ type: array
+ items:
+ $ref: "#/schemas/CustomClaims"
+ additionalProperties: false
+ CustomClaims:
+ type: object
+ required:
+ - claim
+ - value
+ properties:
+ claim:
+ type: string
+ default: claim1
+ value:
+ type: string
+ default: value1
+ type:
+ type: string
+ default: string
+ additionalProperties: false
+required:
+ - name
+ - basePath
+ - type
+ - operations
+ - endpointConfigurations
+ - version
diff --git a/workspaces/apk/apk-extension/schema/apk-schema.json b/workspaces/apk/apk-extension/schema/apk-schema.json
new file mode 100644
index 00000000000..338e9a13e2e
--- /dev/null
+++ b/workspaces/apk/apk-extension/schema/apk-schema.json
@@ -0,0 +1,1060 @@
+{
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "string",
+ "title": "UUID of the API"
+ },
+ "name": {
+ "type": "string",
+ "title": "Name of the API",
+ "maxLength": 60,
+ "minLength": 1
+ },
+ "basePath": {
+ "type": "string",
+ "title": "Base Path of the API",
+ "maxLength": 256,
+ "minLength": 1
+ },
+ "version": {
+ "type": "string",
+ "title": "Version of the API",
+ "maxLength": 30,
+ "minLength": 1,
+ "pattern": "^[^~!@#;:%^*()+={}|\\\\<>\"',&/$\\[\\]\\s+\\/]+$",
+ "description": "A string representing the version of the API. It should not contain special characters or spaces."
+ },
+ "type": {
+ "type": "string",
+ "default": "REST",
+ "enum": [
+ "REST",
+ "GRAPHQL",
+ "GRPC"
+ ],
+ "description": "The type of the API. Can be one of: REST, GraphQL, GRPC."
+ },
+ "aiProvider": {
+ "$ref": "#/schemas/AIProvider",
+ "description": "The AI provider for the API."
+ },
+ "definitionPath": {
+ "type": "string",
+ "description": "Endpoint to expose API Definition"
+ },
+ "defaultVersion": {
+ "type": "boolean",
+ "description": "Is this the default version of the API"
+ },
+ "subscriptionValidation": {
+ "type": "boolean",
+ "description": "Is subscription validation enabled for the API"
+ },
+ "environment": {
+ "type": "string",
+ "description": "Environment of the API"
+ },
+ "endpointConfigurations": {
+ "$ref": "#/schemas/EndpointConfigurations",
+ "description": "Configuration for different endpoints of the API."
+ },
+ "operations": {
+ "type": "array",
+ "items": {
+ "$ref": "#/schemas/APKOperations"
+ },
+ "description": "Operations supported by the API."
+ },
+ "apiPolicies": {
+ "$ref": "#/schemas/APIOperationPolicies",
+ "description": "Policies applied to API-level operations."
+ },
+ "rateLimit": {
+ "$ref": "#/schemas/RateLimit",
+ "description": "Rate limiting configuration for the API."
+ },
+ "authentication": {
+ "type": "array",
+ "items": {
+ "oneOf": [
+ {
+ "$ref": "#/schemas/OAuth2Authentication"
+ },
+ {
+ "$ref": "#/schemas/JWTAuthentication"
+ },
+ {
+ "$ref": "#/schemas/MTLSAuthentication"
+ },
+ {
+ "$ref": "#/schemas/APIKeyAuthentication"
+ }
+ ]
+ }
+ },
+ "additionalProperties": {
+ "type": "array",
+ "description": "Map of custom properties of API",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "value": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "corsConfiguration": {
+ "$ref": "#/schemas/CORSConfiguration",
+ "description": "Cross-Origin Resource Sharing (CORS) configuration for the API."
+ }
+ },
+ "additionalProperties": false,
+ "schemas": {
+ "OAuth2Authentication": {
+ "type": "object",
+ "properties": {
+ "required": {
+ "type": "string",
+ "default": "mandatory",
+ "enum": [
+ "mandatory",
+ "optional"
+ ]
+ },
+ "authType": {
+ "type": "string",
+ "enum": [
+ "OAuth2"
+ ],
+ "description": "The type of authentication to be used, e.g., OAuth2, etc."
+ },
+ "sendTokenToUpstream": {
+ "type": "boolean",
+ "default": false,
+ "description": "Specifies whether to send the authentication token to the upstream service."
+ },
+ "enabled": {
+ "type": "boolean",
+ "description": "Specifies whether authentication is enabled for the API."
+ },
+ "headerName": {
+ "type": "string",
+ "description": "The name of the header field used to send the authentication token."
+ },
+ "queryParamName": {
+ "type": "string",
+ "description": "The name of the query parameter used to send the authentication token."
+ },
+ "headerEnable": {
+ "type": "boolean",
+ "description": "Specifies whether the authentication token can be sent in the header."
+ },
+ "queryParamEnable": {
+ "type": "boolean"
+ }
+ },
+ "additionalProperties": false
+ },
+ "JWTAuthentication": {
+ "type": "object",
+ "properties": {
+ "required": {
+ "type": "string",
+ "default": "mandatory",
+ "enum": [
+ "mandatory",
+ "optional"
+ ]
+ },
+ "authType": {
+ "type": "string",
+ "enum": [
+ "JWT"
+ ]
+ },
+ "sendTokenToUpstream": {
+ "type": "boolean",
+ "default": false
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "headerName": {
+ "type": "string"
+ },
+ "queryParamName": {
+ "type": "string"
+ },
+ "headerEnable": {
+ "type": "boolean"
+ },
+ "queryParamEnable": {
+ "type": "boolean"
+ },
+ "audience": {
+ "type": "array"
+ }
+ },
+ "additionalProperties": false
+ },
+ "MTLSAuthentication": {
+ "type": "object",
+ "properties": {
+ "authType": {
+ "type": "string",
+ "enum": [
+ "mTLS"
+ ],
+ "description": "The type of authentication to be used, e.g., mTLS, etc."
+ },
+ "required": {
+ "type": "string",
+ "default": "optional",
+ "enum": [
+ "mandatory",
+ "optional"
+ ],
+ "description": "Specifies whether mTLS is mandatory or optional"
+ },
+ "enabled": {
+ "type": "boolean",
+ "default": true,
+ "description": "Specifies whether mTLS authentication is enabled for the API."
+ },
+ "certificates": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "Name of the config map containing the certificate"
+ },
+ "key": {
+ "type": "string",
+ "description": "The key of the certificate value"
+ }
+ }
+ },
+ "description": "The list of certificates used for mTLS"
+ }
+ },
+ "additionalProperties": false
+ },
+ "APIKeyAuthentication": {
+ "type": "object",
+ "properties": {
+ "required": {
+ "type": "string",
+ "default": "optional",
+ "enum": [
+ "mandatory",
+ "optional"
+ ]
+ },
+ "authType": {
+ "type": "string",
+ "example": "APIKey",
+ "enum": [
+ "APIKey"
+ ],
+ "description": "The type of authentication to be used, e.g., APIKey, etc."
+ },
+ "enabled": {
+ "type": "boolean"
+ },
+ "sendTokenToUpstream": {
+ "type": "boolean",
+ "default": false
+ },
+ "headerName": {
+ "type": "string",
+ "example": "apikey",
+ "default": "apikey"
+ },
+ "queryParamName": {
+ "type": "string",
+ "example": "apikey",
+ "default": "apikey"
+ },
+ "headerEnable": {
+ "type": "boolean",
+ "default": true
+ },
+ "queryParamEnable": {
+ "type": "boolean",
+ "default": true
+ }
+ },
+ "additionalProperties": false
+ },
+ "CORSConfiguration": {
+ "type": "object",
+ "description": "Cross-Origin Resource Sharing (CORS) configuration for the API.",
+ "properties": {
+ "corsConfigurationEnabled": {
+ "type": "boolean",
+ "default": false,
+ "description": "Specifies whether CORS configuration is enabled."
+ },
+ "accessControlAllowOrigins": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "Allowed origins for CORS requests."
+ },
+ "accessControlAllowCredentials": {
+ "type": "boolean",
+ "default": false,
+ "description": "Specifies whether credentials are allowed to be sent for CORS requests."
+ },
+ "accessControlAllowHeaders": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "Allowed headers for CORS requests."
+ },
+ "accessControlAllowMethods": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "Allowed HTTP methods for CORS requests."
+ },
+ "accessControlAllowMaxAge": {
+ "type": "integer",
+ "default": 0,
+ "description": "Maximum age (in seconds) for which the CORS preflight response can be cached."
+ },
+ "accessControlExposeHeaders": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "description": "The headers that are safe to expose to the API."
+ }
+ },
+ "additionalProperties": false
+ },
+ "APIOperationPolicies": {
+ "title": "API Operation Level Policies",
+ "properties": {
+ "request": {
+ "type": "array",
+ "items": {
+ "$ref": "#/schemas/APKRequestOperationPolicy"
+ },
+ "description": "Policies applied to request operations."
+ },
+ "response": {
+ "type": "array",
+ "items": {
+ "$ref": "#/schemas/APKResponseOperationPolicy"
+ },
+ "description": "Policies applied to response operations."
+ }
+ },
+ "additionalProperties": false
+ },
+ "APKRequestOperationPolicy": {
+ "title": "API Operation Policy",
+ "required": [
+ "policyName"
+ ],
+ "type": "object",
+ "properties": {
+ "policyName": {
+ "type": "string",
+ "description": "The name of the operation policy.",
+ "enum": [
+ "AddHeader",
+ "RemoveHeader",
+ "SetHeader",
+ "Interceptor",
+ "BackendJwt",
+ "RequestMirror",
+ "RequestRedirect",
+ "ModelBasedRoundRobin"
+ ]
+ },
+ "policyVersion": {
+ "type": "string",
+ "default": "v1",
+ "description": "The version of the operation policy."
+ },
+ "policyId": {
+ "type": "string",
+ "description": "The ID of the operation policy."
+ },
+ "parameters": {
+ "type": "object",
+ "oneOf": [
+ {
+ "$ref": "#/schemas/InterceptorProperties"
+ },
+ {
+ "$ref": "#/schemas/BackendJWTProperties"
+ },
+ {
+ "$ref": "#/schemas/HeaderModifierProperties"
+ },
+ {
+ "$ref": "#/schemas/RequestMirrorProperties"
+ },
+ {
+ "$ref": "#/schemas/RequestRedirectProperties"
+ },
+ {
+ "$ref": "#/schemas/ModelBasedRoundRobinProperties"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "APKResponseOperationPolicy": {
+ "title": "API Operation Policy",
+ "required": [
+ "policyName"
+ ],
+ "type": "object",
+ "properties": {
+ "policyName": {
+ "type": "string",
+ "description": "The name of the operation policy.",
+ "enum": [
+ "AddHeader",
+ "RemoveHeader",
+ "SetHeader",
+ "Interceptor",
+ "BackendJwt"
+ ]
+ },
+ "policyVersion": {
+ "type": "string",
+ "default": "v1",
+ "description": "The version of the operation policy."
+ },
+ "policyId": {
+ "type": "string",
+ "description": "The ID of the operation policy."
+ },
+ "parameters": {
+ "type": "object",
+ "oneOf": [
+ {
+ "$ref": "#/schemas/InterceptorProperties"
+ },
+ {
+ "$ref": "#/schemas/BackendJWTProperties"
+ },
+ {
+ "$ref": "#/schemas/HeaderModifierProperties"
+ }
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "RateLimit": {
+ "title": "API Rate Limit Details",
+ "type": "object",
+ "required": [
+ "requestsPerUnit",
+ "unit"
+ ],
+ "properties": {
+ "requestsPerUnit": {
+ "type": "integer",
+ "description": "The number of requests allowed per specified unit of time.",
+ "example": 30
+ },
+ "unit": {
+ "type": "string",
+ "description": "The unit of time for rate limiting.",
+ "enum": [
+ "Minute",
+ "Hour",
+ "Day"
+ ],
+ "example": "Minute"
+ }
+ },
+ "additionalProperties": false
+ },
+ "AIProvider": {
+ "title": "AI Provider",
+ "type": "object",
+ "required": [
+ "name",
+ "apiVersion"
+ ],
+ "properties": {
+ "name": {
+ "type": "string",
+ "description": "The name of the AI provider."
+ },
+ "apiVersion": {
+ "type": "string",
+ "description": "The version of the AI provider."
+ }
+ },
+ "additionalProperties": false
+ },
+ "EndpointConfigurations": {
+ "title": "Endpoint Configurations",
+ "properties": {
+ "production": {
+ "type": "array",
+ "items": {
+ "$ref": "#/schemas/EndpointConfiguration"
+ }
+ },
+ "sandbox": {
+ "type": "array",
+ "items": {
+ "$ref": "#/schemas/EndpointConfiguration"
+ }
+ }
+ },
+ "additionalProperties": false
+ },
+ "EndpointConfiguration": {
+ "required": [
+ "endpoint"
+ ],
+ "type": "object",
+ "properties": {
+ "endpoint": {
+ "oneOf": [
+ {
+ "type": "string"
+ },
+ {
+ "$ref": "#/schemas/K8sService"
+ }
+ ]
+ },
+ "endpointSecurity": {
+ "$ref": "#/schemas/EndpointSecurity",
+ "description": "Security configuration for the API endpoint."
+ },
+ "certificate": {
+ "type": "object",
+ "$ref": "#/schemas/Certificate",
+ "description": "Certificate information for secure communication."
+ },
+ "resiliency": {
+ "$ref": "#/schemas/Resiliency",
+ "description": "Resiliency configuration for the API endpoint."
+ },
+ "aiRatelimit": {
+ "$ref": "#/schemas/AIRatelimit",
+ "description": "AI ratelimit configuration for the API endpoint."
+ },
+ "weight": {
+ "type": "integer",
+ "description": "The weight configuration for the API endpoint."
+ }
+ },
+ "additionalProperties": false
+ },
+ "Certificate": {
+ "type": "object",
+ "properties": {
+ "secretName": {
+ "type": "string",
+ "description": "The name of the secret containing the certificate."
+ },
+ "secretKey": {
+ "type": "string",
+ "description": "The key within the secret that holds the certificate."
+ }
+ },
+ "additionalProperties": false
+ },
+ "EndpointSecurity": {
+ "type": "object",
+ "properties": {
+ "enabled": {
+ "type": "boolean",
+ "default": false,
+ "description": "Specifies whether endpoint security is enabled."
+ },
+ "securityType": {
+ "oneOf": [
+ {
+ "$ref": "#/schemas/BasicEndpointSecurity"
+ },
+ {
+ "$ref": "#/schemas/APIKeyEndpointSecurity"
+ }
+ ],
+ "description": "The type of security to be applied to the API endpoint."
+ }
+ },
+ "additionalProperties": false
+ },
+ "BasicEndpointSecurity": {
+ "type": "object",
+ "properties": {
+ "secretName": {
+ "type": "string",
+ "description": "The name of the secret containing the credentials for basic authentication."
+ },
+ "userNameKey": {
+ "type": "string",
+ "description": "The key within the secret that holds the username for basic authentication."
+ },
+ "passwordKey": {
+ "type": "string",
+ "description": "The key within the secret that holds the password for basic authentication."
+ }
+ },
+ "additionalProperties": false
+ },
+ "APIKeyEndpointSecurity": {
+ "type": "object",
+ "properties": {
+ "secretName": {
+ "type": "string",
+ "description": "The name of the secret containing the certificate."
+ },
+ "in": {
+ "type": "string",
+ "enum": [
+ "Header",
+ "Query"
+ ],
+ "description": "The location of the API key in the request."
+ },
+ "apiKeyNameKey": {
+ "type": "string",
+ "description": "The name of key in the request."
+ },
+ "apiKeyValueKey": {
+ "type": "string",
+ "description": "The value of key in the request."
+ }
+ },
+ "additionalProperties": false
+ },
+ "Resiliency": {
+ "type": "object",
+ "description": "Endpoint resiliency related configurations of the API",
+ "properties": {
+ "timeout": {
+ "$ref": "#/schemas/Timeout"
+ },
+ "retryPolicy": {
+ "$ref": "#/schemas/RetryPolicy"
+ },
+ "circuitBreaker": {
+ "$ref": "#/schemas/CircuitBreaker"
+ }
+ },
+ "additionalProperties": false
+ },
+ "AIRatelimit": {
+ "type": "object",
+ "required": [
+ "enabled",
+ "token",
+ "request"
+ ],
+ "description": "Endpoint AI ratelimit related configurations of the API",
+ "properties": {
+ "enabled": {
+ "type": "boolean",
+ "default": true,
+ "description": "States whether the AI ratelimit is turned on or not"
+ },
+ "token": {
+ "$ref": "#/schemas/TokenAIRL"
+ },
+ "request": {
+ "$ref": "#/schemas/RequestAIRL"
+ }
+ },
+ "additionalProperties": false
+ },
+ "TokenAIRL": {
+ "type": "object",
+ "required": [
+ "promptLimit",
+ "completionLimit",
+ "totalLimit",
+ "unit"
+ ],
+ "description": "Token limits configuration for AI rate limiting",
+ "properties": {
+ "promptLimit": {
+ "type": "integer",
+ "default": 0,
+ "description": "Limit for prompts within the specified unit"
+ },
+ "completionLimit": {
+ "type": "integer",
+ "default": 0,
+ "description": "Limit for completions within the specified unit"
+ },
+ "totalLimit": {
+ "type": "integer",
+ "default": 0,
+ "description": "Total limit combining prompt and completion counts"
+ },
+ "unit": {
+ "type": "string",
+ "default": "Minute",
+ "enum": [
+ "Minute",
+ "Hour",
+ "Day"
+ ],
+ "description": "The time unit for the rate limits"
+ }
+ },
+ "additionalProperties": false
+ },
+ "RequestAIRL": {
+ "type": "object",
+ "required": [
+ "requestLimit",
+ "unit"
+ ],
+ "description": "Request limits configuration for AI rate limiting",
+ "properties": {
+ "requestLimit": {
+ "type": "integer",
+ "default": 0,
+ "description": "Limit for requests within the specified unit"
+ },
+ "unit": {
+ "type": "string",
+ "default": "Minute",
+ "enum": [
+ "Minute",
+ "Hour",
+ "Day"
+ ],
+ "description": "The time unit for the request limits"
+ }
+ },
+ "additionalProperties": false
+ },
+ "CircuitBreaker": {
+ "type": "object",
+ "properties": {
+ "maxConnectionPools": {
+ "type": "integer",
+ "example": 100
+ },
+ "maxConnections": {
+ "type": "integer",
+ "example": 100
+ },
+ "maxPendingRequests": {
+ "type": "integer",
+ "example": 100
+ },
+ "maxRequests": {
+ "type": "integer",
+ "example": 100
+ },
+ "maxRetries": {
+ "type": "integer",
+ "example": 3
+ }
+ },
+ "additionalProperties": false
+ },
+ "Timeout": {
+ "type": "object",
+ "properties": {
+ "downstreamRequestIdleTimeout": {
+ "type": "integer",
+ "example": 400
+ },
+ "upstreamResponseTimeout": {
+ "type": "integer",
+ "example": 40
+ }
+ },
+ "additionalProperties": false
+ },
+ "RetryPolicy": {
+ "type": "object",
+ "properties": {
+ "count": {
+ "type": "integer",
+ "example": 3
+ },
+ "baseIntervalMillis": {
+ "type": "integer",
+ "example": 1000
+ },
+ "statusCodes": {
+ "type": "array",
+ "items": {
+ "type": "integer"
+ }
+ }
+ },
+ "additionalProperties": false
+ },
+ "APKOperations": {
+ "title": "Operation",
+ "type": "object",
+ "properties": {
+ "target": {
+ "type": "string",
+ "example": "/order/{orderId}"
+ },
+ "verb": {
+ "type": "string",
+ "example": "POST"
+ },
+ "secured": {
+ "type": "boolean",
+ "example": true,
+ "default": true,
+ "description": "Authentication mode for resource (true/false)"
+ },
+ "endpointConfigurations": {
+ "$ref": "#/schemas/EndpointConfigurations"
+ },
+ "operationPolicies": {
+ "$ref": "#/schemas/APIOperationPolicies"
+ },
+ "rateLimit": {
+ "$ref": "#/schemas/RateLimit"
+ },
+ "scopes": {
+ "type": "array",
+ "example": [
+
+ ],
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ "required": [
+ "target",
+ "verb"
+ ],
+ "additionalProperties": false
+ },
+ "K8sService": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string",
+ "example": "pizzashack-service"
+ },
+ "namespace": {
+ "type": "string",
+ "example": "apk-platform"
+ },
+ "port": {
+ "type": "integer",
+ "example": 8080
+ },
+ "protocol": {
+ "type": "string",
+ "example": "http"
+ }
+ },
+ "additionalProperties": false
+ },
+ "InterceptorProperties": {
+ "title": "Interceptor Parameters",
+ "type": "object",
+ "properties": {
+ "backendUrl": {
+ "type": "string"
+ },
+ "headersEnabled": {
+ "type": "boolean"
+ },
+ "bodyEnabled": {
+ "type": "boolean"
+ },
+ "trailersEnabled": {
+ "type": "boolean"
+ },
+ "contextEnabled": {
+ "type": "boolean"
+ },
+ "tlsSecretName": {
+ "type": "string"
+ },
+ "tlsSecretKey": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "backendUrl"
+ ],
+ "additionalProperties": false
+ },
+ "BackendJWTProperties": {
+ "title": "Backend JWT Parameters",
+ "type": "object",
+ "properties": {
+ "encoding": {
+ "type": "string"
+ },
+ "signingAlgorithm": {
+ "type": "string"
+ },
+ "header": {
+ "type": "string"
+ },
+ "tokenTTL": {
+ "type": "integer"
+ },
+ "customClaims": {
+ "type": "array",
+ "items": {
+ "$ref": "#/schemas/CustomClaims"
+ }
+ }
+ },
+ "additionalProperties": false
+ },
+ "ModelBasedRoundRobinProperties": {
+ "title": "Model Based Round Robin Parameters",
+ "type": "object",
+ "properties": {
+ "onQuotaExceedSuspendDuration": {
+ "type": "integer",
+ "description": "The duration for which the model routing is suspended for a particular model upon exceeding the quota for that model."
+ },
+ "productionModels": {
+ "type": "array",
+ "items": {
+ "$ref": "#/schemas/AIModel"
+ }
+ },
+ "sandboxModels": {
+ "type": "array",
+ "items": {
+ "$ref": "#/schemas/AIModel"
+ }
+ }
+ },
+ "required": [
+ "onQuotaExceedSuspendDuration",
+ "productionModels"
+ ],
+ "additionalProperties": false
+ },
+ "AIModel": {
+ "title": "AI Model",
+ "type": "object",
+ "properties": {
+ "model": {
+ "type": "string",
+ "description": "The Name of the model."
+ },
+ "endpoint": {
+ "type": "string",
+ "description": "The endpoint of the model."
+ },
+ "weight": {
+ "type": "integer",
+ "description": "The weight of the model."
+ }
+ },
+ "required": [
+ "model",
+ "endpoint"
+ ],
+ "additionalProperties": false
+ },
+ "HeaderModifierProperties": {
+ "title": "Header Modifier Parameters",
+ "type": "object",
+ "properties": {
+ "headerName": {
+ "type": "string",
+ "description": "The name of the header."
+ },
+ "headerValue": {
+ "type": "string",
+ "description": "The value of the header."
+ }
+ },
+ "required": [
+ "headerName"
+ ],
+ "additionalProperties": false
+ },
+ "RequestMirrorProperties": {
+ "title": "Request Mirror Parameters",
+ "type": "object",
+ "properties": {
+ "urls": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ },
+ "additionalProperties": false
+ },
+ "RequestRedirectProperties": {
+ "title": "Request Redirect Parameters",
+ "type": "object",
+ "properties": {
+ "url": {
+ "type": "string",
+ "description": "The URL to redirect the request to."
+ },
+ "statusCode": {
+ "type": "integer",
+ "description": "The status code to show upon redirecting the request.",
+ "default": 302,
+ "enum": [
+ 301,
+ 302
+ ]
+ }
+ },
+ "additionalProperties": false
+ },
+ "CustomClaims": {
+ "type": "object",
+ "required": [
+ "claim",
+ "value"
+ ],
+ "properties": {
+ "claim": {
+ "type": "string"
+ },
+ "value": {
+ "type": "string"
+ },
+ "type": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ }
+ },
+ "required": [
+ "name",
+ "basePath",
+ "type",
+ "operations"
+ ]
+}
\ No newline at end of file
diff --git a/workspaces/apk/apk-extension/src/extension.ts b/workspaces/apk/apk-extension/src/extension.ts
new file mode 100644
index 00000000000..0b1a124d8cf
--- /dev/null
+++ b/workspaces/apk/apk-extension/src/extension.ts
@@ -0,0 +1,155 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import * as vscode from 'vscode';
+import * as fs from 'fs';
+import * as path from 'path';
+
+export async function activate(context: vscode.ExtensionContext) {
+
+ // Register the "*.apk-conf" file association to the "yaml" language
+ // registerFileAssociation();
+
+ // Check if "YAML Language Support by Red Hat" extension is installed
+ const yamlExtension = vscode.extensions.getExtension('redhat.vscode-yaml');
+ if (!yamlExtension) {
+ vscode.window.showErrorMessage(
+ 'The "YAML Language Support by Red Hat" extension is required for the APK Configuration extension to work properly. Please install it and reload the window.'
+ );
+ return;
+ }
+ const yamlExtensionAPI = await yamlExtension.activate();
+ const SCHEMA = "apkschema";
+
+ // Read the schema file content
+ const schemaFilePath = path.join(context.extensionPath, 'schema', 'apk-schema.json');
+
+ const schemaContent = fs.readFileSync(schemaFilePath, 'utf8');
+ const schemaContentJSON = JSON.parse(schemaContent);
+
+ const schemaJSON = JSON.stringify(schemaContentJSON);
+
+ /**
+ *
+ * @param resource The URI of the resource
+ * @returns The URI of the schema file
+ *
+ * This function is called when the YAML Language Support extension needs to know the URI of the schema file.
+ * The schema file is stored in the extension's "schema" folder.
+ * The schema file is named "apk-schema.json".
+ */
+ function onRequestSchemaURI(resource: string): string | undefined {
+ if (resource.endsWith('.apk-conf')) {
+ return `${SCHEMA}://schema/apk-conf`;
+ }
+ return undefined;
+ }
+ /**
+ *
+ * @param schemaUri The URI of the schema
+ * @returns The content of the schema file
+ *
+ */
+ function onRequestSchemaContent(schemaUri: string): string | undefined {
+ const parsedUri = vscode.Uri.parse(schemaUri);
+ if (parsedUri.scheme !== SCHEMA) {
+ return undefined;
+ }
+ if (!parsedUri.path || !parsedUri.path.startsWith('/')) {
+ return undefined;
+ }
+
+ return schemaJSON;
+ }
+
+ // Register the schema provider
+ yamlExtensionAPI.registerContributor(SCHEMA, onRequestSchemaURI, onRequestSchemaContent);
+
+
+ /////////////////////////// template selection code ////////////////////////////
+
+ const extensionRoot = context.extensionUri.fsPath;
+ const templatesFolderPath = vscode.Uri.file(path.join(extensionRoot, "templates"));
+
+ /**
+ * Register a command to handle the "choose a template" action
+ * Read the template files from the templates folder
+ * Process the template files
+ */
+ // vscode.workspace.onDidOpenTextDocument((document) => {
+
+ // Register a command to handle the "choose a template" action
+ // Read the template files from the templates folder
+ const templateFiles = fs.readdirSync(templatesFolderPath.fsPath);
+
+ // Process the template files
+ const templates: string[] = [];
+ templateFiles.forEach((file) => {
+ templates.push(file);
+ });
+
+ context.subscriptions.push(
+ vscode.commands.registerCommand("extension.chooseTemplateApk", async () => {
+ // Show a quick pick menu to let the user choose a template
+ const selectedTemplate = await vscode.window.showQuickPick(templates);
+ if (selectedTemplate) {
+ const activeEditor = vscode.window.activeTextEditor;
+ if (
+ activeEditor &&
+ activeEditor.document.fileName.endsWith(".apk-conf")
+ ) {
+ // Insert the selected template into the currently open '*.apk-conf' file
+ activeEditor.edit((editBuilder) => {
+ const templatePath = vscode.Uri.file(
+ path.join(templatesFolderPath.fsPath, selectedTemplate)
+ );
+ const templateContent = fs.readFileSync(
+ templatePath.fsPath,
+ "utf-8"
+ );
+ editBuilder.insert(activeEditor.selection.start, templateContent);
+ });
+ } else {
+ vscode.window.showErrorMessage('Please open an "apk-config.apk-conf" file.');
+ }
+ }
+
+ })
+ );
+
+ // Show the "choose a template" message when the user creates a new file named "apk-config.yaml"
+ // in the workspace
+ context.subscriptions.push(
+ vscode.workspace.onDidCreateFiles((e) => {
+ e.files.forEach((file) => {
+ if (file.fsPath.endsWith(".apk-conf")) {
+ vscode.window
+ .showInformationMessage("Choose a template", "Select Template")
+ .then((choice) => {
+ if (choice === "Select Template") {
+ vscode.commands.executeCommand("extension.chooseTemplateApk");
+ }
+ });
+ }
+ });
+ })
+ );
+ // });
+ ////////////////////////// end template selection code ///////////////////////////
+}
+
diff --git a/workspaces/apk/apk-extension/src/test/runTest.ts b/workspaces/apk/apk-extension/src/test/runTest.ts
new file mode 100644
index 00000000000..59d86f4167b
--- /dev/null
+++ b/workspaces/apk/apk-extension/src/test/runTest.ts
@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import * as path from 'path';
+
+import { runTests } from '@vscode/test-electron';
+
+async function main() {
+ try {
+ // The folder containing the Extension Manifest package.json
+ // Passed to `--extensionDevelopmentPath`
+ const extensionDevelopmentPath = path.resolve(__dirname, '../../');
+
+ // The path to test runner
+ // Passed to --extensionTestsPath
+ const extensionTestsPath = path.resolve(__dirname, './suite/index');
+
+ // Download VS Code, unzip it and run the integration test
+ await runTests({ extensionDevelopmentPath, extensionTestsPath });
+ } catch (err) {
+ console.error('Failed to run tests', err);
+ process.exit(1);
+ }
+}
+
+main();
diff --git a/workspaces/apk/apk-extension/src/test/suite/extension.test.ts b/workspaces/apk/apk-extension/src/test/suite/extension.test.ts
new file mode 100644
index 00000000000..0dd0c087c57
--- /dev/null
+++ b/workspaces/apk/apk-extension/src/test/suite/extension.test.ts
@@ -0,0 +1,33 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import * as assert from 'assert';
+
+// You can import and use all API from the 'vscode' module
+// as well as import your extension to test it
+import * as vscode from 'vscode';
+// import * as myExtension from '../../extension';
+
+suite('Extension Test Suite', () => {
+ vscode.window.showInformationMessage('Start all tests.');
+
+ test('Sample test', () => {
+ assert.strictEqual(-1, [1, 2, 3].indexOf(5));
+ assert.strictEqual(-1, [1, 2, 3].indexOf(0));
+ });
+});
diff --git a/workspaces/apk/apk-extension/src/test/suite/index.ts b/workspaces/apk/apk-extension/src/test/suite/index.ts
new file mode 100644
index 00000000000..c7fbb180b94
--- /dev/null
+++ b/workspaces/apk/apk-extension/src/test/suite/index.ts
@@ -0,0 +1,56 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import * as path from 'path';
+import * as Mocha from 'mocha';
+import * as glob from 'glob';
+
+export function run(): Promise {
+ // Create the mocha test
+ const mocha = new Mocha({
+ ui: 'tdd',
+ color: true
+ });
+
+ const testsRoot = path.resolve(__dirname, '..');
+
+ return new Promise((c, e) => {
+ glob('**/**.test.js', { cwd: testsRoot }, (err, files) => {
+ if (err) {
+ return e(err);
+ }
+
+ // Add files to the test suite
+ files.forEach(f => mocha.addFile(path.resolve(testsRoot, f)));
+
+ try {
+ // Run the mocha test
+ mocha.run(failures => {
+ if (failures > 0) {
+ e(new Error(`${failures} tests failed.`));
+ } else {
+ c();
+ }
+ });
+ } catch (err) {
+ console.error(err);
+ e(err);
+ }
+ });
+ });
+}
diff --git a/workspaces/apk/apk-extension/templates/basic.yaml b/workspaces/apk/apk-extension/templates/basic.yaml
new file mode 100644
index 00000000000..4b6ff51bf0f
--- /dev/null
+++ b/workspaces/apk/apk-extension/templates/basic.yaml
@@ -0,0 +1,25 @@
+name: "My API"
+basePath: "/myapi"
+type: "REST"
+version: 1.0.0
+endpointConfigurations:
+ production:
+ - endpoint: "https://endpoint/production"
+ sandbox:
+ - endpoint: "https://endpoint/sandbox"
+operations: []
+apiPolicies:
+ request: []
+ response: []
+rateLimit:
+ requestsPerUnit: 1000
+ unit: "Hour"
+authentication: []
+additionalProperties: []
+corsConfiguration:
+ corsConfigurationEnabled: false
+ accessControlAllowOrigins: []
+ accessControlAllowCredentials: false
+ accessControlAllowHeaders: []
+ accessControlAllowMethods: []
+ accessControlAllowMaxAge: 0
\ No newline at end of file
diff --git a/workspaces/apk/apk-extension/templates/petstore.yaml b/workspaces/apk/apk-extension/templates/petstore.yaml
new file mode 100644
index 00000000000..511c923bc68
--- /dev/null
+++ b/workspaces/apk/apk-extension/templates/petstore.yaml
@@ -0,0 +1,68 @@
+id: "123e4567-e89b-12d3-a456-426614174000"
+name: "PetStore API"
+basePath: "/petstore"
+version: "1.0.0"
+type: "REST"
+endpointConfigurations:
+ production:
+ - endpoint: "https://petstore.swagger.io/v2/pet"
+ sandbox:
+ - endpoint: "https://petstore.swagger.io/v2/pet"
+operations:
+ - target: "/pets"
+ verb: "GET"
+ secured: true
+ operationPolicies:
+ request:
+ - policyName: "Request Policy 1"
+ policyVersion: "v1"
+ parameters:
+ header: "header2"
+ response:
+ - policyName: "Response Policy 1"
+ policyVersion: "v1"
+ rateLimit:
+ requestsPerUnit: 100
+ unit: "Minute"
+ scopes: []
+ - target: "/pets/{petId}"
+ verb: "GET"
+ secured: true
+ endpointConfigurations:
+ production:
+ - endpoint: "https://petstore.swagger.io/v2/pet"
+ sandbox:
+ - endpoint: "https://petstore.swagger.io/v2/pet"
+ operationPolicies:
+ request:
+ - policyName: "Request Policy 2"
+ policyVersion: "v1"
+ parameters:
+ header: "header2"
+ response:
+ - policyName: "Response Policy 2"
+ policyVersion: "v1"
+ rateLimit:
+ requestsPerUnit: 50
+ unit: "Minute"
+ scopes: []
+apiPolicies:
+ request: []
+ response: []
+rateLimit:
+ requestsPerUnit: 1000
+ unit: "Hour"
+authentication:
+ - authType: "OAuth2"
+ sendTokenToUpstream: false
+ enabled: true
+ headerName: "Authorization"
+ headerEnable: true
+additionalProperties: []
+corsConfiguration:
+ corsConfigurationEnabled: false
+ accessControlAllowOrigins: []
+ accessControlAllowCredentials: false
+ accessControlAllowHeaders: []
+ accessControlAllowMethods: []
+ accessControlAllowMaxAge: 0
\ No newline at end of file
diff --git a/workspaces/apk/apk-extension/templates/pizza-shack.yaml b/workspaces/apk/apk-extension/templates/pizza-shack.yaml
new file mode 100644
index 00000000000..baf828caf2e
--- /dev/null
+++ b/workspaces/apk/apk-extension/templates/pizza-shack.yaml
@@ -0,0 +1,105 @@
+id: "123e4567-e89b-12d3-a456-426614174000"
+name: "Pizza Shack API"
+basePath: "/pizza"
+version: "1.0.0"
+type: "REST"
+endpointConfigurations:
+ production:
+ - endpoint: "https://pizza"
+ endpointSecurity:
+ enabled: true
+ securityType:
+ basicEndpointSecurity:
+ secretName: "backend-creds"
+ userNameKey: "username"
+ passwordKey: "password"
+ certificate:
+ secretName: "certificate-secret"
+ secretKey: "certificate-key"
+ resiliency: {}
+ sandbox:
+ - endpoint: "https://pizza"
+ endpointSecurity:
+ enabled: false
+ certificate: {}
+operations:
+ - target: "/pizzas"
+ verb: "GET"
+ secured: true
+ endpointConfigurations:
+ production:
+ - endpoint: "https://pizza"
+ sandbox:
+ - endpoint: "https://pizza"
+ operationPolicies:
+ request:
+ - policyName: "Request Policy 1"
+ policyVersion: "v1"
+ parameters:
+ header: "X-Header"
+ response:
+ - policyName: "Response Policy 1"
+ policyVersion: "v1"
+ rateLimit:
+ requestsPerUnit: 100
+ unit: "Minute"
+ scopes:
+ - "read:pizzas"
+ - "write:pizzas"
+ - target: "/pizzas/{pizzaId}"
+ verb: "GET"
+ secured: true
+ endpointConfigurations:
+ production:
+ - endpoint: "https://pizza"
+ sandbox:
+ - endpoint: "https://pizza"
+ operationPolicies:
+ request:
+ - policyName: "Request Policy 2"
+ policyVersion: "v1"
+ parameters:
+ header: "header2"
+ response:
+ - policyName: "Response Policy 2"
+ policyVersion: "v1"
+ rateLimit:
+ requestsPerUnit: 50
+ unit: "Minute"
+ scopes:
+ - "read:pizzas"
+apiPolicies:
+ request:
+ - policyName: "Global Request Policy"
+ policyVersion: "v1"
+ response:
+ - policyName: "Global Response Policy"
+ policyVersion: "v1"
+rateLimit:
+ requestsPerUnit: 1000
+ unit: "Hour"
+authentication:
+ - authType: "OAuth2"
+ sendTokenToUpstream: false
+ enabled: true
+ headerName: "Authorization"
+additionalProperties:
+ - name: "property1"
+ value: "value1"
+ - name: "property2"
+ value: "value2"
+corsConfiguration:
+ corsConfigurationEnabled: true
+ accessControlAllowOrigins:
+ - "https://example.com"
+ - "https://sandbox.example.com"
+ accessControlAllowCredentials: true
+ accessControlAllowHeaders:
+ - "Content-Type"
+ - "Authorization"
+ accessControlAllowMethods:
+ - "GET"
+ - "POST"
+ - "PUT"
+ - "DELETE"
+ accessControlAllowMaxAge: 3600
diff --git a/workspaces/apk/apk-extension/tsconfig.json b/workspaces/apk/apk-extension/tsconfig.json
new file mode 100644
index 00000000000..b695825b2c7
--- /dev/null
+++ b/workspaces/apk/apk-extension/tsconfig.json
@@ -0,0 +1,17 @@
+{
+ "compilerOptions": {
+ "module": "commonjs",
+ "target": "ES2020",
+ "outDir": "out",
+ "lib": [
+ "ES2020"
+ ],
+ "sourceMap": true,
+ "rootDir": "src",
+ "strict": true /* enable all strict type-checking options */
+ /* Additional Checks */
+ // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
+ // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
+ // "noUnusedParameters": true, /* Report errors on unused parameters. */
+ }
+}
\ No newline at end of file
diff --git a/workspaces/apk/apk-extension/vsc-extension-quickstart.md b/workspaces/apk/apk-extension/vsc-extension-quickstart.md
new file mode 100644
index 00000000000..874a39ab680
--- /dev/null
+++ b/workspaces/apk/apk-extension/vsc-extension-quickstart.md
@@ -0,0 +1,42 @@
+# Welcome to your VS Code Extension
+
+## What's in the folder
+
+* This folder contains all of the files necessary for your extension.
+* `package.json` - this is the manifest file in which you declare your extension and command.
+ * The sample plugin registers a command and defines its title and command name. With this information VS Code can show the command in the command palette. It doesn’t yet need to load the plugin.
+* `src/extension.ts` - this is the main file where you will provide the implementation of your command.
+ * The file exports one function, `activate`, which is called the very first time your extension is activated (in this case by executing the command). Inside the `activate` function we call `registerCommand`.
+ * We pass the function containing the implementation of the command as the second parameter to `registerCommand`.
+
+## Get up and running straight away
+
+* Press `F5` to open a new window with your extension loaded.
+* Run your command from the command palette by pressing (`Ctrl+Shift+P` or `Cmd+Shift+P` on Mac) and typing `Hello World`.
+* Set breakpoints in your code inside `src/extension.ts` to debug your extension.
+* Find output from your extension in the debug console.
+
+## Make changes
+
+* You can relaunch the extension from the debug toolbar after changing code in `src/extension.ts`.
+* You can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes.
+
+## Explore the API
+
+* You can open the full set of our API when you open the file `node_modules/@types/vscode/index.d.ts`.
+
+## Run tests
+
+* Open the debug viewlet (`Ctrl+Shift+D` or `Cmd+Shift+D` on Mac) and from the launch configuration dropdown pick `Extension Tests`.
+* Press `F5` to run the tests in a new window with your extension loaded.
+* See the output of the test result in the debug console.
+* Make changes to `src/test/suite/extension.test.ts` or create new test files inside the `test/suite` folder.
+ * The provided test runner will only consider files matching the name pattern `**.test.ts`.
+ * You can create folders inside the `test` folder to structure your tests any way you want.
+
+## Go further
+
+* [Follow UX guidelines](https://code.visualstudio.com/api/ux-guidelines/overview) to create extensions that seamlessly integrate with VS Code's native interface and patterns.
+ * Reduce the extension size and improve the startup time by [bundling your extension](https://code.visualstudio.com/api/working-with-extensions/bundling-extension).
+ * [Publish your extension](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code extension marketplace.
+ * Automate builds by setting up [Continuous Integration](https://code.visualstudio.com/api/working-with-extensions/continuous-integration).
\ No newline at end of file
diff --git a/workspaces/ballerina/ballerina-core/.eslintrc.js b/workspaces/ballerina/ballerina-core/.eslintrc.js
new file mode 100644
index 00000000000..b74482c5379
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/.eslintrc.js
@@ -0,0 +1,11 @@
+module.exports = {
+ extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended'],
+ parser: '@typescript-eslint/parser',
+ plugins: ['@typescript-eslint'],
+ root: true,
+ ignorePatterns: [
+ "lib",
+ ".eslintrc.js",
+ "**/*.d.ts"
+ ],
+};
diff --git a/workspaces/ballerina/ballerina-core/command/index.d.ts b/workspaces/ballerina/ballerina-core/command/index.d.ts
new file mode 100644
index 00000000000..b7988016daa
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/command/index.d.ts
@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+export {};
diff --git a/workspaces/ballerina/ballerina-core/command/index.js b/workspaces/ballerina/ballerina-core/command/index.js
new file mode 100755
index 00000000000..3f128ba1de8
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/command/index.js
@@ -0,0 +1,8 @@
+#!/usr/bin/env node
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const server_1 = require("../lib/ls-utils/server");
+// tslint:disable-next-line: no-console
+console.log("Starting server");
+const server = (0, server_1.startBallerinaLS)();
+//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/workspaces/ballerina/ballerina-core/command/index.js.map b/workspaces/ballerina/ballerina-core/command/index.js.map
new file mode 100644
index 00000000000..cc791369c97
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/command/index.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/command/index.ts"],"names":[],"mappings":";;;AACA,sCAA6C;AAC7C,uCAAuC;AACvC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;AAC9B,MAAM,MAAM,GAAG,IAAA,yBAAgB,GAAE,CAAC"}
\ No newline at end of file
diff --git a/workspaces/ballerina/ballerina-core/config/rush-project.json b/workspaces/ballerina/ballerina-core/config/rush-project.json
new file mode 100644
index 00000000000..3c3241c8f6a
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/config/rush-project.json
@@ -0,0 +1,3 @@
+{
+ "extends": "../../../rush-config.json"
+}
diff --git a/workspaces/ballerina/ballerina-core/package.json b/workspaces/ballerina/ballerina-core/package.json
new file mode 100644
index 00000000000..bdec8603660
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/package.json
@@ -0,0 +1,56 @@
+{
+ "name": "@wso2/ballerina-core",
+ "version": "1.0.0",
+ "description": "Contains types related to the Ballerina extension",
+ "main": "lib/index.js",
+ "types": "lib/index.d.ts",
+ "bin": {
+ "start-ws-lang-server": "command/index.js"
+ },
+ "scripts": {
+ "watch": "tsc --pretty --watch",
+ "build": "tsc --pretty",
+ "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0"
+ },
+ "dependencies": {
+ "@wso2/syntax-tree": "workspace:*",
+ "vscode-languageserver-protocol": "^3.17.5",
+ "vscode-languageserver-types": "^3.17.5",
+ "vscode-messenger-common": "^0.5.1",
+ "vscode-ws-jsonrpc": "^3.4.0",
+ "isomorphic-ws": "^5.0.0",
+ "vscode-jsonrpc": "^8.2.1",
+ "@types/vscode-webview": "^1.57.3",
+ "handlebars": "~4.7.8",
+ "mousetrap": "^1.6.5",
+ "react": "18.2.0",
+ "tree-kill": "^1.2.2",
+ "vscode-uri": "^3.0.8",
+ "@types/mousetrap": "~1.6.11",
+ "@types/ws": "^8.2.1"
+ },
+ "devDependencies": {
+ "@types/node": "^22.15.21",
+ "@types/vscode": "^1.83.1",
+ "@typescript-eslint/eslint-plugin": "^8.32.1",
+ "@typescript-eslint/parser": "^8.32.1",
+ "@types/react": "18.2.0",
+ "copyfiles": "^2.4.1",
+ "eslint": "^9.26.0",
+ "typescript": "5.8.3"
+ },
+ "files": [
+ "lib/**/*"
+ ],
+ "author": "WSO2",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/wso2/ballerina-plugin-vscode.git"
+ },
+ "publishConfig": {
+ "registry": "https://npm.pkg.github.com/"
+ },
+ "engines": {
+ "node": ">=0.10.3 <16"
+ }
+}
diff --git a/workspaces/ballerina/ballerina-core/src/code-generation/templates/ANNOTATION.hbs b/workspaces/ballerina/ballerina-core/src/code-generation/templates/ANNOTATION.hbs
new file mode 100644
index 00000000000..a6a3154e7af
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/code-generation/templates/ANNOTATION.hbs
@@ -0,0 +1,6 @@
+@display {
+ label: "{{{NODE}}}",
+ templateId: "{{{TEMPLATE_ID}}}",
+ xCord: {{{X_CODE}}},
+ yCord: {{{Y_CODE}}}
+}
diff --git a/workspaces/ballerina/ballerina-core/src/code-generation/templates/ASYNC_RECEIVE_ACTION.hbs b/workspaces/ballerina/ballerina-core/src/code-generation/templates/ASYNC_RECEIVE_ACTION.hbs
new file mode 100644
index 00000000000..2c1a97385a2
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/code-generation/templates/ASYNC_RECEIVE_ACTION.hbs
@@ -0,0 +1 @@
+{{{TYPE}}} {{{VAR_NAME}}} = check <- {{{SENDER_WORKER}}};
diff --git a/workspaces/ballerina/ballerina-core/src/code-generation/templates/ASYNC_SEND_ACTION.hbs b/workspaces/ballerina/ballerina-core/src/code-generation/templates/ASYNC_SEND_ACTION.hbs
new file mode 100644
index 00000000000..da2a49d6521
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/code-generation/templates/ASYNC_SEND_ACTION.hbs
@@ -0,0 +1 @@
+{{{EXPRESSION}}} -> {{{TARGET_WORKER}}};
diff --git a/workspaces/ballerina/ballerina-core/src/code-generation/templates/CALLER_ACTION.hbs b/workspaces/ballerina/ballerina-core/src/code-generation/templates/CALLER_ACTION.hbs
new file mode 100644
index 00000000000..3663ccaffb7
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/code-generation/templates/CALLER_ACTION.hbs
@@ -0,0 +1 @@
+{{{ TYPE }}} {{{ VARIABLE }}} = check {{{ CALLER }}}->{{{ACTION}}}("{{{ PATH }}}" {{#if PAYLOAD}} ,{{{PAYLOAD}}} {{/if}});
\ No newline at end of file
diff --git a/workspaces/ballerina/ballerina-core/src/code-generation/templates/CALLER_BLOCK.hbs b/workspaces/ballerina/ballerina-core/src/code-generation/templates/CALLER_BLOCK.hbs
new file mode 100644
index 00000000000..55cdc149451
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/code-generation/templates/CALLER_BLOCK.hbs
@@ -0,0 +1,11 @@
+worker {{{NODE_NAME}}} returns error? {
+ {{#if INPUT_PORTS}}
+ {{{INPUT_PORTS}}}
+ {{/if}}
+ {{#if CALLER_ACTION}}
+ {{{CALLER_ACTION}}}
+ {{/if}}
+ {{#if OUTPUT_PORTS}}
+ {{{OUTPUT_PORTS}}}
+ {{/if}}
+}
diff --git a/workspaces/ballerina/ballerina-core/src/code-generation/templates/CODE_BLOCK_NODE.hbs b/workspaces/ballerina/ballerina-core/src/code-generation/templates/CODE_BLOCK_NODE.hbs
new file mode 100644
index 00000000000..3858de97534
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/code-generation/templates/CODE_BLOCK_NODE.hbs
@@ -0,0 +1,11 @@
+worker {{{NODE_NAME}}} returns error? {
+ {{#if INPUT_PORTS}}
+ {{{INPUT_PORTS}}}
+ {{/if}}
+ {{#if CODE_BLOCK}}
+ {{{CODE_BLOCK}}}
+ {{/if}}
+ {{#if OUTPUT_PORTS}}
+ {{{OUTPUT_PORTS}}}
+ {{/if}}
+}
diff --git a/workspaces/ballerina/ballerina-core/src/code-generation/templates/ELSEIF_BLOCK.hbs b/workspaces/ballerina/ballerina-core/src/code-generation/templates/ELSEIF_BLOCK.hbs
new file mode 100644
index 00000000000..ee7dabce93d
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/code-generation/templates/ELSEIF_BLOCK.hbs
@@ -0,0 +1,3 @@
+else if ({{{CONDITION}}}) {
+ {{{OUTPORTS}}}
+}
diff --git a/workspaces/ballerina/ballerina-core/src/code-generation/templates/ELSE_BLOCK.hbs b/workspaces/ballerina/ballerina-core/src/code-generation/templates/ELSE_BLOCK.hbs
new file mode 100644
index 00000000000..d4d70e5e03d
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/code-generation/templates/ELSE_BLOCK.hbs
@@ -0,0 +1,3 @@
+else {
+ {{{ OUTPORTS }}}
+}
diff --git a/workspaces/ballerina/ballerina-core/src/code-generation/templates/IF_BLOCK.hbs b/workspaces/ballerina/ballerina-core/src/code-generation/templates/IF_BLOCK.hbs
new file mode 100644
index 00000000000..ae66e514cdf
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/code-generation/templates/IF_BLOCK.hbs
@@ -0,0 +1,3 @@
+if ({{{ CONDITION }}}) {
+ {{{ OUTPORTS }}}
+}
diff --git a/workspaces/ballerina/ballerina-core/src/code-generation/templates/RESPOND.hbs b/workspaces/ballerina/ballerina-core/src/code-generation/templates/RESPOND.hbs
new file mode 100644
index 00000000000..b35c7244592
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/code-generation/templates/RESPOND.hbs
@@ -0,0 +1,6 @@
+worker {{{NODE_NAME}}} returns error? {
+ {{#if INPUT_PORTS}}
+ {{{INPUT_PORTS}}}
+ {{{VAR_NAME}}} -> function;
+ {{/if}}
+}
diff --git a/workspaces/ballerina/ballerina-core/src/code-generation/templates/RETURN_BLOCK.hbs b/workspaces/ballerina/ballerina-core/src/code-generation/templates/RETURN_BLOCK.hbs
new file mode 100644
index 00000000000..5e5bef3c3ca
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/code-generation/templates/RETURN_BLOCK.hbs
@@ -0,0 +1,4 @@
+{{#if VAR_NAME}}
+{{{TYPE}}} {{{VAR_NAME}}} = check <- {{{NODE_NAME}}};
+return {{{VAR_NAME}}};
+{{/if}}
diff --git a/workspaces/ballerina/ballerina-core/src/code-generation/templates/START_NODE.hbs b/workspaces/ballerina/ballerina-core/src/code-generation/templates/START_NODE.hbs
new file mode 100644
index 00000000000..014d7cac72c
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/code-generation/templates/START_NODE.hbs
@@ -0,0 +1,6 @@
+worker StartNode returns error? {
+ _ = <- function;
+ {{#if OUTPUT_PORTS}}
+ {{{OUTPUT_PORTS}}}
+ {{/if}}
+}
\ No newline at end of file
diff --git a/workspaces/ballerina/ballerina-core/src/code-generation/templates/SWITCH_NODE.hbs b/workspaces/ballerina/ballerina-core/src/code-generation/templates/SWITCH_NODE.hbs
new file mode 100644
index 00000000000..cb400f4041a
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/code-generation/templates/SWITCH_NODE.hbs
@@ -0,0 +1,6 @@
+worker {{{NODE_NAME}}} returns error? {
+ {{#if INPUT_PORTS}}
+ {{{INPUT_PORTS}}}
+ {{/if}}
+ {{{SWITCH_BLOCK}}}
+}
diff --git a/workspaces/ballerina/ballerina-core/src/code-generation/templates/TRANFORM_FUNCTION.hbs b/workspaces/ballerina/ballerina-core/src/code-generation/templates/TRANFORM_FUNCTION.hbs
new file mode 100644
index 00000000000..30b0222beed
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/code-generation/templates/TRANFORM_FUNCTION.hbs
@@ -0,0 +1 @@
+function {{{FUNCTION_NAME}}}({{{PARAMETERS}}}) {{{FUNCTION_RETURN}}} => ();
\ No newline at end of file
diff --git a/workspaces/ballerina/ballerina-core/src/code-generation/templates/TRANSFORM_NODE.hbs b/workspaces/ballerina/ballerina-core/src/code-generation/templates/TRANSFORM_NODE.hbs
new file mode 100644
index 00000000000..8a352b085b3
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/code-generation/templates/TRANSFORM_NODE.hbs
@@ -0,0 +1,11 @@
+worker {{{NODE_NAME}}} returns error? {
+ {{#if INPUT_PORTS}}
+ {{{INPUT_PORTS}}}
+ {{/if}}
+ {{#if TRANSFORM_FUNCTION}}
+ {{{TRANSFORM_FUNCTION}}}
+ {{/if}}
+ {{#if OUTPUT_PORTS}}
+ {{{OUTPUT_PORTS}}}
+ {{/if}}
+}
diff --git a/workspaces/ballerina/ballerina-core/src/code-generation/templates/index.ts b/workspaces/ballerina/ballerina-core/src/code-generation/templates/index.ts
new file mode 100644
index 00000000000..5195aaf475a
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/code-generation/templates/index.ts
@@ -0,0 +1,128 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+export default {
+ ASYNC_SEND_ACTION : `{{{EXPRESSION}}} -> {{{TARGET_WORKER}}};
+ `,
+ ASYNC_RECEIVE_ACTION : `{{{TYPE}}} {{{VAR_NAME}}} = check <- {{{SENDER_WORKER}}};
+ `,
+ CODE_BLOCK_NODE :
+ `worker {{{NODE_NAME}}} returns error? {
+ {{#if INPUT_PORTS}}
+ {{{INPUT_PORTS}}}
+ {{/if}}
+ {{#if CODE_BLOCK}}
+ {{{CODE_BLOCK}}}
+ {{/if}}
+ {{#if OUTPUT_PORTS}}
+ {{{OUTPUT_PORTS}}}
+ {{/if}}
+ }`,
+ ANNOTATION:
+ `@display {
+ label: "{{{NODE}}}",
+ templateId: "{{{TEMPLATE_ID}}}",
+ xCord: {{{X_CODE}}},
+ yCord: {{{Y_CODE}}}{{#if METADATA}},
+ metadata: "{{{METADATA}}}"
+ {{/if}}
+ }`,
+ SWITCH_NODE :
+ `worker {{{NODE_NAME}}} returns error? {
+ {{#if INPUT_PORTS}}
+ {{{INPUT_PORTS}}}
+ {{/if}}
+ {{#if CODE_BLOCK}}
+ {{{CODE_BLOCK}}}
+ {{/if}}
+ {{{SWITCH_BLOCK}}}
+ }`,
+ IF_BLOCK : `
+ if ({{{CONDITION}}}) {
+ {{{OUTPORTS}}}
+ } `,
+ ELSE_BLOCK :
+ `else {
+ {{{OUTPORTS}}}
+ } `,
+ ELSEIF_BLOCK :
+ `else if ({{{CONDITION}}}) {
+ {{{OUTPORTS}}}
+ } `,
+ CALLER_ACTION : `{{{ TYPE }}} {{{ VARIABLE }}} = check {{{ CALLER }}}->{{{ACTION}}}("{{{ PATH }}}" {{#if PAYLOAD}} ,{{{PAYLOAD}}} {{/if}});
+ `,
+ CALLER_BLOCK:
+ `worker {{{NODE_NAME}}} returns error? {
+ {{#if INPUT_PORTS}}
+ {{{INPUT_PORTS}}}
+ {{/if}}
+ {{#if CALLER_ACTION}}
+ {{{CALLER_ACTION}}}
+ {{/if}}
+ {{#if OUTPUT_PORTS}}
+ {{{OUTPUT_PORTS}}}
+ {{/if}}
+ }`,
+ RESPOND:
+ `worker {{{NODE_NAME}}} returns error? {
+ {{#if INPUT_PORTS}}
+ {{{INPUT_PORTS}}}
+ {{{VAR_NAME}}} -> function;
+ {{/if}}
+ }`,
+ TRANSFORM_NODE:
+ `worker {{{NODE_NAME}}} returns error? {
+ {{#if INPUT_PORTS}}
+ {{{INPUT_PORTS}}}
+ {{/if}}
+ {{#if TRANSFORM_FUNCTION}}
+ {{{TRANSFORM_FUNCTION}}}
+ {{/if}}
+ {{#if OUTPUT_PORTS}}
+ {{{OUTPUT_PORTS}}}
+ {{/if}}
+ }`,
+ RETURN_BLOCK:`
+ {{#if VAR_NAME}}
+ {{{TYPE}}} {{{VAR_NAME}}} = check <- {{{NODE_NAME}}};
+ return {{{VAR_NAME}}};
+ {{/if}}
+ `,
+ TRANSFORM_FUNCTION:
+ `
+ function {{{FUNCTION_NAME}}}({{{PARAMETERS}}}) {{{FUNCTION_RETURN}}} => ();
+ `,
+ START_NODE:
+ `worker StartNode returns error? {
+ _ = <- function;
+ {{#if OUTPUT_PORTS}}
+ {{{OUTPUT_PORTS}}}
+ {{/if}}
+ }`,
+ FUNCTION_RETURN:
+ `returns {{{TYPE}}}|error`,
+ TRANSFORM_FUNCTION_CALL:`
+ {{{TYPE}}} {{{VAR_NAME}}} = check {{{FUNCTION_NAME}}}({{{PARAMETERS}}});`,
+ UNION_EXPRESSION:
+ `{{#each UNION_FIELDS}}{{this}}{{#unless @last}} | {{/unless}}{{/each}}`,
+ TRANSFORM_FUNCTION_WITH_BODY:
+ `
+ function {{{FUNCTION_NAME}}}({{{PARAMETERS}}}) {{{FUNCTION_RETURN}}} {{{FUNCTION_BODY}}}
+ `,
+
+}
diff --git a/workspaces/ballerina/ballerina-core/src/code-generation/utils/metadata-utils.ts b/workspaces/ballerina/ballerina-core/src/code-generation/utils/metadata-utils.ts
new file mode 100644
index 00000000000..3a092bf4f5f
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/code-generation/utils/metadata-utils.ts
@@ -0,0 +1,42 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { NMD_Metadata as Metadata } from "../../interfaces/metadata-types";
+// import { Node } from "../../interfaces/bi";
+
+export function encodeMetadata(obj: Metadata): string {
+ return btoa(encodeURIComponent(JSON.stringify(obj)));
+}
+
+export function decodeMetadata(str: string): Metadata {
+ return JSON.parse(decodeURIComponent(atob(str)));
+}
+
+// export function getNodeMetadata(node: Node): Metadata | undefined {
+// if (!node.metadata) return undefined;
+// // if metadata is already encoded, decode it first
+// if (typeof node.metadata === "string") return decodeMetadata(node.metadata);
+// return node.metadata;
+// }
+
+// export function getEncodedNodeMetadata(node: Node): string | undefined {
+// if (!node.metadata) return undefined;
+// // if metadata is already encoded, return it
+// if (typeof node.metadata === "string") return node.metadata;
+// return encodeMetadata(node.metadata);
+// }
diff --git a/workspaces/ballerina/ballerina-core/src/code-generation/utils/template-utils.ts b/workspaces/ballerina/ballerina-core/src/code-generation/utils/template-utils.ts
new file mode 100644
index 00000000000..a57f889a35d
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/code-generation/utils/template-utils.ts
@@ -0,0 +1,36 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { compile } from "handlebars";
+import templates from "../templates";
+
+export interface TemplateStructure {
+ name: TemplateKey;
+ config: { [key: string]: any };
+}
+
+export type TemplateKey = 'ASYNC_SEND_ACTION' | 'ASYNC_RECEIVE_ACTION' | 'CODE_BLOCK_NODE' | 'ANNOTATION' | 'SWITCH_NODE' |
+ 'IF_BLOCK' | 'ELSE_BLOCK' | 'ELSEIF_BLOCK' | 'CALLER_ACTION' | 'CALLER_BLOCK' | 'RESPOND' | 'RETURN_BLOCK' | 'TRANSFORM_NODE' |
+ 'TRANSFORM_FUNCTION' | 'START_NODE' | 'UNION_EXPRESSION' | 'FUNCTION_RETURN' | "TRANSFORM_FUNCTION_CALL" | "TRANSFORM_FUNCTION_WITH_BODY";
+
+
+export function getComponentSource(template : TemplateStructure) : string {
+ const hbTemplate = compile(templates[template.name]);
+ return hbTemplate(template.config);
+}
diff --git a/workspaces/ballerina/ballerina-core/src/components/CtrlClickWrapper/CtrlClickWrapper.tsx b/workspaces/ballerina/ballerina-core/src/components/CtrlClickWrapper/CtrlClickWrapper.tsx
new file mode 100644
index 00000000000..d472af1567d
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/components/CtrlClickWrapper/CtrlClickWrapper.tsx
@@ -0,0 +1,47 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from "react";
+
+interface CtrlClickWrapperProps {
+ onClick: () => void;
+}
+
+// Wrapper to capture ctrl click action of children and run an action that's passed through props
+export const CtrlClickWrapper = (props: React.PropsWithChildren) => {
+ const { children, onClick } = props;
+ const handleClick = (e: any) => {
+ if (e.ctrlKey || e.metaKey) {
+ e.preventDefault();
+ e.stopPropagation();
+ onClick();
+ }
+ };
+
+ const mappedChildren = React.Children.map(children, (child: any) => {
+ return React.cloneElement(child as React.ReactElement, {
+ onClick: handleClick
+ });
+ });
+
+ return (
+ <>
+ {mappedChildren}
+ >
+ );
+}
diff --git a/workspaces/ballerina/ballerina-core/src/components/index.ts b/workspaces/ballerina/ballerina-core/src/components/index.ts
new file mode 100644
index 00000000000..8fb15d08320
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/components/index.ts
@@ -0,0 +1,19 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+export * from "./CtrlClickWrapper/CtrlClickWrapper";
diff --git a/workspaces/ballerina/ballerina-core/src/history.ts b/workspaces/ballerina/ballerina-core/src/history.ts
new file mode 100644
index 00000000000..ffe0baf6026
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/history.ts
@@ -0,0 +1,60 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import { VisualizerLocation } from "./state-machine-types";
+
+export interface HistoryEntry {
+ location: VisualizerLocation;
+ uid?: string;
+ dataMapperDepth?: number;
+}
+
+export class History {
+ private historyStack: HistoryEntry[] = [];
+
+ public get(): HistoryEntry[] {
+ return [...this.historyStack];
+ }
+
+ public push(item: HistoryEntry): void {
+ this.historyStack.push(item);
+ }
+
+ public pop(): void {
+ this.historyStack.pop();
+ }
+
+ public select(index: number): void {
+ if (index < 0 || index >= this.historyStack.length) return;
+ this.historyStack = this.historyStack.slice(0, index + 1);
+ }
+
+ public clear(): void {
+ this.historyStack = [];
+ }
+
+ public clearAndPopulateWith(historyEntry: HistoryEntry): void {
+ this.historyStack = [historyEntry];
+ }
+
+ public updateCurrentEntry(historyEntry: HistoryEntry): void {
+ if (this.historyStack.length === 0) return;
+ const newHistory = [...this.historyStack];
+ newHistory[newHistory.length - 1] = historyEntry;
+ this.historyStack = newHistory;
+ }
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/ActionIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/ActionIcon.tsx
new file mode 100644
index 00000000000..b47b82b102a
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/ActionIcon.tsx
@@ -0,0 +1,31 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export interface ActionIconProps {
+ className?: string
+}
+
+export default function Action(props: ActionIconProps) {
+ return (
+
+ );
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/Api.tsx b/workspaces/ballerina/ballerina-core/src/icons/Api.tsx
new file mode 100644
index 00000000000..1831a0e667e
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/Api.tsx
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function ApiIcon(props: any) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/Assignment.tsx b/workspaces/ballerina/ballerina-core/src/icons/Assignment.tsx
new file mode 100644
index 00000000000..ee4e7c16387
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/Assignment.tsx
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function AssignmentIcon(props: any) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/BackArrow.tsx b/workspaces/ballerina/ballerina-core/src/icons/BackArrow.tsx
new file mode 100644
index 00000000000..988f4c1cf85
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/BackArrow.tsx
@@ -0,0 +1,6 @@
+import React from 'react';
+
+export default function BackArrow() {
+ return Arrow Back
+}
+
diff --git a/workspaces/ballerina/ballerina-core/src/icons/Calendar.tsx b/workspaces/ballerina/ballerina-core/src/icons/Calendar.tsx
new file mode 100644
index 00000000000..cf418ee3f03
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/Calendar.tsx
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function CalendarIcon(props: any) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/CallerIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/CallerIcon.tsx
new file mode 100644
index 00000000000..47636554acf
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/CallerIcon.tsx
@@ -0,0 +1,39 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export function CallerIcon(props: any) {
+ const { onClick, ...restProps } = props;
+
+ const handleOnClick = (evt: React.MouseEvent) => {
+ evt.stopPropagation();
+ if (props && onClick) {
+ onClick();
+ }
+ }
+
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/ClassIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/ClassIcon.tsx
new file mode 100644
index 00000000000..3cd82299920
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/ClassIcon.tsx
@@ -0,0 +1,35 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export interface ClassIconProps {
+ className?: string
+}
+
+export default function ClassIcon(props: ClassIconProps) {
+
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/ComponentCollapseIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/ComponentCollapseIcon.tsx
new file mode 100644
index 00000000000..2c9c52b58b7
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/ComponentCollapseIcon.tsx
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export interface ConstantCollapseProps {
+ color?: string
+}
+
+export default function ComponentCollapseIcon(props: ConstantCollapseProps) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/ComponentExpandIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/ComponentExpandIcon.tsx
new file mode 100644
index 00000000000..54be11ebe62
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/ComponentExpandIcon.tsx
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export interface ConstantIconProps {
+ color?: string
+}
+
+export default function ComponentExpandIcon(props: ConstantIconProps) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/Configurable.tsx b/workspaces/ballerina/ballerina-core/src/icons/Configurable.tsx
new file mode 100644
index 00000000000..9993d57837d
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/Configurable.tsx
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export interface ConfigurableIconProps {
+ className?: string
+}
+
+export default function ConfigurableIcon(props: ConfigurableIconProps) {
+ return (
+
+ );
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/ConnectorIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/ConnectorIcon.tsx
new file mode 100644
index 00000000000..39ed0f81949
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/ConnectorIcon.tsx
@@ -0,0 +1,31 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export interface ConnectorIconProps {
+ className?: string
+}
+
+export default function Connector(props: ConnectorIconProps) {
+ return (
+
+ );
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/ConstantIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/ConstantIcon.tsx
new file mode 100644
index 00000000000..9f308e23151
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/ConstantIcon.tsx
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export interface ConstantIconProps {
+ className?: string
+}
+
+export default function ConstantIcon(props: ConstantIconProps) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/Custom.tsx b/workspaces/ballerina/ballerina-core/src/icons/Custom.tsx
new file mode 100644
index 00000000000..8c8820b1e9d
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/Custom.tsx
@@ -0,0 +1,33 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export interface CustomIconProps {
+ className?: string
+}
+
+export default function CustomIcon(props: CustomIconProps) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/CustomStatement.tsx b/workspaces/ballerina/ballerina-core/src/icons/CustomStatement.tsx
new file mode 100644
index 00000000000..37754d19f38
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/CustomStatement.tsx
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function CustomStatementIcon(props: any) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/DataMapper.tsx b/workspaces/ballerina/ballerina-core/src/icons/DataMapper.tsx
new file mode 100644
index 00000000000..cace1fa6e36
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/DataMapper.tsx
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export interface DataMapperProps {
+ className?: string
+}
+
+export default function DataMapperIcon(props: DataMapperProps) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/DefaultConnectorIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/DefaultConnectorIcon.tsx
new file mode 100644
index 00000000000..94ccb5e87b6
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/DefaultConnectorIcon.tsx
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import * as React from "react";
+
+export const DEFAULT_LOGO_WIDTH = 47;
+
+export interface DefaultIconProps {
+ cx?: number;
+ cy?: number;
+ width?: number;
+ scale?: number;
+}
+
+export default function DefaultConnectorIcon(props: DefaultIconProps) {
+ const { cx, cy, width, scale } = props;
+ const iconWidth = width || DEFAULT_LOGO_WIDTH;
+ const translateDistance = scale < 1 ? iconWidth * scale : 0;
+
+ return (
+
+ );
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/DeleteButton.tsx b/workspaces/ballerina/ballerina-core/src/icons/DeleteButton.tsx
new file mode 100644
index 00000000000..097f6817e59
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/DeleteButton.tsx
@@ -0,0 +1,49 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function DeleteButton(props: any) {
+ const { onClick, ...restProps } = props;
+
+ const handleOnClick = (evt: React.MouseEvent) => {
+ evt.stopPropagation();
+ if (props && onClick) {
+ onClick();
+ }
+ }
+
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/DesignViewIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/DesignViewIcon.tsx
new file mode 100644
index 00000000000..a6276ca3cea
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/DesignViewIcon.tsx
@@ -0,0 +1,31 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from "react";
+
+export function DesignViewIcon() {
+ return (
+
+ )
+}
+
diff --git a/workspaces/ballerina/ballerina-core/src/icons/DiagramDisabled.tsx b/workspaces/ballerina/ballerina-core/src/icons/DiagramDisabled.tsx
new file mode 100644
index 00000000000..c0a14b1666e
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/DiagramDisabled.tsx
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function DiagramDisabled() {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/DiagramEnabled.tsx b/workspaces/ballerina/ballerina-core/src/icons/DiagramEnabled.tsx
new file mode 100644
index 00000000000..60f9e0dff04
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/DiagramEnabled.tsx
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function DiagramEnabled() {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/DisableDigram.tsx b/workspaces/ballerina/ballerina-core/src/icons/DisableDigram.tsx
new file mode 100644
index 00000000000..d022ea8e87a
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/DisableDigram.tsx
@@ -0,0 +1,42 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function DisableDigramIcon(props: any) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/EditButton.tsx b/workspaces/ballerina/ballerina-core/src/icons/EditButton.tsx
new file mode 100644
index 00000000000..8e1cf7db880
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/EditButton.tsx
@@ -0,0 +1,47 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function EditButton(props: any) {
+ const { onClick, ...restProps } = props;
+
+ const handleOnClick = (evt: React.MouseEvent) => {
+ evt.stopPropagation();
+ if (props && onClick) {
+ onClick();
+ }
+ }
+
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/EditDarkIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/EditDarkIcon.tsx
new file mode 100644
index 00000000000..7ab3bb0991c
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/EditDarkIcon.tsx
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function EditDarkIcon(props: any) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/Email.tsx b/workspaces/ballerina/ballerina-core/src/icons/Email.tsx
new file mode 100644
index 00000000000..0fafcdc5ef8
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/Email.tsx
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function EmailIcon(props: any) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/EnumIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/EnumIcon.tsx
new file mode 100644
index 00000000000..fb4168d9775
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/EnumIcon.tsx
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function EnumIcon() {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/Error.tsx b/workspaces/ballerina/ballerina-core/src/icons/Error.tsx
new file mode 100644
index 00000000000..9794c277dc2
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/Error.tsx
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function ErrorIcon(props: any) {
+ return (
+
+ )}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/ErrorCopyIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/ErrorCopyIcon.tsx
new file mode 100644
index 00000000000..4d4ff506ecf
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/ErrorCopyIcon.tsx
@@ -0,0 +1,38 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function ErrorCopyIcon(props: any) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/ExpEditorCollapseIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/ExpEditorCollapseIcon.tsx
new file mode 100644
index 00000000000..339b009fcd5
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/ExpEditorCollapseIcon.tsx
@@ -0,0 +1,33 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function ExpEditorCollapseIcon(props: any) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/ExpEditorExpandIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/ExpEditorExpandIcon.tsx
new file mode 100644
index 00000000000..01bc96cef89
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/ExpEditorExpandIcon.tsx
@@ -0,0 +1,33 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function ExpEditorExpandIcon(props: any) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/ExpandButton.tsx b/workspaces/ballerina/ballerina-core/src/icons/ExpandButton.tsx
new file mode 100644
index 00000000000..f140856110c
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/ExpandButton.tsx
@@ -0,0 +1,44 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from "react";
+
+export default function ExpandButton(props: any) {
+ const { onClick, ...restProps } = props;
+
+ const handleOnClick = (evt: React.MouseEvent) => {
+ evt.stopPropagation();
+ if (props && onClick) {
+ onClick();
+ }
+ };
+
+ return (
+
+ );
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/FileUploadIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/FileUploadIcon.tsx
new file mode 100644
index 00000000000..40fbc725a54
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/FileUploadIcon.tsx
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function FileUploadIcon(props: any) {
+ return (
+
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/ForEach.tsx b/workspaces/ballerina/ballerina-core/src/icons/ForEach.tsx
new file mode 100644
index 00000000000..3aa09ed8f9e
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/ForEach.tsx
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function ForEachIcon(props: any) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/FunctionCallIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/FunctionCallIcon.tsx
new file mode 100644
index 00000000000..df190ee4306
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/FunctionCallIcon.tsx
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function FunctionCallIcon() {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/FunctionIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/FunctionIcon.tsx
new file mode 100644
index 00000000000..8fd53552302
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/FunctionIcon.tsx
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export interface FunctionIconProps {
+ className?: string
+}
+
+export default function FunctionIcon(props: FunctionIconProps) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/GitHub.tsx b/workspaces/ballerina/ballerina-core/src/icons/GitHub.tsx
new file mode 100644
index 00000000000..98d3aba5830
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/GitHub.tsx
@@ -0,0 +1,26 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function GitHubIcon(props: any) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/GraphqlMutationIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/GraphqlMutationIcon.tsx
new file mode 100644
index 00000000000..98e8321f928
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/GraphqlMutationIcon.tsx
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import React from "react";
+
+export function GraphqlMutationIcon() {
+ return (
+
+ );
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/GraphqlQueryIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/GraphqlQueryIcon.tsx
new file mode 100644
index 00000000000..6d27a10926a
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/GraphqlQueryIcon.tsx
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import React from "react";
+
+export function GraphqlQueryIcon() {
+ return (
+
+ );
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/GraphqlSubscriptionIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/GraphqlSubscriptionIcon.tsx
new file mode 100644
index 00000000000..0208a92450e
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/GraphqlSubscriptionIcon.tsx
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import React from "react";
+
+export function GraphqlSubscriptionIcon() {
+ return (
+
+ );
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/HeaderIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/HeaderIcon.tsx
new file mode 100644
index 00000000000..3244f7916f9
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/HeaderIcon.tsx
@@ -0,0 +1,39 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export function HeaderIcon(props: any) {
+ const { onClick, ...restProps } = props;
+
+ const handleOnClick = (evt: React.MouseEvent) => {
+ evt.stopPropagation();
+ if (props && onClick) {
+ onClick();
+ }
+ }
+
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/If.tsx b/workspaces/ballerina/ballerina-core/src/icons/If.tsx
new file mode 100644
index 00000000000..795ec09aba1
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/If.tsx
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function IfIcon(props: any) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/Info.tsx b/workspaces/ballerina/ballerina-core/src/icons/Info.tsx
new file mode 100644
index 00000000000..6097050818b
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/Info.tsx
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function InfoIcon(props: any) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/LabelDeleteIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/LabelDeleteIcon.tsx
new file mode 100644
index 00000000000..230847d23d6
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/LabelDeleteIcon.tsx
@@ -0,0 +1,59 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from "react";
+
+export default function LabelDeleteIcon() {
+ return (
+
+ );
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/LabelEditIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/LabelEditIcon.tsx
new file mode 100644
index 00000000000..c1e0be4cd8d
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/LabelEditIcon.tsx
@@ -0,0 +1,53 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from "react";
+
+export default function LabelEditIcon() {
+ return (
+
+ );
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/LabelRunIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/LabelRunIcon.tsx
new file mode 100644
index 00000000000..c96b6345cfb
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/LabelRunIcon.tsx
@@ -0,0 +1,53 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from "react";
+
+export default function LabelRunIcon() {
+ return (
+
+ );
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/LabelTryIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/LabelTryIcon.tsx
new file mode 100644
index 00000000000..5ef3ed8a90d
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/LabelTryIcon.tsx
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from "react";
+
+export default function LabelTryIcon() {
+ return (
+
+ );
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/ListenerFormIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/ListenerFormIcon.tsx
new file mode 100644
index 00000000000..a5474b305eb
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/ListenerFormIcon.tsx
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function ListenerFormIcon(props: any) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/ListenerIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/ListenerIcon.tsx
new file mode 100644
index 00000000000..575d5278941
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/ListenerIcon.tsx
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export interface ListenerIconProps {
+ className?: string
+}
+
+export default function ListenerIcon(props: ListenerIconProps) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/Log.tsx b/workspaces/ballerina/ballerina-core/src/icons/Log.tsx
new file mode 100644
index 00000000000..9738e615f6c
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/Log.tsx
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function LogIcon(props: any) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/LogoCircle.tsx b/workspaces/ballerina/ballerina-core/src/icons/LogoCircle.tsx
new file mode 100644
index 00000000000..456de01ee00
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/LogoCircle.tsx
@@ -0,0 +1,35 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function LogoCircleIcon(props: any) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/Manual.tsx b/workspaces/ballerina/ballerina-core/src/icons/Manual.tsx
new file mode 100644
index 00000000000..6a191fd6464
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/Manual.tsx
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function ManualIcon(props: any) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/ModuleConnectorIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/ModuleConnectorIcon.tsx
new file mode 100644
index 00000000000..56c3005cdbd
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/ModuleConnectorIcon.tsx
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export interface ModuleConnectorIconProps {
+ className?: string
+}
+
+export default function ModuleConnectorIcon(props: ModuleConnectorIconProps) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/ModuleVariableIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/ModuleVariableIcon.tsx
new file mode 100644
index 00000000000..d54c76a6328
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/ModuleVariableIcon.tsx
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export interface ModuleVariableIconProps {
+ className?: string
+}
+
+export default function ModuleVariableIcon(props: ModuleVariableIconProps) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/ParamEditButton.tsx b/workspaces/ballerina/ballerina-core/src/icons/ParamEditButton.tsx
new file mode 100644
index 00000000000..4b78ed76b92
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/ParamEditButton.tsx
@@ -0,0 +1,43 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export function ParamEditButton(props: any) {
+ const { onClick, ...restProps } = props;
+
+ const handleOnClick = (evt: React.MouseEvent) => {
+ evt.stopPropagation();
+ if (props && onClick) {
+ onClick();
+ }
+ }
+
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/ParamIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/ParamIcon.tsx
new file mode 100644
index 00000000000..d01c3fed2f2
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/ParamIcon.tsx
@@ -0,0 +1,39 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export function ParamIcon(props: any) {
+ const { onClick, ...restProps } = props;
+
+ const handleOnClick = (evt: React.MouseEvent) => {
+ evt.stopPropagation();
+ if (props && onClick) {
+ onClick();
+ }
+ }
+
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/PayloadIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/PayloadIcon.tsx
new file mode 100644
index 00000000000..3d18fa43e37
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/PayloadIcon.tsx
@@ -0,0 +1,39 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export function PayloadIcon(props: any) {
+ const { onClick, ...restProps } = props;
+
+ const handleOnClick = (evt: React.MouseEvent) => {
+ evt.stopPropagation();
+ if (props && onClick) {
+ onClick();
+ }
+ }
+
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/Property.tsx b/workspaces/ballerina/ballerina-core/src/icons/Property.tsx
new file mode 100644
index 00000000000..dd216e0ad01
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/Property.tsx
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function PropertyIcon(props: any) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/QueryIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/QueryIcon.tsx
new file mode 100644
index 00000000000..39e7f308628
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/QueryIcon.tsx
@@ -0,0 +1,39 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export function QueryIcon(props: any) {
+ const { onClick, ...restProps } = props;
+
+ const handleOnClick = (evt: React.MouseEvent) => {
+ evt.stopPropagation();
+ if (props && onClick) {
+ onClick();
+ }
+ }
+
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/RecordIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/RecordIcon.tsx
new file mode 100644
index 00000000000..ec5eee856c1
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/RecordIcon.tsx
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export interface RecordIconProps {
+ className?: string
+}
+
+export default function RecordIcon(props: RecordIconProps) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/RequestIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/RequestIcon.tsx
new file mode 100644
index 00000000000..673b4587a3c
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/RequestIcon.tsx
@@ -0,0 +1,39 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export function RequestIcon(props: any) {
+ const { onClick, ...restProps } = props;
+
+ const handleOnClick = (evt: React.MouseEvent) => {
+ evt.stopPropagation();
+ if (props && onClick) {
+ onClick();
+ }
+ }
+
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/ResourceIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/ResourceIcon.tsx
new file mode 100644
index 00000000000..184b193e922
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/ResourceIcon.tsx
@@ -0,0 +1,37 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export interface ResourceIconProps {
+ className?: string
+}
+
+export default function ResourceIcon(props: ResourceIconProps) {
+
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/Respond.tsx b/workspaces/ballerina/ballerina-core/src/icons/Respond.tsx
new file mode 100644
index 00000000000..f986be4f7d5
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/Respond.tsx
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function RespondIcon(props: any) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/Return.tsx b/workspaces/ballerina/ballerina-core/src/icons/Return.tsx
new file mode 100644
index 00000000000..191541cbbca
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/Return.tsx
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function ReturnIcon(props: any) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/Salesforce.tsx b/workspaces/ballerina/ballerina-core/src/icons/Salesforce.tsx
new file mode 100644
index 00000000000..e050a331772
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/Salesforce.tsx
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function SalesforceIcon(props: any) {
+ return (
+
+ );
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/Schedule.tsx b/workspaces/ballerina/ballerina-core/src/icons/Schedule.tsx
new file mode 100644
index 00000000000..a4b84942b00
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/Schedule.tsx
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function ScheduleIcon(props: any) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/SearchIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/SearchIcon.tsx
new file mode 100644
index 00000000000..af67de2c88d
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/SearchIcon.tsx
@@ -0,0 +1,48 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from "react";
+
+export default function SearchIcon(props: any) {
+ return (
+
+ );
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/SegmentIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/SegmentIcon.tsx
new file mode 100644
index 00000000000..3b862cf45e0
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/SegmentIcon.tsx
@@ -0,0 +1,39 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export function SegmentIcon(props: any) {
+ const { onClick, ...restProps } = props;
+
+ const handleOnClick = (evt: React.MouseEvent) => {
+ evt.stopPropagation();
+ if (props && onClick) {
+ onClick();
+ }
+ }
+
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/ServiceIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/ServiceIcon.tsx
new file mode 100644
index 00000000000..3351ae499eb
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/ServiceIcon.tsx
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export interface ServiceIconProps {
+ className?: string
+}
+
+export const ServiceIconLight = (props: ServiceIconProps) =>
+
+export default function ServiceIcon(props: ServiceIconProps) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/ServiceInvalidImg.tsx b/workspaces/ballerina/ballerina-core/src/icons/ServiceInvalidImg.tsx
new file mode 100644
index 00000000000..b49e5006f35
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/ServiceInvalidImg.tsx
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export function ServiceInvalidImg() {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/SettingsIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/SettingsIcon.tsx
new file mode 100644
index 00000000000..39c6f20be70
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/SettingsIcon.tsx
@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export function SettingsIcon(props: any) {
+ const { onClick, ...restProps } = props;
+
+ const handleOnClick = (evt: React.MouseEvent) => {
+ evt.stopPropagation();
+ if (props && onClick) {
+ onClick();
+ }
+ }
+
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/SettingsIconSelected.tsx b/workspaces/ballerina/ballerina-core/src/icons/SettingsIconSelected.tsx
new file mode 100644
index 00000000000..581317c2217
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/SettingsIconSelected.tsx
@@ -0,0 +1,41 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export function SettingsIconSelected(props: any) {
+ const { onClick, ...restProps } = props;
+
+ const handleOnClick = (evt: React.MouseEvent) => {
+ evt.stopPropagation();
+ if (props && onClick) {
+ onClick();
+ }
+ }
+
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/ShowMenuIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/ShowMenuIcon.tsx
new file mode 100644
index 00000000000..edcf71afaee
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/ShowMenuIcon.tsx
@@ -0,0 +1,50 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from "react";
+
+export default function ShowMenuIcon(props: any) {
+ const { onClick } = props;
+
+ const handleOnClick = (evt: React.MouseEvent) => {
+ evt.stopPropagation();
+ if (props && onClick) {
+ onClick();
+ }
+ };
+
+ return (
+
+ );
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/StatementExpandIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/StatementExpandIcon.tsx
new file mode 100644
index 00000000000..8f16a5e46a6
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/StatementExpandIcon.tsx
@@ -0,0 +1,55 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export interface StatementExpandIconProps {
+ color?: string
+}
+
+export default function StatementExpandIcon(props: StatementExpandIconProps) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/TIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/TIcon.tsx
new file mode 100644
index 00000000000..2fe7feb5c7b
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/TIcon.tsx
@@ -0,0 +1,40 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import React from "react";
+
+type TIconProps = {
+ sx?: React.CSSProperties;
+};
+
+export const TIcon = ({ sx }: TIconProps) => {
+ return (
+
+ );
+};
diff --git a/workspaces/ballerina/ballerina-core/src/icons/TopLevelPlusIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/TopLevelPlusIcon.tsx
new file mode 100644
index 00000000000..3adffc0c0f8
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/TopLevelPlusIcon.tsx
@@ -0,0 +1,33 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function TopLevelPlusIcon(props: {selected?: boolean}) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/UndoIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/UndoIcon.tsx
new file mode 100644
index 00000000000..a4f9b0daef2
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/UndoIcon.tsx
@@ -0,0 +1,32 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function UndoIcon(props: any) {
+ return (
+
+ );
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/VarIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/VarIcon.tsx
new file mode 100644
index 00000000000..d9814f234e0
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/VarIcon.tsx
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import React from "react";
+
+export function VarIcon() {
+ return (
+
+ );
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/VariableIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/VariableIcon.tsx
new file mode 100644
index 00000000000..2d15a32cd2b
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/VariableIcon.tsx
@@ -0,0 +1,34 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export interface VariableIconProps {
+ className?: string
+}
+
+export default function VariableIcon(props: VariableIconProps) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/Warning.tsx b/workspaces/ballerina/ballerina-core/src/icons/Warning.tsx
new file mode 100644
index 00000000000..4f2d848bed1
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/Warning.tsx
@@ -0,0 +1,16 @@
+import React from 'react';
+
+export default function WarningIcon(props: any) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/WarningIcon.tsx b/workspaces/ballerina/ballerina-core/src/icons/WarningIcon.tsx
new file mode 100644
index 00000000000..d2010fa6947
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/WarningIcon.tsx
@@ -0,0 +1,39 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export function Warning(props: any) {
+ const { onClick, ...restProps } = props;
+
+ const handleOnClick = (evt: React.MouseEvent) => {
+ evt.stopPropagation();
+ if (props && onClick) {
+ onClick();
+ }
+ }
+
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/Webhook.tsx b/workspaces/ballerina/ballerina-core/src/icons/Webhook.tsx
new file mode 100644
index 00000000000..4a4a3c10691
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/Webhook.tsx
@@ -0,0 +1,29 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function WebhookIcon(props: any) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/While.tsx b/workspaces/ballerina/ballerina-core/src/icons/While.tsx
new file mode 100644
index 00000000000..b0cdaef4d38
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/While.tsx
@@ -0,0 +1,27 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+import React from 'react';
+
+export default function While(props: any) {
+ return (
+
+ )
+}
diff --git a/workspaces/ballerina/ballerina-core/src/icons/index.ts b/workspaces/ballerina/ballerina-core/src/icons/index.ts
new file mode 100644
index 00000000000..8dd236e5633
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/icons/index.ts
@@ -0,0 +1,109 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+export { default as ApiIcon } from "./Api";
+export { default as CalendarIcon } from "./Calendar";
+export { default as CustomIcon } from "./Custom";
+export { default as DiagramEnabled } from "./DiagramEnabled";
+export { default as DiagramDisabled } from "./DiagramDisabled";
+export { default as EmailIcon } from "./Email";
+export { default as ForEachIcon } from "./ForEach";
+export { default as WhileIcon } from "./While";
+export { default as ActionIcon } from "./ActionIcon";
+export { default as GitHubIcon } from "./GitHub";
+export { default as IfIcon } from "./If";
+export { default as InfoIcon } from "./Info";
+export { default as LogIcon } from "./Log";
+export { default as ManualIcon } from "./Manual";
+export { default as PropertyIcon } from "./Property";
+export { default as AssignmentIcon } from "./Assignment";
+export { default as RespondIcon } from "./Respond";
+export { default as ReturnIcon } from "./Return";
+export { default as ScheduleIcon } from "./Schedule";
+export { default as SalesforceIcon } from "./Salesforce";
+export { default as WebhookIcon } from "./Webhook";
+export { default as CustomStatementIcon } from "./CustomStatement";
+// Module level icons
+export { default as ServiceIcon } from './ServiceIcon';
+export { default as Configurable } from './Configurable';
+export { default as ConfigurableIcon } from './Configurable';
+export { default as ServiceDeclaration } from './ServiceIcon';
+export { default as ConstantIcon } from './ConstantIcon';
+export { default as ConstDeclaration } from './ConstantIcon';
+export { default as ModuleConnectorDecl } from './ModuleConnectorIcon';
+export { default as TypeDefinitionIcon } from './RecordIcon';
+export { default as TypeDefinition } from './RecordIcon';
+export { default as RecordEditor } from './RecordIcon';
+export { default as EnumDeclaration } from './EnumIcon';
+export { default as ListenerIcon } from './ListenerIcon';
+export { default as ListenerDeclaration } from './ListenerIcon';
+export { default as ListenerFormIcon } from './ListenerFormIcon';
+export { default as ClassIcon } from './ClassIcon';
+export { default as ClassDefinition } from './ClassIcon';
+export { default as VariableIcon } from './VariableIcon';
+export { default as ModuleVarDecl } from './ModuleVariableIcon';
+export { default as ObjectField } from './VariableIcon';
+export { default as FunctionIcon } from './FunctionIcon';
+export { default as ObjectMethodDefinition } from './FunctionIcon';
+export { default as FunctionDefinition } from './FunctionIcon';
+export { default as FunctionCallIcon } from './FunctionCallIcon';
+export { default as ConnectorIcon } from './ConnectorIcon';
+export { default as ResourceIcon } from './ResourceIcon';
+export { default as ResourceAccessorDefinition } from './ResourceIcon';
+export { default as Custom } from "./Custom";
+export { VarIcon } from "./VarIcon";
+export { default as ErrorIcon } from "./Error";
+export { default as TriggerList } from "./ListenerIcon";
+export { default as ComponentCollapseIcon } from "./ComponentCollapseIcon";
+export { default as ComponentExpandIcon } from "./ComponentExpandIcon";
+export { default as DeleteButton } from "./DeleteButton";
+export { default as EditButton } from "./EditButton";
+export { default as ExpandButton } from "./ExpandButton";
+export { default as TopLevelPlusIcon } from "./TopLevelPlusIcon";
+export { default as WarningIcon } from "./Warning";
+export { ServiceIconLight } from "./ServiceIcon";
+export { ServiceInvalidImg } from "./ServiceInvalidImg";
+export { default as ModuleVariableIcon } from './ModuleVariableIcon';
+export { default as EnumIcon } from './EnumIcon';
+export { default as ErrorCopyIcon } from './ErrorCopyIcon';
+export { default as DefaultConnectorIcon } from './DefaultConnectorIcon';
+export { default as DataMapper } from './DataMapper';
+export { QueryIcon } from './QueryIcon';
+export { SegmentIcon } from './SegmentIcon';
+export { CallerIcon } from './CallerIcon';
+export { HeaderIcon } from './HeaderIcon';
+export { RequestIcon } from './RequestIcon';
+export { PayloadIcon } from './PayloadIcon';
+export { ParamIcon } from './ParamIcon';
+export { ParamEditButton } from './ParamEditButton';
+export { SettingsIcon } from './SettingsIcon';
+export { SettingsIconSelected } from './SettingsIconSelected';
+export { Warning } from "./WarningIcon";
+export { default as LabelDeleteIcon } from './LabelDeleteIcon';
+export { default as LabelEditIcon } from './LabelEditIcon';
+export { default as LabelRunIcon } from './LabelRunIcon';
+export { default as LabelTryIcon } from './LabelTryIcon';
+export { default as ShowMenuIcon } from './ShowMenuIcon';
+export { default as FileUploadIcon } from './FileUploadIcon';
+export { default as UndoIcon } from './UndoIcon';
+export { DesignViewIcon } from './DesignViewIcon';
+export { GraphqlQueryIcon } from "./GraphqlQueryIcon";
+export { GraphqlMutationIcon } from "./GraphqlMutationIcon";
+export { GraphqlSubscriptionIcon } from "./GraphqlSubscriptionIcon";
+export { default as BackArrow } from './BackArrow';
+export { TIcon } from './TIcon';
+
diff --git a/workspaces/ballerina/ballerina-core/src/index.ts b/workspaces/ballerina/ballerina-core/src/index.ts
new file mode 100644
index 00000000000..68bbd0402ee
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/index.ts
@@ -0,0 +1,116 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+export { default as templates } from "./templates/components";
+
+// ------ State machine interfaces -------->
+export * from "./state-machine-types";
+export * from "./vscode";
+
+// ------ Ballerina related interfaces -------->
+export * from "./interfaces/ballerina";
+export * from "./interfaces/bi";
+export * from "./interfaces/common";
+export * from "./interfaces/component";
+export * from "./interfaces/component-diagram";
+export * from "./interfaces/constants";
+export * from "./interfaces/config-spec";
+export * from "./interfaces/event";
+export * from "./interfaces/store";
+export * from "./interfaces/performance";
+export * from "./interfaces/extended-lang-client";
+export * from "./interfaces/service";
+export * from "./interfaces/inline-data-mapper";
+
+// ------ LS Utils -------->
+export * from "./ls-utils/WSConnection";
+export * from "./ls-utils/BallerinaLanguageClient";
+
+// ------ RPC interfaces -------->
+export * from "./rpc-types/ai-agent";
+export * from "./rpc-types/ai-agent/interfaces";
+export * from "./rpc-types/ai-agent/rpc-type";
+export * from "./rpc-types/bi-diagram";
+export * from "./rpc-types/bi-diagram/interfaces";
+export * from "./rpc-types/bi-diagram/rpc-type";
+export * from "./rpc-types/sequence-diagram";
+export * from "./rpc-types/sequence-diagram/interfaces";
+export * from "./rpc-types/sequence-diagram/rpc-type";
+export * from "./rpc-types/connector-wizard";
+export * from "./rpc-types/connector-wizard/rpc-type";
+export * from "./rpc-types/connector-wizard/interfaces";
+export * from "./rpc-types/record-creator";
+export * from "./rpc-types/record-creator/rpc-type";
+export * from "./rpc-types/graphql-designer";
+export * from "./rpc-types/graphql-designer/rpc-type";
+export * from "./rpc-types/graphql-designer/interfaces";
+export * from "./rpc-types/service-designer";
+export * from "./rpc-types/service-designer/rpc-type";
+export * from "./rpc-types/service-designer/interfaces";
+export * from "./rpc-types/visualizer";
+export * from "./rpc-types/visualizer/rpc-type";
+export * from "./rpc-types/visualizer/interfaces";
+export * from "./rpc-types/lang-client";
+export * from "./rpc-types/lang-client/rpc-type";
+export * from "./rpc-types/lang-client/interfaces";
+export * from "./rpc-types/library-browser";
+export * from "./rpc-types/library-browser/rpc-type";
+export * from "./rpc-types/library-browser/interfaces";
+export * from "./rpc-types/common";
+export * from "./rpc-types/common/rpc-type";
+export * from "./rpc-types/common/interfaces";
+export * from "./rpc-types/persist-diagram";
+export * from "./rpc-types/persist-diagram/rpc-type";
+export * from "./rpc-types/ai-panel";
+export * from "./rpc-types/ai-panel/rpc-type";
+export * from "./rpc-types/ai-panel/interfaces";
+export * from "./rpc-types/inline-data-mapper";
+export * from "./rpc-types/inline-data-mapper/rpc-type";
+export * from "./rpc-types/inline-data-mapper/interfaces";
+export * from "./rpc-types/test-manager";
+export * from "./rpc-types/test-manager/rpc-type";
+export * from "./rpc-types/icp-service";
+export * from "./rpc-types/icp-service/rpc-type";
+export * from "./rpc-types/agent-chat";
+export * from "./rpc-types/agent-chat/interfaces";
+export * from "./rpc-types/agent-chat/rpc-type";
+
+
+// ------ History class and interface -------->
+export * from "./history";
+
+// ------ Undo Redo Manger class -------->
+export * from "./undo-redo-manager";
+
+// ------ Util functions -------->
+export * from "./utils";
+export * from "./utils/modification-utils";
+export * from "./utils/form-component-utils";
+export * from "./utils/diagnostics-utils";
+export * from "./utils/visitors/records-finder-visitor";
+export * from "./utils/keyboard-navigation-manager";
+export * from "./utils/identifier-utils"
+
+// ------ Util Components -------->
+export * from "./components"
+export * from "./icons"
+
+// ------ AI Panel Related Interfaces -------->
+export * from "./interfaces/ai-panel";
+
+export { Diagnostic } from "vscode-languageserver-types";
diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/ai-panel.ts b/workspaces/ballerina/ballerina-core/src/interfaces/ai-panel.ts
new file mode 100644
index 00000000000..c8805f72666
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/interfaces/ai-panel.ts
@@ -0,0 +1,54 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+export enum Command {
+ Code = '/code',
+ Tests = '/tests',
+ DataMap = '/datamap',
+ TypeCreator = '/typecreator',
+ Healthcare = '/healthcare',
+ Ask = '/ask',
+ NaturalProgramming = '/natural-programming (experimental)',
+ OpenAPI = '/openapi',
+}
+
+export enum TemplateId {
+ // Shared
+ Wildcard = 'wildcard',
+
+ // Command.Code
+ GenerateCode = 'generate-code',
+ GenerateFromReadme = 'generate-from-readme',
+
+ // Command.Tests
+ TestsForService = 'tests-for-service',
+ TestsForFunction = 'tests-for-function',
+
+ // Command.DataMap
+ MappingsForRecords = 'mappings-for-records',
+ MappingsForFunction = 'mappings-for-function',
+
+ // Command.TypeCreator
+ TypesForAttached = 'types-for-attached',
+
+ // Command.NaturalProgramming
+ CodeDocDriftCheck = 'code-doc-drift-check',
+ GenerateCodeFromRequirements = 'generate-code-from-requirements',
+ GenerateTestFromRequirements = 'generate-test-from-requirements',
+ GenerateCodeFromFollowingRequirements = 'generate-code-from-following-requirements',
+}
diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/ballerina.ts b/workspaces/ballerina/ballerina-core/src/interfaces/ballerina.ts
new file mode 100644
index 00000000000..fca680b76d2
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/interfaces/ballerina.ts
@@ -0,0 +1,627 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { DocumentIdentifier, LinePosition, LineRange, Position, Range } from "./common";
+import { ClientCapabilities, Location } from "vscode-languageserver-protocol";
+import { DiagramDiagnostic, FunctionDefinitionInfo, NonPrimitiveBal } from "./config-spec";
+import { STModifyParams } from "./extended-lang-client";
+import { NodePosition, STNode } from "@wso2/syntax-tree";
+
+export enum DIAGNOSTIC_SEVERITY {
+ INTERNAL = "INTERNAL",
+ HINT = "HINT",
+ INFO = "INFO",
+ WARNING = "WARNING",
+ ERROR = "ERROR"
+}
+
+export interface GoToSourceParams {
+ textDocumentIdentifier: {
+ uri: string;
+ };
+ position: Position;
+}
+
+export interface RevealRangeParams {
+ textDocumentIdentifier: {
+ uri: string;
+ };
+ range: Range;
+}
+
+export interface BallerinaExample {
+ title: string;
+ url: string;
+}
+
+export interface BallerinaExampleCategory {
+ title: string;
+ column: number;
+ samples: BallerinaExample[];
+}
+
+export interface VisibleEndpoint {
+ kind?: string;
+ isCaller: boolean;
+ isExternal: boolean;
+ isModuleVar: boolean;
+ moduleName: string;
+ name: string;
+ packageName: string;
+ orgName: string;
+ version: string;
+ typeName: string;
+ position: NodePosition;
+ viewState?: any;
+ isParameter?: boolean;
+ isClassField?: boolean;
+}
+
+export interface TypeField {
+ typeName: string;
+ name?: string;
+ displayName?: string;
+ memberType?: TypeField;
+ inclusionType?: TypeField;
+ paramType?: TypeField;
+ selectedDataType?: string;
+ description?: string;
+ defaultValue?: any;
+ value?: any;
+ optional?: boolean;
+ defaultable?: boolean;
+ fields?: TypeField[];
+ members?: TypeField[];
+ references?: TypeField[];
+ restType?: TypeField;
+ constraintType?: TypeField;
+ rowType?: TypeField;
+ keys?: string[];
+ isReturn?: boolean;
+ isTypeDef?: boolean;
+ isReference?: boolean;
+ isStream?: boolean;
+ isErrorUnion?: boolean;
+ typeInfo?: NonPrimitiveBal;
+ hide?: boolean;
+ aiSuggestion?: string;
+ noCodeGen?: boolean;
+ requestName?: string; // only for http form used when there's a request object in the request
+ tooltip?: string;
+ tooltipActionLink?: string;
+ tooltipActionText?: string;
+ isErrorType?: boolean;
+ isRestParam?: boolean; // TODO: unified rest params
+ hasRestType?: boolean;
+ isRestType?: boolean;
+ customAutoComplete?: string[];
+ validationRegex?: any;
+ leftTypeParam?: any;
+ rightTypeParam?: any;
+ initialDiagnostics?: DiagramDiagnostic[];
+ documentation?: string;
+ displayAnnotation?: any;
+ position?: NodePosition;
+ selected?: boolean;
+ originalTypeName?: string;
+ resolvedUnionType?: TypeField | TypeField[];
+}
+
+export interface BallerinaConnectorInfo extends BallerinaConnector {
+ functions: FunctionDefinitionInfo[];
+ documentation?: string;
+}
+
+export interface BallerinaConnectorsRequest {
+ query: string;
+ packageName?: string;
+ organization?: string;
+ connector?: string;
+ description?: string;
+ template?: string;
+ keyword?: string;
+ ballerinaVersion?: string;
+ platform?: boolean;
+ userPackages?: boolean;
+ limit?: number;
+ offset?: number;
+ sort?: string;
+ targetFile?: string;
+}
+
+
+// tslint:disable-next-line: no-empty-interface
+
+
+export interface Package {
+ organization: string;
+ name: string;
+ version: string;
+ platform?: string;
+ languageSpecificationVersion?: string;
+ URL?: string;
+ balaURL?: string;
+ balaVersion?: string;
+ digest?: string;
+ summary?: string;
+ readme?: string;
+ template?: boolean;
+ licenses?: any[];
+ authors?: any[];
+ sourceCodeLocation?: string;
+ keywords?: any[];
+ ballerinaVersion?: string;
+ icon?: string;
+ pullCount?: number;
+ createdDate?: number;
+ modules?: any[];
+}
+
+export interface PartialSTModification {
+ startLine: number;
+ startColumn: number;
+ endLine: number;
+ endColumn: number;
+ newCodeSnippet: string;
+}
+
+
+export interface BallerinaModule {
+ id?: string;
+ type?: string;
+ name: string;
+ displayName?: string;
+ moduleName?: string;
+ package: Package;
+ displayAnnotation?: DisplayAnnotation;
+ icon?: string;
+}
+
+export interface ConnectorInfo {
+ connector: any;
+ functionNode?: STNode;
+ action?: FunctionDefinitionInfo;
+}
+
+// tslint:disable-next-line: no-empty-interface
+export interface BallerinaConnector extends BallerinaModule { }
+
+// tslint:disable-next-line: no-empty-interface
+export interface BallerinaTrigger extends BallerinaModule { }
+
+export interface Package {
+ organization: string;
+ name: string;
+ version: string;
+ platform?: string;
+ languageSpecificationVersion?: string;
+ URL?: string;
+ balaURL?: string;
+ balaVersion?: string;
+ digest?: string;
+ summary?: string;
+ readme?: string;
+ template?: boolean;
+ licenses?: any[];
+ authors?: any[];
+ sourceCodeLocation?: string;
+ keywords?: any[];
+ ballerinaVersion?: string;
+ icon?: string;
+ pullCount?: number;
+ createdDate?: number;
+ visibility?: string;
+ modules?: any[];
+}
+
+export interface BallerinaTriggerInfo extends BallerinaTrigger {
+ serviceTypes: ServiceType[],
+ listenerParams?: Parameter[],
+ listener: any,
+ documentation?: string,
+}
+
+export interface ServiceType {
+ name: string;
+ description?: string;
+ functions?: RemoteFunction[];
+ basePath?: Parameter;
+ // Editor Related
+ isImplemented?: boolean;
+}
+
+export interface RemoteFunction {
+ isRemote?: boolean;
+ documentation?: string;
+ optional?: boolean;
+ name: string;
+ parameters?: Parameter[];
+ qualifiers?: string[];
+ returnType?: ReturnType;
+ // Editor Related
+ isImplemented?: boolean;
+ enabled?: boolean;
+ group?: any;
+}
+
+export interface Parameter {
+ name: string;
+ typeName: string;
+ optional?: boolean;
+ typeInfo?: TypeInfo;
+ displayAnnotation?: DisplayAnnotation;
+ fields?: Field[];
+ hasRestType?: boolean;
+ restType?: ReturnType;
+ defaultable?: boolean;
+ defaultValue?: string;
+ defaultTypeName?: string; // Is this defaultTypeValue?
+ documentation?: string;
+ type?: string[]
+ arrayType?: boolean;
+}
+
+export interface DisplayAnnotation {
+ label?: string;
+ iconPath?: string;
+}
+
+export interface MemberField {
+ typeName?: string;
+ optional?: boolean;
+ defaultable?: boolean;
+}
+export interface Field {
+ name?: string;
+ typeName?: string;
+ optional?: boolean;
+ defaultable?: boolean;
+ fields?: ReturnType[];
+ hasRestType?: boolean;
+ restType?: ReturnType;
+ members?: MemberField[];
+ defaultType?: string;
+}
+
+export interface ReturnType {
+ name?: string;
+ typeName?: string;
+ optional?: boolean;
+ defaultable?: boolean;
+ displayAnnotation?: DisplayAnnotation;
+}
+
+export interface TypeInfo {
+ name?: string;
+ orgName?: string;
+ moduleName?: string;
+ version?: string;
+}
+
+export interface BallerinaModulesRequest {
+ query: string;
+ packageName?: string;
+ organization?: string;
+ connector?: string;
+ description?: string;
+ template?: string;
+ keyword?: string;
+ ballerinaVersion?: string;
+ platform?: boolean;
+ userPackages?: boolean;
+ limit?: number;
+ offset?: number;
+ sort?: string;
+ targetFile?: string;
+}
+export interface BallerinaModuleResponse {
+ central: BallerinaModule[];
+ local?: BallerinaModule[];
+ error?: string;
+}
+
+export interface STModification {
+ startLine?: number;
+ startColumn?: number;
+ endLine?: number;
+ endColumn?: number;
+ type: string;
+ config?: any;
+ isImport?: boolean;
+}
+
+export interface MainTriggerModifyRequest extends STModifyParams {
+ type: "main";
+ config?: MainConfig;
+}
+
+export interface ServiceConfig {
+ SERVICE: string;
+ RESOURCE: string;
+ RES_PATH: string;
+ PORT: string;
+ METHODS: string;
+ CURRENT_TRIGGER?: string;
+}
+
+export interface MainConfig {
+ COMMENT?: string;
+ CURRENT_TRIGGER?: string;
+}
+
+export interface ServiceTriggerModifyRequest extends STModifyParams {
+ type: "service";
+ config: ServiceConfig;
+}
+
+export interface ExecutorPosition {
+ kind: string;
+ range: LineRange;
+ name: string;
+ filePath: string;
+}
+
+export interface ParameterInfo {
+ name: string,
+ description?: string,
+ kind: string,
+ type: string,
+ modelPosition?: NodePosition,
+ fields?: ParameterInfo[]
+}
+
+export interface SymbolDocumentation {
+ description: string,
+ parameters?: ParameterInfo[],
+ returnValueDescription?: string,
+ deprecatedDocumentation?: string,
+ deprecatedParams?: ParameterInfo[]
+}
+
+export interface ExpressionRange {
+ startLine: LinePosition;
+ endLine: LinePosition;
+ filePath?: string;
+}
+
+
+export interface ResolvedTypeForExpression {
+ type: TypeField;
+ requestedRange: ExpressionRange;
+}
+
+export interface ResolvedTypeForSymbol {
+ type: TypeField;
+ requestedPosition: LinePosition;
+}
+
+export interface BallerinaConstructRequest {
+ query: string;
+ packageName?: string;
+ organization?: string;
+ connector?: string;
+ description?: string;
+ template?: string;
+ keyword?: string;
+ ballerinaVersion?: string;
+ platform?: boolean;
+ userPackages?: boolean;
+ limit?: number;
+ offset?: number;
+ sort?: string;
+ targetFile?: string;
+}
+
+export interface Package {
+ organization: string;
+ name: string;
+ version: string;
+ platform?: string;
+ languageSpecificationVersion?: string;
+ URL?: string;
+ balaURL?: string;
+ balaVersion?: string;
+ digest?: string;
+ summary?: string;
+ readme?: string;
+ template?: boolean;
+ licenses?: any[];
+ authors?: any[];
+ sourceCodeLocation?: string;
+ keywords?: any[];
+ ballerinaVersion?: string;
+ icon?: string;
+ pullCount?: number;
+ createdDate?: number;
+ visibility?: string;
+ modules?: any[];
+}
+
+export interface CurrentFile {
+ content: string;
+ path: string;
+ size: number;
+}
+
+export interface BallerinaConstruct {
+ id?: string;
+ name: string;
+ displayName?: string;
+ moduleName?: string;
+ package: Package;
+ displayAnnotation?: DisplayAnnotation;
+ icon?: string;
+}
+
+export interface APITimeConsumption {
+ diagnostics: number[];
+ completion: number[];
+}
+
+export interface OADiagnostic {
+ message: string;
+ serverity: string;
+ location?: LineRange;
+}
+
+export interface OASpec {
+ file: string;
+ serviceName: string;
+ spec: any;
+ diagnostics: OADiagnostic[];
+}
+
+export interface PerformanceAnalyzerGraphRequest {
+ documentIdentifier: DocumentIdentifier;
+ range: Range;
+ choreoAPI: string;
+ choreoCookie: string;
+ choreoToken: string;
+}
+
+export interface NoteBookCellOutputValue {
+ value: string;
+ mimeType: string;
+ type: string;
+}
+
+export interface NotebookCellMetaInfo {
+ definedVars: string[];
+ moduleDclns: string[];
+}
+
+export interface ExtendedClientCapabilities extends ClientCapabilities {
+ experimental: { introspection: boolean, showTextDocument: boolean, experimentalLanguageFeatures?: boolean };
+}
+
+export interface PackageSummary {
+ name: string,
+ filePath: string,
+ modules: ModuleSummary[]
+}
+
+export interface ModuleSummary extends ComponentSummary {
+ name: string
+}
+
+export interface ComponentSummary {
+ functions: ComponentInfo[],
+ services: ComponentInfo[],
+ records: ComponentInfo[],
+ objects: ComponentInfo[],
+ classes: ComponentInfo[],
+ types: ComponentInfo[],
+ constants: ComponentInfo[],
+ enums: ComponentInfo[],
+ listeners: ComponentInfo[],
+ moduleVariables: ComponentInfo[],
+ automations: ComponentInfo[],
+ configurableVariables: ComponentInfo[],
+ naturalFunctions: ComponentInfo[]
+}
+
+export interface ComponentInfo {
+ name: string;
+ filePath: string;
+ startLine: number;
+ startColumn: number;
+ endLine: number;
+ endColumn: number;
+ resources?: ComponentInfo[];
+}
+
+export type SequenceModel = {
+ participants: Participant[];
+ location: Location;
+};
+
+export type SequenceModelDiagnostic = {
+ errorMsg: string;
+ isIncompleteModel: boolean;
+};
+
+export enum ParticipantType {
+ FUNCTION = "FUNCTION",
+ WORKER = "WORKER",
+ ENDPOINT = "ENDPOINT",
+}
+
+export type Participant = {
+ id: string;
+ name: string;
+ kind: ParticipantType;
+ moduleName: string;
+ nodes: Node[];
+ location: Location;
+};
+
+export interface JsonToRecordMapperDiagnostic {
+ message: string;
+ severity?: DIAGNOSTIC_SEVERITY;
+}
+
+export interface XMLToRecordConverterDiagnostic {
+ message: string;
+ severity?: DIAGNOSTIC_SEVERITY;
+}
+
+
+export interface ConstantConfigFormState {
+ isPublic: boolean;
+ isTypeDefined: boolean;
+ constantName: string;
+ constantValue: string;
+ constantType: string;
+ isExpressionValid: boolean;
+}
+
+export interface ConfigurableFormState {
+ isPublic: boolean;
+ varType: string;
+ varName: string;
+ varValue: string;
+ isExpressionValid: boolean;
+ hasDefaultValue: boolean;
+ label: string;
+}
+
+export interface ListenerConfig {
+ listenerName: string,
+ listenerPort: string,
+ listenerType: string
+ isExpressionValid: boolean;
+}
+
+export interface ModuleVariableFormState {
+ varType: string;
+ varName: string;
+ varValue: string;
+ varOptions: string[];
+}
+
+export interface HeaderObjectConfig {
+ requestName?: string;
+ objectKey: string;
+ objectValue: string;
+}
+
+export interface CommandResponse {
+ error: boolean;
+ message: string;
+}
diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts
new file mode 100644
index 00000000000..864ed51839c
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts
@@ -0,0 +1,443 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { NodePosition } from "@wso2/syntax-tree";
+import { LinePosition } from "./common";
+import { Diagnostic as VSCodeDiagnostic } from "vscode-languageserver-types";
+
+export type { NodePosition };
+
+export type Flow = {
+ fileName: string;
+ nodes: FlowNode[];
+ connections?: FlowNode[];
+};
+
+export type Client = {
+ id: string;
+ label: string;
+ kind: ClientKind;
+ lineRange: ELineRange;
+ scope: ClientScope;
+ value: string;
+ flags: number;
+};
+
+export type ClientKind = "HTTP" | "OTHER";
+
+export type ClientScope = "LOCAL" | "OBJECT" | "GLOBAL";
+
+export type FlowNode = {
+ id: string;
+ metadata: Metadata;
+ codedata: CodeData;
+ diagnostics?: Diagnostic;
+ properties?: NodeProperties;
+ branches: Branch[];
+ flags?: number;
+ returning: boolean;
+ suggested?: boolean;
+ viewState?: ViewState;
+ hasBreakpoint?: boolean;
+ isActiveBreakpoint?: boolean;
+};
+
+export type FunctionNode = {
+ id: string;
+ metadata: Metadata;
+ codedata: CodeData;
+ diagnostics?: Diagnostic;
+ properties?: NodeProperties;
+ flags?: number;
+ returning: boolean;
+};
+
+export type Metadata = {
+ label: string;
+ description: string;
+ icon?: string;
+ keywords?: string[];
+ draft?: boolean; // for diagram draft nodes
+ data?: {
+ isDataMappedFunction?: boolean;
+ isAgentTool?: boolean;
+ isIsolatedFunction?: boolean;
+ tools?: ToolData[];
+ model?: ToolData;
+ memory?: MemoryData;
+ agent?: AgentData;
+ paramsToHide?: string[]; // List of properties keys to to hide from forms
+ };
+ functionKind?: string;
+};
+
+export type ToolData = {
+ name: string;
+ description?: string;
+ path?: string;
+ type?: string;
+};
+
+export type AgentData = {
+ role?: string;
+ instructions?: string;
+};
+
+export type MemoryData = {
+ name: string;
+ type: string;
+};
+
+export type Imports = {
+ [prefix: string]: string;
+};
+
+export type Property = {
+ metadata: Metadata;
+ diagnostics?: Diagnostic;
+ valueType: string;
+ value: string | string[] | ELineRange | NodeProperties | Property[];
+ advanceProperties?: NodeProperties;
+ optional: boolean;
+ editable: boolean;
+ advanced?: boolean;
+ hidden?: boolean;
+ placeholder?: string;
+ valueTypeConstraint?: string | string[];
+ codedata?: CodeData;
+ typeMembers?: PropertyTypeMemberInfo[];
+ imports?: Imports;
+ advancedValue?: string;
+ modified?: boolean;
+ oldValue?: string;
+};
+
+export type PropertyTypeMemberInfo = {
+ type: string;
+ kind: string;
+ packageInfo: string;
+ packageName?: string;
+ selected: boolean;
+};
+
+export type RecordTypeField = {
+ key: string;
+ property: Property;
+ recordTypeMembers: PropertyTypeMemberInfo[];
+};
+
+export type Diagnostic = {
+ hasDiagnostics: boolean;
+ diagnostics?: DiagnosticMessage[];
+};
+
+export type DiagnosticMessage = {
+ message: string;
+ severity: "ERROR" | "WARNING" | "INFO";
+};
+
+export type CodeData = {
+ node?: NodeKind;
+ org?: string;
+ module?: string;
+ object?: string;
+ symbol?: string;
+ lineRange?: ELineRange;
+ sourceCode?: string;
+ parentSymbol?: string;
+ inferredReturnType?: string;
+ version?: string;
+ isNew?: boolean;
+ isGenerated?: boolean;
+ resourcePath?: string;
+ id?: string;
+ kind?: string;
+ originalName?: string;
+ dependentProperty?: string[];
+};
+
+export type Branch = {
+ label: string;
+ kind: BranchKind;
+ codedata: CodeData;
+ repeatable: Repeatable;
+ properties: NodeProperties;
+ children: FlowNode[];
+ viewState?: ViewState;
+};
+
+export type ELineRange = {
+ fileName: string;
+ startLine: LinePosition;
+ endLine: LinePosition;
+};
+
+export type NodeProperties = { [P in NodePropertyKey]?: Property };
+
+export type ViewState = {
+ // element view state
+ x: number;
+ y: number;
+ lw: number; // left width from center
+ rw: number; // right width from center
+ h: number; // height
+ // container view state
+ clw: number; // container left width from center
+ crw: number; // container right width from center
+ ch: number; // container height
+ // flow start node
+ startNodeId?: string;
+ // is top level node
+ isTopLevel?: boolean;
+};
+
+// Add node target position metadata
+export type TargetMetadata = {
+ topNodeId: string;
+ bottomNodeId?: string;
+ linkLabel?: string;
+};
+
+export enum DIRECTORY_MAP {
+ AGENTS = "agents",
+ AUTOMATION = "AUTOMATION",
+ CONFIGURABLE = "CONFIGURABLE",
+ CONNECTION = "CONNECTION",
+ CONNECTOR = "CONNECTOR",
+ DATA_MAPPER = "DATA_MAPPER",
+ FUNCTION = "FUNCTION",
+ LISTENER = "LISTENER",
+ LOCAL_CONNECTORS = "localConnectors",
+ NP_FUNCTION = "NP_FUNCTION",
+ REMOTE = "REMOTE",
+ RESOURCE = "RESOURCE",
+ SERVICE = "SERVICE",
+ TYPE = "TYPE",
+ VARIABLE = "VARIABLE",
+}
+
+export enum FUNCTION_TYPE {
+ REGULAR = "regular",
+ EXPRESSION_BODIED = "expressionBodied",
+ ALL = "all",
+}
+
+export interface ProjectStructureResponse {
+ projectName: string;
+ directoryMap: {
+ [DIRECTORY_MAP.SERVICE]: ProjectStructureArtifactResponse[];
+ [DIRECTORY_MAP.AUTOMATION]: ProjectStructureArtifactResponse[];
+ [DIRECTORY_MAP.LISTENER]: ProjectStructureArtifactResponse[];
+ [DIRECTORY_MAP.FUNCTION]: ProjectStructureArtifactResponse[];
+ [DIRECTORY_MAP.CONNECTION]: ProjectStructureArtifactResponse[];
+ [DIRECTORY_MAP.TYPE]: ProjectStructureArtifactResponse[];
+ [DIRECTORY_MAP.CONFIGURABLE]: ProjectStructureArtifactResponse[];
+ [DIRECTORY_MAP.DATA_MAPPER]: ProjectStructureArtifactResponse[];
+ [DIRECTORY_MAP.NP_FUNCTION]: ProjectStructureArtifactResponse[];
+ [DIRECTORY_MAP.AGENTS]: ProjectStructureArtifactResponse[];
+ [DIRECTORY_MAP.LOCAL_CONNECTORS]: ProjectStructureArtifactResponse[];
+ };
+}
+
+export interface ProjectStructureArtifactResponse {
+ id: string;
+ name: string;
+ path: string;
+ type: string;
+ icon?: string;
+ context?: string;
+ moduleName?: string;
+ position?: NodePosition;
+ resources?: ProjectStructureArtifactResponse[];
+ isNew?: boolean;
+}
+
+export interface UpdatedArtifactsResponse {
+ artifacts: ProjectStructureArtifactResponse[];
+ error?: string;
+}
+
+export type Item = Category | AvailableNode;
+
+export type Category = {
+ metadata: Metadata;
+ items: Item[];
+};
+
+export type AvailableNode = {
+ metadata: Metadata;
+ codedata: CodeData;
+ enabled: boolean;
+};
+
+export type DiagramLabel = "On Fail" | "Body";
+
+export type NodePropertyKey =
+ | "agentType"
+ | "checkError"
+ | "client"
+ | "collection"
+ | "comment"
+ | "condition"
+ | "configValue"
+ | "connection"
+ | "defaultable"
+ | "defaultValue"
+ | "documentation"
+ | "enableModelContext"
+ | "expression"
+ | "functionName"
+ | "maxIter"
+ | "memory"
+ | "method"
+ | "model"
+ | "msg"
+ | "parameters"
+ | "path"
+ | "patterns"
+ | "prompt"
+ | "query"
+ | "scope"
+ | "sessionId"
+ | "size"
+ | "statement"
+ | "systemPrompt"
+ | "targetType"
+ | "tools"
+ | "type"
+ | "variable"
+ | "verbose"
+ | "view";
+
+export type BranchKind = "block" | "worker";
+
+export type Repeatable = "ONE_OR_MORE" | "ZERO_OR_ONE" | "ONE" | "ZERO_OR_MORE";
+
+export type Scope = "module" | "local" | "object";
+
+export type NodeKind =
+ | "ACTION_OR_EXPRESSION"
+ | "AGENT"
+ | "AGENT_CALL"
+ | "ASSIGN"
+ | "AUTOMATION"
+ | "BODY"
+ | "BREAK"
+ | "CLASS"
+ | "CLASS_INIT"
+ | "COMMENT"
+ | "COMMIT"
+ | "CONDITIONAL"
+ | "CONFIG_VARIABLE"
+ | "CONTINUE"
+ | "DATA_MAPPER_CALL"
+ | "DATA_MAPPER_DEFINITION"
+ | "DRAFT"
+ | "ELSE"
+ | "EMPTY"
+ | "ERROR_HANDLER"
+ | "EVENT_START"
+ | "EXPRESSION"
+ | "FAIL"
+ | "FOREACH"
+ | "FORK"
+ | "FUNCTION"
+ | "FUNCTION_CALL"
+ | "FUNCTION_DEFINITION"
+ | "IF"
+ | "INCLUDED_FIELD"
+ | "LOCK"
+ | "LV_EXPRESSION"
+ | "MATCH"
+ | "NEW_CONNECTION"
+ | "NEW_DATA"
+ | "NP_FUNCTION"
+ | "NP_FUNCTION_CALL"
+ | "NP_FUNCTION_DEFINITION"
+ | "ON_FAILURE"
+ | "PANIC"
+ | "PARALLEL_FLOW"
+ | "RAW_TEMPLATE"
+ | "REMOTE_ACTION_CALL"
+ | "RESOURCE_ACTION_CALL"
+ | "RETURN"
+ | "RETRY"
+ | "ROLLBACK"
+ | "START"
+ | "STOP"
+ | "TRANSACTION"
+ | "UPDATE_DATA"
+ | "VARIABLE"
+ | "WAIT"
+ | "WHILE"
+ | "WORKER";
+
+export type OverviewFlow = {
+ entryPoints: EntryPoint[];
+ name: string;
+ thinking: string;
+ connections: Connection[];
+};
+
+export type EntryPoint = {
+ id: string;
+ name: string;
+ type: string;
+ status: string;
+ dependencies: Dependency[];
+};
+
+export type Dependency = {
+ id: string;
+ status: string;
+};
+
+export type Connection = {
+ id: string;
+ name: string;
+ status: string;
+ org?: string;
+ package?: string;
+ client?: string;
+};
+
+export type Line = {
+ line: number;
+ offset: number;
+};
+
+export type ConfigVariable = {
+ metadata: Metadata;
+ codedata: CodeData;
+ properties: NodeProperties;
+ branches: Branch[];
+ id: string;
+ returning: boolean;
+ diagnostics?: Diagnostic;
+ flags?: number;
+};
+
+export type FormDiagnostics = {
+ key: string;
+ diagnostics: VSCodeDiagnostic[];
+};
+
+export type CompletionInsertText = {
+ value: string;
+ cursorOffset?: number;
+};
diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/common.ts b/workspaces/ballerina/ballerina-core/src/interfaces/common.ts
new file mode 100644
index 00000000000..fda696e7ab3
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/interfaces/common.ts
@@ -0,0 +1,103 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
+
+import { STNode } from "@wso2/syntax-tree";
+import { FlowNode, RecordTypeField } from "./bi";
+
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+export declare enum BallerinaComponentTypes {
+ REST_API = "restAPI",
+ GRAPHQL = "graphql",
+ MAIN = "main",
+ WEBHOOK = "webhook",
+ GRPC_API = "grpcAPI",
+ WEBSOCKET_API = "websocketAPI"
+}
+
+export enum SubPanelView {
+ INLINE_DATA_MAPPER = "inlineDataMapper",
+ HELPER_PANEL = "helperPanel",
+ ADD_NEW_FORM = "addNewForm",
+ UNDEFINED = undefined,
+}
+
+export interface DocumentIdentifier {
+ uri: string;
+}
+
+export interface LineRange {
+ fileName?: string;
+ startLine: LinePosition;
+ endLine: LinePosition;
+}
+
+export interface LinePosition {
+ line: number;
+ offset: number;
+}
+
+export interface Range {
+ start: Position;
+ end: Position;
+}
+
+export interface Position {
+ line: number;
+ character: number;
+}
+
+export interface NOT_SUPPORTED_TYPE {
+
+}
+export interface FunctionDef {
+ syntaxTree: STNode;
+ defFilePath: string;
+}
+
+export interface SubPanel {
+ view: SubPanelView;
+ props?: SubPanelViewProps;
+}
+
+export interface SubPanelViewProps {
+ inlineDataMapper?: InlineDataMapperProps;
+ sidePanelData?: SidePanelData;
+}
+
+export interface SidePanelData {
+ filePath: string;
+ range: LineRange;
+ editorKey: string;
+ configurePanelData?: ConfigurePanelData;
+ recordField: RecordTypeField;
+}
+
+export interface ConfigurePanelData {
+ isEnable: boolean;
+ name?: string;
+ documentation?: string;
+ value?: string;
+}
+
+interface InlineDataMapperProps {
+ filePath: string;
+ flowNode: FlowNode;
+ propertyKey: string;
+ editorKey: string;
+ position: LinePosition;
+}
diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/component-diagram.ts b/workspaces/ballerina/ballerina-core/src/interfaces/component-diagram.ts
new file mode 100644
index 00000000000..f29120c45bd
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/interfaces/component-diagram.ts
@@ -0,0 +1,96 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { LineRange } from "./common";
+
+// Component Diagram Model
+export type CDModel = {
+ automation?: CDAutomation;
+ connections: CDConnection[];
+ listeners: CDListener[];
+ services: CDService[];
+};
+
+export type CDAutomation = {
+ name: string;
+ displayName: string;
+ location: CDLocation;
+ connections: string[];
+ uuid: string;
+};
+
+export type CDLocation = LineRange & {
+ filePath: string;
+};
+
+export type CDConnection = {
+ symbol: string;
+ location: CDLocation;
+ scope: string;
+ uuid: string;
+ enableFlowModel: boolean;
+ sortText: string;
+ icon?: string;
+};
+
+export type CDListener = {
+ symbol: string;
+ location: CDLocation;
+ attachedServices: string[];
+ kind: string;
+ type: string;
+ args: CDArg[];
+ uuid: string;
+ icon: string;
+ enableFlowModel: boolean;
+ sortText: string;
+};
+
+export type CDArg = {
+ key: string;
+ value: string;
+};
+
+export type CDService = {
+ location: CDLocation;
+ attachedListeners: string[];
+ connections: string[];
+ functions: CDFunction[];
+ remoteFunctions: CDFunction[];
+ resourceFunctions: CDResourceFunction[];
+ absolutePath: string;
+ type: string;
+ icon: string;
+ uuid: string;
+ enableFlowModel: boolean;
+ sortText: string;
+ displayName?: string;
+};
+
+export type CDFunction = {
+ name: string;
+ location: CDLocation;
+ connections?: string[];
+};
+
+export type CDResourceFunction = {
+ accessor: string;
+ path: string;
+ location: CDLocation;
+ connections?: string[];
+};
diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/component.ts b/workspaces/ballerina/ballerina-core/src/interfaces/component.ts
new file mode 100644
index 00000000000..45dd704c58c
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/interfaces/component.ts
@@ -0,0 +1,217 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { LinePosition } from "./common";
+
+export interface Project {
+ id: string;
+ name: string;
+ components: ComponentModel[];
+ version?: string;
+}
+
+export enum BuildPack {
+ Ballerina = "ballerina",
+ Java = "java",
+ Go = "go",
+ NodeJs = "nodejs",
+ Python = "python",
+ Ruby = "ruby",
+ Rust = "rust",
+ Other = "other"
+}
+
+export interface ComponentModel {
+ id: string;
+ orgName: string;
+ version?: string;
+ modelVersion: string;
+ services: Map;
+ entities: Map;
+ type?: ComponentType;
+ buildPack?: string;
+ diagnostics?: CMDiagnostics[];
+ functionEntryPoint?: CMEntryPoint;
+ hasCompilationErrors: boolean;
+ hasModelErrors?: boolean;
+ connections: CMDependency[];
+}
+
+export interface ComponentModelDeprecated {
+ packageId: CMPackageID;
+ version?: string;
+ services: Map;
+ entities: Map;
+ diagnostics?: CMDiagnostics[];
+ functionEntryPoint?: any;
+ hasCompilationErrors: boolean;
+}
+
+export interface CMDiagnostics {
+ name: string;
+ message?: string;
+ severity?: string;
+}
+
+export interface CMPackageID {
+ name: string,
+ org: string,
+ version: string
+}
+
+export interface CMLocation {
+ filePath: string;
+ startPosition: LinePosition;
+ endPosition: LinePosition;
+}
+
+interface CMNode {
+ sourceLocation?: CMLocation;
+ diagnostics?: CMDiagnostics[];
+}
+
+interface CMFunctionNode extends CMNode {
+ id: string;
+ label: string;
+ interactions: CMInteraction[];
+ parameters: CMParameter[];
+ returns: string[];
+}
+
+export interface CMEntryPoint extends CMFunctionNode {
+ annotation: CMAnnotation;
+ type?: 'scheduledTask' | 'manualTrigger';
+ dependencies: string[];
+}
+
+export interface CMService extends CMNode {
+ id: string;
+ label: string;
+ remoteFunctions: CMRemoteFunction[];
+ resourceFunctions: CMResourceFunction[];
+ type: string;
+ dependencies: string[];
+ annotation: CMAnnotation;
+ deploymentMetadata?: CMDeploymentMetadata;
+ isNoData?: boolean;
+ dataInProgress?: boolean;
+}
+
+export interface CMAnnotation extends CMNode {
+ id: string;
+ label: string;
+}
+
+export interface CMDependency extends CMNode {
+ id: string;
+ type: string;
+ onPlatform?: boolean;
+ serviceLabel?: string;
+}
+
+export interface CMResourceFunction extends CMFunctionNode {
+ path: string;
+}
+
+export interface CMRemoteFunction extends CMFunctionNode {
+ name: string;
+}
+
+export interface CMInteraction extends CMNode {
+ id: string;
+ type: string;
+ serviceId: string;
+ serviceLabel?: string;
+}
+
+export interface CMParameter extends CMNode {
+ in?: string;
+ isRequired: boolean;
+ name: string;
+ type: string[];
+}
+
+export interface CMEntity extends CMNode {
+ attributes: CMAttribute[];
+ inclusions: string[];
+ isAnonymous: boolean;
+}
+
+export interface CMAttribute extends CMNode {
+ name: string;
+ type: string;
+ defaultValue: string;
+ required: boolean;
+ nillable: boolean;
+ isReadOnly?: boolean;
+ associations: CMAssociation[];
+}
+
+export interface CMAssociation {
+ associate: string;
+ cardinality: CMCardinality;
+}
+
+export interface CMCardinality {
+ associate: string;
+ self: string;
+}
+
+export interface CMDeploymentMetadata {
+ gateways: {
+ internet: {
+ isExposed: boolean;
+ },
+ intranet: {
+ isExposed: boolean;
+ }
+ }
+}
+
+export enum ComponentType {
+ SERVICE = "service",
+ WEB_APP = "web-app",
+ SCHEDULED_TASK = "scheduled-task",
+ MANUAL_TASK = "manual-task",
+ API_PROXY = "api-proxy",
+ WEB_HOOK = "web-hook",
+ EVENT_HANDLER = "event-handler",
+ TEST = "test",
+}
+
+export declare enum ComponentDisplayType {
+ RestApi = "restAPI",
+ ManualTrigger = "manualTrigger",
+ ScheduledTask = "scheduledTask",
+ Webhook = "webhook",
+ Websocket = "webSocket",
+ Proxy = "proxy",
+ ByocCronjob = "byocCronjob",
+ ByocJob = "byocJob",
+ GraphQL = "graphql",
+ ByocWebApp = "byocWebApp",
+ ByocWebAppDockerLess = "byocWebAppsDockerfileLess",
+ ByocRestApi = "byocRestApi",
+ ByocWebhook = "byocWebhook",
+ MiRestApi = "miRestApi",
+ MiEventHandler = "miEventHandler",
+ Service = "ballerinaService",
+ ByocService = "byocService",
+ MiApiService = "miApiService"
+}
\ No newline at end of file
diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/config-spec.ts b/workspaces/ballerina/ballerina-core/src/interfaces/config-spec.ts
new file mode 100644
index 00000000000..4fb9496ee80
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/interfaces/config-spec.ts
@@ -0,0 +1,416 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { NodePosition, STNode } from "@wso2/syntax-tree";
+import { STModification, TypeInfo } from "./ballerina";
+
+export enum GenerationType {
+ ASSIGNMENT,
+ NEW
+}
+
+export enum PrimitiveBalType {
+ String = "string",
+ Record = "record",
+ Union = "union",
+ Enum = "enum",
+ Int = "int",
+ Float = "float",
+ Boolean = "boolean",
+ Array = "array",
+ Json = "json",
+ Xml = "xml",
+ Nil = "nil",
+ Var = "var",
+ Error = "error",
+ Decimal = "decimal"
+}
+
+export enum OtherBalType {
+ Map = "map",
+ Object = "object",
+ Stream = "stream",
+ Table = "table",
+ Null = "()"
+}
+
+export const AnydataType = "anydata";
+export const AnyType = "any";
+
+export const httpResponse: NonPrimitiveBal = {
+ orgName: 'ballerina',
+ moduleName: 'http',
+ name: 'Response',
+}
+
+export const httpRequest: NonPrimitiveBal = {
+ orgName: 'ballerina',
+ moduleName: 'http',
+ name: 'Request',
+}
+
+export interface NonPrimitiveBal {
+ orgName: string;
+ moduleName: string;
+ name: string;
+ version?: string;
+}
+
+// tslint:disable-next-line: max-classes-per-file
+export type balTypes = "string" | "record" | "union" | "int" | "float" | "decimal" | "boolean" | "array" | "json" | "xml" | "nil" | "http:Request" | "var" | "error" | undefined;
+
+export type BallerinaType = PrimitiveBalType | NonPrimitiveBal;
+
+export type ExpressionEditorType = BallerinaType | BallerinaType[];
+
+export interface FunctionDefinitionInfo {
+ name: string;
+ documentation: string;
+ parameters: FormField[];
+ pathParams?: PathParam[];
+ returnType?: FormField;
+ qualifiers?: string[];
+ isRemote?: boolean; // TODO: remove this
+ displayAnnotation?: any;
+}
+
+export interface FormField {
+ typeName: string;
+ name?: string;
+ displayName?: string;
+ memberType?: FormField;
+ inclusionType?: FormField;
+ paramType?: FormField;
+ selectedDataType?: string;
+ description?: string;
+ defaultValue?: any;
+ value?: any;
+ optional?: boolean;
+ defaultable?: boolean;
+ fields?: FormField[];
+ members?: FormField[];
+ references?: FormField[];
+ restType?: FormField;
+ constraintType?: FormField;
+ rowType?: FormField;
+ keys?: string[];
+ isReturn?: boolean;
+ isTypeDef?: boolean;
+ isReference?: boolean;
+ isStream?: boolean;
+ isErrorUnion?: boolean;
+ typeInfo?: NonPrimitiveBal;
+ hide?: boolean;
+ aiSuggestion?: string;
+ noCodeGen?: boolean;
+ requestName?: string; // only for http form used when there's a request object in the request
+ tooltip?: string;
+ tooltipActionLink?: string;
+ tooltipActionText?: string;
+ isErrorType?: boolean;
+ isRestParam?: boolean; // TODO: unified rest params
+ hasRestType?: boolean;
+ isRestType?: boolean;
+ customAutoComplete?: string[];
+ validationRegex?: any;
+ leftTypeParam?: any;
+ rightTypeParam?: any;
+ initialDiagnostics?: DiagramDiagnostic[];
+ documentation?: string;
+ displayAnnotation?: any;
+ position?: NodePosition;
+ selected?: boolean;
+}
+
+export interface PathParam {
+ name: string;
+ typeName: string;
+ isRestType: boolean;
+}
+
+export interface FormFieldReturnType {
+ hasError: boolean;
+ hasReturn: boolean;
+ returnType: string;
+ importTypeInfo?: NonPrimitiveBal[];
+}
+
+export interface FormFieldChecks {
+ name: string;
+ isValid: boolean;
+ isEmpty?: boolean;
+ canIgnore?: boolean; // Ff field is optional or defaultable
+}
+
+// tslint:disable-next-line: max-classes-per-file
+export class ResponsePayloadMap {
+ payloadTypes: Map = new Map();
+ isPayloadSelected: boolean = false;
+ selectedPayloadType?: string;
+ payloadVariableName?: string;
+}
+
+
+// tslint:disable-next-line: max-classes-per-file
+export class ActionConfig {
+ public isRemote: boolean = true;
+ public name: string = "";
+ public returnVariableName?: string = "";
+ public returnType?: string = "";
+ public fields: FormField[] = [];
+ public isReturnValueIgnored?: boolean;
+}
+
+// tslint:disable-next-line: max-classes-per-file
+export class ConnectorConfig {
+ public connectionName?: string = "";
+ public name?: string = "";
+ public connectorInit: FormField[] = [];
+ public action: ActionConfig;
+ public existingConnections?: any;
+ public isExistingConnection?: boolean;
+ public subExitingConnection?: string;
+ public isNewConnector?: boolean;
+ public responsePayloadMap?: ResponsePayloadMap;
+ public initPosition?: NodePosition;
+ public isReturnError?: boolean;
+ public isConnectionNameUpdated?: boolean;
+ public qualifiers?: string[];
+}
+
+export interface ConfigurationSpec {
+ type: string;
+ name: string;
+ icon?: symbol;
+ description?: string;
+ size?: "small" | "medium";
+}
+
+export enum WizardType {
+ NEW,
+ EXISTING
+}
+
+export function getPrimitiveType(type: string): PrimitiveBalType {
+ let typeString: PrimitiveBalType;
+ switch (type) {
+ case "var":
+ typeString = PrimitiveBalType.Var;
+ break;
+ case "string":
+ typeString = PrimitiveBalType.String;
+ break;
+ case "int":
+ typeString = PrimitiveBalType.Int;
+ break;
+ case "float":
+ typeString = PrimitiveBalType.Float;
+ break;
+ case "record":
+ typeString = PrimitiveBalType.Record;
+ break;
+ case "|":
+ typeString = PrimitiveBalType.Union;
+ break;
+ case "boolean":
+ typeString = PrimitiveBalType.Boolean;
+ break;
+ case "[]":
+ typeString = PrimitiveBalType.Array;
+ break;
+ case "json":
+ typeString = PrimitiveBalType.Json;
+ break;
+ case "xml":
+ typeString = PrimitiveBalType.Xml;
+ break;
+ case "nil":
+ typeString = PrimitiveBalType.Nil;
+ break;
+ default:
+ typeString = undefined;
+ break;
+ }
+ return typeString;
+}
+
+export interface ManualConfigType {
+ name: string,
+ value: string
+}
+
+export interface DiagramDiagnostic {
+ message: string,
+ diagnosticInfo: {
+ code: string,
+ severity: string
+ },
+ range: NodePosition
+}
+
+export interface InjectableItem {
+ id: string;
+ modification: STModification;
+ name?: string;
+ value?: string;
+}
+
+export interface ExpressionInjectablesProps {
+ list: InjectableItem[];
+ setInjectables: (InjectableItem: InjectableItem[]) => void;
+}
+
+export interface DiagnosticMsgSeverity {
+ message: string,
+ severity: string
+}
+
+export interface ConditionConfig {
+ type: string;
+ conditionExpression?: string | ForeachConfig | ElseIfConfig;
+ scopeSymbols?: string[];
+ conditionPosition?: NodePosition;
+ model?: STNode
+}
+
+export interface ForeachConfig {
+ variable: string;
+ collection: string;
+ type: string;
+ model?: STNode
+}
+
+export interface ElseIfConfig {
+ values: { id: number, expression: string, position: NodePosition }[]
+}
+
+export interface ProcessConfig {
+ type: string;
+ config?: string | LogConfig | RespondConfig | CustomExpressionConfig | WorkerConfig | SendStatementConfig
+ | ReceivestatementConfig | WaitStatementConfig;
+ scopeSymbols?: string[];
+ model?: STNode;
+ wizardType?: WizardType;
+ targetPosition?: NodePosition;
+}
+
+export interface LogConfig {
+ type: string;
+ expression: string;
+}
+
+
+export interface WorkerConfig {
+ name: string;
+ returnType: string;
+}
+
+export interface SendStatementConfig {
+ expression: string;
+ targetWorker: string;
+}
+
+export interface ReceivestatementConfig {
+ type: string;
+ varName: string;
+ senderWorker: string;
+}
+
+export interface WaitStatementConfig {
+ type: string;
+ varName: string;
+ expression: string;
+}
+
+export interface FlushStatementConfig {
+ varName: string;
+ expression: string;
+}
+
+export interface CustomExpressionConfig {
+ expression: string;
+}
+
+export interface RespondConfig {
+ genType: string;
+ caller: string;
+ respondExpression: string;
+ variable: string;
+ responseCode?: string;
+}
+
+export interface DataMapperInputTypeInfo {
+ type: string;
+ name: string;
+ node?: STNode;
+}
+
+export interface DataMapperOutputTypeInfo {
+ variableName?: string;
+ type: string;
+ node?: STNode;
+ generationType?: GenerationType;
+ typeInfo?: TypeInfo;
+ startLine?: number;
+ fields?: DataMapperOutputField[];
+ sampleStructure?: string;
+ fieldsGenerated?: boolean;
+ saved?: boolean
+ typeDefInSameModule?: boolean;
+}
+
+export interface DataMapperConfig {
+ inputTypes: DataMapperInputTypeInfo[]; // todo ::: finalize the interface
+ outputType: DataMapperOutputTypeInfo;
+}
+
+export interface DataMapperOutputField {
+ name: string;
+ type: string;
+ fields?: DataMapperOutputField[];
+ value?: string;
+ isChanged: boolean;
+}
+
+export interface EndConfig {
+ type: string;
+ expression?: string | RespondConfig;
+ scopeSymbols?: string[];
+ wizardType?: WizardType;
+ model?: STNode;
+}
+
+export interface HTTPServiceConfigState {
+ serviceBasePath: string;
+ listenerConfig: ListenerConfigFormState,
+ hasInvalidConfig?: boolean
+}
+
+export interface ListenerConfigFormState {
+ createNewListener?: boolean;
+ fromVar?: boolean,
+ listenerName?: string,
+ listenerPort?: string,
+}
+
+export interface ServiceConfigState {
+ serviceBasePath: string;
+ listenerConfig: ListenerConfigFormState,
+ serviceType?: string
+}
diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/constants.ts b/workspaces/ballerina/ballerina-core/src/interfaces/constants.ts
new file mode 100644
index 00000000000..c8d90f609a7
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/interfaces/constants.ts
@@ -0,0 +1,53 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+export enum SHARED_COMMANDS {
+ FORCE_UPDATE_PROJECT_ARTIFACTS = 'ballerina.force.update.artifacts',
+ SHOW_VISUALIZER = 'ballerina.show.visualizer',
+ GET_STATE_CONTEXT = 'ballerina.get.stateContext',
+ OPEN_BI_WELCOME = 'ballerina.open.bi.welcome',
+ OPEN_BI_NEW_PROJECT = 'ballerina.open.bi.new',
+ OPEN_SERVICE_FORM = 'ballerina.open.service.form',
+ OPEN_AI_PANEL = 'ballerina.open.ai.panel',
+ CLOSE_AI_PANEL = 'ballerina.close.ai.panel',
+ OPEN_AGENT_CHAT = 'ballerina.open.agent.chat'
+}
+
+export const BI_COMMANDS = {
+ BI_RUN_PROJECT: 'BI.project.run',
+ BI_DEBUG_PROJECT: 'BI.project.debug',
+ REFRESH_COMMAND: 'BI.project-explorer.refresh',
+ FOCUS_PROJECT_EXPLORER: 'BI.project-explorer.focus',
+ PROJECT_EXPLORER: 'BI.project-explorer',
+ ADD_CONNECTIONS: 'BI.project-explorer.add-connection',
+ DELETE_COMPONENT: 'BI.project-explorer.delete',
+ ADD_ENTRY_POINT: 'BI.project-explorer.add-entry-point',
+ ADD_TYPE: 'BI.project-explorer.add-type',
+ VIEW_TYPE_DIAGRAM: 'BI.project-explorer.view-type-diagram',
+ ADD_FUNCTION: 'BI.project-explorer.add-function',
+ OPEN_TYPE_DIAGRAM: 'BI.view.typeDiagram',
+ ADD_CONFIGURATION: 'BI.project-explorer.add-configuration',
+ ADD_PROJECT: 'BI.project-explorer.add',
+ SHOW_OVERVIEW: 'BI.project-explorer.overview',
+ SWITCH_PROJECT: 'BI.project-explorer.switch-project',
+ ADD_DATA_MAPPER: 'BI.project-explorer.add-data-mapper',
+ BI_EDIT_TEST_FUNCTION: 'BI.test.edit.function',
+ BI_ADD_TEST_FUNCTION: 'BI.test.add.function',
+ BI_EDIT_TEST_FUNCTION_DEF: 'BI.test.edit.function.def',
+ ADD_NATURAL_FUNCTION: 'BI.project-explorer.add-natural-function',
+};
diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/event.ts b/workspaces/ballerina/ballerina-core/src/interfaces/event.ts
new file mode 100644
index 00000000000..80053d531dd
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/interfaces/event.ts
@@ -0,0 +1,61 @@
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+// types related track lowcode events
+export const ADD_STATEMENT = "editor-workspace-add-statement";
+export const SAVE_STATEMENT = "editor-workspace-save-statement";
+
+export const ADD_CONNECTOR = "editor-workspace-add-connector";
+export const SAVE_CONNECTOR = "editor-workspace-save-connector";
+export const LOAD_CONNECTOR_LIST = "editor-workspace-load-connector-list";
+export const SEARCH_CONNECTOR = "editor-workspace-search-connector";
+export const SAVE_CONNECTOR_INIT = "editor-workspace-save-connector-init";
+export const SAVE_CONNECTOR_INVOKE = "editor-workspace-save-connector-invoke";
+export const CONNECTOR_CLOSED = "editor-workspace-connector-form-closed";
+export const DIAGRAM_MODIFIED = "editor-workspace-edit-diagram";
+export const SELECT_CONNECTOR = "editor-workspace-select-connector";
+export const DELETE_CONNECTOR = "editor-workspace-delete-connector";
+
+export const ADD_CONFIGURABLE = "editor-workspace-add-configurable";
+
+export const ADD_VARIABLE = "editor-workspace-add-variable";
+export const SAVE_VARIABLE = "editor-workspace-save-variable";
+export const ADD_OTHER_STATEMENT = "editor-workspace-add-other-statement";
+export const SAVE_OTHER_STATEMENT = "editor-workspace-save-other-statement";
+
+export const OPEN_LOW_CODE = "editor-workspace-open";
+
+export type EVENT_NAME = typeof ADD_STATEMENT |
+ typeof SAVE_STATEMENT | typeof ADD_CONNECTOR |
+ typeof SAVE_CONNECTOR_INIT | typeof SAVE_CONNECTOR |
+ typeof SAVE_CONNECTOR_INVOKE |
+ typeof CONNECTOR_CLOSED | typeof ADD_VARIABLE | typeof SAVE_VARIABLE | typeof ADD_CONNECTOR | typeof SAVE_CONNECTOR |
+ typeof ADD_OTHER_STATEMENT | typeof SAVE_OTHER_STATEMENT | typeof SEARCH_CONNECTOR | typeof ADD_CONFIGURABLE |
+ typeof OPEN_LOW_CODE | typeof DIAGRAM_MODIFIED | typeof LOAD_CONNECTOR_LIST | typeof SELECT_CONNECTOR | typeof DELETE_CONNECTOR;
+
+export interface LowcodeEvent {
+ /** Name of the app insights event */
+ type: EVENT_NAME;
+ name?: string;
+ /** scope property within custom dimensions */
+ connectorName?: string;
+ /** Custom dimensions sent to app insights */
+ property?: { [key: string]: string };
+ /** Custom measurements sent to app insights */
+ measurements?: { [key: string]: number; };
+}
diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts
new file mode 100644
index 00000000000..93c7032bbc0
--- /dev/null
+++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts
@@ -0,0 +1,1628 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
+/**
+ * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved.
+ *
+ * WSO2 LLC. licenses this file to you under the Apache License,
+ * Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { CodeAction, Diagnostic, DocumentSymbol, SymbolInformation, TextDocumentItem, WorkspaceEdit } from "vscode-languageserver-types";
+import { CMDiagnostics, ComponentModel } from "./component";
+import { DocumentIdentifier, LinePosition, LineRange, NOT_SUPPORTED_TYPE, Position, Range } from "./common";
+import { BallerinaConnectorInfo, BallerinaExampleCategory, BallerinaModuleResponse, BallerinaModulesRequest, BallerinaTrigger, BallerinaTriggerInfo, BallerinaConnector, ExecutorPosition, ExpressionRange, JsonToRecordMapperDiagnostic, MainTriggerModifyRequest, NoteBookCellOutputValue, NotebookCellMetaInfo, OASpec, PackageSummary, PartialSTModification, ResolvedTypeForExpression, ResolvedTypeForSymbol, STModification, SequenceModel, SequenceModelDiagnostic, ServiceTriggerModifyRequest, SymbolDocumentation, XMLToRecordConverterDiagnostic, TypeField, ComponentInfo } from "./ballerina";
+import { ModulePart, STNode } from "@wso2/syntax-tree";
+import { CodeActionParams, DefinitionParams, DocumentSymbolParams, ExecuteCommandParams, InitializeParams, InitializeResult, LocationLink, RenameParams } from "vscode-languageserver-protocol";
+import { Category, Flow, FlowNode, CodeData, ConfigVariable, FunctionNode, Property, PropertyTypeMemberInfo, DIRECTORY_MAP, Imports } from "./bi";
+import { ConnectorRequest, ConnectorResponse } from "../rpc-types/connector-wizard/interfaces";
+import { SqFlow } from "../rpc-types/sequence-diagram/interfaces";
+import { FieldType, FunctionModel, ListenerModel, ServiceClassModel, ServiceModel } from "./service";
+import { CDModel } from "./component-diagram";
+import { IDMModel, Mapping } from "./inline-data-mapper";
+import { SCOPE } from "../state-machine-types";
+
+export interface DidOpenParams {
+ textDocument: TextDocumentItem;
+}
+
+export interface DidCloseParams {
+ textDocument: {
+ uri: string;
+ };
+}
+
+export interface DidChangeParams {
+ textDocument: {
+ uri: string;
+ version: number;
+ };
+ contentChanges: [
+ {
+ text: string;
+ }
+ ];
+}
+
+export interface CompletionParams {
+ textDocument: {
+ uri: string;
+ };
+ position: {
+ character: number;
+ line: number;
+ };
+ context: {
+ triggerKind: number;
+ };
+}
+
+export interface Completion {
+ detail: string;
+ insertText: string;
+ insertTextFormat: number;
+ kind: number;
+ label: string;
+ additionalTextEdits?: TextEdit[];
+ documentation?: string;
+ sortText?: string;
+ filterText?: string;
+}
+
+export interface TextEdit {
+ newText: string,
+ range: {
+ end: {
+ character: number;
+ line: number;
+ },
+ start: {
+ character: number;
+ line: number;
+ }
+ }
+}
+
+export interface DidChangeWatchedFileParams {
+ changes: Change[];
+}
+
+export interface Change {
+ uri: string;
+ type: number;
+}
+
+// <-------- BALLERINA RELATED --------->
+
+interface BallerinaCapability {
+ name: string;
+ [key: string]: boolean | string;
+}
+
+export interface BallerinaInitializeParams {
+ ballerinaClientCapabilities: BallerinaCapability[];
+}
+
+export interface BallerinaInitializeResult {
+ ballerinaServerCapabilities: BallerinaCapability[];
+}
+
+export interface ComponentModelsParams {
+ documentUris: string[];
+}
+
+export interface ComponentModels {
+ componentModels: {
+ [key: string]: ComponentModel;
+ };
+ diagnostics: CMDiagnostics[];
+}
+
+export interface PersistERModelParams {
+ documentUri: string;
+}
+
+export interface PersistERModel {
+ persistERModel: {
+ [key: string]: ComponentModel;
+ };
+ diagnostics: CMDiagnostics[];
+}
+
+export interface DiagnosticsParams {
+ documentIdentifier: {
+ uri: string;
+ };
+}
+
+export interface Diagnostics {
+ uri: string;
+ diagnostics: Diagnostic[];
+}
+
+export interface ExpressionType {
+ documentIdentifier: {
+ uri: string;
+ };
+ types: string[];
+}
+
+export interface ConnectorsParams extends BallerinaModulesRequest { }
+
+export interface Connectors {
+ central: BallerinaConnector[];
+ local?: BallerinaConnector[];
+ error?: string;
+}
+
+export interface TriggersParams extends BallerinaModulesRequest { }
+
+export interface Triggers extends BallerinaModuleResponse {
+ central: BallerinaTrigger[];
+ error?: string;
+}
+
+export interface ConnectorParams extends BallerinaConnector { }
+
+export interface Connector extends BallerinaConnectorInfo {
+ error?: string;
+}
+
+export interface TriggerParams {
+ id?: string;
+ orgName?: string;
+ packageName?: string;
+}
+
+export interface Trigger extends BallerinaTriggerInfo {
+ error?: string;
+}
+
+export interface RecordParams {
+ org: string;
+ module: string;
+ version: string;
+ name: string;
+}
+
+export interface BallerinaRecord {
+ org: string;
+ module: string;
+ version: string;
+ name: string;
+ ast?: STNode;
+ error?: any;
+}
+
+export interface STModifyParams {
+ documentIdentifier: { uri: string; };
+ astModifications: STModification[];
+}
+
+export interface BallerinaSTParams {
+ lineRange: Range;
+ documentIdentifier: DocumentIdentifier;
+}
+
+export type TriggerModifyParams = MainTriggerModifyRequest | ServiceTriggerModifyRequest;
+
+export interface SymbolInfoParams {
+ textDocumentIdentifier: {
+ uri: string;
+ },
+ position: {
+ line: number;
+ character: number;
+ }
+}
+
+export interface SymbolInfo {
+ symbolKind: string,
+ documentation: SymbolDocumentation
+}
+
+export interface TypeFromExpressionParams {
+ documentIdentifier: {
+ uri: string;
+ };
+ expressionRanges: ExpressionRange[];
+}
+
+export interface TypesFromExpression {
+ types: ResolvedTypeForExpression[];
+}
+
+export interface TypeFromSymbolParams {
+ documentIdentifier: {
+ uri: string;
+ };
+ positions: LinePosition[];
+}
+
+export interface TypesFromSymbol {
+ types: ResolvedTypeForSymbol[];
+}
+
+export interface TypesFromFnDefinitionParams {
+ documentIdentifier: {
+ uri: string;
+ };
+ fnPosition: LinePosition;
+ returnTypeDescPosition: LinePosition;
+}
+
+export interface VisibleVariableTypesParams {
+ filePath: string;
+ position: LinePosition;
+}
+
+export interface VisibleVariableTypes {
+ categories: VisibleType[];
+}
+
+export interface VisibleType {
+ name: string;
+ types: TypeWithIdentifier[];
+}
+
+export interface TypeWithIdentifier {
+ name: string;
+ type: TypeField;
+}
+
+export interface InlineDataMapperModelRequest {
+ filePath: string;
+ flowNode: FlowNode;
+ propertyKey: string;
+ position: LinePosition;
+}
+
+export interface InlineDataMapperSourceRequest extends InlineDataMapperModelRequest {
+ mappings: Mapping[];
+}
+
+export interface VisualizableFieldsRequest {
+ filePath: string;
+ flowNode: FlowNode;
+ position: LinePosition;
+}
+
+export interface InlineDataMapperModelResponse {
+ mappingsModel: IDMModel;
+}
+
+export interface InlineDataMapperSourceResponse {
+ source: string;
+}
+
+export interface VisualizableFieldsResponse {
+ visualizableProperties: string[];
+}
+
+export interface AddArrayElementRequest {
+ filePath: string;
+ flowNode: FlowNode;
+ position: LinePosition;
+ propertyKey: string;
+ targetField: string;
+}
+
+export interface GraphqlDesignServiceParams {
+ filePath: string;
+ startLine: LinePosition;
+ endLine: LinePosition;
+}
+
+export interface GraphqlDesignService {
+ graphqlDesignModel: any;
+ isIncompleteModel: boolean;
+ errorMsg: string;
+}
+
+export interface SyntaxTreeParams {
+ documentIdentifier: {
+ uri: string;
+ };
+}
+
+export interface SyntaxTree {
+ syntaxTree: ModulePart | STNode;
+ parseSuccess: boolean;
+ source?: string;
+ defFilePath?: string;
+}
+
+export interface BallerinaExampleListParams {
+ filter?: string;
+}
+
+export interface BallerinaExampleList {
+ samples: Array;
+}
+
+export interface BallerinaProjectParams {
+ documentIdentifier: DocumentIdentifier;
+}
+
+export interface BallerinaProject {
+ kind?: string;
+ path?: string;
+ version?: string;
+ author?: string;
+ packageName?: string;
+ orgName?: string;
+}
+
+export interface BallerinaPackagesParams {
+ documentIdentifiers: DocumentIdentifier[];
+}
+
+export interface BallerinaProjectComponents {
+ packages?: PackageSummary[];
+}
+
+export interface PackageConfigSchema {
+ configSchema: any;
+}
+
+export interface SyntaxTreeNodeParams {
+ documentIdentifier: DocumentIdentifier;
+ range: Range;
+}
+
+export interface SyntaxTreeNode {
+ kind: string;
+}
+
+export interface SequenceDiagramModelParams {
+ filePath: string;
+ startLine: LinePosition;
+ endLine: LinePosition;
+}
+
+export type SequenceDiagramModel = {
+ sequenceDiagram: SequenceModel;
+ modelDiagnostic?: SequenceModelDiagnostic
+};
+
+export interface ExecutorPositions {
+ executorPositions?: ExecutorPosition[];
+}
+
+// Test Manager related interfaces
+
+export interface TestsDiscoveryRequest {
+ filePath: string;
+}
+
+export interface TestsDiscoveryResponse {
+ result?: Map;
+ errorMsg?: string;
+ stacktrace?: string;
+}
+
+export interface FunctionTreeNode {
+ functionName: string;
+ lineRange: FunctionLineRange;
+ kind: string;
+ groups: string[];
+}
+
+export interface FunctionLineRange {
+ fileName: string;
+ startLine: LinePosition;
+ endLine: LinePosition;
+}
+
+export interface ICPEnabledRequest {
+ projectPath: string;
+}
+
+export interface ICPEnabledResponse {
+ enabled?: boolean;
+ errorMsg?: string;
+ stacktrace?: string;
+}
+
+export interface GetTestFunctionRequest {
+ filePath: string;
+ functionName: string;
+}
+
+export interface AddOrUpdateTestFunctionRequest {
+ filePath: string;
+ function: TestFunction;
+}
+
+export interface TestSourceEditResponse {
+ textEdits?: {
+ [key: string]: TextEdit[];
+ };
+ errorMsg?: string;
+ stacktrace?: string;
+}
+
+export interface GetTestFunctionResponse {
+ function?: TestFunction;
+ errorMsg?: string;
+ stacktrace?: string;
+}
+
+export interface TestFunctionMetadata {
+ label?: string;
+ description?: string;
+}
+
+export interface Codedata {
+ lineRange?: FunctionLineRange;
+}
+
+export interface ValueProperty {
+ metadata?: TestFunctionMetadata;
+ codedata?: Codedata;
+ valueType?: string;
+ valueTypeConstraint?: any;
+ originalName?: string;
+ value?: any;
+ placeholder?: string;
+ optional?: boolean;
+ editable?: boolean;
+ advanced?: boolean;
+ imports?: Imports;
+}
+
+export interface FunctionParameter {
+ type?: ValueProperty;
+ variable?: ValueProperty;
+ defaultValue?: ValueProperty;
+ optional?: boolean;
+ editable?: boolean;
+ advanced?: boolean;
+}
+
+export interface Annotation {
+ metadata?: TestFunctionMetadata;
+ codedata?: Codedata;
+ org?: string;
+ module?: string;
+ name?: string;
+ fields?: ValueProperty[];
+}
+
+export interface TestFunction {
+ metadata?: TestFunctionMetadata;
+ codedata?: Codedata;
+ functionName?: ValueProperty;
+ returnType?: ValueProperty;
+ parameters?: FunctionParameter[];
+ annotations?: Annotation[];
+ editable?: boolean;
+}
+
+// End of Test Manager related interfaces
+
+export interface JsonToRecordParams {
+ jsonString: string;
+ recordName: string;
+ isRecordTypeDesc: boolean;
+ isClosed: boolean;
+ forceFormatRecordFields?: boolean;
+ prefix?: string;
+ filePathUri?: string;
+}
+
+export interface TypeDataWithReferences {
+ types: {
+ type: Type;
+ refs: string[];
+ }[];
+}
+
+export interface JsonToRecord {
+ codeBlock: string;
+ diagnostics?: JsonToRecordMapperDiagnostic[];
+}
+
+export interface XMLToRecordParams {
+ xmlValue: string;
+ isRecordTypeDesc?: boolean;
+ isClosed?: boolean;
+ forceFormatRecordFields?: boolean;
+ prefix?: string;
+ filePath?: string;
+}
+
+export interface XMLToRecord {
+ codeBlock: string;
+ diagnostics?: XMLToRecordConverterDiagnostic[];
+}
+
+export interface NoteBookCellOutputParams {
+ source: string;
+}
+
+export interface NoteBookCellOutput {
+ shellValue?: NoteBookCellOutputValue;
+ errors: string[];
+ diagnostics: string[];
+ metaInfo?: NotebookCellMetaInfo;
+ consoleOut: string;
+}
+
+export interface NotebookFileSource {
+ content: string;
+ filePath: string;
+}
+
+export interface NotebookVariable {
+ name: string;
+ type: string;
+ value: string;
+}
+
+export interface NotebookDeleteDclnParams {
+ varToDelete: string;
+}
+
+export interface PartialSTParams {
+ codeSnippet: string;
+ stModification?: PartialSTModification;
+}
+
+export interface PartialST {
+ syntaxTree: STNode;
+}
+
+export interface OpenAPIConverterParams {
+ documentFilePath: string;
+ enableBalExtension?: boolean;
+}
+
+export interface OpenAPISpec {
+ content: OASpec[];
+ error?: string;
+}
+
+// <------ OTHERS -------
+
+export interface PerformanceAnalyzerParams {
+ documentIdentifier: DocumentIdentifier;
+ isWorkerSupported: boolean;
+}
+
+export interface PerformanceAnalyzer {
+ resourcePos: Range;
+ endpoints: any;
+ actionInvocations: any;
+ type: string;
+ message: string;
+ name: string;
+}
+
+export interface BallerinaServerCapability {
+ name: string;
+ [key: string]: boolean | string;
+}
+
+export interface ProjectDiagnosticsRequest {
+ projectRootIdentifier: DocumentIdentifier;
+}
+
+export interface ProjectDiagnosticsResponse {
+ errorDiagnosticMap?: Map;
+}
+
+export interface MainFunctionParamsRequest {
+ projectRootIdentifier: DocumentIdentifier;
+}
+
+export interface MainFunctionParamsResponse {
+ hasMain: boolean;
+ params?: TypeBindingPair[];
+ restParams?: TypeBindingPair;
+}
+
+export interface TypeBindingPair {
+ type: string;
+ paramName: string;
+ defaultValue?: string;
+}
+
+// <------------ EXTENDED LANG CLIENT INTERFACE --------->
+
+
+
+// <------------ BI INTERFACES --------->
+export interface BIFlowModelRequest {
+ filePath: string;
+ startLine: LinePosition;
+ endLine: LinePosition;
+ forceAssign?: boolean;
+}
+
+export interface BISuggestedFlowModelRequest extends BIFlowModelRequest {
+ text: string;
+ position: LinePosition;
+}
+
+export type BIFlowModelResponse = {
+ flowModel?: Flow;
+ errorMsg?: string;
+ stacktrace?: string;
+};
+
+export interface BISourceCodeRequest {
+ filePath: string;
+ flowNode: FlowNode | FunctionNode;
+ isConnector?: boolean;
+ isFunctionNodeUpdate?: boolean;
+}
+
+export type BISourceCodeResponse = {
+ textEdits: {
+ [key: string]: TextEdit[];
+ };
+};
+
+export type BIDeleteByComponentInfoRequest = {
+ filePath: string;
+ component: ComponentInfo;
+}
+
+export type BIDeleteByComponentInfoResponse = {
+ textEdits: {
+ [key: string]: TextEdit[];
+ };
+};
+
+export interface BIAvailableNodesRequest {
+ position: LinePosition;
+ filePath: string;
+}
+
+export type BIAvailableNodesResponse = {
+ categories: Category[];
+};
+
+export interface BIGetVisibleVariableTypesRequest {
+ filePath: string;
+ position: LinePosition;
+}
+
+export interface BIGetVisibleVariableTypesResponse {
+ categories: VisibleType[];
+}
+
+export interface BINodeTemplateRequest {
+ position: LinePosition;
+ filePath: string;
+ id: CodeData;
+ forceAssign?: boolean;
+}
+
+export type BINodeTemplateResponse = {
+ flowNode: FlowNode;
+};
+
+export interface BIModuleNodesRequest {
+ filePath: string;
+}
+
+export type BIModuleNodesResponse = {
+ flowModel: Flow;
+};
+
+export type SearchQueryParams = {
+ q?: string;
+ limit?: number;
+ offset?: number;
+ includeAvailableFunctions?: string;
+}
+
+export type SearchKind = 'FUNCTION' | 'CONNECTOR' | 'TYPE' | "NP_FUNCTION";
+
+export type BISearchRequest = {
+ position: LineRange;
+ filePath: string;
+ queryMap: SearchQueryParams;
+ searchKind: SearchKind;
+}
+
+export type BISearchResponse = {
+ categories: Category[];
+}
+
+export type BIGetEnclosedFunctionRequest = {
+ filePath: string;
+ position: LinePosition;
+ findClass?: boolean;
+}
+
+export type BIGetEnclosedFunctionResponse = {
+ filePath: string;
+ startLine: LinePosition;
+ endLine: LinePosition;
+}
+
+export type BIConnectorsRequest = {
+ queryMap: SearchQueryParams;
+}
+
+export type BIConnectorsResponse = {
+ categories: Category[];
+}
+
+export type ServiceFromOASRequest = {
+ openApiContractPath: string;
+ projectPath: string;
+ port: number;
+}
+
+export type ServiceFromOASResponse = {
+ service: {
+ fileName: string,
+ startLine: LinePosition;
+ endLine: LinePosition;
+ },
+ errorMsg?: string;
+}
+
+export interface ConfigVariableRequest {
+ projectPath: string;
+ includeLibraries?: boolean;
+}
+
+export type ConfigVariableResponse = {
+ configVariables: ConfigVariable[];
+ errorMsg?: any;
+}
+
+export interface UpdateConfigVariableRequest {
+ configFilePath: string;
+ configVariable: ConfigVariable;
+}
+
+export interface UpdateConfigVariableResponse {
+
+}
+
+export interface UpdateConfigVariableRequestV2 {
+ configFilePath: string;
+ configVariable: FlowNode | FunctionNode;
+ packageName: string;
+ moduleName: string;
+}
+
+export type UpdateConfigVariableResponseV2 = {
+ textEdits: {
+ [key: string]: TextEdit[];
+ };
+ errorMsg?: any;
+};
+
+export interface DeleteConfigVariableRequestV2 {
+ configFilePath: string;
+ configVariable: FlowNode | FunctionNode;
+ packageName: string;
+ moduleName: string;
+}
+
+export type DeleteConfigVariableResponseV2 = {
+ textEdits: {
+ [key: string]: TextEdit[];
+ };
+ errorMsg?: any;
+};
+
+export interface GetConfigVariableNodeTemplateRequest {
+ isNew: boolean;
+}
+
+export interface OpenConfigTomlRequest {
+ filePath: string
+}
+
+export interface BICopilotContextRequest {
+ position: LinePosition;
+ filePath: string;
+}
+
+export interface BICopilotContextResponse {
+ prefix: string;
+ suffix: string;
+}
+
+export interface BIDesignModelRequest {
+ projectPath: string;
+}
+
+export type BIDesignModelResponse = {
+ designModel: CDModel;
+};
+
+export interface SequenceModelRequest {
+ filePath: string;
+ startLine: LinePosition;
+ endLine: LinePosition;
+}
+
+export type SequenceModelResponse = {
+ sequenceDiagram: SqFlow;
+};
+
+export interface ComponentsFromContent {
+ content: string;
+}
+
+export enum TriggerKind {
+ INVOKED = 1,
+ TRIGGER_CHARACTER = 2,
+ TRIGGER_FOR_INCOMPLETE_COMPLETIONS = 3,
+}
+
+export const TRIGGER_CHARACTERS = [':', '.', '>', '@', '/', '\\', '?'] as const;
+
+export type TriggerCharacter = typeof TRIGGER_CHARACTERS[number];
+
+export type ExpressionProperty = Property;
+
+export interface ExpressionEditorContext {
+ expression: string;
+ startLine: LinePosition;
+ offset: number;
+ lineOffset: number;
+ codedata: CodeData;
+ property: ExpressionProperty;
+}
+
+export interface ExpressionCompletionsRequest {
+ filePath: string;
+ context: ExpressionEditorContext;
+ completionContext: {
+ triggerKind: TriggerKind;
+ triggerCharacter?: TriggerCharacter;
+ };
+}
+
+export interface ExpressionCompletionItem {
+ label: string;
+ kind: number;
+ detail: string;
+ sortText: string;
+ filterText: string;
+ insertText: string;
+ insertTextFormat: number;
+ additionalTextEdits?: TextEdit[];
+}
+
+export type ExpressionCompletionsResponse = ExpressionCompletionItem[];
+
+export interface SignatureHelpRequest {
+ filePath: string;
+ context: ExpressionEditorContext;
+ signatureHelpContext: {
+ isRetrigger: boolean;
+ triggerCharacter?: TriggerCharacter;
+ triggerKind: number;
+ }
+}
+
+export interface SignatureInfo {
+ label: string;
+ documentation: {
+ kind: string;
+ value: string;
+ };
+ parameters: {
+ label: number[];
+ documentation: {
+ kind: string;
+ value: string;
+ }
+ }[];
+}
+
+export interface SignatureHelpResponse {
+ signatures: SignatureInfo[];
+ activeSignature: number;
+ activeParameter: number;
+}
+
+export interface VisibleTypesRequest {
+ filePath: string;
+ position: LinePosition;
+ typeConstraint?: string;
+}
+
+export interface VisibleTypeItem {
+ insertText: string;
+ kind: number;
+ label: string;
+ labelDetails: {
+ description: string;
+ detail: string;
+ }
+}
+
+export type VisibleTypesResponse = VisibleTypeItem[];
+
+export interface ReferenceLSRequest {
+ textDocument: {
+ uri: string;
+ };
+ position: {
+ character: number;
+ line: number;
+ };
+ context: {
+ includeDeclaration: boolean;
+ };
+}
+export interface Reference {
+ uri: string;
+ range: Range;
+}
+
+export interface ExpressionDiagnosticsRequest {
+ filePath: string;
+ context: ExpressionEditorContext;
+}
+
+export interface ExpressionDiagnosticsResponse {
+ diagnostics: Diagnostic[];
+}
+
+export interface UpdateImportsRequest {
+ filePath: string;
+ importStatement: string;
+}
+
+export interface ImportsInfoResponse {
+ prefix: string;
+ moduleId: string;
+}
+
+export interface UpdateImportsResponse extends ImportsInfoResponse {
+ importStatementOffset: number;
+}
+
+export const functionKinds = {
+ CURRENT: 'CURRENT',
+ IMPORTED: 'IMPORTED',
+ AVAILABLE: 'AVAILABLE'
+} as const;
+
+export type FunctionKind = typeof functionKinds[keyof typeof functionKinds];
+
+export interface AddFunctionRequest {
+ filePath: string;
+ codedata: CodeData;
+ kind: FunctionKind;
+ searchKind: SearchKind;
+}
+
+export interface AddImportItemResponse extends ImportsInfoResponse {
+ template: string;
+}
+
+export interface RenameIdentifierRequest {
+ fileName: string;
+ position: Position;
+ newName: string;
+}
+
+// <-------- Trigger Related ------->
+export interface TriggerModelsRequest {
+ organization?: string;
+ packageName?: string;
+ query?: string;
+ keyWord?: string;
+}
+
+export interface TriggerModelsResponse {
+ local: ServiceModel[];
+}
+
+// <-------- Trigger Related ------->
+
+// <-------- Service Designer Related ------->
+export interface ListenersRequest {
+ filePath: string;
+ moduleName: string;
+ orgName?: string;
+ pkgName?: string;
+ listenerTypeName?: string;
+}
+export interface ListenersResponse {
+ hasListeners: boolean;
+ listeners: string[];
+}
+export interface ListenerModelRequest {
+ moduleName: string;
+ orgName?: string;
+ pkgName?: string;
+ listenerTypeName?: string;
+}
+export interface ListenerModelResponse {
+ listener: ListenerModel;
+}
+
+export interface ListenerSourceCodeRequest {
+ filePath: string;
+ listener: ListenerModel;
+}
+export interface ListenerSourceCodeResponse {
+ textEdits: {
+ [key: string]: TextEdit[];
+ };
+}
+export interface ServiceModelRequest {
+ filePath: string;
+ moduleName: string;
+ listenerName?: string;
+ orgName?: string;
+ pkgName?: string;
+}
+export interface ServiceModelResponse {
+ service: ServiceModel;
+}
+export interface ServiceSourceCodeRequest {
+ filePath: string;
+ service: ServiceModel;
+}
+export interface ServiceSourceCodeResponse {
+ textEdits: {
+ [key: string]: TextEdit[];
+ };
+}
+
+export interface ClassFieldModifierRequest {
+ filePath: string;
+ field: FieldType;
+}
+
+export interface AddFieldRequest {
+ filePath: string;
+ field: FieldType;
+ codedata: {
+ lineRange: LineRange;
+ };
+}
+
+export interface SourceEditResponse {
+ textEdits?: {
+ [key: string]: TextEdit[];
+ };
+ errorMsg?: string;
+ stacktrace?: string;
+}
+
+export interface ServiceClassSourceRequest {
+ filePath: string;
+ serviceClass: ServiceClassModel;
+}
+
+export interface FunctionModelRequest {
+ type: string;
+ functionName: string;
+}
+
+export interface FunctionModelResponse {
+ function: FunctionModel;
+}
+export interface ServiceModelFromCodeRequest {
+ filePath: string;
+ codedata: {
+ lineRange: LineRange; // For the entire service
+ };
+}
+export interface ServiceModelFromCodeResponse {
+ service: ServiceModel;
+}
+export interface ListenerModelFromCodeRequest {
+ filePath: string;
+ codedata: {
+ lineRange: LineRange; // For the entire service
+ };
+}
+
+export interface ModelFromCodeRequest {
+ filePath: string;
+ codedata: {
+ lineRange: LineRange;
+ };
+ context: string;
+}
+
+export interface ServiceClassModelResponse {
+ model?: ServiceClassModel;
+ errorMsg?: string;
+ stacktrace?: string;
+}
+
+// <-------- Type Related ------->
+
+export interface Type {
+ name: string;
+ editable: boolean;
+ metadata: TypeMetadata;
+ codedata: TypeCodeData;
+ properties: Record;
+ members: Member[];
+ restMember?: Member;
+ includes?: string[];
+ functions?: TypeFunctionModel[];
+ allowAdditionalFields?: boolean;
+}
+
+type ServiceFunctionKind = "RESOURCE" | "REMOTE" | "FUNCTION";
+
+export interface TypeFunctionModel {
+ qualifiers: string[];
+ accessor: string;
+ kind: ServiceFunctionKind;
+ name?: string;
+ description?: string;
+ parameters: Member[];
+ restParameter?: Member;
+ returnType?: Type | string;
+ refs: string[];
+ imports?: Imports;
+}
+
+export interface TypeMetadata {
+ label: string;
+ description: string;
+}
+
+export type TypeNodeKind = "RECORD" | "ENUM" | "ARRAY" | "UNION" | "ERROR" | "MAP" | "STREAM" | "FUTURE" |
+ "TYPEDESC" | "CLASS" | "OBJECT" | "INTERSECTION" | "SERVICE_DECLARATION" | "TABLE" | "TUPLE";
+// todo make this consistant
+export interface TypeCodeData {
+ lineRange?: LineRange;
+ node: TypeNodeKind;
+}
+
+export interface TypeProperty {
+ metadata: TypeMetadata;
+ valueType: string;
+ value: string | string[]; // as required for qualifiers
+ optional: boolean;
+ editable: boolean;
+ advanced: boolean;
+}
+
+export interface Member {
+ kind: string;
+ refs: string[];
+ type: string | Type;
+ name?: string;
+ docs?: string;
+ defaultValue?: string;
+ optional?: boolean;
+ imports?: Imports;
+}
+
+export interface GetGraphqlTypeRequest {
+ filePath: string,
+ linePosition: LinePosition;
+}
+
+export interface GetGraphqlTypeResponse {
+ type: Type;
+ refs: Type[];
+}
+
+export interface GetTypesRequest {
+ filePath: string;
+}
+
+export interface GetTypeRequest {
+ filePath: string;
+ linePosition: LinePosition;
+}
+
+export interface UpdateTypeRequest {
+ filePath: string;
+ description: string;
+ type: Type;
+}
+
+export interface UpdateTypesRequest {
+ filePath: string;
+ types: Type[];
+}
+
+export interface UpdateTypesResponse {
+ textEdits: {
+ [filePath: string]: TextEdit[];
+ };
+ errorMsg?: string;
+ stacktrace?: string;
+}
+
+export interface GetTypesResponse {
+ types: Type[];
+}
+
+export interface GetTypeResponse {
+ type: Type;
+}
+
+export interface GetRecordConfigRequest {
+ filePath: string;
+ codedata: {
+ org: string;
+ module: string;
+ version: string;
+ packageName?: string;
+ };
+ typeConstraint: string;
+}
+
+export interface GetRecordConfigResponse {
+ recordConfig?: TypeField;
+ errorMsg?: string;
+ stacktrace?: string;
+}
+
+export type RecordSourceGenRequest = {
+ filePath: string;
+ type: TypeField;
+}
+
+export type RecordSourceGenResponse = {
+ errorMessage?: string;
+ stackTrace?: string;
+ recordValue?: string;
+}
+
+export type UpdateRecordConfigRequest = {
+ filePath: string;
+ codedata: {
+ org: string;
+ module: string;
+ version: string;
+ };
+ typeConstraint: string;
+ expr: string;
+}
+
+export type GetRecordModelFromSourceRequest = {
+ filePath: string;
+ typeMembers: PropertyTypeMemberInfo[];
+ expr: string;
+}
+
+export type GetRecordModelFromSourceResponse = {
+ recordConfig: TypeField;
+ typeName: string;
+ errorMsg?: string;
+ stacktrace?: string;
+}
+
+
+export interface TextEditRange {
+ start: {
+ line: number;
+ character: number;
+ };
+ end: {
+ line: number;
+ character: number;
+ };
+}
+
+export interface TextEdit {
+ range: TextEditRange;
+ newText: string;
+}
+
+export interface UpdateTypeResponse {
+ name: string;
+ textEdits: {
+ [filePath: string]: TextEdit[];
+ };
+}
+
+// <-------- Trigger Related ------->
+
+export interface TriggerFunctionResponse {
+
+}
+
+export interface ListenerModelFromCodeResponse {
+ listener: ListenerModel;
+}
+export interface HttpResourceModelRequest {
+ type: "http",
+ functionName: "resource"
+}
+export interface HttpResourceModelResponse {
+ function: FunctionModel;
+}
+export interface FunctionSourceCodeRequest {
+ filePath: string;
+ function: FunctionModel;
+ codedata: {
+ lineRange: LineRange; // For the entire service
+ };
+ service?: ServiceModel;
+}
+export interface ResourceSourceCodeResponse {
+ textEdits: {
+ [key: string]: TextEdit[];
+ };
+}
+// <-------- Service Designer Related ------->
+
+
+export interface FunctionNodeRequest {
+ projectPath?: string;
+ fileName?: string;
+ functionName: string;
+}
+export interface FunctionNodeResponse {
+ functionDefinition: FunctionNode;
+}
+
+// <-------- AI Agent Related ------->
+
+export interface AINodesRequest {
+ filePath: string;
+}
+export interface AINodesResponse {
+ agents?: CodeData[];
+ models?: CodeData[];
+}
+export interface MemoryManagersRequest {
+ filePath: string;
+}
+export interface MemoryManagersResponse {
+ memoryManagers?: CodeData[];
+}
+export interface AIModelsResponse {
+ models: string[];
+}
+
+// TODO: Correct the data type
+export interface AIModelsRequest {
+ agent: any;
+ filePath?: string;
+}
+
+export interface AIToolsRequest {
+ filePath: string;
+}
+export interface AIToolsResponse {
+ tools: string[];
+}
+
+export interface AIGentToolsRequest {
+ filePath: string;
+ flowNode: FlowNode;
+ toolName: string;
+ description: string;
+ connection: string;
+}
+
+export interface AIGentToolsResponse {
+ textEdits: {
+ [key: string]: TextEdit[];
+ };
+}
+
+export type OpenAPIClientGenerationRequest = {
+ openApiContractPath: string;
+ projectPath: string;
+ module: string;
+}
+
+interface OpenAPIClientSource {
+ isModuleExists: boolean;
+ textEditsMap: {
+ [key: string]: TextEdit[];
+ };
+}
+
+export type OpenAPIClientGenerationResponse = {
+ source: OpenAPIClientSource;
+}
+
+export type OpenAPIGeneratedModulesRequest = {
+ projectPath: string;
+}
+
+export type OpenAPIGeneratedModulesResponse = {
+ modules: string[];
+}
+
+export type OpenAPIClientDeleteRequest = {
+ projectPath: string;
+ module: string;
+}
+
+export type OpenAPIClientDeleteData = {
+ filesToDelete: string[];
+ textEditsMap: {
+ [key: string]: TextEdit[];
+ };
+}
+
+export type OpenAPIClientDeleteResponse = {
+ deleteData: OpenAPIClientDeleteData
+}
+
+// <-------- Deployment Related ------->
+
+export interface DeploymentRequest {
+ integrationTypes: SCOPE[];
+}
+
+export interface DeploymentResponse {
+ isCompleted: boolean;
+}
+
+
+// 2201.12.3 -> New Project Component Artifacts Tree
+
+export interface BaseArtifact {
+ id: string;
+ location: {
+ fileName: string;
+ startLine: {
+ line: number;
+ offset: number;
+ };
+ endLine: {
+ line: number;
+ offset: number;
+ };
+ };
+ type: DIRECTORY_MAP;
+ name: string;
+ module?: string;
+ scope: string;
+ icon?: string; // Optional for those that have an icon
+ children?: Record; // To allow nested structures
+ accessor?: string; // Specific to Entry Points
+ value?: T; // Generic value property to hold different types
+}
+
+// Artifact Types
+export enum ARTIFACT_TYPE {
+ Functions = "Functions",
+ Connections = "Connections",
+ Listeners = "Listeners",
+ EntryPoints = "Entry Points",
+ Types = "Types",
+ NaturalFunctions = "Natural Functions",
+ DataMappers = "Data Mappers",
+ Configurations = "Configurations"
+}
+
+export interface Artifacts {
+ [ARTIFACT_TYPE.Functions]: Record;
+ [ARTIFACT_TYPE.Connections]: Record;
+ [ARTIFACT_TYPE.Listeners]: Record;
+ [ARTIFACT_TYPE.EntryPoints]: Record;
+ [ARTIFACT_TYPE.Types]: Record;
+ [ARTIFACT_TYPE.NaturalFunctions]: Record;
+ [ARTIFACT_TYPE.DataMappers]: Record;
+ [ARTIFACT_TYPE.Configurations]: Record;
+}
+
+export interface ArtifactsNotification {
+ uri: string;
+ artifacts: Artifacts;
+}
+
+export interface ProjectArtifactsRequest {
+ projectPath: string;
+}
+export interface ProjectArtifacts {
+ artifacts: Artifacts;
+}
+
+// <------------ BI INTERFACES --------->
+
+export interface BaseLangClientInterface {
+ init?: (params: InitializeParams) => Promise;
+ didOpen: (Params: DidOpenParams) => void;
+ didClose: (params: DidCloseParams) => void;
+ didChange: (params: DidChangeParams) => void;
+ definition: (params: DefinitionParams) => Promise;
+ close?: () => void;
+}
+
+export interface BIInterface extends BaseLangClientInterface {
+ getSTByRange: (params: BallerinaSTParams) => Promise;
+ getFlowModel: (params: BIFlowModelRequest) => Promise;
+ getSourceCode: (params: BISourceCodeRequest) => Promise;
+ getAvailableNodes: (params: BIAvailableNodesRequest) => Promise;
+ getNodeTemplate: (params: BINodeTemplateRequest) => Promise;
+ getSequenceDiagramModel: (params: SequenceModelRequest) => Promise;
+ generateServiceFromOAS: (params: ServiceFromOASRequest) => Promise;
+ getExpressionCompletions: (params: ExpressionCompletionsRequest) => Promise;
+ getConfigVariables: (params: ConfigVariableRequest) => Promise;
+ updateConfigVariables: (params: UpdateConfigVariableRequest) => Promise;
+ getConfigVariablesV2: (params: ConfigVariableRequest) => Promise;
+ updateConfigVariablesV2: (params: UpdateConfigVariableRequestV2) => Promise;
+ deleteConfigVariableV2: (params: DeleteConfigVariableRequestV2) => Promise;
+ getConfigVariableNodeTemplate: (params: GetConfigVariableNodeTemplateRequest) => Promise;
+ getComponentsFromContent: (params: ComponentsFromContent) => Promise;
+ getSignatureHelp: (params: SignatureHelpRequest) => Promise;
+ getVisibleTypes: (params: VisibleTypesRequest) => Promise;
+ getExpressionDiagnostics: (params: ExpressionDiagnosticsRequest) => Promise;
+ getOpenApiGeneratedModules: (params: OpenAPIGeneratedModulesRequest) => Promise
+
+ // New Service Designer APIs
+ getTriggerModels: (params: TriggerModelsRequest) => Promise;
+ getListeners: (params: ListenersRequest) => Promise;
+ getListenerModel: (params: ListenerModelRequest) => Promise;
+ addListenerSourceCode: (params: ListenerSourceCodeRequest) => Promise;
+ getListenerFromSourceCode: (params: ListenerModelFromCodeRequest) => Promise;
+ getServiceModel: (params: ServiceModelRequest) => Promise