@red-hat-developer-hub/backstage-plugin-orchestrator-backend 4.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/CHANGELOG.md +740 -0
  2. package/README.md +5 -0
  3. package/app-config.yaml +3 -0
  4. package/dist/helpers/errorBuilder.cjs.js +36 -0
  5. package/dist/helpers/errorBuilder.cjs.js.map +1 -0
  6. package/dist/helpers/filterBuilder.cjs.js +197 -0
  7. package/dist/helpers/filterBuilder.cjs.js.map +1 -0
  8. package/dist/helpers/queryBuilder.cjs.js +40 -0
  9. package/dist/helpers/queryBuilder.cjs.js.map +1 -0
  10. package/dist/index.cjs.js +10 -0
  11. package/dist/index.cjs.js.map +1 -0
  12. package/dist/index.d.ts +9 -0
  13. package/dist/package.json.cjs.js +6 -0
  14. package/dist/package.json.cjs.js.map +1 -0
  15. package/dist/plugin.cjs.js +45 -0
  16. package/dist/plugin.cjs.js.map +1 -0
  17. package/dist/routerWrapper/index.cjs.js +31 -0
  18. package/dist/routerWrapper/index.cjs.js.map +1 -0
  19. package/dist/service/DataIndexService.cjs.js +405 -0
  20. package/dist/service/DataIndexService.cjs.js.map +1 -0
  21. package/dist/service/DataInputSchemaService.cjs.js +12 -0
  22. package/dist/service/DataInputSchemaService.cjs.js.map +1 -0
  23. package/dist/service/DevModeService.cjs.js +144 -0
  24. package/dist/service/DevModeService.cjs.js.map +1 -0
  25. package/dist/service/GitService.cjs.js +72 -0
  26. package/dist/service/GitService.cjs.js.map +1 -0
  27. package/dist/service/GitWrapper/git.cjs.js +219 -0
  28. package/dist/service/GitWrapper/git.cjs.js.map +1 -0
  29. package/dist/service/Helper.cjs.js +66 -0
  30. package/dist/service/Helper.cjs.js.map +1 -0
  31. package/dist/service/OrchestratorService.cjs.js +119 -0
  32. package/dist/service/OrchestratorService.cjs.js.map +1 -0
  33. package/dist/service/ScaffolderService.cjs.js +94 -0
  34. package/dist/service/ScaffolderService.cjs.js.map +1 -0
  35. package/dist/service/SonataFlowService.cjs.js +188 -0
  36. package/dist/service/SonataFlowService.cjs.js.map +1 -0
  37. package/dist/service/WorkflowCacheService.cjs.js +91 -0
  38. package/dist/service/WorkflowCacheService.cjs.js.map +1 -0
  39. package/dist/service/api/mapping/V2Mappings.cjs.js +150 -0
  40. package/dist/service/api/mapping/V2Mappings.cjs.js.map +1 -0
  41. package/dist/service/api/v2.cjs.js +187 -0
  42. package/dist/service/api/v2.cjs.js.map +1 -0
  43. package/dist/service/constants.cjs.js +10 -0
  44. package/dist/service/constants.cjs.js.map +1 -0
  45. package/dist/service/router.cjs.js +626 -0
  46. package/dist/service/router.cjs.js.map +1 -0
  47. package/dist/types/pagination.cjs.js +30 -0
  48. package/dist/types/pagination.cjs.js.map +1 -0
  49. package/package.json +110 -0
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # Orchestrator Backend Plugin for Backstage
2
+
3
+ Welcome to the backend package for the Orchestrator plugin!
4
+
5
+ For more information about the Orchestrator plugin, see the [Orchestrator Plugin documentation](https://github.com/redhat-developer/rhdh-plugins/tree/main/workspaces/orchestrator/plugins/orchestrator) on GitHub.
@@ -0,0 +1,3 @@
1
+ orchestrator:
2
+ dataIndexService:
3
+ url: http://sonataflow-platform-data-index-service.sonataflow-infra
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ const NO_DATA_INDEX_URL = "NO_DATA_INDEX_URL";
4
+ const NO_CLIENT_PROVIDED = "NO_CLIENT_PROVIDED";
5
+ const SWF_BACKEND_NOT_INITED = "SWF_BACKEND_NOT_INITED";
6
+ class ErrorBuilder {
7
+ static NewBackendError(name, message) {
8
+ const e = new Error(message);
9
+ e.name = name;
10
+ return e;
11
+ }
12
+ static GET_NO_DATA_INDEX_URL_ERR() {
13
+ return this.NewBackendError(
14
+ NO_DATA_INDEX_URL,
15
+ "No data index url specified or found"
16
+ );
17
+ }
18
+ static GET_NO_CLIENT_PROVIDED_ERR() {
19
+ return this.NewBackendError(
20
+ NO_CLIENT_PROVIDED,
21
+ "No or null graphql client"
22
+ );
23
+ }
24
+ static GET_SWF_BACKEND_NOT_INITED() {
25
+ return this.NewBackendError(
26
+ SWF_BACKEND_NOT_INITED,
27
+ "The SonataFlow backend is not initialized, call initialize() method before trying to get the workflows."
28
+ );
29
+ }
30
+ }
31
+
32
+ exports.ErrorBuilder = ErrorBuilder;
33
+ exports.NO_CLIENT_PROVIDED = NO_CLIENT_PROVIDED;
34
+ exports.NO_DATA_INDEX_URL = NO_DATA_INDEX_URL;
35
+ exports.SWF_BACKEND_NOT_INITED = SWF_BACKEND_NOT_INITED;
36
+ //# sourceMappingURL=errorBuilder.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errorBuilder.cjs.js","sources":["../../src/helpers/errorBuilder.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nexport const NO_DATA_INDEX_URL = 'NO_DATA_INDEX_URL';\nexport const NO_BACKEND_EXEC_CTX = 'NO_BACKEND_EXEC_CTX';\nexport const NO_CLIENT_PROVIDED = 'NO_CLIENT_PROVIDED';\nexport const NO_LOGGER = 'NO_LOGGER';\nexport const SWF_BACKEND_NOT_INITED = 'SWF_BACKEND_NOT_INITED';\n\nexport class ErrorBuilder {\n public static NewBackendError(name: string, message: string): Error {\n const e = new Error(message);\n e.name = name;\n return e;\n }\n\n public static GET_NO_DATA_INDEX_URL_ERR(): Error {\n return this.NewBackendError(\n NO_DATA_INDEX_URL,\n 'No data index url specified or found',\n );\n }\n\n public static GET_NO_CLIENT_PROVIDED_ERR(): Error {\n return this.NewBackendError(\n NO_CLIENT_PROVIDED,\n 'No or null graphql client',\n );\n }\n\n public static GET_SWF_BACKEND_NOT_INITED(): Error {\n return this.NewBackendError(\n SWF_BACKEND_NOT_INITED,\n 'The SonataFlow backend is not initialized, call initialize() method before trying to get the workflows.',\n );\n }\n}\n"],"names":[],"mappings":";;AAeO,MAAM,iBAAoB,GAAA,oBAAA;AAE1B,MAAM,kBAAqB,GAAA,qBAAA;AAE3B,MAAM,sBAAyB,GAAA,yBAAA;AAE/B,MAAM,YAAa,CAAA;AAAA,EACxB,OAAc,eAAgB,CAAA,IAAA,EAAc,OAAwB,EAAA;AAClE,IAAM,MAAA,CAAA,GAAI,IAAI,KAAA,CAAM,OAAO,CAAA,CAAA;AAC3B,IAAA,CAAA,CAAE,IAAO,GAAA,IAAA,CAAA;AACT,IAAO,OAAA,CAAA,CAAA;AAAA,GACT;AAAA,EAEA,OAAc,yBAAmC,GAAA;AAC/C,IAAA,OAAO,IAAK,CAAA,eAAA;AAAA,MACV,iBAAA;AAAA,MACA,sCAAA;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EAEA,OAAc,0BAAoC,GAAA;AAChD,IAAA,OAAO,IAAK,CAAA,eAAA;AAAA,MACV,kBAAA;AAAA,MACA,2BAAA;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EAEA,OAAc,0BAAoC,GAAA;AAChD,IAAA,OAAO,IAAK,CAAA,eAAA;AAAA,MACV,sBAAA;AAAA,MACA,yGAAA;AAAA,KACF,CAAA;AAAA,GACF;AACF;;;;;;;"}
@@ -0,0 +1,197 @@
1
+ 'use strict';
2
+
3
+ var backstagePluginOrchestratorCommon = require('@red-hat-developer-hub/backstage-plugin-orchestrator-common');
4
+ var V2Mappings = require('../service/api/mapping/V2Mappings.cjs.js');
5
+
6
+ function isLogicalFilter(filter) {
7
+ return filter.filters !== void 0;
8
+ }
9
+ function handleLogicalFilter(introspection, type, filter) {
10
+ if (!filter.operator) return "";
11
+ const subClauses = filter.filters.map(
12
+ (f) => buildFilterCondition(introspection, type, f)
13
+ );
14
+ return `${filter.operator.toLowerCase()}: {${subClauses.join(", ")}}`;
15
+ }
16
+ function handleBetweenOperator(filter) {
17
+ if (!Array.isArray(filter.value) || filter.value.length !== 2) {
18
+ throw new Error("Between operator requires an array of two elements");
19
+ }
20
+ return `${filter.field}: {${getGraphQLOperator(
21
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Between
22
+ )}: {from: "${filter.value[0]}", to: "${filter.value[1]}"}}`;
23
+ }
24
+ function handleIsNullOperator(filter) {
25
+ return `${filter.field}: {${getGraphQLOperator(
26
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.IsNull
27
+ )}: ${convertToBoolean(filter.value)}}`;
28
+ }
29
+ function isEnumFilter(fieldName, type) {
30
+ if (type === "ProcessInstance") {
31
+ if (fieldName === "state") {
32
+ return true;
33
+ }
34
+ }
35
+ return false;
36
+ }
37
+ function convertEnumValue(fieldName, fieldValue, type) {
38
+ if (type === "ProcessInstance") {
39
+ if (fieldName === "state") {
40
+ const state = backstagePluginOrchestratorCommon.ProcessInstanceStatusDTO[fieldValue];
41
+ if (!state) {
42
+ throw new Error(
43
+ `status ${fieldValue} is not a valid value of ProcessInstanceStatusDTO`
44
+ );
45
+ }
46
+ return V2Mappings.getProcessInstanceStateFromStatusDTOString(state).valueOf();
47
+ }
48
+ }
49
+ throw new Error(
50
+ `Unsupported enum ${fieldName}: can't convert value ${fieldValue}`
51
+ );
52
+ }
53
+ function isValidEnumOperator(operator) {
54
+ return operator === backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.In || operator === backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Eq;
55
+ }
56
+ function handleBinaryOperator(binaryFilter, fieldDef, type) {
57
+ if (isEnumFilter(binaryFilter.field, type)) {
58
+ if (!isValidEnumOperator(binaryFilter.operator)) {
59
+ throw new Error(
60
+ `Invalid operator ${binaryFilter.operator} for enum field ${binaryFilter.field} filter`
61
+ );
62
+ }
63
+ binaryFilter.value = convertEnumValue(
64
+ binaryFilter.field,
65
+ binaryFilter.value,
66
+ type
67
+ );
68
+ }
69
+ const formattedValue = Array.isArray(binaryFilter.value) ? `[${binaryFilter.value.map((v) => formatValue(binaryFilter.field, v, fieldDef, type)).join(", ")}]` : formatValue(binaryFilter.field, binaryFilter.value, fieldDef, type);
70
+ return `${binaryFilter.field}: {${getGraphQLOperator(
71
+ binaryFilter.operator
72
+ )}: ${formattedValue}}`;
73
+ }
74
+ function buildFilterCondition(introspection, type, filters) {
75
+ if (!filters) {
76
+ return "";
77
+ }
78
+ if (isLogicalFilter(filters)) {
79
+ return handleLogicalFilter(introspection, type, filters);
80
+ }
81
+ if (!isOperatorSupported(filters.operator)) {
82
+ throw new Error(`Unsopported operator ${filters.operator}`);
83
+ }
84
+ const fieldDef = introspection.find((f) => f.name === filters.field);
85
+ if (!fieldDef) {
86
+ throw new Error(`Can't find field "${filters.field}" definition`);
87
+ }
88
+ if (!isOperatorAllowedForField(filters.operator, fieldDef)) {
89
+ throw new Error(`Unsupported field type ${fieldDef.type.name}`);
90
+ }
91
+ switch (filters.operator) {
92
+ case backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.IsNull:
93
+ return handleIsNullOperator(filters);
94
+ case backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Between:
95
+ return handleBetweenOperator(filters);
96
+ case backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Eq:
97
+ case backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Like:
98
+ case backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.In:
99
+ case backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Gt:
100
+ case backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Gte:
101
+ case backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Lt:
102
+ case backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Lte:
103
+ return handleBinaryOperator(filters, fieldDef, type);
104
+ default:
105
+ throw new Error(`Can't build filter condition`);
106
+ }
107
+ }
108
+ function isOperatorSupported(operator) {
109
+ return operator === backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Eq || operator === backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Like || operator === backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.In || operator === backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.IsNull || operator === backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Gt || operator === backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Gte || operator === backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Lt || operator === backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Lte || operator === backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Between;
110
+ }
111
+ function isFieldFilterSupported(fieldDef) {
112
+ return fieldDef?.type.name === backstagePluginOrchestratorCommon.TypeName.String;
113
+ }
114
+ function isOperatorAllowedForField(operator, fieldDef) {
115
+ const allowedOperators = {
116
+ [backstagePluginOrchestratorCommon.TypeName.String]: [
117
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.In,
118
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Like,
119
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.IsNull,
120
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Eq
121
+ ],
122
+ [backstagePluginOrchestratorCommon.TypeName.Id]: [
123
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.In,
124
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.IsNull,
125
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Eq
126
+ ],
127
+ [backstagePluginOrchestratorCommon.TypeName.Date]: [
128
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.IsNull,
129
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Eq,
130
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Gt,
131
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Gte,
132
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Lt,
133
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Lte,
134
+ backstagePluginOrchestratorCommon.FieldFilterOperatorEnum.Between
135
+ ],
136
+ [backstagePluginOrchestratorCommon.TypeName.StringArray]: []
137
+ };
138
+ const allowedForType = allowedOperators[fieldDef.type.name];
139
+ return allowedForType ? allowedForType.includes(operator) : false;
140
+ }
141
+ function convertToBoolean(value) {
142
+ if (typeof value === "boolean") {
143
+ return value;
144
+ }
145
+ if (typeof value === "string") {
146
+ return value.toLowerCase() === "true";
147
+ }
148
+ if (typeof value === "number") {
149
+ return value === 1;
150
+ }
151
+ return false;
152
+ }
153
+ function formatValue(fieldName, fieldValue, fieldDef, type) {
154
+ if (!isFieldFilterSupported) {
155
+ throw new Error(`Unsupported field type ${fieldDef.type.name}`);
156
+ }
157
+ if (isEnumFilter(fieldName, type)) {
158
+ return `${fieldValue}`;
159
+ }
160
+ if (fieldDef.type.name === backstagePluginOrchestratorCommon.TypeName.String || fieldDef.type.name === backstagePluginOrchestratorCommon.TypeName.Id || fieldDef.type.name === backstagePluginOrchestratorCommon.TypeName.Date) {
161
+ return `"${fieldValue}"`;
162
+ }
163
+ throw new Error(
164
+ `Failed to format value for ${fieldName} ${fieldValue} with type ${fieldDef.type.name}`
165
+ );
166
+ }
167
+ function getGraphQLOperator(operator) {
168
+ switch (operator) {
169
+ case "EQ":
170
+ return "equal";
171
+ case "LIKE":
172
+ return "like";
173
+ case "IN":
174
+ return "in";
175
+ case "IS_NULL":
176
+ return "isNull";
177
+ case "GT":
178
+ return "greaterThan";
179
+ case "GTE":
180
+ return "greaterThanEqual";
181
+ case "LT":
182
+ return "lessThan";
183
+ case "LTE":
184
+ return "lessThanEqual";
185
+ // case 'CONTAINS':
186
+ // return "contains"
187
+ // case 'CONTAINS_ALL':
188
+ // case 'CONTAINS_ANY':
189
+ case "BETWEEN":
190
+ return "between";
191
+ default:
192
+ throw new Error(`Operation "${operator}" not supported`);
193
+ }
194
+ }
195
+
196
+ exports.buildFilterCondition = buildFilterCondition;
197
+ //# sourceMappingURL=filterBuilder.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filterBuilder.cjs.js","sources":["../../src/helpers/filterBuilder.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n FieldFilter,\n FieldFilterOperatorEnum,\n Filter,\n IntrospectionField,\n LogicalFilter,\n ProcessInstanceStatusDTO,\n TypeName,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { getProcessInstanceStateFromStatusDTOString } from '../service/api/mapping/V2Mappings';\n\ntype ProcessType = 'ProcessDefinition' | 'ProcessInstance';\n\nfunction isLogicalFilter(filter: Filter): filter is LogicalFilter {\n return (filter as LogicalFilter).filters !== undefined;\n}\n\nfunction handleLogicalFilter(\n introspection: IntrospectionField[],\n type: ProcessType,\n filter: LogicalFilter,\n): string {\n if (!filter.operator) return '';\n\n const subClauses = filter.filters.map(f =>\n buildFilterCondition(introspection, type, f),\n );\n\n return `${filter.operator.toLowerCase()}: {${subClauses.join(', ')}}`;\n}\n\nfunction handleBetweenOperator(filter: FieldFilter): string {\n if (!Array.isArray(filter.value) || filter.value.length !== 2) {\n throw new Error('Between operator requires an array of two elements');\n }\n return `${filter.field}: {${getGraphQLOperator(\n FieldFilterOperatorEnum.Between,\n )}: {from: \"${filter.value[0]}\", to: \"${filter.value[1]}\"}}`;\n}\n\nfunction handleIsNullOperator(filter: FieldFilter): string {\n return `${filter.field}: {${getGraphQLOperator(\n FieldFilterOperatorEnum.IsNull,\n )}: ${convertToBoolean(filter.value)}}`;\n}\n\nfunction isEnumFilter(\n fieldName: string,\n type: 'ProcessDefinition' | 'ProcessInstance',\n): boolean {\n if (type === 'ProcessInstance') {\n if (fieldName === 'state') {\n return true;\n }\n }\n return false;\n}\n\nfunction convertEnumValue(\n fieldName: string,\n fieldValue: string,\n type: 'ProcessDefinition' | 'ProcessInstance',\n): string {\n if (type === 'ProcessInstance') {\n if (fieldName === 'state') {\n const state = (ProcessInstanceStatusDTO as any)[\n fieldValue as keyof typeof ProcessInstanceStatusDTO\n ];\n\n if (!state) {\n throw new Error(\n `status ${fieldValue} is not a valid value of ProcessInstanceStatusDTO`,\n );\n }\n return getProcessInstanceStateFromStatusDTOString(state).valueOf();\n }\n }\n throw new Error(\n `Unsupported enum ${fieldName}: can't convert value ${fieldValue}`,\n );\n}\n\nfunction isValidEnumOperator(operator: FieldFilterOperatorEnum): boolean {\n return (\n operator === FieldFilterOperatorEnum.In ||\n operator === FieldFilterOperatorEnum.Eq\n );\n}\n\nfunction handleBinaryOperator(\n binaryFilter: FieldFilter,\n fieldDef: IntrospectionField,\n type: 'ProcessDefinition' | 'ProcessInstance',\n): string {\n if (isEnumFilter(binaryFilter.field, type)) {\n if (!isValidEnumOperator(binaryFilter.operator)) {\n throw new Error(\n `Invalid operator ${binaryFilter.operator} for enum field ${binaryFilter.field} filter`,\n );\n }\n binaryFilter.value = convertEnumValue(\n binaryFilter.field,\n binaryFilter.value,\n type,\n );\n }\n const formattedValue = Array.isArray(binaryFilter.value)\n ? `[${binaryFilter.value\n .map(v => formatValue(binaryFilter.field, v, fieldDef, type))\n .join(', ')}]`\n : formatValue(binaryFilter.field, binaryFilter.value, fieldDef, type);\n return `${binaryFilter.field}: {${getGraphQLOperator(\n binaryFilter.operator,\n )}: ${formattedValue}}`;\n}\n\nexport function buildFilterCondition(\n introspection: IntrospectionField[],\n type: ProcessType,\n filters?: Filter,\n): string {\n if (!filters) {\n return '';\n }\n\n if (isLogicalFilter(filters)) {\n return handleLogicalFilter(introspection, type, filters);\n }\n\n if (!isOperatorSupported(filters.operator)) {\n throw new Error(`Unsopported operator ${filters.operator}`);\n }\n\n const fieldDef = introspection.find(f => f.name === filters.field);\n if (!fieldDef) {\n throw new Error(`Can't find field \"${filters.field}\" definition`);\n }\n\n if (!isOperatorAllowedForField(filters.operator, fieldDef)) {\n throw new Error(`Unsupported field type ${fieldDef.type.name}`);\n }\n\n switch (filters.operator) {\n case FieldFilterOperatorEnum.IsNull:\n return handleIsNullOperator(filters);\n case FieldFilterOperatorEnum.Between:\n return handleBetweenOperator(filters);\n case FieldFilterOperatorEnum.Eq:\n case FieldFilterOperatorEnum.Like:\n case FieldFilterOperatorEnum.In:\n case FieldFilterOperatorEnum.Gt:\n case FieldFilterOperatorEnum.Gte:\n case FieldFilterOperatorEnum.Lt:\n case FieldFilterOperatorEnum.Lte:\n return handleBinaryOperator(filters, fieldDef, type);\n\n default:\n throw new Error(`Can't build filter condition`);\n }\n}\n\nfunction isOperatorSupported(operator: FieldFilterOperatorEnum): boolean {\n return (\n operator === FieldFilterOperatorEnum.Eq ||\n operator === FieldFilterOperatorEnum.Like ||\n operator === FieldFilterOperatorEnum.In ||\n operator === FieldFilterOperatorEnum.IsNull ||\n operator === FieldFilterOperatorEnum.Gt ||\n operator === FieldFilterOperatorEnum.Gte ||\n operator === FieldFilterOperatorEnum.Lt ||\n operator === FieldFilterOperatorEnum.Lte ||\n operator === FieldFilterOperatorEnum.Between\n );\n}\n\nfunction isFieldFilterSupported(fieldDef: IntrospectionField): boolean {\n return fieldDef?.type.name === TypeName.String;\n}\n\nfunction isOperatorAllowedForField(\n operator: FieldFilterOperatorEnum,\n fieldDef: IntrospectionField,\n): boolean {\n const allowedOperators: Record<TypeName, FieldFilterOperatorEnum[]> = {\n [TypeName.String]: [\n FieldFilterOperatorEnum.In,\n FieldFilterOperatorEnum.Like,\n FieldFilterOperatorEnum.IsNull,\n FieldFilterOperatorEnum.Eq,\n ],\n [TypeName.Id]: [\n FieldFilterOperatorEnum.In,\n FieldFilterOperatorEnum.IsNull,\n FieldFilterOperatorEnum.Eq,\n ],\n [TypeName.Date]: [\n FieldFilterOperatorEnum.IsNull,\n FieldFilterOperatorEnum.Eq,\n FieldFilterOperatorEnum.Gt,\n FieldFilterOperatorEnum.Gte,\n FieldFilterOperatorEnum.Lt,\n FieldFilterOperatorEnum.Lte,\n FieldFilterOperatorEnum.Between,\n ],\n [TypeName.StringArray]: [],\n };\n const allowedForType = allowedOperators[fieldDef.type.name];\n return allowedForType ? allowedForType.includes(operator) : false;\n}\n\nfunction convertToBoolean(value: any): boolean {\n if (typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'string') {\n return value.toLowerCase() === 'true';\n }\n if (typeof value === 'number') {\n return value === 1;\n }\n return false; // Default to false for unsupported types\n}\n\nfunction formatValue(\n fieldName: string,\n fieldValue: any,\n fieldDef: IntrospectionField,\n type: ProcessType,\n): string {\n if (!isFieldFilterSupported) {\n throw new Error(`Unsupported field type ${fieldDef.type.name}`);\n }\n\n if (isEnumFilter(fieldName, type)) {\n return `${fieldValue}`;\n }\n if (\n fieldDef.type.name === TypeName.String ||\n fieldDef.type.name === TypeName.Id ||\n fieldDef.type.name === TypeName.Date\n ) {\n return `\"${fieldValue}\"`;\n }\n throw new Error(\n `Failed to format value for ${fieldName} ${fieldValue} with type ${fieldDef.type.name}`,\n );\n}\n\nfunction getGraphQLOperator(operator: FieldFilterOperatorEnum): string {\n switch (operator) {\n case 'EQ':\n return 'equal';\n case 'LIKE':\n return 'like';\n case 'IN':\n return 'in';\n case 'IS_NULL':\n return 'isNull';\n case 'GT':\n return 'greaterThan';\n case 'GTE':\n return 'greaterThanEqual';\n case 'LT':\n return 'lessThan';\n case 'LTE':\n return 'lessThanEqual';\n // case 'CONTAINS':\n // return \"contains\"\n // case 'CONTAINS_ALL':\n // case 'CONTAINS_ANY':\n case 'BETWEEN':\n return 'between';\n default:\n throw new Error(`Operation \"${operator}\" not supported`);\n }\n}\n"],"names":["FieldFilterOperatorEnum","ProcessInstanceStatusDTO","getProcessInstanceStateFromStatusDTOString","TypeName"],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ 'use strict';
2
+
3
+ function buildGraphQlQuery(args) {
4
+ let query = `{${args.type}`;
5
+ const whereClause = buildWhereClause(args.whereClause);
6
+ const paginationClause = buildPaginationClause(args.pagination);
7
+ if (whereClause || paginationClause) {
8
+ query += " (";
9
+ query += [whereClause, paginationClause].filter(Boolean).join(", ");
10
+ query += ") ";
11
+ }
12
+ query += ` {${args.queryBody} } }`;
13
+ return query.replace(/\s+/g, " ").trim();
14
+ }
15
+ function buildWhereClause(whereClause) {
16
+ return whereClause ? `where: {${whereClause}}` : "";
17
+ }
18
+ function buildPaginationClause(pagination) {
19
+ if (!pagination) return "";
20
+ const parts = [];
21
+ if (pagination.sortField !== void 0) {
22
+ parts.push(
23
+ `orderBy: {${pagination.sortField}: ${pagination.order !== void 0 ? pagination.order?.toUpperCase() : "ASC"}}`
24
+ );
25
+ }
26
+ const paginationParts = [];
27
+ if (pagination.limit !== void 0) {
28
+ paginationParts.push(`limit: ${pagination.limit}`);
29
+ }
30
+ if (pagination.offset !== void 0) {
31
+ paginationParts.push(`offset: ${pagination.offset}`);
32
+ }
33
+ if (paginationParts.length) {
34
+ parts.push(`pagination: {${paginationParts.join(", ")}}`);
35
+ }
36
+ return parts.join(", ");
37
+ }
38
+
39
+ exports.buildGraphQlQuery = buildGraphQlQuery;
40
+ //# sourceMappingURL=queryBuilder.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryBuilder.cjs.js","sources":["../../src/helpers/queryBuilder.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Pagination } from '../types/pagination';\n\nexport function buildGraphQlQuery(args: {\n type: 'ProcessDefinitions' | 'ProcessInstances' | 'Jobs';\n queryBody: string;\n whereClause?: string;\n pagination?: Pagination;\n}): string {\n let query = `{${args.type}`;\n\n const whereClause = buildWhereClause(args.whereClause);\n const paginationClause = buildPaginationClause(args.pagination);\n\n if (whereClause || paginationClause) {\n query += ' (';\n query += [whereClause, paginationClause].filter(Boolean).join(', ');\n query += ') ';\n }\n\n query += ` {${args.queryBody} } }`;\n\n return query.replace(/\\s+/g, ' ').trim();\n}\n\nfunction buildWhereClause(whereClause?: string): string {\n return whereClause ? `where: {${whereClause}}` : '';\n}\n\nfunction buildPaginationClause(pagination?: Pagination): string {\n if (!pagination) return '';\n\n const parts = [];\n\n if (pagination.sortField !== undefined) {\n parts.push(\n `orderBy: {${pagination.sortField}: ${\n pagination.order !== undefined ? pagination.order?.toUpperCase() : 'ASC'\n }}`,\n );\n }\n\n const paginationParts = [];\n if (pagination.limit !== undefined) {\n paginationParts.push(`limit: ${pagination.limit}`);\n }\n if (pagination.offset !== undefined) {\n paginationParts.push(`offset: ${pagination.offset}`);\n }\n if (paginationParts.length) {\n parts.push(`pagination: {${paginationParts.join(', ')}}`);\n }\n\n return parts.join(', ');\n}\n"],"names":[],"mappings":";;AAiBO,SAAS,kBAAkB,IAKvB,EAAA;AACT,EAAI,IAAA,KAAA,GAAQ,CAAI,CAAA,EAAA,IAAA,CAAK,IAAI,CAAA,CAAA,CAAA;AAEzB,EAAM,MAAA,WAAA,GAAc,gBAAiB,CAAA,IAAA,CAAK,WAAW,CAAA,CAAA;AACrD,EAAM,MAAA,gBAAA,GAAmB,qBAAsB,CAAA,IAAA,CAAK,UAAU,CAAA,CAAA;AAE9D,EAAA,IAAI,eAAe,gBAAkB,EAAA;AACnC,IAAS,KAAA,IAAA,IAAA,CAAA;AACT,IAAS,KAAA,IAAA,CAAC,aAAa,gBAAgB,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA,CAAA;AAClE,IAAS,KAAA,IAAA,IAAA,CAAA;AAAA,GACX;AAEA,EAAS,KAAA,IAAA,CAAA,EAAA,EAAK,KAAK,SAAS,CAAA,IAAA,CAAA,CAAA;AAE5B,EAAA,OAAO,KAAM,CAAA,OAAA,CAAQ,MAAQ,EAAA,GAAG,EAAE,IAAK,EAAA,CAAA;AACzC,CAAA;AAEA,SAAS,iBAAiB,WAA8B,EAAA;AACtD,EAAO,OAAA,WAAA,GAAc,CAAW,QAAA,EAAA,WAAW,CAAM,CAAA,CAAA,GAAA,EAAA,CAAA;AACnD,CAAA;AAEA,SAAS,sBAAsB,UAAiC,EAAA;AAC9D,EAAI,IAAA,CAAC,YAAmB,OAAA,EAAA,CAAA;AAExB,EAAA,MAAM,QAAQ,EAAC,CAAA;AAEf,EAAI,IAAA,UAAA,CAAW,cAAc,KAAW,CAAA,EAAA;AACtC,IAAM,KAAA,CAAA,IAAA;AAAA,MACJ,CAAA,UAAA,EAAa,UAAW,CAAA,SAAS,CAC/B,EAAA,EAAA,UAAA,CAAW,KAAU,KAAA,KAAA,CAAA,GAAY,UAAW,CAAA,KAAA,EAAO,WAAY,EAAA,GAAI,KACrE,CAAA,CAAA,CAAA;AAAA,KACF,CAAA;AAAA,GACF;AAEA,EAAA,MAAM,kBAAkB,EAAC,CAAA;AACzB,EAAI,IAAA,UAAA,CAAW,UAAU,KAAW,CAAA,EAAA;AAClC,IAAA,eAAA,CAAgB,IAAK,CAAA,CAAA,OAAA,EAAU,UAAW,CAAA,KAAK,CAAE,CAAA,CAAA,CAAA;AAAA,GACnD;AACA,EAAI,IAAA,UAAA,CAAW,WAAW,KAAW,CAAA,EAAA;AACnC,IAAA,eAAA,CAAgB,IAAK,CAAA,CAAA,QAAA,EAAW,UAAW,CAAA,MAAM,CAAE,CAAA,CAAA,CAAA;AAAA,GACrD;AACA,EAAA,IAAI,gBAAgB,MAAQ,EAAA;AAC1B,IAAA,KAAA,CAAM,KAAK,CAAgB,aAAA,EAAA,eAAA,CAAgB,IAAK,CAAA,IAAI,CAAC,CAAG,CAAA,CAAA,CAAA,CAAA;AAAA,GAC1D;AAEA,EAAO,OAAA,KAAA,CAAM,KAAK,IAAI,CAAA,CAAA;AACxB;;;;"}
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var plugin = require('./plugin.cjs.js');
6
+
7
+
8
+
9
+ exports.default = plugin.orchestratorPlugin;
10
+ //# sourceMappingURL=index.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
@@ -0,0 +1,9 @@
1
+ import * as _backstage_backend_plugin_api from '@backstage/backend-plugin-api';
2
+
3
+ /**
4
+ * @public
5
+ * Orchestrator Backend Plugin
6
+ */
7
+ declare const orchestratorPlugin: _backstage_backend_plugin_api.BackendFeature;
8
+
9
+ export { orchestratorPlugin as default };
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ var name = "@red-hat-developer-hub/backstage-plugin-orchestrator-backend";
4
+
5
+ exports.name = name;
6
+ //# sourceMappingURL=package.json.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.json.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -0,0 +1,45 @@
1
+ 'use strict';
2
+
3
+ var backendPluginApi = require('@backstage/backend-plugin-api');
4
+ var alpha = require('@backstage/plugin-catalog-node/alpha');
5
+ var index = require('./routerWrapper/index.cjs.js');
6
+
7
+ const orchestratorPlugin = backendPluginApi.createBackendPlugin({
8
+ pluginId: "orchestrator",
9
+ register(env) {
10
+ env.registerInit({
11
+ deps: {
12
+ logger: backendPluginApi.coreServices.logger,
13
+ config: backendPluginApi.coreServices.rootConfig,
14
+ discovery: backendPluginApi.coreServices.discovery,
15
+ catalogApi: alpha.catalogServiceRef,
16
+ urlReader: backendPluginApi.coreServices.urlReader,
17
+ permissions: backendPluginApi.coreServices.permissions,
18
+ scheduler: backendPluginApi.coreServices.scheduler,
19
+ auth: backendPluginApi.coreServices.auth,
20
+ httpAuth: backendPluginApi.coreServices.httpAuth,
21
+ http: backendPluginApi.coreServices.httpRouter
22
+ },
23
+ async init(props) {
24
+ const { http } = props;
25
+ const router = await index.createRouter(props);
26
+ http.use(router);
27
+ http.addAuthPolicy({
28
+ path: "/health",
29
+ allow: "unauthenticated"
30
+ });
31
+ http.addAuthPolicy({
32
+ path: "/static",
33
+ allow: "unauthenticated"
34
+ });
35
+ http.addAuthPolicy({
36
+ path: "/docs",
37
+ allow: "unauthenticated"
38
+ });
39
+ }
40
+ });
41
+ }
42
+ });
43
+
44
+ exports.orchestratorPlugin = orchestratorPlugin;
45
+ //# sourceMappingURL=plugin.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.cjs.js","sources":["../src/plugin.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { catalogServiceRef } from '@backstage/plugin-catalog-node/alpha';\n\nimport { createRouter } from './routerWrapper';\n\n/**\n * @public\n * Orchestrator Backend Plugin\n */\nexport const orchestratorPlugin = createBackendPlugin({\n pluginId: 'orchestrator',\n register(env) {\n env.registerInit({\n deps: {\n logger: coreServices.logger,\n config: coreServices.rootConfig,\n discovery: coreServices.discovery,\n catalogApi: catalogServiceRef,\n urlReader: coreServices.urlReader,\n permissions: coreServices.permissions,\n scheduler: coreServices.scheduler,\n auth: coreServices.auth,\n httpAuth: coreServices.httpAuth,\n http: coreServices.httpRouter,\n },\n async init(props) {\n const { http } = props;\n const router = await createRouter(props);\n http.use(router);\n http.addAuthPolicy({\n path: '/health',\n allow: 'unauthenticated',\n });\n http.addAuthPolicy({\n path: '/static',\n allow: 'unauthenticated',\n });\n http.addAuthPolicy({\n path: '/docs',\n allow: 'unauthenticated',\n });\n },\n });\n },\n});\n"],"names":["createBackendPlugin","coreServices","catalogServiceRef","createRouter"],"mappings":";;;;;;AA2BO,MAAM,qBAAqBA,oCAAoB,CAAA;AAAA,EACpD,QAAU,EAAA,cAAA;AAAA,EACV,SAAS,GAAK,EAAA;AACZ,IAAA,GAAA,CAAI,YAAa,CAAA;AAAA,MACf,IAAM,EAAA;AAAA,QACJ,QAAQC,6BAAa,CAAA,MAAA;AAAA,QACrB,QAAQA,6BAAa,CAAA,UAAA;AAAA,QACrB,WAAWA,6BAAa,CAAA,SAAA;AAAA,QACxB,UAAY,EAAAC,uBAAA;AAAA,QACZ,WAAWD,6BAAa,CAAA,SAAA;AAAA,QACxB,aAAaA,6BAAa,CAAA,WAAA;AAAA,QAC1B,WAAWA,6BAAa,CAAA,SAAA;AAAA,QACxB,MAAMA,6BAAa,CAAA,IAAA;AAAA,QACnB,UAAUA,6BAAa,CAAA,QAAA;AAAA,QACvB,MAAMA,6BAAa,CAAA,UAAA;AAAA,OACrB;AAAA,MACA,MAAM,KAAK,KAAO,EAAA;AAChB,QAAM,MAAA,EAAE,MAAS,GAAA,KAAA,CAAA;AACjB,QAAM,MAAA,MAAA,GAAS,MAAME,kBAAA,CAAa,KAAK,CAAA,CAAA;AACvC,QAAA,IAAA,CAAK,IAAI,MAAM,CAAA,CAAA;AACf,QAAA,IAAA,CAAK,aAAc,CAAA;AAAA,UACjB,IAAM,EAAA,SAAA;AAAA,UACN,KAAO,EAAA,iBAAA;AAAA,SACR,CAAA,CAAA;AACD,QAAA,IAAA,CAAK,aAAc,CAAA;AAAA,UACjB,IAAM,EAAA,SAAA;AAAA,UACN,KAAO,EAAA,iBAAA;AAAA,SACR,CAAA,CAAA;AACD,QAAA,IAAA,CAAK,aAAc,CAAA;AAAA,UACjB,IAAM,EAAA,OAAA;AAAA,UACN,KAAO,EAAA,iBAAA;AAAA,SACR,CAAA,CAAA;AAAA,OACH;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AACF,CAAC;;;;"}
@@ -0,0 +1,31 @@
1
+ 'use strict';
2
+
3
+ var DevModeService = require('../service/DevModeService.cjs.js');
4
+ var router = require('../service/router.cjs.js');
5
+
6
+ async function createRouter(args) {
7
+ const autoStartDevMode = args.config.getOptionalBoolean(
8
+ "orchestrator.sonataFlowService.autoStart"
9
+ ) ?? false;
10
+ if (autoStartDevMode) {
11
+ const devModeService = new DevModeService.DevModeService(args.config, args.logger);
12
+ const isSonataFlowUp = await devModeService.launchDevMode();
13
+ if (!isSonataFlowUp) {
14
+ args.logger.error("SonataFlow is not up. Check your configuration.");
15
+ }
16
+ }
17
+ return await router.createBackendRouter({
18
+ config: args.config,
19
+ logger: args.logger,
20
+ discovery: args.discovery,
21
+ catalogApi: args.catalogApi,
22
+ urlReader: args.urlReader,
23
+ scheduler: args.scheduler,
24
+ permissions: args.permissions,
25
+ httpAuth: args.httpAuth,
26
+ auth: args.auth
27
+ });
28
+ }
29
+
30
+ exports.createRouter = createRouter;
31
+ //# sourceMappingURL=index.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs.js","sources":["../../src/routerWrapper/index.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport type {\n AuthService,\n DiscoveryService,\n HttpAuthService,\n LoggerService,\n PermissionsService,\n SchedulerService,\n UrlReaderService,\n} from '@backstage/backend-plugin-api';\nimport type { CatalogApi } from '@backstage/catalog-client';\nimport type { Config } from '@backstage/config';\n\nimport express from 'express';\n\nimport { DevModeService } from '../service/DevModeService';\nimport { createBackendRouter } from '../service/router';\n\nexport interface RouterOptions {\n config: Config;\n logger: LoggerService;\n discovery: DiscoveryService;\n catalogApi: CatalogApi;\n urlReader: UrlReaderService;\n scheduler: SchedulerService;\n permissions: PermissionsService;\n httpAuth: HttpAuthService;\n auth: AuthService;\n}\n\nexport async function createRouter(\n args: RouterOptions,\n): Promise<express.Router> {\n const autoStartDevMode =\n args.config.getOptionalBoolean(\n 'orchestrator.sonataFlowService.autoStart',\n ) ?? false;\n\n if (autoStartDevMode) {\n const devModeService = new DevModeService(args.config, args.logger);\n\n const isSonataFlowUp = await devModeService.launchDevMode();\n\n if (!isSonataFlowUp) {\n args.logger.error('SonataFlow is not up. Check your configuration.');\n }\n }\n\n return await createBackendRouter({\n config: args.config,\n logger: args.logger,\n discovery: args.discovery,\n catalogApi: args.catalogApi,\n urlReader: args.urlReader,\n scheduler: args.scheduler,\n permissions: args.permissions,\n httpAuth: args.httpAuth,\n auth: args.auth,\n });\n}\n"],"names":["DevModeService","createBackendRouter"],"mappings":";;;;;AA4CA,eAAsB,aACpB,IACyB,EAAA;AACzB,EAAM,MAAA,gBAAA,GACJ,KAAK,MAAO,CAAA,kBAAA;AAAA,IACV,0CAAA;AAAA,GACG,IAAA,KAAA,CAAA;AAEP,EAAA,IAAI,gBAAkB,EAAA;AACpB,IAAA,MAAM,iBAAiB,IAAIA,6BAAA,CAAe,IAAK,CAAA,MAAA,EAAQ,KAAK,MAAM,CAAA,CAAA;AAElE,IAAM,MAAA,cAAA,GAAiB,MAAM,cAAA,CAAe,aAAc,EAAA,CAAA;AAE1D,IAAA,IAAI,CAAC,cAAgB,EAAA;AACnB,MAAK,IAAA,CAAA,MAAA,CAAO,MAAM,iDAAiD,CAAA,CAAA;AAAA,KACrE;AAAA,GACF;AAEA,EAAA,OAAO,MAAMC,0BAAoB,CAAA;AAAA,IAC/B,QAAQ,IAAK,CAAA,MAAA;AAAA,IACb,QAAQ,IAAK,CAAA,MAAA;AAAA,IACb,WAAW,IAAK,CAAA,SAAA;AAAA,IAChB,YAAY,IAAK,CAAA,UAAA;AAAA,IACjB,WAAW,IAAK,CAAA,SAAA;AAAA,IAChB,WAAW,IAAK,CAAA,SAAA;AAAA,IAChB,aAAa,IAAK,CAAA,WAAA;AAAA,IAClB,UAAU,IAAK,CAAA,QAAA;AAAA,IACf,MAAM,IAAK,CAAA,IAAA;AAAA,GACZ,CAAA,CAAA;AACH;;;;"}