@red-hat-developer-hub/backstage-plugin-orchestrator-backend 6.1.4 → 7.0.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  ### Dependencies
2
2
 
3
+ ## 7.0.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [223d35c]
8
+ - @red-hat-developer-hub/backstage-plugin-orchestrator-common@2.0.1
9
+
10
+ ## 7.0.0
11
+
12
+ ### Major Changes
13
+
14
+ - 66b7b7c: removing assessment code
15
+
16
+ ### Patch Changes
17
+
18
+ - a79f849: Updated dependency `prettier` to `3.6.2`.
19
+ - d7d2490: enable custom auth provider for executing workflows
20
+ - Updated dependencies [e590195]
21
+ - Updated dependencies [66b7b7c]
22
+ - Updated dependencies [d7d2490]
23
+ - @red-hat-developer-hub/backstage-plugin-orchestrator-common@2.0.0
24
+
3
25
  ## 6.1.4
4
26
 
5
27
  ### Patch Changes
@@ -1 +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;AAE1B,MAAM,kBAAqB,GAAA;AAE3B,MAAM,sBAAyB,GAAA;AAE/B,MAAM,YAAa,CAAA;AAAA,EACxB,OAAc,eAAgB,CAAA,IAAA,EAAc,OAAwB,EAAA;AAClE,IAAM,MAAA,CAAA,GAAI,IAAI,KAAA,CAAM,OAAO,CAAA;AAC3B,IAAA,CAAA,CAAE,IAAO,GAAA,IAAA;AACT,IAAO,OAAA,CAAA;AAAA;AACT,EAEA,OAAc,yBAAmC,GAAA;AAC/C,IAAA,OAAO,IAAK,CAAA,eAAA;AAAA,MACV,iBAAA;AAAA,MACA;AAAA,KACF;AAAA;AACF,EAEA,OAAc,0BAAoC,GAAA;AAChD,IAAA,OAAO,IAAK,CAAA,eAAA;AAAA,MACV,kBAAA;AAAA,MACA;AAAA,KACF;AAAA;AACF,EAEA,OAAc,0BAAoC,GAAA;AAChD,IAAA,OAAO,IAAK,CAAA,eAAA;AAAA,MACV,sBAAA;AAAA,MACA;AAAA,KACF;AAAA;AAEJ;;;;;;;"}
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,iBAAA,GAAoB;AAE1B,MAAM,kBAAA,GAAqB;AAE3B,MAAM,sBAAA,GAAyB;AAE/B,MAAM,YAAA,CAAa;AAAA,EACxB,OAAc,eAAA,CAAgB,IAAA,EAAc,OAAA,EAAwB;AAClE,IAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,OAAO,CAAA;AAC3B,IAAA,CAAA,CAAE,IAAA,GAAO,IAAA;AACT,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEA,OAAc,yBAAA,GAAmC;AAC/C,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,MACV,iBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,OAAc,0BAAA,GAAoC;AAChD,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,MACV,kBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,OAAc,0BAAA,GAAoC;AAChD,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,MACV,sBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"filterBuilder.cjs.js","sources":["../../src/helpers/filterBuilder.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 */\n\nimport {\n FieldFilter,\n FieldFilterOperatorEnum,\n Filter,\n IntrospectionField,\n LogicalFilter,\n NestedFilter,\n TypeName,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\ntype ProcessType = 'ProcessDefinition' | 'ProcessInstance';\n\nconst supportedOperators = [\n FieldFilterOperatorEnum.Eq,\n FieldFilterOperatorEnum.Like,\n FieldFilterOperatorEnum.In,\n FieldFilterOperatorEnum.IsNull,\n FieldFilterOperatorEnum.Gt,\n FieldFilterOperatorEnum.Gte,\n FieldFilterOperatorEnum.Lt,\n FieldFilterOperatorEnum.Lte,\n FieldFilterOperatorEnum.Between,\n];\n\nconst supportedOperatorsByType: 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};\n\nfunction isLogicalFilter(filter: Filter): filter is LogicalFilter {\n return (filter as LogicalFilter).filters !== undefined;\n}\n\nfunction isNestedFilter(filter: Filter): filter is NestedFilter {\n return (filter as NestedFilter).nested !== 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 handleNestedFilter(\n introspection: IntrospectionField[],\n type: ProcessType,\n filter: NestedFilter,\n): string {\n const subClauses = buildFilterCondition(\n introspection,\n type,\n filter.nested,\n true,\n );\n\n return `${filter.field}: {${subClauses}}`;\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 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 | undefined,\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 }\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 isNested?: boolean,\n): string {\n if (!filters) {\n return '';\n }\n\n if (isNestedFilter(filters)) {\n return handleNestedFilter(introspection, type, filters);\n }\n\n if (isLogicalFilter(filters)) {\n return handleLogicalFilter(introspection, type, filters);\n }\n\n if (!isOperatorSupported(filters.operator)) {\n throw new Error(\n `Unsupported operator ${filters.operator}. Supported operators are: ${supportedOperators.join(', ')}`,\n );\n }\n\n let fieldDef;\n\n if (!isNested) {\n 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, type)) {\n const allowedOperators =\n supportedOperatorsByType[fieldDef.type.name] || [];\n throw new Error(\n `Unsupported operator ${filters.operator} for field \"${fieldDef.name}\" of type \"${fieldDef.type.name}\". Allowed operators are: ${allowedOperators.join(', ')}`,\n );\n }\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 supportedOperators.includes(operator);\n}\n\nfunction isFieldFilterSupported(fieldDef: IntrospectionField): boolean {\n return fieldDef?.type.name === TypeName.String;\n}\n\nexport function isOperatorAllowedForField(\n operator: FieldFilterOperatorEnum,\n fieldDef: IntrospectionField,\n type: ProcessType,\n): boolean {\n if (isEnumFilter(fieldDef.name, type) && isValidEnumOperator(operator)) {\n return true;\n }\n\n const allowedForType = supportedOperatorsByType[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 | undefined,\n type: ProcessType,\n): string {\n if (!fieldDef) {\n return `\"${fieldValue}\"`;\n }\n\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 'BETWEEN':\n return 'between';\n default:\n throw new Error(`Operation \"${operator}\" not supported`);\n }\n}\n"],"names":["FieldFilterOperatorEnum","TypeName"],"mappings":"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"}
1
+ {"version":3,"file":"filterBuilder.cjs.js","sources":["../../src/helpers/filterBuilder.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 */\n\nimport {\n FieldFilter,\n FieldFilterOperatorEnum,\n Filter,\n IntrospectionField,\n LogicalFilter,\n NestedFilter,\n TypeName,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\ntype ProcessType = 'ProcessDefinition' | 'ProcessInstance';\n\nconst supportedOperators = [\n FieldFilterOperatorEnum.Eq,\n FieldFilterOperatorEnum.Like,\n FieldFilterOperatorEnum.In,\n FieldFilterOperatorEnum.IsNull,\n FieldFilterOperatorEnum.Gt,\n FieldFilterOperatorEnum.Gte,\n FieldFilterOperatorEnum.Lt,\n FieldFilterOperatorEnum.Lte,\n FieldFilterOperatorEnum.Between,\n];\n\nconst supportedOperatorsByType: 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};\n\nfunction isLogicalFilter(filter: Filter): filter is LogicalFilter {\n return (filter as LogicalFilter).filters !== undefined;\n}\n\nfunction isNestedFilter(filter: Filter): filter is NestedFilter {\n return (filter as NestedFilter).nested !== 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 handleNestedFilter(\n introspection: IntrospectionField[],\n type: ProcessType,\n filter: NestedFilter,\n): string {\n const subClauses = buildFilterCondition(\n introspection,\n type,\n filter.nested,\n true,\n );\n\n return `${filter.field}: {${subClauses}}`;\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 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 | undefined,\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 }\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 isNested?: boolean,\n): string {\n if (!filters) {\n return '';\n }\n\n if (isNestedFilter(filters)) {\n return handleNestedFilter(introspection, type, filters);\n }\n\n if (isLogicalFilter(filters)) {\n return handleLogicalFilter(introspection, type, filters);\n }\n\n if (!isOperatorSupported(filters.operator)) {\n throw new Error(\n `Unsupported operator ${filters.operator}. Supported operators are: ${supportedOperators.join(', ')}`,\n );\n }\n\n let fieldDef;\n\n if (!isNested) {\n 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, type)) {\n const allowedOperators =\n supportedOperatorsByType[fieldDef.type.name] || [];\n throw new Error(\n `Unsupported operator ${filters.operator} for field \"${fieldDef.name}\" of type \"${fieldDef.type.name}\". Allowed operators are: ${allowedOperators.join(', ')}`,\n );\n }\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 supportedOperators.includes(operator);\n}\n\nfunction isFieldFilterSupported(fieldDef: IntrospectionField): boolean {\n return fieldDef?.type.name === TypeName.String;\n}\n\nexport function isOperatorAllowedForField(\n operator: FieldFilterOperatorEnum,\n fieldDef: IntrospectionField,\n type: ProcessType,\n): boolean {\n if (isEnumFilter(fieldDef.name, type) && isValidEnumOperator(operator)) {\n return true;\n }\n\n const allowedForType = supportedOperatorsByType[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 | undefined,\n type: ProcessType,\n): string {\n if (!fieldDef) {\n return `\"${fieldValue}\"`;\n }\n\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 'BETWEEN':\n return 'between';\n default:\n throw new Error(`Operation \"${operator}\" not supported`);\n }\n}\n"],"names":["FieldFilterOperatorEnum","TypeName"],"mappings":"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"}
@@ -1 +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;AAEzB,EAAM,MAAA,WAAA,GAAc,gBAAiB,CAAA,IAAA,CAAK,WAAW,CAAA;AACrD,EAAM,MAAA,gBAAA,GAAmB,qBAAsB,CAAA,IAAA,CAAK,UAAU,CAAA;AAE9D,EAAA,IAAI,eAAe,gBAAkB,EAAA;AACnC,IAAS,KAAA,IAAA,IAAA;AACT,IAAS,KAAA,IAAA,CAAC,aAAa,gBAAgB,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AAClE,IAAS,KAAA,IAAA,IAAA;AAAA;AAGX,EAAS,KAAA,IAAA,CAAA,EAAA,EAAK,KAAK,SAAS,CAAA,IAAA,CAAA;AAE5B,EAAA,OAAO,KAAM,CAAA,OAAA,CAAQ,MAAQ,EAAA,GAAG,EAAE,IAAK,EAAA;AACzC;AAEA,SAAS,iBAAiB,WAA8B,EAAA;AACtD,EAAO,OAAA,WAAA,GAAc,CAAW,QAAA,EAAA,WAAW,CAAM,CAAA,CAAA,GAAA,EAAA;AACnD;AAEA,SAAS,sBAAsB,UAAiC,EAAA;AAC9D,EAAI,IAAA,CAAC,YAAmB,OAAA,EAAA;AAExB,EAAA,MAAM,QAAQ,EAAC;AAEf,EAAI,IAAA,UAAA,CAAW,cAAc,MAAW,EAAA;AACtC,IAAM,KAAA,CAAA,IAAA;AAAA,MACJ,CAAA,UAAA,EAAa,UAAW,CAAA,SAAS,CAC/B,EAAA,EAAA,UAAA,CAAW,KAAU,KAAA,MAAA,GAAY,UAAW,CAAA,KAAA,EAAO,WAAY,EAAA,GAAI,KACrE,CAAA,CAAA;AAAA,KACF;AAAA;AAGF,EAAA,MAAM,kBAAkB,EAAC;AACzB,EAAI,IAAA,UAAA,CAAW,UAAU,MAAW,EAAA;AAClC,IAAA,eAAA,CAAgB,IAAK,CAAA,CAAA,OAAA,EAAU,UAAW,CAAA,KAAK,CAAE,CAAA,CAAA;AAAA;AAEnD,EAAI,IAAA,UAAA,CAAW,WAAW,MAAW,EAAA;AACnC,IAAA,eAAA,CAAgB,IAAK,CAAA,CAAA,QAAA,EAAW,UAAW,CAAA,MAAM,CAAE,CAAA,CAAA;AAAA;AAErD,EAAA,IAAI,gBAAgB,MAAQ,EAAA;AAC1B,IAAA,KAAA,CAAM,KAAK,CAAgB,aAAA,EAAA,eAAA,CAAgB,IAAK,CAAA,IAAI,CAAC,CAAG,CAAA,CAAA,CAAA;AAAA;AAG1D,EAAO,OAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;;"}
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,IAAA,EAKvB;AACT,EAAA,IAAI,KAAA,GAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAA;AAEzB,EAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,IAAA,CAAK,WAAW,CAAA;AACrD,EAAA,MAAM,gBAAA,GAAmB,qBAAA,CAAsB,IAAA,CAAK,UAAU,CAAA;AAE9D,EAAA,IAAI,eAAe,gBAAA,EAAkB;AACnC,IAAA,KAAA,IAAS,IAAA;AACT,IAAA,KAAA,IAAS,CAAC,aAAa,gBAAgB,CAAA,CAAE,OAAO,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AAClE,IAAA,KAAA,IAAS,IAAA;AAAA,EACX;AAEA,EAAA,KAAA,IAAS,CAAA,EAAA,EAAK,KAAK,SAAS,CAAA,IAAA,CAAA;AAE5B,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AACzC;AAEA,SAAS,iBAAiB,WAAA,EAA8B;AACtD,EAAA,OAAO,WAAA,GAAc,CAAA,QAAA,EAAW,WAAW,CAAA,CAAA,CAAA,GAAM,EAAA;AACnD;AAEA,SAAS,sBAAsB,UAAA,EAAiC;AAC9D,EAAA,IAAI,CAAC,YAAY,OAAO,EAAA;AAExB,EAAA,MAAM,QAAQ,EAAC;AAEf,EAAA,IAAI,UAAA,CAAW,cAAc,MAAA,EAAW;AACtC,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,UAAA,EAAa,UAAA,CAAW,SAAS,CAAA,EAAA,EAC/B,UAAA,CAAW,KAAA,KAAU,MAAA,GAAY,UAAA,CAAW,KAAA,EAAO,WAAA,EAAY,GAAI,KACrE,CAAA,CAAA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,kBAAkB,EAAC;AACzB,EAAA,IAAI,UAAA,CAAW,UAAU,MAAA,EAAW;AAClC,IAAA,eAAA,CAAgB,IAAA,CAAK,CAAA,OAAA,EAAU,UAAA,CAAW,KAAK,CAAA,CAAE,CAAA;AAAA,EACnD;AACA,EAAA,IAAI,UAAA,CAAW,WAAW,MAAA,EAAW;AACnC,IAAA,eAAA,CAAgB,IAAA,CAAK,CAAA,QAAA,EAAW,UAAA,CAAW,MAAM,CAAA,CAAE,CAAA;AAAA,EACrD;AACA,EAAA,IAAI,gBAAgB,MAAA,EAAQ;AAC1B,IAAA,KAAA,CAAM,KAAK,CAAA,aAAA,EAAgB,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EAC1D;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.cjs.js","sources":["../src/plugin.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 */\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 auditor: coreServices.auditor,\n config: coreServices.rootConfig,\n discovery: coreServices.discovery,\n catalogApi: catalogServiceRef,\n urlReader: coreServices.urlReader,\n permissions: coreServices.permissions,\n scheduler: coreServices.scheduler,\n httpAuth: coreServices.httpAuth,\n http: coreServices.httpRouter,\n userInfo: coreServices.userInfo,\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":";;;;;;AA4BO,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,SAASA,6BAAa,CAAA,OAAA;AAAA,QACtB,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,UAAUA,6BAAa,CAAA,QAAA;AAAA,QACvB,MAAMA,6BAAa,CAAA,UAAA;AAAA,QACnB,UAAUA,6BAAa,CAAA;AAAA,OACzB;AAAA,MACA,MAAM,KAAK,KAAO,EAAA;AAChB,QAAM,MAAA,EAAE,MAAS,GAAA,KAAA;AACjB,QAAM,MAAA,MAAA,GAAS,MAAME,kBAAA,CAAa,KAAK,CAAA;AACvC,QAAA,IAAA,CAAK,IAAI,MAAM,CAAA;AACf,QAAA,IAAA,CAAK,aAAc,CAAA;AAAA,UACjB,IAAM,EAAA,SAAA;AAAA,UACN,KAAO,EAAA;AAAA,SACR,CAAA;AACD,QAAA,IAAA,CAAK,aAAc,CAAA;AAAA,UACjB,IAAM,EAAA,SAAA;AAAA,UACN,KAAO,EAAA;AAAA,SACR,CAAA;AACD,QAAA,IAAA,CAAK,aAAc,CAAA;AAAA,UACjB,IAAM,EAAA,OAAA;AAAA,UACN,KAAO,EAAA;AAAA,SACR,CAAA;AAAA;AACH,KACD,CAAA;AAAA;AAEL,CAAC;;;;"}
1
+ {"version":3,"file":"plugin.cjs.js","sources":["../src/plugin.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 */\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 auditor: coreServices.auditor,\n config: coreServices.rootConfig,\n discovery: coreServices.discovery,\n catalogApi: catalogServiceRef,\n urlReader: coreServices.urlReader,\n permissions: coreServices.permissions,\n scheduler: coreServices.scheduler,\n httpAuth: coreServices.httpAuth,\n http: coreServices.httpRouter,\n userInfo: coreServices.userInfo,\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":";;;;;;AA4BO,MAAM,qBAAqBA,oCAAA,CAAoB;AAAA,EACpD,QAAA,EAAU,cAAA;AAAA,EACV,SAAS,GAAA,EAAK;AACZ,IAAA,GAAA,CAAI,YAAA,CAAa;AAAA,MACf,IAAA,EAAM;AAAA,QACJ,QAAQC,6BAAA,CAAa,MAAA;AAAA,QACrB,SAASA,6BAAA,CAAa,OAAA;AAAA,QACtB,QAAQA,6BAAA,CAAa,UAAA;AAAA,QACrB,WAAWA,6BAAA,CAAa,SAAA;AAAA,QACxB,UAAA,EAAYC,uBAAA;AAAA,QACZ,WAAWD,6BAAA,CAAa,SAAA;AAAA,QACxB,aAAaA,6BAAA,CAAa,WAAA;AAAA,QAC1B,WAAWA,6BAAA,CAAa,SAAA;AAAA,QACxB,UAAUA,6BAAA,CAAa,QAAA;AAAA,QACvB,MAAMA,6BAAA,CAAa,UAAA;AAAA,QACnB,UAAUA,6BAAA,CAAa;AAAA,OACzB;AAAA,MACA,MAAM,KAAK,KAAA,EAAO;AAChB,QAAA,MAAM,EAAE,MAAK,GAAI,KAAA;AACjB,QAAA,MAAM,MAAA,GAAS,MAAME,kBAAA,CAAa,KAAK,CAAA;AACvC,QAAA,IAAA,CAAK,IAAI,MAAM,CAAA;AACf,QAAA,IAAA,CAAK,aAAA,CAAc;AAAA,UACjB,IAAA,EAAM,SAAA;AAAA,UACN,KAAA,EAAO;AAAA,SACR,CAAA;AACD,QAAA,IAAA,CAAK,aAAA,CAAc;AAAA,UACjB,IAAA,EAAM,SAAA;AAAA,UACN,KAAA,EAAO;AAAA,SACR,CAAA;AACD,QAAA,IAAA,CAAK,aAAA,CAAc;AAAA,UACjB,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../../src/routerWrapper/index.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 */\n\nimport type {\n AuditorService,\n DiscoveryService,\n HttpAuthService,\n LoggerService,\n PermissionsService,\n SchedulerService,\n UrlReaderService,\n UserInfoService,\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 auditor: AuditorService;\n discovery: DiscoveryService;\n catalogApi: CatalogApi;\n urlReader: UrlReaderService;\n scheduler: SchedulerService;\n permissions: PermissionsService;\n httpAuth: HttpAuthService;\n userInfo: UserInfoService;\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 auditor: args.auditor,\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 userInfo: args.userInfo,\n });\n}\n"],"names":["DevModeService","createBackendRouter"],"mappings":";;;;;AA+CA,eAAsB,aACpB,IACyB,EAAA;AACzB,EAAM,MAAA,gBAAA,GACJ,KAAK,MAAO,CAAA,kBAAA;AAAA,IACV;AAAA,GACG,IAAA,KAAA;AAEP,EAAA,IAAI,gBAAkB,EAAA;AACpB,IAAA,MAAM,iBAAiB,IAAIA,6BAAA,CAAe,IAAK,CAAA,MAAA,EAAQ,KAAK,MAAM,CAAA;AAElE,IAAM,MAAA,cAAA,GAAiB,MAAM,cAAA,CAAe,aAAc,EAAA;AAE1D,IAAA,IAAI,CAAC,cAAgB,EAAA;AACnB,MAAK,IAAA,CAAA,MAAA,CAAO,MAAM,iDAAiD,CAAA;AAAA;AACrE;AAGF,EAAA,OAAO,MAAMC,0BAAoB,CAAA;AAAA,IAC/B,QAAQ,IAAK,CAAA,MAAA;AAAA,IACb,QAAQ,IAAK,CAAA,MAAA;AAAA,IACb,SAAS,IAAK,CAAA,OAAA;AAAA,IACd,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,UAAU,IAAK,CAAA;AAAA,GAChB,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../../src/routerWrapper/index.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 */\n\nimport type {\n AuditorService,\n DiscoveryService,\n HttpAuthService,\n LoggerService,\n PermissionsService,\n SchedulerService,\n UrlReaderService,\n UserInfoService,\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 auditor: AuditorService;\n discovery: DiscoveryService;\n catalogApi: CatalogApi;\n urlReader: UrlReaderService;\n scheduler: SchedulerService;\n permissions: PermissionsService;\n httpAuth: HttpAuthService;\n userInfo: UserInfoService;\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 auditor: args.auditor,\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 userInfo: args.userInfo,\n });\n}\n"],"names":["DevModeService","createBackendRouter"],"mappings":";;;;;AA+CA,eAAsB,aACpB,IAAA,EACyB;AACzB,EAAA,MAAM,gBAAA,GACJ,KAAK,MAAA,CAAO,kBAAA;AAAA,IACV;AAAA,GACF,IAAK,KAAA;AAEP,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,MAAM,iBAAiB,IAAIA,6BAAA,CAAe,IAAA,CAAK,MAAA,EAAQ,KAAK,MAAM,CAAA;AAElE,IAAA,MAAM,cAAA,GAAiB,MAAM,cAAA,CAAe,aAAA,EAAc;AAE1D,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,IAAA,CAAK,MAAA,CAAO,MAAM,iDAAiD,CAAA;AAAA,IACrE;AAAA,EACF;AAEA,EAAA,OAAO,MAAMC,0BAAA,CAAoB;AAAA,IAC/B,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,QAAQ,IAAA,CAAK,MAAA;AAAA,IACb,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,UAAU,IAAA,CAAK;AAAA,GAChB,CAAA;AACH;;;;"}
@@ -200,11 +200,7 @@ class DataIndexService {
200
200
  `Workflow defintion is required to fetch instance ${instance.id}`
201
201
  );
202
202
  }
203
- const workflowDefinitionSrc = backstagePluginOrchestratorCommon.fromWorkflowSource(
204
- workflowInfo.source
205
- );
206
203
  if (workflowInfo) {
207
- instance.category = backstagePluginOrchestratorCommon.getWorkflowCategory(workflowDefinitionSrc);
208
204
  instance.description = workflowInfo.description;
209
205
  }
210
206
  return instance;
@@ -331,7 +327,6 @@ class DataIndexService {
331
327
  workflowInfo.source
332
328
  );
333
329
  if (workflowInfo) {
334
- instance.category = backstagePluginOrchestratorCommon.getWorkflowCategory(workflowDefinitionSrc);
335
330
  instance.description = workflowDefinitionSrc.description;
336
331
  }
337
332
  return instance;
@@ -1 +1 @@
1
- {"version":3,"file":"DataIndexService.cjs.js","sources":["../../src/service/DataIndexService.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 */\n\nimport { LoggerService } from '@backstage/backend-plugin-api';\n\nimport { Client, fetchExchange, gql } from '@urql/core';\n\nimport {\n Filter,\n fromWorkflowSource,\n getWorkflowCategory,\n IntrospectionField,\n parseWorkflowVariables,\n ProcessInstance,\n WorkflowDefinition,\n WorkflowInfo,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { ErrorBuilder } from '../helpers/errorBuilder';\nimport { buildFilterCondition } from '../helpers/filterBuilder';\nimport { buildGraphQlQuery } from '../helpers/queryBuilder';\nimport { Pagination } from '../types/pagination';\nimport { FETCH_PROCESS_INSTANCES_SORT_FIELD } from './constants';\n\nexport class DataIndexService {\n private readonly client: Client;\n public processDefinitionArguments: IntrospectionField[] = [];\n public processInstanceArguments: IntrospectionField[] = [];\n\n public constructor(\n private readonly dataIndexUrl: string,\n private readonly logger: LoggerService,\n ) {\n if (!dataIndexUrl.length) {\n throw ErrorBuilder.GET_NO_DATA_INDEX_URL_ERR();\n }\n\n this.client = this.getNewGraphQLClient();\n }\n\n private getNewGraphQLClient(): Client {\n const diURL = `${this.dataIndexUrl}/graphql`;\n return new Client({\n url: diURL,\n exchanges: [fetchExchange],\n });\n }\n\n public async initInputProcessDefinitionArgs(): Promise<IntrospectionField[]> {\n if (this.processDefinitionArguments.length === 0) {\n this.processDefinitionArguments =\n await this.inspectInputArgument('ProcessDefinition');\n }\n return this.processDefinitionArguments; // For testing purposes\n }\n\n public graphQLArgumentQuery(type: string): string {\n return `query ${type}Argument {\n __type(name: \"${type}Argument\") {\n kind\n name\n inputFields {\n name\n type {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n }\n }\n }\n }\n }\n }\n }`;\n }\n\n public async inspectInputArgument(\n type: string,\n ): Promise<IntrospectionField[]> {\n const result = await this.client.query(this.graphQLArgumentQuery(type), {});\n\n this.logger.debug(`Introspection query result: ${JSON.stringify(result)}`);\n\n this.handleGraphqlClientError(\n 'Error executing introspection query',\n result,\n );\n\n const pairs: IntrospectionField[] = [];\n if (result?.data?.__type?.inputFields) {\n for (const field of result.data.__type.inputFields) {\n if (\n field.name !== 'and' &&\n field.name !== 'or' &&\n field.name !== 'not'\n ) {\n pairs.push({\n name: field.name,\n type: {\n name: field.type.name,\n kind: field.type.kind,\n ofType: field.type.ofType,\n },\n });\n }\n }\n }\n return pairs;\n }\n\n public async fetchWorkflowInfo(\n definitionId: string,\n ): Promise<WorkflowInfo | undefined> {\n const graphQlQuery = `{ ProcessDefinitions ( where: {id: {equal: \"${definitionId}\" } } ) { id, name, version, type, endpoint, serviceUrl, source } }`;\n\n const result = await this.client.query(graphQlQuery, {});\n\n this.logger.debug(\n `Get workflow definition result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError('Error fetching workflow definition', result);\n\n const processDefinitions = result.data.ProcessDefinitions as WorkflowInfo[];\n\n if (processDefinitions.length === 0) {\n this.logger.info(`No workflow definition found for ${definitionId}`);\n return undefined;\n }\n\n return processDefinitions[0];\n }\n\n public async fetchWorkflowServiceUrls(): Promise<Record<string, string>> {\n const graphQlQuery = `{ ProcessDefinitions { id, serviceUrl } }`;\n\n const result = await this.client.query(graphQlQuery, {});\n\n this.logger.debug(\n `Get workflow service urls result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error fetching workflow service urls',\n result,\n );\n\n const processDefinitions = result.data.ProcessDefinitions as WorkflowInfo[];\n return processDefinitions\n .filter(definition => definition.serviceUrl)\n .map(definition => ({ [definition.id]: definition.serviceUrl! }))\n .reduce((acc, curr) => ({ ...acc, ...curr }), {});\n }\n\n public async fetchWorkflowInfos(args: {\n definitionIds?: string[];\n pagination?: Pagination;\n filter?: Filter;\n }): Promise<WorkflowInfo[]> {\n this.logger.info(`fetchWorkflowInfos() called: ${this.dataIndexUrl}`);\n const { definitionIds, pagination, filter } = args;\n\n const definitionIdsCondition =\n definitionIds !== undefined && definitionIds.length > 0\n ? `id: {in: ${JSON.stringify(definitionIds)}}`\n : undefined;\n\n const filterCondition = filter\n ? buildFilterCondition(\n await this.initInputProcessDefinitionArgs(),\n 'ProcessDefinition',\n filter,\n )\n : undefined;\n\n let whereClause: string | undefined;\n if (definitionIds && filter) {\n whereClause = `and: [{${definitionIdsCondition}}, {${filterCondition}}]`;\n } else if (definitionIdsCondition || filterCondition) {\n whereClause = definitionIdsCondition ?? filterCondition;\n } else {\n whereClause = undefined;\n }\n\n const graphQlQuery = buildGraphQlQuery({\n type: 'ProcessDefinitions',\n queryBody: 'id, name, version, type, endpoint, serviceUrl, source',\n whereClause,\n pagination,\n });\n this.logger.debug(`GraphQL query: ${graphQlQuery}`);\n const result = await this.client.query(graphQlQuery, {});\n this.logger.debug(\n `Get workflow definitions result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error fetching data index swf results',\n result,\n );\n\n return result.data.ProcessDefinitions;\n }\n\n public async fetchInstances(args: {\n definitionIds?: string[];\n pagination?: Pagination;\n filter?: Filter;\n }): Promise<ProcessInstance[]> {\n const { pagination, definitionIds, filter } = args;\n if (pagination) pagination.sortField ??= FETCH_PROCESS_INSTANCES_SORT_FIELD;\n\n const processIdNotNullCondition = 'processId: {isNull: false}';\n const definitionIdsCondition =\n definitionIds && definitionIds.length > 0\n ? `processId: {in: ${JSON.stringify(definitionIds)}}`\n : undefined;\n const type = 'ProcessInstance';\n const filterCondition = filter\n ? buildFilterCondition(\n await this.inspectInputArgument(type),\n type,\n filter,\n )\n : '';\n\n let whereClause = '';\n const conditions = [];\n\n if (processIdNotNullCondition) {\n conditions.push(`{${processIdNotNullCondition}}`);\n }\n\n if (definitionIdsCondition) {\n conditions.push(`{${definitionIdsCondition}}`);\n }\n\n if (filter) {\n conditions.push(`{${filterCondition}}`);\n }\n\n if (conditions.length === 0) {\n whereClause = processIdNotNullCondition;\n } else if (conditions.length === 1) {\n whereClause = conditions[0].slice(1, -1); // Remove the outer braces\n } else if (conditions.length > 1) {\n whereClause = `and: [${conditions.join(', ')}]`;\n }\n\n const graphQlQuery = buildGraphQlQuery({\n type: 'ProcessInstances',\n queryBody:\n 'id, processName, processId, state, start, end, nodes { id }, variables, executionSummary, parentProcessInstance {id, processName, businessKey}',\n whereClause,\n pagination,\n });\n\n this.logger.debug(`GraphQL query: ${graphQlQuery}`);\n\n const result = await this.client.query<{\n ProcessInstances: ProcessInstance[];\n }>(graphQlQuery, {});\n this.logger.debug(\n `Fetch process instances result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError('Error when fetching instances', result);\n\n const processInstancesSrc = result.data ? result.data.ProcessInstances : [];\n\n const processInstances = await Promise.all(\n processInstancesSrc.map(async instance => {\n return await this.getWorkflowDefinitionFromInstance(instance);\n }),\n );\n return processInstances;\n }\n\n private async getWorkflowDefinitionFromInstance(instance: ProcessInstance) {\n const workflowInfo = await this.fetchWorkflowInfo(instance.processId);\n if (!workflowInfo?.source) {\n throw new Error(\n `Workflow defintion is required to fetch instance ${instance.id}`,\n );\n }\n const workflowDefinitionSrc: WorkflowDefinition = fromWorkflowSource(\n workflowInfo.source,\n );\n if (workflowInfo) {\n instance.category = getWorkflowCategory(workflowDefinitionSrc);\n instance.description = workflowInfo.description;\n }\n return instance;\n }\n\n public async fetchWorkflowSource(\n definitionId: string,\n ): Promise<string | undefined> {\n const graphQlQuery = `{ ProcessDefinitions ( where: {id: {equal: \"${definitionId}\" } } ) { id, source } }`;\n\n const result = await this.client.query(graphQlQuery, {});\n\n this.logger.debug(\n `Fetch workflow source result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching workflow source',\n result,\n );\n\n const processDefinitions = result.data.ProcessDefinitions as WorkflowInfo[];\n\n if (processDefinitions.length === 0) {\n this.logger.info(`No workflow source found for ${definitionId}`);\n return undefined;\n }\n\n return processDefinitions[0].source;\n }\n\n public async fetchInstancesByDefinitionId(args: {\n definitionId: string;\n limit: number;\n offset: number;\n }): Promise<ProcessInstance[]> {\n const graphQlQuery = `{ ProcessInstances(where: {processId: {equal: \"${args.definitionId}\" } }, orderBy: {start:DESC}, pagination: {limit: ${args.limit}, offset: ${args.offset}}) { id, processName, state, start, end } }`;\n\n const result = await this.client.query(graphQlQuery, {});\n\n this.logger.debug(\n `Fetch workflow instances result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching workflow instances',\n result,\n );\n\n return result.data.ProcessInstances;\n }\n\n public async fetchInstanceVariables(\n instanceId: string,\n ): Promise<object | undefined> {\n const graphQlQuery = `{ ProcessInstances (where: { id: {equal: \"${instanceId}\" } } ) { variables } }`;\n\n const result = await this.client.query(graphQlQuery, {});\n\n this.logger.debug(\n `Fetch process instance variables result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching process instance variables',\n result,\n );\n\n const processInstances = result.data.ProcessInstances as ProcessInstance[];\n\n if (processInstances.length === 0) {\n return undefined;\n }\n\n return parseWorkflowVariables(processInstances[0].variables as object);\n }\n\n public async fetchDefinitionIdByInstanceId(\n instanceId: string,\n ): Promise<string | undefined> {\n const graphQlQuery = `{ ProcessInstances (where: { id: {equal: \"${instanceId}\" } } ) { processId } }`;\n\n const result = await this.client.query(graphQlQuery, {});\n\n this.logger.debug(\n `Fetch process id from instance result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching process id from instance',\n result,\n );\n\n const processInstances = result.data.ProcessInstances as ProcessInstance[];\n\n if (processInstances.length === 0) {\n return undefined;\n }\n\n return processInstances[0].processId;\n }\n\n public async fetchInstance(\n instanceId: string,\n ): Promise<ProcessInstance | undefined> {\n const FindProcessInstanceQuery = gql`\n query FindProcessInstanceQuery($instanceId: String!) {\n ProcessInstances(where: { id: { equal: $instanceId } }) {\n id\n processName\n processId\n serviceUrl\n executionSummary\n state\n start\n end\n nodes {\n id\n nodeId\n definitionId\n type\n name\n enter\n exit\n errorMessage\n }\n variables\n parentProcessInstance {\n id\n processName\n businessKey\n }\n error {\n nodeDefinitionId\n nodeInstanceId\n message\n }\n }\n }\n `;\n\n const result = await this.client.query(FindProcessInstanceQuery, {\n instanceId,\n });\n\n this.logger.debug(\n `Fetch process instance result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching process instances',\n result,\n );\n\n const processInstances = result.data.ProcessInstances as ProcessInstance[];\n\n if (processInstances.length === 0) {\n return undefined;\n }\n\n const instance = this.removeNodes(processInstances[0]);\n\n const workflowInfo = await this.fetchWorkflowInfo(instance.processId);\n if (!workflowInfo?.source) {\n throw new Error(\n `Workflow definition is required to fetch instance ${instance.id}`,\n );\n }\n const workflowDefinitionSrc: WorkflowDefinition = fromWorkflowSource(\n workflowInfo.source,\n );\n if (workflowInfo) {\n instance.category = getWorkflowCategory(workflowDefinitionSrc);\n instance.description = workflowDefinitionSrc.description;\n }\n return instance;\n }\n\n private handleGraphqlClientError(scenario: string, result: any) {\n if (!result?.error) {\n return;\n }\n this.logger.error(`${scenario} ${result}`);\n const networkError = result.error.networkError?.cause?.message;\n if (networkError) {\n const toThrow = new Error(`${result.error.message}. ${networkError}`);\n toThrow.name = 'Network Error';\n throw toThrow;\n } else {\n throw result.error;\n }\n }\n\n private removeNodes(instance: ProcessInstance): ProcessInstance {\n const errorNodeId = instance.error?.nodeInstanceId;\n instance.nodes = instance.nodes.filter(node => {\n return !node.errorMessage || node.id === errorNodeId;\n });\n return instance;\n }\n}\n"],"names":["ErrorBuilder","Client","fetchExchange","buildFilterCondition","buildGraphQlQuery","FETCH_PROCESS_INSTANCES_SORT_FIELD","fromWorkflowSource","getWorkflowCategory","parseWorkflowVariables","gql"],"mappings":"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"}
1
+ {"version":3,"file":"DataIndexService.cjs.js","sources":["../../src/service/DataIndexService.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 */\n\nimport { LoggerService } from '@backstage/backend-plugin-api';\n\nimport { Client, fetchExchange, gql } from '@urql/core';\n\nimport {\n Filter,\n fromWorkflowSource,\n IntrospectionField,\n parseWorkflowVariables,\n ProcessInstance,\n WorkflowDefinition,\n WorkflowInfo,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { ErrorBuilder } from '../helpers/errorBuilder';\nimport { buildFilterCondition } from '../helpers/filterBuilder';\nimport { buildGraphQlQuery } from '../helpers/queryBuilder';\nimport { Pagination } from '../types/pagination';\nimport { FETCH_PROCESS_INSTANCES_SORT_FIELD } from './constants';\n\nexport class DataIndexService {\n private readonly client: Client;\n public processDefinitionArguments: IntrospectionField[] = [];\n public processInstanceArguments: IntrospectionField[] = [];\n\n public constructor(\n private readonly dataIndexUrl: string,\n private readonly logger: LoggerService,\n ) {\n if (!dataIndexUrl.length) {\n throw ErrorBuilder.GET_NO_DATA_INDEX_URL_ERR();\n }\n\n this.client = this.getNewGraphQLClient();\n }\n\n private getNewGraphQLClient(): Client {\n const diURL = `${this.dataIndexUrl}/graphql`;\n return new Client({\n url: diURL,\n exchanges: [fetchExchange],\n });\n }\n\n public async initInputProcessDefinitionArgs(): Promise<IntrospectionField[]> {\n if (this.processDefinitionArguments.length === 0) {\n this.processDefinitionArguments =\n await this.inspectInputArgument('ProcessDefinition');\n }\n return this.processDefinitionArguments; // For testing purposes\n }\n\n public graphQLArgumentQuery(type: string): string {\n return `query ${type}Argument {\n __type(name: \"${type}Argument\") {\n kind\n name\n inputFields {\n name\n type {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n ofType {\n kind\n name\n }\n }\n }\n }\n }\n }\n }`;\n }\n\n public async inspectInputArgument(\n type: string,\n ): Promise<IntrospectionField[]> {\n const result = await this.client.query(this.graphQLArgumentQuery(type), {});\n\n this.logger.debug(`Introspection query result: ${JSON.stringify(result)}`);\n\n this.handleGraphqlClientError(\n 'Error executing introspection query',\n result,\n );\n\n const pairs: IntrospectionField[] = [];\n if (result?.data?.__type?.inputFields) {\n for (const field of result.data.__type.inputFields) {\n if (\n field.name !== 'and' &&\n field.name !== 'or' &&\n field.name !== 'not'\n ) {\n pairs.push({\n name: field.name,\n type: {\n name: field.type.name,\n kind: field.type.kind,\n ofType: field.type.ofType,\n },\n });\n }\n }\n }\n return pairs;\n }\n\n public async fetchWorkflowInfo(\n definitionId: string,\n ): Promise<WorkflowInfo | undefined> {\n const graphQlQuery = `{ ProcessDefinitions ( where: {id: {equal: \"${definitionId}\" } } ) { id, name, version, type, endpoint, serviceUrl, source } }`;\n\n const result = await this.client.query(graphQlQuery, {});\n\n this.logger.debug(\n `Get workflow definition result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError('Error fetching workflow definition', result);\n\n const processDefinitions = result.data.ProcessDefinitions as WorkflowInfo[];\n\n if (processDefinitions.length === 0) {\n this.logger.info(`No workflow definition found for ${definitionId}`);\n return undefined;\n }\n\n return processDefinitions[0];\n }\n\n public async fetchWorkflowServiceUrls(): Promise<Record<string, string>> {\n const graphQlQuery = `{ ProcessDefinitions { id, serviceUrl } }`;\n\n const result = await this.client.query(graphQlQuery, {});\n\n this.logger.debug(\n `Get workflow service urls result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error fetching workflow service urls',\n result,\n );\n\n const processDefinitions = result.data.ProcessDefinitions as WorkflowInfo[];\n return processDefinitions\n .filter(definition => definition.serviceUrl)\n .map(definition => ({ [definition.id]: definition.serviceUrl! }))\n .reduce((acc, curr) => ({ ...acc, ...curr }), {});\n }\n\n public async fetchWorkflowInfos(args: {\n definitionIds?: string[];\n pagination?: Pagination;\n filter?: Filter;\n }): Promise<WorkflowInfo[]> {\n this.logger.info(`fetchWorkflowInfos() called: ${this.dataIndexUrl}`);\n const { definitionIds, pagination, filter } = args;\n\n const definitionIdsCondition =\n definitionIds !== undefined && definitionIds.length > 0\n ? `id: {in: ${JSON.stringify(definitionIds)}}`\n : undefined;\n\n const filterCondition = filter\n ? buildFilterCondition(\n await this.initInputProcessDefinitionArgs(),\n 'ProcessDefinition',\n filter,\n )\n : undefined;\n\n let whereClause: string | undefined;\n if (definitionIds && filter) {\n whereClause = `and: [{${definitionIdsCondition}}, {${filterCondition}}]`;\n } else if (definitionIdsCondition || filterCondition) {\n whereClause = definitionIdsCondition ?? filterCondition;\n } else {\n whereClause = undefined;\n }\n\n const graphQlQuery = buildGraphQlQuery({\n type: 'ProcessDefinitions',\n queryBody: 'id, name, version, type, endpoint, serviceUrl, source',\n whereClause,\n pagination,\n });\n this.logger.debug(`GraphQL query: ${graphQlQuery}`);\n const result = await this.client.query(graphQlQuery, {});\n this.logger.debug(\n `Get workflow definitions result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error fetching data index swf results',\n result,\n );\n\n return result.data.ProcessDefinitions;\n }\n\n public async fetchInstances(args: {\n definitionIds?: string[];\n pagination?: Pagination;\n filter?: Filter;\n }): Promise<ProcessInstance[]> {\n const { pagination, definitionIds, filter } = args;\n if (pagination) pagination.sortField ??= FETCH_PROCESS_INSTANCES_SORT_FIELD;\n\n const processIdNotNullCondition = 'processId: {isNull: false}';\n const definitionIdsCondition =\n definitionIds && definitionIds.length > 0\n ? `processId: {in: ${JSON.stringify(definitionIds)}}`\n : undefined;\n const type = 'ProcessInstance';\n const filterCondition = filter\n ? buildFilterCondition(\n await this.inspectInputArgument(type),\n type,\n filter,\n )\n : '';\n\n let whereClause = '';\n const conditions = [];\n\n if (processIdNotNullCondition) {\n conditions.push(`{${processIdNotNullCondition}}`);\n }\n\n if (definitionIdsCondition) {\n conditions.push(`{${definitionIdsCondition}}`);\n }\n\n if (filter) {\n conditions.push(`{${filterCondition}}`);\n }\n\n if (conditions.length === 0) {\n whereClause = processIdNotNullCondition;\n } else if (conditions.length === 1) {\n whereClause = conditions[0].slice(1, -1); // Remove the outer braces\n } else if (conditions.length > 1) {\n whereClause = `and: [${conditions.join(', ')}]`;\n }\n\n const graphQlQuery = buildGraphQlQuery({\n type: 'ProcessInstances',\n queryBody:\n 'id, processName, processId, state, start, end, nodes { id }, variables, executionSummary, parentProcessInstance {id, processName, businessKey}',\n whereClause,\n pagination,\n });\n\n this.logger.debug(`GraphQL query: ${graphQlQuery}`);\n\n const result = await this.client.query<{\n ProcessInstances: ProcessInstance[];\n }>(graphQlQuery, {});\n this.logger.debug(\n `Fetch process instances result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError('Error when fetching instances', result);\n\n const processInstancesSrc = result.data ? result.data.ProcessInstances : [];\n\n const processInstances = await Promise.all(\n processInstancesSrc.map(async instance => {\n return await this.getWorkflowDefinitionFromInstance(instance);\n }),\n );\n return processInstances;\n }\n\n private async getWorkflowDefinitionFromInstance(instance: ProcessInstance) {\n const workflowInfo = await this.fetchWorkflowInfo(instance.processId);\n if (!workflowInfo?.source) {\n throw new Error(\n `Workflow defintion is required to fetch instance ${instance.id}`,\n );\n }\n if (workflowInfo) {\n instance.description = workflowInfo.description;\n }\n return instance;\n }\n\n public async fetchWorkflowSource(\n definitionId: string,\n ): Promise<string | undefined> {\n const graphQlQuery = `{ ProcessDefinitions ( where: {id: {equal: \"${definitionId}\" } } ) { id, source } }`;\n\n const result = await this.client.query(graphQlQuery, {});\n\n this.logger.debug(\n `Fetch workflow source result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching workflow source',\n result,\n );\n\n const processDefinitions = result.data.ProcessDefinitions as WorkflowInfo[];\n\n if (processDefinitions.length === 0) {\n this.logger.info(`No workflow source found for ${definitionId}`);\n return undefined;\n }\n\n return processDefinitions[0].source;\n }\n\n public async fetchInstancesByDefinitionId(args: {\n definitionId: string;\n limit: number;\n offset: number;\n }): Promise<ProcessInstance[]> {\n const graphQlQuery = `{ ProcessInstances(where: {processId: {equal: \"${args.definitionId}\" } }, orderBy: {start:DESC}, pagination: {limit: ${args.limit}, offset: ${args.offset}}) { id, processName, state, start, end } }`;\n\n const result = await this.client.query(graphQlQuery, {});\n\n this.logger.debug(\n `Fetch workflow instances result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching workflow instances',\n result,\n );\n\n return result.data.ProcessInstances;\n }\n\n public async fetchInstanceVariables(\n instanceId: string,\n ): Promise<object | undefined> {\n const graphQlQuery = `{ ProcessInstances (where: { id: {equal: \"${instanceId}\" } } ) { variables } }`;\n\n const result = await this.client.query(graphQlQuery, {});\n\n this.logger.debug(\n `Fetch process instance variables result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching process instance variables',\n result,\n );\n\n const processInstances = result.data.ProcessInstances as ProcessInstance[];\n\n if (processInstances.length === 0) {\n return undefined;\n }\n\n return parseWorkflowVariables(processInstances[0].variables as object);\n }\n\n public async fetchDefinitionIdByInstanceId(\n instanceId: string,\n ): Promise<string | undefined> {\n const graphQlQuery = `{ ProcessInstances (where: { id: {equal: \"${instanceId}\" } } ) { processId } }`;\n\n const result = await this.client.query(graphQlQuery, {});\n\n this.logger.debug(\n `Fetch process id from instance result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching process id from instance',\n result,\n );\n\n const processInstances = result.data.ProcessInstances as ProcessInstance[];\n\n if (processInstances.length === 0) {\n return undefined;\n }\n\n return processInstances[0].processId;\n }\n\n public async fetchInstance(\n instanceId: string,\n ): Promise<ProcessInstance | undefined> {\n const FindProcessInstanceQuery = gql`\n query FindProcessInstanceQuery($instanceId: String!) {\n ProcessInstances(where: { id: { equal: $instanceId } }) {\n id\n processName\n processId\n serviceUrl\n executionSummary\n state\n start\n end\n nodes {\n id\n nodeId\n definitionId\n type\n name\n enter\n exit\n errorMessage\n }\n variables\n parentProcessInstance {\n id\n processName\n businessKey\n }\n error {\n nodeDefinitionId\n nodeInstanceId\n message\n }\n }\n }\n `;\n\n const result = await this.client.query(FindProcessInstanceQuery, {\n instanceId,\n });\n\n this.logger.debug(\n `Fetch process instance result: ${JSON.stringify(result)}`,\n );\n\n this.handleGraphqlClientError(\n 'Error when fetching process instances',\n result,\n );\n\n const processInstances = result.data.ProcessInstances as ProcessInstance[];\n\n if (processInstances.length === 0) {\n return undefined;\n }\n\n const instance = this.removeNodes(processInstances[0]);\n\n const workflowInfo = await this.fetchWorkflowInfo(instance.processId);\n if (!workflowInfo?.source) {\n throw new Error(\n `Workflow definition is required to fetch instance ${instance.id}`,\n );\n }\n const workflowDefinitionSrc: WorkflowDefinition = fromWorkflowSource(\n workflowInfo.source,\n );\n if (workflowInfo) {\n instance.description = workflowDefinitionSrc.description;\n }\n return instance;\n }\n\n private handleGraphqlClientError(scenario: string, result: any) {\n if (!result?.error) {\n return;\n }\n this.logger.error(`${scenario} ${result}`);\n const networkError = result.error.networkError?.cause?.message;\n if (networkError) {\n const toThrow = new Error(`${result.error.message}. ${networkError}`);\n toThrow.name = 'Network Error';\n throw toThrow;\n } else {\n throw result.error;\n }\n }\n\n private removeNodes(instance: ProcessInstance): ProcessInstance {\n const errorNodeId = instance.error?.nodeInstanceId;\n instance.nodes = instance.nodes.filter(node => {\n return !node.errorMessage || node.id === errorNodeId;\n });\n return instance;\n }\n}\n"],"names":["ErrorBuilder","Client","fetchExchange","buildFilterCondition","buildGraphQlQuery","FETCH_PROCESS_INSTANCES_SORT_FIELD","parseWorkflowVariables","gql","fromWorkflowSource"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"DataInputSchemaService.cjs.js","sources":["../../src/service/DataInputSchemaService.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 { JsonObject } from '@backstage/types';\n\nimport { WORKFLOW_DATA_KEY } from './constants';\n\nexport class DataInputSchemaService {\n public extractWorkflowData(variables?: object): JsonObject | undefined {\n return variables && WORKFLOW_DATA_KEY in variables\n ? (variables[WORKFLOW_DATA_KEY] as JsonObject)\n : undefined;\n }\n}\n"],"names":["WORKFLOW_DATA_KEY"],"mappings":";;;;AAmBO,MAAM,sBAAuB,CAAA;AAAA,EAC3B,oBAAoB,SAA4C,EAAA;AACrE,IAAA,OAAO,SAAa,IAAAA,2BAAA,IAAqB,SACpC,GAAA,SAAA,CAAUA,2BAAiB,CAC5B,GAAA,MAAA;AAAA;AAER;;;;"}
1
+ {"version":3,"file":"DataInputSchemaService.cjs.js","sources":["../../src/service/DataInputSchemaService.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 { JsonObject } from '@backstage/types';\n\nimport { WORKFLOW_DATA_KEY } from './constants';\n\nexport class DataInputSchemaService {\n public extractWorkflowData(variables?: object): JsonObject | undefined {\n return variables && WORKFLOW_DATA_KEY in variables\n ? (variables[WORKFLOW_DATA_KEY] as JsonObject)\n : undefined;\n }\n}\n"],"names":["WORKFLOW_DATA_KEY"],"mappings":";;;;AAmBO,MAAM,sBAAA,CAAuB;AAAA,EAC3B,oBAAoB,SAAA,EAA4C;AACrE,IAAA,OAAO,SAAA,IAAaA,2BAAA,IAAqB,SAAA,GACpC,SAAA,CAAUA,2BAAiB,CAAA,GAC5B,MAAA;AAAA,EACN;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"DevModeService.cjs.js","sources":["../../src/service/DevModeService.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 */\n\nimport type { LoggerService } from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\n\nimport fs from 'fs-extra';\n\nimport {\n DEFAULT_SONATAFLOW_BASE_URL,\n DEFAULT_SONATAFLOW_CONTAINER_IMAGE,\n DEFAULT_SONATAFLOW_PERSISTENCE_PATH,\n DEFAULT_WORKFLOWS_PATH,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { spawn } from 'child_process';\nimport { join, resolve } from 'path';\n\nimport { GitService } from './GitService';\nimport { executeWithRetry } from './Helper';\n\nconst SONATA_FLOW_RESOURCES_PATH =\n '/home/kogito/serverless-workflow-project/src/main/resources';\nconst DEFAULT_SONATAFLOW_RUNTIME = 'docker';\n\ninterface LauncherCommand {\n command: string;\n args: string[];\n}\n\ninterface DevModeConnectionConfig {\n host: string;\n port?: number;\n containerImage: string;\n resourcesPath: string;\n persistencePath?: string;\n repoUrl?: string;\n notificationsBearerToken?: string;\n notificationsUrl?: string;\n runtime: string;\n}\n\nexport class DevModeService {\n private readonly connection: DevModeConnectionConfig;\n private readonly gitService;\n\n constructor(\n config: Config,\n private readonly logger: LoggerService,\n ) {\n this.connection = this.extractConnectionConfig(config);\n this.gitService = new GitService(logger, config);\n }\n\n public get devModeUrl(): string {\n if (!this.connection.port) {\n return this.connection.host;\n }\n return `${this.connection.host}:${this.connection.port}`;\n }\n\n public async launchDevMode(): Promise<boolean> {\n await this.loadDevWorkflows();\n\n const isAlreadyUp = await this.isSonataFlowUp(false, this.devModeUrl);\n if (isAlreadyUp) {\n return true;\n }\n\n this.launchSonataFlow();\n\n return await this.isSonataFlowUp(true, this.devModeUrl);\n }\n\n private async isSonataFlowUp(\n withRetry: boolean,\n endpoint: string,\n ): Promise<boolean> {\n const healthUrl = `${endpoint}/q/health`;\n this.logger.info(`Checking SonataFlow health at: ${healthUrl}`);\n\n try {\n const response = await executeWithRetry(\n () => fetch(healthUrl),\n withRetry ? 15 : 1,\n );\n if (response.ok) {\n this.logger.info('SonataFlow is up and running');\n return true;\n }\n } catch (e) {\n this.logger.error(`Error when checking SonataFlow health: ${e}`);\n }\n return false;\n }\n\n private launchSonataFlow(): void {\n const launcherCmd = this.createLauncherCommand();\n\n this.logger.info(\n `Auto starting SonataFlow through: ${\n launcherCmd.command\n } ${launcherCmd.args.join(' ')}`,\n );\n\n const process = spawn(launcherCmd.command, launcherCmd.args, {\n shell: false,\n });\n\n process.on('close', code => {\n this.logger.info(`SonataFlow process exited with code ${code}`);\n });\n\n process.on('exit', code => {\n this.logger.info(`SonataFlow process exited with code ${code}`);\n });\n\n process.on('error', error => {\n this.logger.error(`SonataFlow process error: ${error}`);\n });\n }\n\n private createLauncherCommand(): LauncherCommand {\n const resourcesAbsPath = resolve(\n join(this.connection.resourcesPath, DEFAULT_WORKFLOWS_PATH),\n );\n\n const launcherArgs = [\n 'run',\n '--name',\n 'backstage-internal-sonataflow',\n ...(this.connection.runtime === 'podman'\n ? ['--replace']\n : ['--add-host', 'host.docker.internal:host-gateway']),\n ];\n\n // TODO: pass automatically a set of env variables from configuration, i.e. all config props with names starting at ENV_:\n // config: orchestrator.sonataFlowService.ENV_foo\n\n launcherArgs.push('-e', `QUARKUS_HTTP_PORT=${this.connection.port}`);\n\n launcherArgs.push('-p', `${this.connection.port}:${this.connection.port}`);\n launcherArgs.push('-e', `KOGITO_SERVICE_URL=${this.devModeUrl}`);\n launcherArgs.push(\n '-v',\n `${resourcesAbsPath}:${SONATA_FLOW_RESOURCES_PATH}:Z`,\n );\n if (this.connection?.persistencePath) {\n // if persistence is enabled, mount the volume and persist data across restarts\n const persistenceAbsPath = resolve(this.connection.persistencePath);\n this.logger.info(\n `Persistence is enabled, mounting ${persistenceAbsPath} as volume to persist data`,\n );\n if (!fs.existsSync(persistenceAbsPath)) {\n fs.mkdirSync(persistenceAbsPath, { recursive: true });\n }\n launcherArgs.push(\n '-v',\n `${persistenceAbsPath}:${DEFAULT_SONATAFLOW_PERSISTENCE_PATH}:Z`,\n );\n }\n launcherArgs.push('-e', 'KOGITO.CODEGEN.PROCESS.FAILONERROR=false');\n launcherArgs.push(\n '-e',\n `QUARKUS_EMBEDDED_POSTGRESQL_DATA_DIR=${DEFAULT_SONATAFLOW_PERSISTENCE_PATH}`,\n );\n launcherArgs.push(\n '-e',\n `NOTIFICATIONS_BEARER_TOKEN=${this.connection.notificationsBearerToken}`,\n );\n launcherArgs.push(\n '-e',\n `BACKSTAGE_NOTIFICATIONS_URL=${this.connection.notificationsUrl}`,\n );\n\n launcherArgs.push(this.connection.containerImage);\n\n return {\n command: this.connection.runtime,\n args: launcherArgs,\n };\n }\n\n private extractConnectionConfig(config: Config): DevModeConnectionConfig {\n const host =\n config.getOptionalString('orchestrator.sonataFlowService.baseUrl') ??\n DEFAULT_SONATAFLOW_BASE_URL;\n const port = config.getOptionalNumber(\n 'orchestrator.sonataFlowService.port',\n );\n\n const resourcesPath =\n config.getOptionalString(\n 'orchestrator.sonataFlowService.workflowsSource.localPath',\n ) ?? '';\n\n const containerImage =\n config.getOptionalString('orchestrator.sonataFlowService.container') ??\n DEFAULT_SONATAFLOW_CONTAINER_IMAGE;\n\n const persistencePath =\n config.getOptionalString(\n 'orchestrator.sonataFlowService.persistence.path',\n ) ?? '';\n\n const repoUrl =\n config.getOptionalString(\n 'orchestrator.sonataFlowService.workflowsSource.gitRepositoryUrl',\n ) ?? '';\n\n const notificationsBearerToken =\n config.getOptionalString(\n 'orchestrator.sonataFlowService.notificationsBearerToken',\n ) ?? '';\n\n const notificationsUrl =\n config.getOptionalString(\n 'orchestrator.sonataFlowService.notificationsUrl',\n ) ?? '';\n\n const runtime =\n config.getOptionalString('orchestrator.sonataFlowService.runtime') ??\n DEFAULT_SONATAFLOW_RUNTIME;\n\n return {\n runtime,\n host,\n port,\n containerImage,\n resourcesPath,\n persistencePath,\n repoUrl,\n notificationsBearerToken,\n notificationsUrl,\n };\n }\n\n public async loadDevWorkflows() {\n if (!this.connection?.repoUrl || !this.connection?.resourcesPath) {\n this.logger.info(\n 'No Git repository or path configured. Skipping dev workflows loading.',\n );\n return;\n }\n\n this.logger.info(`Loading dev workflows from ${this.connection.repoUrl}`);\n const localPath = this.connection.resourcesPath;\n if (await fs.pathExists(localPath)) {\n this.logger.info(`Path ${localPath} already exists. Skipping clone.`);\n return;\n }\n\n await this.gitService.clone(this.connection.repoUrl, localPath);\n // Remove .git to avoid any submodule issues\n await fs.rm(join(localPath, '.git'), { recursive: true, force: true });\n }\n}\n"],"names":["GitService","executeWithRetry","spawn","resolve","join","DEFAULT_WORKFLOWS_PATH","fs","DEFAULT_SONATAFLOW_PERSISTENCE_PATH","DEFAULT_SONATAFLOW_BASE_URL","DEFAULT_SONATAFLOW_CONTAINER_IMAGE"],"mappings":";;;;;;;;;;;;;AAkCA,MAAM,0BACJ,GAAA,6DAAA;AACF,MAAM,0BAA6B,GAAA,QAAA;AAmB5B,MAAM,cAAe,CAAA;AAAA,EAI1B,WAAA,CACE,QACiB,MACjB,EAAA;AADiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAEjB,IAAK,IAAA,CAAA,UAAA,GAAa,IAAK,CAAA,uBAAA,CAAwB,MAAM,CAAA;AACrD,IAAA,IAAA,CAAK,UAAa,GAAA,IAAIA,qBAAW,CAAA,MAAA,EAAQ,MAAM,CAAA;AAAA;AACjD,EATiB,UAAA;AAAA,EACA,UAAA;AAAA,EAUjB,IAAW,UAAqB,GAAA;AAC9B,IAAI,IAAA,CAAC,IAAK,CAAA,UAAA,CAAW,IAAM,EAAA;AACzB,MAAA,OAAO,KAAK,UAAW,CAAA,IAAA;AAAA;AAEzB,IAAA,OAAO,GAAG,IAAK,CAAA,UAAA,CAAW,IAAI,CAAI,CAAA,EAAA,IAAA,CAAK,WAAW,IAAI,CAAA,CAAA;AAAA;AACxD,EAEA,MAAa,aAAkC,GAAA;AAC7C,IAAA,MAAM,KAAK,gBAAiB,EAAA;AAE5B,IAAA,MAAM,cAAc,MAAM,IAAA,CAAK,cAAe,CAAA,KAAA,EAAO,KAAK,UAAU,CAAA;AACpE,IAAA,IAAI,WAAa,EAAA;AACf,MAAO,OAAA,IAAA;AAAA;AAGT,IAAA,IAAA,CAAK,gBAAiB,EAAA;AAEtB,IAAA,OAAO,MAAM,IAAA,CAAK,cAAe,CAAA,IAAA,EAAM,KAAK,UAAU,CAAA;AAAA;AACxD,EAEA,MAAc,cACZ,CAAA,SAAA,EACA,QACkB,EAAA;AAClB,IAAM,MAAA,SAAA,GAAY,GAAG,QAAQ,CAAA,SAAA,CAAA;AAC7B,IAAA,IAAA,CAAK,MAAO,CAAA,IAAA,CAAK,CAAkC,+BAAA,EAAA,SAAS,CAAE,CAAA,CAAA;AAE9D,IAAI,IAAA;AACF,MAAA,MAAM,WAAW,MAAMC,uBAAA;AAAA,QACrB,MAAM,MAAM,SAAS,CAAA;AAAA,QACrB,YAAY,EAAK,GAAA;AAAA,OACnB;AACA,MAAA,IAAI,SAAS,EAAI,EAAA;AACf,QAAK,IAAA,CAAA,MAAA,CAAO,KAAK,8BAA8B,CAAA;AAC/C,QAAO,OAAA,IAAA;AAAA;AACT,aACO,CAAG,EAAA;AACV,MAAA,IAAA,CAAK,MAAO,CAAA,KAAA,CAAM,CAA0C,uCAAA,EAAA,CAAC,CAAE,CAAA,CAAA;AAAA;AAEjE,IAAO,OAAA,KAAA;AAAA;AACT,EAEQ,gBAAyB,GAAA;AAC/B,IAAM,MAAA,WAAA,GAAc,KAAK,qBAAsB,EAAA;AAE/C,IAAA,IAAA,CAAK,MAAO,CAAA,IAAA;AAAA,MACV,CAAA,kCAAA,EACE,YAAY,OACd,CAAA,CAAA,EAAI,YAAY,IAAK,CAAA,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA,KAChC;AAEA,IAAA,MAAM,OAAU,GAAAC,mBAAA,CAAM,WAAY,CAAA,OAAA,EAAS,YAAY,IAAM,EAAA;AAAA,MAC3D,KAAO,EAAA;AAAA,KACR,CAAA;AAED,IAAQ,OAAA,CAAA,EAAA,CAAG,SAAS,CAAQ,IAAA,KAAA;AAC1B,MAAA,IAAA,CAAK,MAAO,CAAA,IAAA,CAAK,CAAuC,oCAAA,EAAA,IAAI,CAAE,CAAA,CAAA;AAAA,KAC/D,CAAA;AAED,IAAQ,OAAA,CAAA,EAAA,CAAG,QAAQ,CAAQ,IAAA,KAAA;AACzB,MAAA,IAAA,CAAK,MAAO,CAAA,IAAA,CAAK,CAAuC,oCAAA,EAAA,IAAI,CAAE,CAAA,CAAA;AAAA,KAC/D,CAAA;AAED,IAAQ,OAAA,CAAA,EAAA,CAAG,SAAS,CAAS,KAAA,KAAA;AAC3B,MAAA,IAAA,CAAK,MAAO,CAAA,KAAA,CAAM,CAA6B,0BAAA,EAAA,KAAK,CAAE,CAAA,CAAA;AAAA,KACvD,CAAA;AAAA;AACH,EAEQ,qBAAyC,GAAA;AAC/C,IAAA,MAAM,gBAAmB,GAAAC,YAAA;AAAA,MACvBC,SAAK,CAAA,IAAA,CAAK,UAAW,CAAA,aAAA,EAAeC,wDAAsB;AAAA,KAC5D;AAEA,IAAA,MAAM,YAAe,GAAA;AAAA,MACnB,KAAA;AAAA,MACA,QAAA;AAAA,MACA,+BAAA;AAAA,MACA,GAAI,IAAK,CAAA,UAAA,CAAW,OAAY,KAAA,QAAA,GAC5B,CAAC,WAAW,CAAA,GACZ,CAAC,YAAA,EAAc,mCAAmC;AAAA,KACxD;AAKA,IAAA,YAAA,CAAa,KAAK,IAAM,EAAA,CAAA,kBAAA,EAAqB,IAAK,CAAA,UAAA,CAAW,IAAI,CAAE,CAAA,CAAA;AAEnE,IAAa,YAAA,CAAA,IAAA,CAAK,IAAM,EAAA,CAAA,EAAG,IAAK,CAAA,UAAA,CAAW,IAAI,CAAI,CAAA,EAAA,IAAA,CAAK,UAAW,CAAA,IAAI,CAAE,CAAA,CAAA;AACzE,IAAA,YAAA,CAAa,IAAK,CAAA,IAAA,EAAM,CAAsB,mBAAA,EAAA,IAAA,CAAK,UAAU,CAAE,CAAA,CAAA;AAC/D,IAAa,YAAA,CAAA,IAAA;AAAA,MACX,IAAA;AAAA,MACA,CAAA,EAAG,gBAAgB,CAAA,CAAA,EAAI,0BAA0B,CAAA,EAAA;AAAA,KACnD;AACA,IAAI,IAAA,IAAA,CAAK,YAAY,eAAiB,EAAA;AAEpC,MAAA,MAAM,kBAAqB,GAAAF,YAAA,CAAQ,IAAK,CAAA,UAAA,CAAW,eAAe,CAAA;AAClE,MAAA,IAAA,CAAK,MAAO,CAAA,IAAA;AAAA,QACV,oCAAoC,kBAAkB,CAAA,0BAAA;AAAA,OACxD;AACA,MAAA,IAAI,CAACG,mBAAA,CAAG,UAAW,CAAA,kBAAkB,CAAG,EAAA;AACtC,QAAAA,mBAAA,CAAG,SAAU,CAAA,kBAAA,EAAoB,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA;AAEtD,MAAa,YAAA,CAAA,IAAA;AAAA,QACX,IAAA;AAAA,QACA,CAAA,EAAG,kBAAkB,CAAA,CAAA,EAAIC,qEAAmC,CAAA,EAAA;AAAA,OAC9D;AAAA;AAEF,IAAa,YAAA,CAAA,IAAA,CAAK,MAAM,0CAA0C,CAAA;AAClE,IAAa,YAAA,CAAA,IAAA;AAAA,MACX,IAAA;AAAA,MACA,wCAAwCA,qEAAmC,CAAA;AAAA,KAC7E;AACA,IAAa,YAAA,CAAA,IAAA;AAAA,MACX,IAAA;AAAA,MACA,CAAA,2BAAA,EAA8B,IAAK,CAAA,UAAA,CAAW,wBAAwB,CAAA;AAAA,KACxE;AACA,IAAa,YAAA,CAAA,IAAA;AAAA,MACX,IAAA;AAAA,MACA,CAAA,4BAAA,EAA+B,IAAK,CAAA,UAAA,CAAW,gBAAgB,CAAA;AAAA,KACjE;AAEA,IAAa,YAAA,CAAA,IAAA,CAAK,IAAK,CAAA,UAAA,CAAW,cAAc,CAAA;AAEhD,IAAO,OAAA;AAAA,MACL,OAAA,EAAS,KAAK,UAAW,CAAA,OAAA;AAAA,MACzB,IAAM,EAAA;AAAA,KACR;AAAA;AACF,EAEQ,wBAAwB,MAAyC,EAAA;AACvE,IAAA,MAAM,IACJ,GAAA,MAAA,CAAO,iBAAkB,CAAA,wCAAwC,CACjE,IAAAC,6DAAA;AACF,IAAA,MAAM,OAAO,MAAO,CAAA,iBAAA;AAAA,MAClB;AAAA,KACF;AAEA,IAAA,MAAM,gBACJ,MAAO,CAAA,iBAAA;AAAA,MACL;AAAA,KACG,IAAA,EAAA;AAEP,IAAA,MAAM,cACJ,GAAA,MAAA,CAAO,iBAAkB,CAAA,0CAA0C,CACnE,IAAAC,oEAAA;AAEF,IAAA,MAAM,kBACJ,MAAO,CAAA,iBAAA;AAAA,MACL;AAAA,KACG,IAAA,EAAA;AAEP,IAAA,MAAM,UACJ,MAAO,CAAA,iBAAA;AAAA,MACL;AAAA,KACG,IAAA,EAAA;AAEP,IAAA,MAAM,2BACJ,MAAO,CAAA,iBAAA;AAAA,MACL;AAAA,KACG,IAAA,EAAA;AAEP,IAAA,MAAM,mBACJ,MAAO,CAAA,iBAAA;AAAA,MACL;AAAA,KACG,IAAA,EAAA;AAEP,IAAA,MAAM,OACJ,GAAA,MAAA,CAAO,iBAAkB,CAAA,wCAAwC,CACjE,IAAA,0BAAA;AAEF,IAAO,OAAA;AAAA,MACL,OAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA;AAAA,MACA,cAAA;AAAA,MACA,aAAA;AAAA,MACA,eAAA;AAAA,MACA,OAAA;AAAA,MACA,wBAAA;AAAA,MACA;AAAA,KACF;AAAA;AACF,EAEA,MAAa,gBAAmB,GAAA;AAC9B,IAAA,IAAI,CAAC,IAAK,CAAA,UAAA,EAAY,WAAW,CAAC,IAAA,CAAK,YAAY,aAAe,EAAA;AAChE,MAAA,IAAA,CAAK,MAAO,CAAA,IAAA;AAAA,QACV;AAAA,OACF;AACA,MAAA;AAAA;AAGF,IAAA,IAAA,CAAK,OAAO,IAAK,CAAA,CAAA,2BAAA,EAA8B,IAAK,CAAA,UAAA,CAAW,OAAO,CAAE,CAAA,CAAA;AACxE,IAAM,MAAA,SAAA,GAAY,KAAK,UAAW,CAAA,aAAA;AAClC,IAAA,IAAI,MAAMH,mBAAA,CAAG,UAAW,CAAA,SAAS,CAAG,EAAA;AAClC,MAAA,IAAA,CAAK,MAAO,CAAA,IAAA,CAAK,CAAQ,KAAA,EAAA,SAAS,CAAkC,gCAAA,CAAA,CAAA;AACpE,MAAA;AAAA;AAGF,IAAA,MAAM,KAAK,UAAW,CAAA,KAAA,CAAM,IAAK,CAAA,UAAA,CAAW,SAAS,SAAS,CAAA;AAE9D,IAAM,MAAAA,mBAAA,CAAG,EAAG,CAAAF,SAAA,CAAK,SAAW,EAAA,MAAM,CAAG,EAAA,EAAE,SAAW,EAAA,IAAA,EAAM,KAAO,EAAA,IAAA,EAAM,CAAA;AAAA;AAEzE;;;;"}
1
+ {"version":3,"file":"DevModeService.cjs.js","sources":["../../src/service/DevModeService.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 */\n\nimport type { LoggerService } from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\n\nimport fs from 'fs-extra';\n\nimport {\n DEFAULT_SONATAFLOW_BASE_URL,\n DEFAULT_SONATAFLOW_CONTAINER_IMAGE,\n DEFAULT_SONATAFLOW_PERSISTENCE_PATH,\n DEFAULT_WORKFLOWS_PATH,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { spawn } from 'child_process';\nimport { join, resolve } from 'path';\n\nimport { GitService } from './GitService';\nimport { executeWithRetry } from './Helper';\n\nconst SONATA_FLOW_RESOURCES_PATH =\n '/home/kogito/serverless-workflow-project/src/main/resources';\nconst DEFAULT_SONATAFLOW_RUNTIME = 'docker';\n\ninterface LauncherCommand {\n command: string;\n args: string[];\n}\n\ninterface DevModeConnectionConfig {\n host: string;\n port?: number;\n containerImage: string;\n resourcesPath: string;\n persistencePath?: string;\n repoUrl?: string;\n notificationsBearerToken?: string;\n notificationsUrl?: string;\n runtime: string;\n}\n\nexport class DevModeService {\n private readonly connection: DevModeConnectionConfig;\n private readonly gitService;\n\n constructor(\n config: Config,\n private readonly logger: LoggerService,\n ) {\n this.connection = this.extractConnectionConfig(config);\n this.gitService = new GitService(logger, config);\n }\n\n public get devModeUrl(): string {\n if (!this.connection.port) {\n return this.connection.host;\n }\n return `${this.connection.host}:${this.connection.port}`;\n }\n\n public async launchDevMode(): Promise<boolean> {\n await this.loadDevWorkflows();\n\n const isAlreadyUp = await this.isSonataFlowUp(false, this.devModeUrl);\n if (isAlreadyUp) {\n return true;\n }\n\n this.launchSonataFlow();\n\n return await this.isSonataFlowUp(true, this.devModeUrl);\n }\n\n private async isSonataFlowUp(\n withRetry: boolean,\n endpoint: string,\n ): Promise<boolean> {\n const healthUrl = `${endpoint}/q/health`;\n this.logger.info(`Checking SonataFlow health at: ${healthUrl}`);\n\n try {\n const response = await executeWithRetry(\n () => fetch(healthUrl),\n withRetry ? 15 : 1,\n );\n if (response.ok) {\n this.logger.info('SonataFlow is up and running');\n return true;\n }\n } catch (e) {\n this.logger.error(`Error when checking SonataFlow health: ${e}`);\n }\n return false;\n }\n\n private launchSonataFlow(): void {\n const launcherCmd = this.createLauncherCommand();\n\n this.logger.info(\n `Auto starting SonataFlow through: ${\n launcherCmd.command\n } ${launcherCmd.args.join(' ')}`,\n );\n\n const process = spawn(launcherCmd.command, launcherCmd.args, {\n shell: false,\n });\n\n process.on('close', code => {\n this.logger.info(`SonataFlow process exited with code ${code}`);\n });\n\n process.on('exit', code => {\n this.logger.info(`SonataFlow process exited with code ${code}`);\n });\n\n process.on('error', error => {\n this.logger.error(`SonataFlow process error: ${error}`);\n });\n }\n\n private createLauncherCommand(): LauncherCommand {\n const resourcesAbsPath = resolve(\n join(this.connection.resourcesPath, DEFAULT_WORKFLOWS_PATH),\n );\n\n const launcherArgs = [\n 'run',\n '--name',\n 'backstage-internal-sonataflow',\n ...(this.connection.runtime === 'podman'\n ? ['--replace']\n : ['--add-host', 'host.docker.internal:host-gateway']),\n ];\n\n // TODO: pass automatically a set of env variables from configuration, i.e. all config props with names starting at ENV_:\n // config: orchestrator.sonataFlowService.ENV_foo\n\n launcherArgs.push('-e', `QUARKUS_HTTP_PORT=${this.connection.port}`);\n\n launcherArgs.push('-p', `${this.connection.port}:${this.connection.port}`);\n launcherArgs.push('-e', `KOGITO_SERVICE_URL=${this.devModeUrl}`);\n launcherArgs.push(\n '-v',\n `${resourcesAbsPath}:${SONATA_FLOW_RESOURCES_PATH}:Z`,\n );\n if (this.connection?.persistencePath) {\n // if persistence is enabled, mount the volume and persist data across restarts\n const persistenceAbsPath = resolve(this.connection.persistencePath);\n this.logger.info(\n `Persistence is enabled, mounting ${persistenceAbsPath} as volume to persist data`,\n );\n if (!fs.existsSync(persistenceAbsPath)) {\n fs.mkdirSync(persistenceAbsPath, { recursive: true });\n }\n launcherArgs.push(\n '-v',\n `${persistenceAbsPath}:${DEFAULT_SONATAFLOW_PERSISTENCE_PATH}:Z`,\n );\n }\n launcherArgs.push('-e', 'KOGITO.CODEGEN.PROCESS.FAILONERROR=false');\n launcherArgs.push(\n '-e',\n `QUARKUS_EMBEDDED_POSTGRESQL_DATA_DIR=${DEFAULT_SONATAFLOW_PERSISTENCE_PATH}`,\n );\n launcherArgs.push(\n '-e',\n `NOTIFICATIONS_BEARER_TOKEN=${this.connection.notificationsBearerToken}`,\n );\n launcherArgs.push(\n '-e',\n `BACKSTAGE_NOTIFICATIONS_URL=${this.connection.notificationsUrl}`,\n );\n\n launcherArgs.push(this.connection.containerImage);\n\n return {\n command: this.connection.runtime,\n args: launcherArgs,\n };\n }\n\n private extractConnectionConfig(config: Config): DevModeConnectionConfig {\n const host =\n config.getOptionalString('orchestrator.sonataFlowService.baseUrl') ??\n DEFAULT_SONATAFLOW_BASE_URL;\n const port = config.getOptionalNumber(\n 'orchestrator.sonataFlowService.port',\n );\n\n const resourcesPath =\n config.getOptionalString(\n 'orchestrator.sonataFlowService.workflowsSource.localPath',\n ) ?? '';\n\n const containerImage =\n config.getOptionalString('orchestrator.sonataFlowService.container') ??\n DEFAULT_SONATAFLOW_CONTAINER_IMAGE;\n\n const persistencePath =\n config.getOptionalString(\n 'orchestrator.sonataFlowService.persistence.path',\n ) ?? '';\n\n const repoUrl =\n config.getOptionalString(\n 'orchestrator.sonataFlowService.workflowsSource.gitRepositoryUrl',\n ) ?? '';\n\n const notificationsBearerToken =\n config.getOptionalString(\n 'orchestrator.sonataFlowService.notificationsBearerToken',\n ) ?? '';\n\n const notificationsUrl =\n config.getOptionalString(\n 'orchestrator.sonataFlowService.notificationsUrl',\n ) ?? '';\n\n const runtime =\n config.getOptionalString('orchestrator.sonataFlowService.runtime') ??\n DEFAULT_SONATAFLOW_RUNTIME;\n\n return {\n runtime,\n host,\n port,\n containerImage,\n resourcesPath,\n persistencePath,\n repoUrl,\n notificationsBearerToken,\n notificationsUrl,\n };\n }\n\n public async loadDevWorkflows() {\n if (!this.connection?.repoUrl || !this.connection?.resourcesPath) {\n this.logger.info(\n 'No Git repository or path configured. Skipping dev workflows loading.',\n );\n return;\n }\n\n this.logger.info(`Loading dev workflows from ${this.connection.repoUrl}`);\n const localPath = this.connection.resourcesPath;\n if (await fs.pathExists(localPath)) {\n this.logger.info(`Path ${localPath} already exists. Skipping clone.`);\n return;\n }\n\n await this.gitService.clone(this.connection.repoUrl, localPath);\n // Remove .git to avoid any submodule issues\n await fs.rm(join(localPath, '.git'), { recursive: true, force: true });\n }\n}\n"],"names":["GitService","executeWithRetry","spawn","resolve","join","DEFAULT_WORKFLOWS_PATH","fs","DEFAULT_SONATAFLOW_PERSISTENCE_PATH","DEFAULT_SONATAFLOW_BASE_URL","DEFAULT_SONATAFLOW_CONTAINER_IMAGE"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"GitService.cjs.js","sources":["../../src/service/GitService.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 { LoggerService } from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\nimport { ScmIntegrations } from '@backstage/integration';\n\nimport { Git } from './GitWrapper';\n\nexport class GitService {\n private readonly git: Git;\n\n private readonly logger: LoggerService;\n private authenticated: boolean;\n\n private readonly author = {\n name: 'backstage-orchestrator',\n email: 'orchestrator@backstage.io',\n };\n\n private readonly committer = {\n name: 'backstage-orchestrator',\n email: 'orchestrator@backstage.io',\n };\n\n constructor(logger: LoggerService, config: Config) {\n this.logger = logger;\n const githubIntegration = ScmIntegrations.fromConfig(config)\n .github.list()\n .pop();\n this.git = Git.fromAuth({\n username: 'x-access-token',\n password: githubIntegration?.config.token,\n });\n this.authenticated = !!githubIntegration?.config.token;\n }\n\n async clone(repoURL: string, localPath: string): Promise<void> {\n this.logger.info(`cloning repo ${repoURL} into ${localPath}`);\n return this.git\n .clone({\n url: repoURL,\n dir: localPath,\n depth: 1,\n })\n .then(() => this.git.checkout({ dir: localPath, ref: 'main' }));\n }\n\n async push(dir: string, message: string): Promise<void> {\n if (!this.authenticated) {\n this.logger.warn(\n 'Git integration is required to be configured for push, with the token or credentials',\n );\n return;\n }\n const branch = 'main';\n const force = true;\n const remote = 'origin';\n const filepath = '.';\n this.git\n .fetch({ remote, dir })\n .then(() => this.git.checkout({ dir, ref: branch }))\n .then(() => this.git.add({ dir, filepath }))\n .then(() =>\n this.git.commit({\n dir,\n message,\n author: this.author,\n committer: this.committer,\n }),\n )\n .then(() => this.git.push({ dir, remote, remoteRef: branch, force }))\n .finally(() => this.logger.info('push completed'))\n .catch(ex => this.logger.error(ex));\n }\n\n async pull(localPath: string): Promise<void> {\n const remoteBranch = 'origin/main';\n const localBranch = 'main';\n const remote = 'origin';\n this.git\n .fetch({ remote, dir: localPath })\n .then(() => this.git.checkout({ dir: localPath, ref: localBranch }))\n .then(() =>\n this.git.merge({\n dir: localPath,\n ours: localBranch,\n theirs: remoteBranch,\n author: this.author,\n committer: this.committer,\n }),\n )\n .finally(() => this.logger.info('merge completed'))\n .catch(ex => this.logger.error(ex));\n }\n}\n"],"names":["ScmIntegrations","Git"],"mappings":"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"}
1
+ {"version":3,"file":"GitService.cjs.js","sources":["../../src/service/GitService.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 { LoggerService } from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\nimport { ScmIntegrations } from '@backstage/integration';\n\nimport { Git } from './GitWrapper';\n\nexport class GitService {\n private readonly git: Git;\n\n private readonly logger: LoggerService;\n private authenticated: boolean;\n\n private readonly author = {\n name: 'backstage-orchestrator',\n email: 'orchestrator@backstage.io',\n };\n\n private readonly committer = {\n name: 'backstage-orchestrator',\n email: 'orchestrator@backstage.io',\n };\n\n constructor(logger: LoggerService, config: Config) {\n this.logger = logger;\n const githubIntegration = ScmIntegrations.fromConfig(config)\n .github.list()\n .pop();\n this.git = Git.fromAuth({\n username: 'x-access-token',\n password: githubIntegration?.config.token,\n });\n this.authenticated = !!githubIntegration?.config.token;\n }\n\n async clone(repoURL: string, localPath: string): Promise<void> {\n this.logger.info(`cloning repo ${repoURL} into ${localPath}`);\n return this.git\n .clone({\n url: repoURL,\n dir: localPath,\n depth: 1,\n })\n .then(() => this.git.checkout({ dir: localPath, ref: 'main' }));\n }\n\n async push(dir: string, message: string): Promise<void> {\n if (!this.authenticated) {\n this.logger.warn(\n 'Git integration is required to be configured for push, with the token or credentials',\n );\n return;\n }\n const branch = 'main';\n const force = true;\n const remote = 'origin';\n const filepath = '.';\n this.git\n .fetch({ remote, dir })\n .then(() => this.git.checkout({ dir, ref: branch }))\n .then(() => this.git.add({ dir, filepath }))\n .then(() =>\n this.git.commit({\n dir,\n message,\n author: this.author,\n committer: this.committer,\n }),\n )\n .then(() => this.git.push({ dir, remote, remoteRef: branch, force }))\n .finally(() => this.logger.info('push completed'))\n .catch(ex => this.logger.error(ex));\n }\n\n async pull(localPath: string): Promise<void> {\n const remoteBranch = 'origin/main';\n const localBranch = 'main';\n const remote = 'origin';\n this.git\n .fetch({ remote, dir: localPath })\n .then(() => this.git.checkout({ dir: localPath, ref: localBranch }))\n .then(() =>\n this.git.merge({\n dir: localPath,\n ours: localBranch,\n theirs: remoteBranch,\n author: this.author,\n committer: this.committer,\n }),\n )\n .finally(() => this.logger.info('merge completed'))\n .catch(ex => this.logger.error(ex));\n }\n}\n"],"names":["ScmIntegrations","Git"],"mappings":";;;;;AAqBO,MAAM,UAAA,CAAW;AAAA,EACL,GAAA;AAAA,EAEA,MAAA;AAAA,EACT,aAAA;AAAA,EAES,MAAA,GAAS;AAAA,IACxB,IAAA,EAAM,wBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EAEiB,SAAA,GAAY;AAAA,IAC3B,IAAA,EAAM,wBAAA;AAAA,IACN,KAAA,EAAO;AAAA,GACT;AAAA,EAEA,WAAA,CAAY,QAAuB,MAAA,EAAgB;AACjD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,MAAM,iBAAA,GAAoBA,4BAAgB,UAAA,CAAW,MAAM,EACxD,MAAA,CAAO,IAAA,GACP,GAAA,EAAI;AACP,IAAA,IAAA,CAAK,GAAA,GAAMC,QAAI,QAAA,CAAS;AAAA,MACtB,QAAA,EAAU,gBAAA;AAAA,MACV,QAAA,EAAU,mBAAmB,MAAA,CAAO;AAAA,KACrC,CAAA;AACD,IAAA,IAAA,CAAK,aAAA,GAAgB,CAAC,CAAC,iBAAA,EAAmB,MAAA,CAAO,KAAA;AAAA,EACnD;AAAA,EAEA,MAAM,KAAA,CAAM,OAAA,EAAiB,SAAA,EAAkC;AAC7D,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,CAAA,aAAA,EAAgB,OAAO,CAAA,MAAA,EAAS,SAAS,CAAA,CAAE,CAAA;AAC5D,IAAA,OAAO,IAAA,CAAK,IACT,KAAA,CAAM;AAAA,MACL,GAAA,EAAK,OAAA;AAAA,MACL,GAAA,EAAK,SAAA;AAAA,MACL,KAAA,EAAO;AAAA,KACR,CAAA,CACA,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,EAAE,GAAA,EAAK,SAAA,EAAW,GAAA,EAAK,MAAA,EAAQ,CAAC,CAAA;AAAA,EAClE;AAAA,EAEA,MAAM,IAAA,CAAK,GAAA,EAAa,OAAA,EAAgC;AACtD,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA;AAAA,QACV;AAAA,OACF;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,MAAA;AACf,IAAA,MAAM,KAAA,GAAQ,IAAA;AACd,IAAA,MAAM,MAAA,GAAS,QAAA;AACf,IAAA,MAAM,QAAA,GAAW,GAAA;AACjB,IAAA,IAAA,CAAK,GAAA,CACF,KAAA,CAAM,EAAE,MAAA,EAAQ,GAAA,EAAK,CAAA,CACrB,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,CAAI,QAAA,CAAS,EAAE,GAAA,EAAK,GAAA,EAAK,MAAA,EAAQ,CAAC,CAAA,CAClD,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,EAAE,GAAA,EAAK,QAAA,EAAU,CAAC,CAAA,CAC1C,IAAA;AAAA,MAAK,MACJ,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO;AAAA,QACd,GAAA;AAAA,QACA,OAAA;AAAA,QACA,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,WAAW,IAAA,CAAK;AAAA,OACjB;AAAA,KACH,CACC,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,EAAE,GAAA,EAAK,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAQ,KAAA,EAAO,CAAC,CAAA,CACnE,OAAA,CAAQ,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,gBAAgB,CAAC,CAAA,CAChD,KAAA,CAAM,CAAA,EAAA,KAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,EAAE,CAAC,CAAA;AAAA,EACtC;AAAA,EAEA,MAAM,KAAK,SAAA,EAAkC;AAC3C,IAAA,MAAM,YAAA,GAAe,aAAA;AACrB,IAAA,MAAM,WAAA,GAAc,MAAA;AACpB,IAAA,MAAM,MAAA,GAAS,QAAA;AACf,IAAA,IAAA,CAAK,GAAA,CACF,MAAM,EAAE,MAAA,EAAQ,KAAK,SAAA,EAAW,EAChC,IAAA,CAAK,MAAM,KAAK,GAAA,CAAI,QAAA,CAAS,EAAE,GAAA,EAAK,SAAA,EAAW,KAAK,WAAA,EAAa,CAAC,CAAA,CAClE,IAAA;AAAA,MAAK,MACJ,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM;AAAA,QACb,GAAA,EAAK,SAAA;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,MAAA,EAAQ,YAAA;AAAA,QACR,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,WAAW,IAAA,CAAK;AAAA,OACjB;AAAA,KACH,CACC,OAAA,CAAQ,MAAM,IAAA,CAAK,OAAO,IAAA,CAAK,iBAAiB,CAAC,CAAA,CACjD,MAAM,CAAA,EAAA,KAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,EAAE,CAAC,CAAA;AAAA,EACtC;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"git.cjs.js","sources":["../../../src/service/GitWrapper/git.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 */\n\nimport { LoggerService } from '@backstage/backend-plugin-api';\n\nimport fs from 'fs-extra';\nimport git, {\n AuthCallback,\n MergeResult,\n ProgressCallback,\n ReadCommitResult,\n} from 'isomorphic-git';\nimport http from 'isomorphic-git/http/node';\n\nfunction isAuthCallbackOptions(\n options: StaticAuthOptions | AuthCallbackOptions,\n): options is AuthCallbackOptions {\n return 'onAuth' in options;\n}\n\n/**\n * Configure static credential for authentication\n * @public\n */\nexport type StaticAuthOptions = {\n username?: string;\n password?: string;\n token?: string;\n logger?: LoggerService;\n};\n\n/**\n * Configure an authentication callback that can provide credentials on demand\n * @public\n */\nexport type AuthCallbackOptions = {\n onAuth: AuthCallback;\n logger?: LoggerService;\n};\n\n/*\nprovider username password\nAzure 'notempty' token\nBitbucket Cloud 'x-token-auth' token\nBitbucket Server username password or token\nGitHub 'x-access-token' token\nGitLab 'oauth2' token\nFrom : https://isomorphic-git.org/docs/en/onAuth with fix for GitHub\nOr token provided as `token` for Bearer auth header\ninstead of Basic Auth (e.g., Bitbucket Server).\n*/\n\n/**\n * A convenience wrapper around the `isomorphic-git` library.\n * @public\n */\n\nexport class Git {\n private readonly headers: {\n [x: string]: string;\n };\n\n private constructor(\n private readonly config: {\n onAuth: AuthCallback;\n token?: string;\n logger?: LoggerService;\n },\n ) {\n this.onAuth = config.onAuth;\n\n this.headers = {\n 'user-agent': 'git/@isomorphic-git',\n ...(config.token ? { Authorization: `Bearer ${config.token}` } : {}),\n };\n }\n\n async add(options: { dir: string; filepath: string }): Promise<void> {\n const { dir, filepath } = options;\n this.config.logger?.info(`Adding file {dir=${dir},filepath=${filepath}}`);\n\n return git.add({ fs, dir, filepath });\n }\n\n async addRemote(options: {\n dir: string;\n remote: string;\n url: string;\n force?: boolean;\n }): Promise<void> {\n const { dir, url, remote, force } = options;\n this.config.logger?.info(\n `Creating new remote {dir=${dir},remote=${remote},url=${url}}`,\n );\n return git.addRemote({ fs, dir, remote, url, force });\n }\n\n async deleteRemote(options: { dir: string; remote: string }): Promise<void> {\n const { dir, remote } = options;\n this.config.logger?.info(`Deleting remote {dir=${dir},remote=${remote}}`);\n return git.deleteRemote({ fs, dir, remote });\n }\n\n async checkout(options: { dir: string; ref: string }): Promise<void> {\n const { dir, ref } = options;\n this.config.logger?.info(`Checking out branch {dir=${dir},ref=${ref}}`);\n\n return git.checkout({ fs, dir, ref });\n }\n\n async branch(options: { dir: string; ref: string }): Promise<void> {\n const { dir, ref } = options;\n this.config.logger?.info(`Creating branch {dir=${dir},ref=${ref}`);\n\n return git.branch({ fs, dir, ref });\n }\n\n async commit(options: {\n dir: string;\n message: string;\n author: { name: string; email: string };\n committer: { name: string; email: string };\n }): Promise<string> {\n const { dir, message, author, committer } = options;\n this.config.logger?.info(\n `Committing file to repo {dir=${dir},message=${message}}`,\n );\n return git.commit({ fs, dir, message, author, committer });\n }\n\n /** https://isomorphic-git.org/docs/en/clone */\n async clone(options: {\n url: string;\n dir: string;\n ref?: string;\n depth?: number;\n noCheckout?: boolean;\n }): Promise<void> {\n const { url, dir, ref, depth, noCheckout } = options;\n this.config.logger?.info(`Cloning repo {dir=${dir},url=${url}}`);\n\n try {\n return await git.clone({\n fs,\n http,\n url,\n dir,\n ref,\n singleBranch: true,\n depth: depth ?? 1,\n noCheckout,\n onProgress: this.onProgressHandler(),\n headers: this.headers,\n onAuth: this.onAuth,\n });\n } catch (ex: any) {\n this.config.logger?.error(`Failed to clone repo {dir=${dir},url=${url}}`);\n if (ex.data) {\n throw new Error(`${ex.message} {data=${JSON.stringify(ex.data)}}`);\n }\n throw ex;\n }\n }\n\n /** https://isomorphic-git.org/docs/en/currentBranch */\n async currentBranch(options: {\n dir: string;\n fullName?: boolean;\n }): Promise<string | undefined> {\n const { dir, fullName = false } = options;\n return git.currentBranch({ fs, dir, fullname: fullName }) as Promise<\n string | undefined\n >;\n }\n\n /** https://isomorphic-git.org/docs/en/fetch */\n async fetch(options: {\n dir: string;\n remote?: string;\n tags?: boolean;\n }): Promise<void> {\n const { dir, remote = 'origin', tags = false } = options;\n this.config.logger?.info(\n `Fetching remote=${remote} for repository {dir=${dir}}`,\n );\n\n try {\n await git.fetch({\n fs,\n http,\n dir,\n remote,\n tags,\n onProgress: this.onProgressHandler(),\n headers: this.headers,\n onAuth: this.onAuth,\n });\n } catch (ex: any) {\n this.config.logger?.error(\n `Failed to fetch repo {dir=${dir},remote=${remote}}`,\n );\n if (ex.data) {\n throw new Error(`${ex.message} {data=${JSON.stringify(ex.data)}}`);\n }\n throw ex;\n }\n }\n\n async init(options: { dir: string; defaultBranch?: string }): Promise<void> {\n const { dir, defaultBranch = 'master' } = options;\n this.config.logger?.info(`Init git repository {dir=${dir}}`);\n\n return git.init({\n fs,\n dir,\n defaultBranch,\n });\n }\n\n /** https://isomorphic-git.org/docs/en/merge */\n async merge(options: {\n dir: string;\n theirs: string;\n ours?: string;\n author: { name: string; email: string };\n committer: { name: string; email: string };\n }): Promise<MergeResult> {\n const { dir, theirs, ours, author, committer } = options;\n this.config.logger?.info(\n `Merging branch '${theirs}' into '${ours}' for repository {dir=${dir}}`,\n );\n\n // If ours is undefined, current branch is used.\n return git.merge({\n fs,\n dir,\n ours,\n theirs,\n author,\n committer,\n });\n }\n\n async push(options: {\n dir: string;\n remote: string;\n remoteRef?: string;\n force?: boolean;\n }) {\n const { dir, remote, remoteRef, force } = options;\n this.config.logger?.info(\n `Pushing directory to remote {dir=${dir},remote=${remote}}`,\n );\n try {\n return await git.push({\n fs,\n dir,\n http,\n onProgress: this.onProgressHandler(),\n remoteRef,\n force,\n headers: this.headers,\n remote,\n onAuth: this.onAuth,\n });\n } catch (ex: any) {\n this.config.logger?.error(\n `Failed to push to repo {dir=${dir}, remote=${remote}}`,\n );\n if (ex.data) {\n throw new Error(`${ex.message} {data=${JSON.stringify(ex.data)}}`);\n }\n throw ex;\n }\n }\n\n /** https://isomorphic-git.org/docs/en/readCommit */\n async readCommit(options: {\n dir: string;\n sha: string;\n }): Promise<ReadCommitResult> {\n const { dir, sha } = options;\n return git.readCommit({ fs, dir, oid: sha });\n }\n\n /** https://isomorphic-git.org/docs/en/remove */\n async remove(options: { dir: string; filepath: string }): Promise<void> {\n const { dir, filepath } = options;\n this.config.logger?.info(\n `Removing file from git index {dir=${dir},filepath=${filepath}}`,\n );\n return git.remove({ fs, dir, filepath });\n }\n\n /** https://isomorphic-git.org/docs/en/resolveRef */\n async resolveRef(options: { dir: string; ref: string }): Promise<string> {\n const { dir, ref } = options;\n return git.resolveRef({ fs, dir, ref });\n }\n\n /** https://isomorphic-git.org/docs/en/log */\n async log(options: {\n dir: string;\n ref?: string;\n }): Promise<ReadCommitResult[]> {\n const { dir, ref } = options;\n return git.log({\n fs,\n dir,\n ref: ref ?? 'HEAD',\n });\n }\n\n private readonly onAuth: AuthCallback;\n\n private readonly onProgressHandler = (): ProgressCallback => {\n let currentPhase = '';\n\n return event => {\n if (currentPhase !== event.phase) {\n currentPhase = event.phase;\n this.config.logger?.info(event.phase);\n }\n const total = event.total\n ? `${Math.round((event.loaded / event.total) * 100)}%`\n : event.loaded;\n this.config.logger?.debug(`status={${event.phase},total={${total}}}`);\n };\n };\n\n static readonly fromAuth = (\n options: StaticAuthOptions | AuthCallbackOptions,\n ) => {\n if (isAuthCallbackOptions(options)) {\n const { onAuth, logger } = options;\n return new Git({ onAuth, logger });\n }\n\n const { username, password, token, logger } = options;\n return new Git({ onAuth: () => ({ username, password }), token, logger });\n };\n}\n"],"names":["git","fs","http","logger"],"mappings":";;;;;;;;;;;;AA2BA,SAAS,sBACP,OACgC,EAAA;AAChC,EAAA,OAAO,QAAY,IAAA,OAAA;AACrB;AAuCO,MAAM,GAAI,CAAA;AAAA,EAKP,YACW,MAKjB,EAAA;AALiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAMjB,IAAA,IAAA,CAAK,SAAS,MAAO,CAAA,MAAA;AAErB,IAAA,IAAA,CAAK,OAAU,GAAA;AAAA,MACb,YAAc,EAAA,qBAAA;AAAA,MACd,GAAI,MAAO,CAAA,KAAA,GAAQ,EAAE,aAAA,EAAe,UAAU,MAAO,CAAA,KAAK,CAAG,CAAA,EAAA,GAAI;AAAC,KACpE;AAAA;AACF,EAjBiB,OAAA;AAAA,EAmBjB,MAAM,IAAI,OAA2D,EAAA;AACnE,IAAM,MAAA,EAAE,GAAK,EAAA,QAAA,EAAa,GAAA,OAAA;AAC1B,IAAA,IAAA,CAAK,OAAO,MAAQ,EAAA,IAAA,CAAK,oBAAoB,GAAG,CAAA,UAAA,EAAa,QAAQ,CAAG,CAAA,CAAA,CAAA;AAExE,IAAA,OAAOA,qBAAI,GAAI,CAAA,MAAEC,mBAAI,EAAA,GAAA,EAAK,UAAU,CAAA;AAAA;AACtC,EAEA,MAAM,UAAU,OAKE,EAAA;AAChB,IAAA,MAAM,EAAE,GAAA,EAAK,GAAK,EAAA,MAAA,EAAQ,OAAU,GAAA,OAAA;AACpC,IAAA,IAAA,CAAK,OAAO,MAAQ,EAAA,IAAA;AAAA,MAClB,CAA4B,yBAAA,EAAA,GAAG,CAAW,QAAA,EAAA,MAAM,QAAQ,GAAG,CAAA,CAAA;AAAA,KAC7D;AACA,IAAO,OAAAD,oBAAA,CAAI,UAAU,MAAEC,mBAAA,EAAI,KAAK,MAAQ,EAAA,GAAA,EAAK,OAAO,CAAA;AAAA;AACtD,EAEA,MAAM,aAAa,OAAyD,EAAA;AAC1E,IAAM,MAAA,EAAE,GAAK,EAAA,MAAA,EAAW,GAAA,OAAA;AACxB,IAAA,IAAA,CAAK,OAAO,MAAQ,EAAA,IAAA,CAAK,wBAAwB,GAAG,CAAA,QAAA,EAAW,MAAM,CAAG,CAAA,CAAA,CAAA;AACxE,IAAA,OAAOD,qBAAI,YAAa,CAAA,MAAEC,mBAAI,EAAA,GAAA,EAAK,QAAQ,CAAA;AAAA;AAC7C,EAEA,MAAM,SAAS,OAAsD,EAAA;AACnE,IAAM,MAAA,EAAE,GAAK,EAAA,GAAA,EAAQ,GAAA,OAAA;AACrB,IAAA,IAAA,CAAK,OAAO,MAAQ,EAAA,IAAA,CAAK,4BAA4B,GAAG,CAAA,KAAA,EAAQ,GAAG,CAAG,CAAA,CAAA,CAAA;AAEtE,IAAA,OAAOD,qBAAI,QAAS,CAAA,MAAEC,mBAAI,EAAA,GAAA,EAAK,KAAK,CAAA;AAAA;AACtC,EAEA,MAAM,OAAO,OAAsD,EAAA;AACjE,IAAM,MAAA,EAAE,GAAK,EAAA,GAAA,EAAQ,GAAA,OAAA;AACrB,IAAA,IAAA,CAAK,OAAO,MAAQ,EAAA,IAAA,CAAK,wBAAwB,GAAG,CAAA,KAAA,EAAQ,GAAG,CAAE,CAAA,CAAA;AAEjE,IAAA,OAAOD,qBAAI,MAAO,CAAA,MAAEC,mBAAI,EAAA,GAAA,EAAK,KAAK,CAAA;AAAA;AACpC,EAEA,MAAM,OAAO,OAKO,EAAA;AAClB,IAAA,MAAM,EAAE,GAAA,EAAK,OAAS,EAAA,MAAA,EAAQ,WAAc,GAAA,OAAA;AAC5C,IAAA,IAAA,CAAK,OAAO,MAAQ,EAAA,IAAA;AAAA,MAClB,CAAA,6BAAA,EAAgC,GAAG,CAAA,SAAA,EAAY,OAAO,CAAA,CAAA;AAAA,KACxD;AACA,IAAO,OAAAD,oBAAA,CAAI,OAAO,MAAEC,mBAAA,EAAI,KAAK,OAAS,EAAA,MAAA,EAAQ,WAAW,CAAA;AAAA;AAC3D;AAAA,EAGA,MAAM,MAAM,OAMM,EAAA;AAChB,IAAA,MAAM,EAAE,GAAK,EAAA,GAAA,EAAK,GAAK,EAAA,KAAA,EAAO,YAAe,GAAA,OAAA;AAC7C,IAAA,IAAA,CAAK,OAAO,MAAQ,EAAA,IAAA,CAAK,qBAAqB,GAAG,CAAA,KAAA,EAAQ,GAAG,CAAG,CAAA,CAAA,CAAA;AAE/D,IAAI,IAAA;AACF,MAAO,OAAA,MAAMD,qBAAI,KAAM,CAAA;AAAA,YACrBC,mBAAA;AAAA,cACAC,qBAAA;AAAA,QACA,GAAA;AAAA,QACA,GAAA;AAAA,QACA,GAAA;AAAA,QACA,YAAc,EAAA,IAAA;AAAA,QACd,OAAO,KAAS,IAAA,CAAA;AAAA,QAChB,UAAA;AAAA,QACA,UAAA,EAAY,KAAK,iBAAkB,EAAA;AAAA,QACnC,SAAS,IAAK,CAAA,OAAA;AAAA,QACd,QAAQ,IAAK,CAAA;AAAA,OACd,CAAA;AAAA,aACM,EAAS,EAAA;AAChB,MAAA,IAAA,CAAK,OAAO,MAAQ,EAAA,KAAA,CAAM,6BAA6B,GAAG,CAAA,KAAA,EAAQ,GAAG,CAAG,CAAA,CAAA,CAAA;AACxE,MAAA,IAAI,GAAG,IAAM,EAAA;AACX,QAAM,MAAA,IAAI,KAAM,CAAA,CAAA,EAAG,EAAG,CAAA,OAAO,CAAU,OAAA,EAAA,IAAA,CAAK,SAAU,CAAA,EAAA,CAAG,IAAI,CAAC,CAAG,CAAA,CAAA,CAAA;AAAA;AAEnE,MAAM,MAAA,EAAA;AAAA;AACR;AACF;AAAA,EAGA,MAAM,cAAc,OAGY,EAAA;AAC9B,IAAA,MAAM,EAAE,GAAA,EAAK,QAAW,GAAA,KAAA,EAAU,GAAA,OAAA;AAClC,IAAA,OAAOF,qBAAI,aAAc,CAAA,MAAEC,qBAAI,GAAK,EAAA,QAAA,EAAU,UAAU,CAAA;AAAA;AAG1D;AAAA,EAGA,MAAM,MAAM,OAIM,EAAA;AAChB,IAAA,MAAM,EAAE,GAAK,EAAA,MAAA,GAAS,QAAU,EAAA,IAAA,GAAO,OAAU,GAAA,OAAA;AACjD,IAAA,IAAA,CAAK,OAAO,MAAQ,EAAA,IAAA;AAAA,MAClB,CAAA,gBAAA,EAAmB,MAAM,CAAA,qBAAA,EAAwB,GAAG,CAAA,CAAA;AAAA,KACtD;AAEA,IAAI,IAAA;AACF,MAAA,MAAMD,qBAAI,KAAM,CAAA;AAAA,YACdC,mBAAA;AAAA,cACAC,qBAAA;AAAA,QACA,GAAA;AAAA,QACA,MAAA;AAAA,QACA,IAAA;AAAA,QACA,UAAA,EAAY,KAAK,iBAAkB,EAAA;AAAA,QACnC,SAAS,IAAK,CAAA,OAAA;AAAA,QACd,QAAQ,IAAK,CAAA;AAAA,OACd,CAAA;AAAA,aACM,EAAS,EAAA;AAChB,MAAA,IAAA,CAAK,OAAO,MAAQ,EAAA,KAAA;AAAA,QAClB,CAAA,0BAAA,EAA6B,GAAG,CAAA,QAAA,EAAW,MAAM,CAAA,CAAA;AAAA,OACnD;AACA,MAAA,IAAI,GAAG,IAAM,EAAA;AACX,QAAM,MAAA,IAAI,KAAM,CAAA,CAAA,EAAG,EAAG,CAAA,OAAO,CAAU,OAAA,EAAA,IAAA,CAAK,SAAU,CAAA,EAAA,CAAG,IAAI,CAAC,CAAG,CAAA,CAAA,CAAA;AAAA;AAEnE,MAAM,MAAA,EAAA;AAAA;AACR;AACF,EAEA,MAAM,KAAK,OAAiE,EAAA;AAC1E,IAAA,MAAM,EAAE,GAAA,EAAK,aAAgB,GAAA,QAAA,EAAa,GAAA,OAAA;AAC1C,IAAA,IAAA,CAAK,MAAO,CAAA,MAAA,EAAQ,IAAK,CAAA,CAAA,yBAAA,EAA4B,GAAG,CAAG,CAAA,CAAA,CAAA;AAE3D,IAAA,OAAOF,qBAAI,IAAK,CAAA;AAAA,UACdC,mBAAA;AAAA,MACA,GAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA;AACH;AAAA,EAGA,MAAM,MAAM,OAMa,EAAA;AACvB,IAAA,MAAM,EAAE,GAAK,EAAA,MAAA,EAAQ,IAAM,EAAA,MAAA,EAAQ,WAAc,GAAA,OAAA;AACjD,IAAA,IAAA,CAAK,OAAO,MAAQ,EAAA,IAAA;AAAA,MAClB,CAAmB,gBAAA,EAAA,MAAM,CAAW,QAAA,EAAA,IAAI,yBAAyB,GAAG,CAAA,CAAA;AAAA,KACtE;AAGA,IAAA,OAAOD,qBAAI,KAAM,CAAA;AAAA,UACfC,mBAAA;AAAA,MACA,GAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA;AACH,EAEA,MAAM,KAAK,OAKR,EAAA;AACD,IAAA,MAAM,EAAE,GAAA,EAAK,MAAQ,EAAA,SAAA,EAAW,OAAU,GAAA,OAAA;AAC1C,IAAA,IAAA,CAAK,OAAO,MAAQ,EAAA,IAAA;AAAA,MAClB,CAAA,iCAAA,EAAoC,GAAG,CAAA,QAAA,EAAW,MAAM,CAAA,CAAA;AAAA,KAC1D;AACA,IAAI,IAAA;AACF,MAAO,OAAA,MAAMD,qBAAI,IAAK,CAAA;AAAA,YACpBC,mBAAA;AAAA,QACA,GAAA;AAAA,cACAC,qBAAA;AAAA,QACA,UAAA,EAAY,KAAK,iBAAkB,EAAA;AAAA,QACnC,SAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAS,IAAK,CAAA,OAAA;AAAA,QACd,MAAA;AAAA,QACA,QAAQ,IAAK,CAAA;AAAA,OACd,CAAA;AAAA,aACM,EAAS,EAAA;AAChB,MAAA,IAAA,CAAK,OAAO,MAAQ,EAAA,KAAA;AAAA,QAClB,CAAA,4BAAA,EAA+B,GAAG,CAAA,SAAA,EAAY,MAAM,CAAA,CAAA;AAAA,OACtD;AACA,MAAA,IAAI,GAAG,IAAM,EAAA;AACX,QAAM,MAAA,IAAI,KAAM,CAAA,CAAA,EAAG,EAAG,CAAA,OAAO,CAAU,OAAA,EAAA,IAAA,CAAK,SAAU,CAAA,EAAA,CAAG,IAAI,CAAC,CAAG,CAAA,CAAA,CAAA;AAAA;AAEnE,MAAM,MAAA,EAAA;AAAA;AACR;AACF;AAAA,EAGA,MAAM,WAAW,OAGa,EAAA;AAC5B,IAAM,MAAA,EAAE,GAAK,EAAA,GAAA,EAAQ,GAAA,OAAA;AACrB,IAAA,OAAOF,qBAAI,UAAW,CAAA,MAAEC,qBAAI,GAAK,EAAA,GAAA,EAAK,KAAK,CAAA;AAAA;AAC7C;AAAA,EAGA,MAAM,OAAO,OAA2D,EAAA;AACtE,IAAM,MAAA,EAAE,GAAK,EAAA,QAAA,EAAa,GAAA,OAAA;AAC1B,IAAA,IAAA,CAAK,OAAO,MAAQ,EAAA,IAAA;AAAA,MAClB,CAAA,kCAAA,EAAqC,GAAG,CAAA,UAAA,EAAa,QAAQ,CAAA,CAAA;AAAA,KAC/D;AACA,IAAA,OAAOD,qBAAI,MAAO,CAAA,MAAEC,mBAAI,EAAA,GAAA,EAAK,UAAU,CAAA;AAAA;AACzC;AAAA,EAGA,MAAM,WAAW,OAAwD,EAAA;AACvE,IAAM,MAAA,EAAE,GAAK,EAAA,GAAA,EAAQ,GAAA,OAAA;AACrB,IAAA,OAAOD,qBAAI,UAAW,CAAA,MAAEC,mBAAI,EAAA,GAAA,EAAK,KAAK,CAAA;AAAA;AACxC;AAAA,EAGA,MAAM,IAAI,OAGsB,EAAA;AAC9B,IAAM,MAAA,EAAE,GAAK,EAAA,GAAA,EAAQ,GAAA,OAAA;AACrB,IAAA,OAAOD,qBAAI,GAAI,CAAA;AAAA,UACbC,mBAAA;AAAA,MACA,GAAA;AAAA,MACA,KAAK,GAAO,IAAA;AAAA,KACb,CAAA;AAAA;AACH,EAEiB,MAAA;AAAA,EAEA,oBAAoB,MAAwB;AAC3D,IAAA,IAAI,YAAe,GAAA,EAAA;AAEnB,IAAA,OAAO,CAAS,KAAA,KAAA;AACd,MAAI,IAAA,YAAA,KAAiB,MAAM,KAAO,EAAA;AAChC,QAAA,YAAA,GAAe,KAAM,CAAA,KAAA;AACrB,QAAA,IAAA,CAAK,MAAO,CAAA,MAAA,EAAQ,IAAK,CAAA,KAAA,CAAM,KAAK,CAAA;AAAA;AAEtC,MAAA,MAAM,KAAQ,GAAA,KAAA,CAAM,KAChB,GAAA,CAAA,EAAG,IAAK,CAAA,KAAA,CAAO,KAAM,CAAA,MAAA,GAAS,KAAM,CAAA,KAAA,GAAS,GAAG,CAAC,MACjD,KAAM,CAAA,MAAA;AACV,MAAK,IAAA,CAAA,MAAA,CAAO,QAAQ,KAAM,CAAA,CAAA,QAAA,EAAW,MAAM,KAAK,CAAA,QAAA,EAAW,KAAK,CAAI,EAAA,CAAA,CAAA;AAAA,KACtE;AAAA,GACF;AAAA,EAEA,OAAgB,QAAW,GAAA,CACzB,OACG,KAAA;AACH,IAAI,IAAA,qBAAA,CAAsB,OAAO,CAAG,EAAA;AAClC,MAAA,MAAM,EAAE,MAAA,EAAQ,MAAAE,EAAAA,OAAAA,EAAW,GAAA,OAAA;AAC3B,MAAA,OAAO,IAAI,GAAI,CAAA,EAAE,MAAQ,EAAA,MAAA,EAAAA,SAAQ,CAAA;AAAA;AAGnC,IAAA,MAAM,EAAE,QAAA,EAAU,QAAU,EAAA,KAAA,EAAO,QAAW,GAAA,OAAA;AAC9C,IAAO,OAAA,IAAI,GAAI,CAAA,EAAE,MAAQ,EAAA,OAAO,EAAE,QAAA,EAAU,QAAS,EAAA,CAAA,EAAI,KAAO,EAAA,MAAA,EAAQ,CAAA;AAAA,GAC1E;AACF;;;;"}
1
+ {"version":3,"file":"git.cjs.js","sources":["../../../src/service/GitWrapper/git.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 */\n\nimport { LoggerService } from '@backstage/backend-plugin-api';\n\nimport fs from 'fs-extra';\nimport git, {\n AuthCallback,\n MergeResult,\n ProgressCallback,\n ReadCommitResult,\n} from 'isomorphic-git';\nimport http from 'isomorphic-git/http/node';\n\nfunction isAuthCallbackOptions(\n options: StaticAuthOptions | AuthCallbackOptions,\n): options is AuthCallbackOptions {\n return 'onAuth' in options;\n}\n\n/**\n * Configure static credential for authentication\n * @public\n */\nexport type StaticAuthOptions = {\n username?: string;\n password?: string;\n token?: string;\n logger?: LoggerService;\n};\n\n/**\n * Configure an authentication callback that can provide credentials on demand\n * @public\n */\nexport type AuthCallbackOptions = {\n onAuth: AuthCallback;\n logger?: LoggerService;\n};\n\n/*\nprovider username password\nAzure 'notempty' token\nBitbucket Cloud 'x-token-auth' token\nBitbucket Server username password or token\nGitHub 'x-access-token' token\nGitLab 'oauth2' token\nFrom : https://isomorphic-git.org/docs/en/onAuth with fix for GitHub\nOr token provided as `token` for Bearer auth header\ninstead of Basic Auth (e.g., Bitbucket Server).\n*/\n\n/**\n * A convenience wrapper around the `isomorphic-git` library.\n * @public\n */\n\nexport class Git {\n private readonly headers: {\n [x: string]: string;\n };\n\n private constructor(\n private readonly config: {\n onAuth: AuthCallback;\n token?: string;\n logger?: LoggerService;\n },\n ) {\n this.onAuth = config.onAuth;\n\n this.headers = {\n 'user-agent': 'git/@isomorphic-git',\n ...(config.token ? { Authorization: `Bearer ${config.token}` } : {}),\n };\n }\n\n async add(options: { dir: string; filepath: string }): Promise<void> {\n const { dir, filepath } = options;\n this.config.logger?.info(`Adding file {dir=${dir},filepath=${filepath}}`);\n\n return git.add({ fs, dir, filepath });\n }\n\n async addRemote(options: {\n dir: string;\n remote: string;\n url: string;\n force?: boolean;\n }): Promise<void> {\n const { dir, url, remote, force } = options;\n this.config.logger?.info(\n `Creating new remote {dir=${dir},remote=${remote},url=${url}}`,\n );\n return git.addRemote({ fs, dir, remote, url, force });\n }\n\n async deleteRemote(options: { dir: string; remote: string }): Promise<void> {\n const { dir, remote } = options;\n this.config.logger?.info(`Deleting remote {dir=${dir},remote=${remote}}`);\n return git.deleteRemote({ fs, dir, remote });\n }\n\n async checkout(options: { dir: string; ref: string }): Promise<void> {\n const { dir, ref } = options;\n this.config.logger?.info(`Checking out branch {dir=${dir},ref=${ref}}`);\n\n return git.checkout({ fs, dir, ref });\n }\n\n async branch(options: { dir: string; ref: string }): Promise<void> {\n const { dir, ref } = options;\n this.config.logger?.info(`Creating branch {dir=${dir},ref=${ref}`);\n\n return git.branch({ fs, dir, ref });\n }\n\n async commit(options: {\n dir: string;\n message: string;\n author: { name: string; email: string };\n committer: { name: string; email: string };\n }): Promise<string> {\n const { dir, message, author, committer } = options;\n this.config.logger?.info(\n `Committing file to repo {dir=${dir},message=${message}}`,\n );\n return git.commit({ fs, dir, message, author, committer });\n }\n\n /** https://isomorphic-git.org/docs/en/clone */\n async clone(options: {\n url: string;\n dir: string;\n ref?: string;\n depth?: number;\n noCheckout?: boolean;\n }): Promise<void> {\n const { url, dir, ref, depth, noCheckout } = options;\n this.config.logger?.info(`Cloning repo {dir=${dir},url=${url}}`);\n\n try {\n return await git.clone({\n fs,\n http,\n url,\n dir,\n ref,\n singleBranch: true,\n depth: depth ?? 1,\n noCheckout,\n onProgress: this.onProgressHandler(),\n headers: this.headers,\n onAuth: this.onAuth,\n });\n } catch (ex: any) {\n this.config.logger?.error(`Failed to clone repo {dir=${dir},url=${url}}`);\n if (ex.data) {\n throw new Error(`${ex.message} {data=${JSON.stringify(ex.data)}}`);\n }\n throw ex;\n }\n }\n\n /** https://isomorphic-git.org/docs/en/currentBranch */\n async currentBranch(options: {\n dir: string;\n fullName?: boolean;\n }): Promise<string | undefined> {\n const { dir, fullName = false } = options;\n return git.currentBranch({ fs, dir, fullname: fullName }) as Promise<\n string | undefined\n >;\n }\n\n /** https://isomorphic-git.org/docs/en/fetch */\n async fetch(options: {\n dir: string;\n remote?: string;\n tags?: boolean;\n }): Promise<void> {\n const { dir, remote = 'origin', tags = false } = options;\n this.config.logger?.info(\n `Fetching remote=${remote} for repository {dir=${dir}}`,\n );\n\n try {\n await git.fetch({\n fs,\n http,\n dir,\n remote,\n tags,\n onProgress: this.onProgressHandler(),\n headers: this.headers,\n onAuth: this.onAuth,\n });\n } catch (ex: any) {\n this.config.logger?.error(\n `Failed to fetch repo {dir=${dir},remote=${remote}}`,\n );\n if (ex.data) {\n throw new Error(`${ex.message} {data=${JSON.stringify(ex.data)}}`);\n }\n throw ex;\n }\n }\n\n async init(options: { dir: string; defaultBranch?: string }): Promise<void> {\n const { dir, defaultBranch = 'master' } = options;\n this.config.logger?.info(`Init git repository {dir=${dir}}`);\n\n return git.init({\n fs,\n dir,\n defaultBranch,\n });\n }\n\n /** https://isomorphic-git.org/docs/en/merge */\n async merge(options: {\n dir: string;\n theirs: string;\n ours?: string;\n author: { name: string; email: string };\n committer: { name: string; email: string };\n }): Promise<MergeResult> {\n const { dir, theirs, ours, author, committer } = options;\n this.config.logger?.info(\n `Merging branch '${theirs}' into '${ours}' for repository {dir=${dir}}`,\n );\n\n // If ours is undefined, current branch is used.\n return git.merge({\n fs,\n dir,\n ours,\n theirs,\n author,\n committer,\n });\n }\n\n async push(options: {\n dir: string;\n remote: string;\n remoteRef?: string;\n force?: boolean;\n }) {\n const { dir, remote, remoteRef, force } = options;\n this.config.logger?.info(\n `Pushing directory to remote {dir=${dir},remote=${remote}}`,\n );\n try {\n return await git.push({\n fs,\n dir,\n http,\n onProgress: this.onProgressHandler(),\n remoteRef,\n force,\n headers: this.headers,\n remote,\n onAuth: this.onAuth,\n });\n } catch (ex: any) {\n this.config.logger?.error(\n `Failed to push to repo {dir=${dir}, remote=${remote}}`,\n );\n if (ex.data) {\n throw new Error(`${ex.message} {data=${JSON.stringify(ex.data)}}`);\n }\n throw ex;\n }\n }\n\n /** https://isomorphic-git.org/docs/en/readCommit */\n async readCommit(options: {\n dir: string;\n sha: string;\n }): Promise<ReadCommitResult> {\n const { dir, sha } = options;\n return git.readCommit({ fs, dir, oid: sha });\n }\n\n /** https://isomorphic-git.org/docs/en/remove */\n async remove(options: { dir: string; filepath: string }): Promise<void> {\n const { dir, filepath } = options;\n this.config.logger?.info(\n `Removing file from git index {dir=${dir},filepath=${filepath}}`,\n );\n return git.remove({ fs, dir, filepath });\n }\n\n /** https://isomorphic-git.org/docs/en/resolveRef */\n async resolveRef(options: { dir: string; ref: string }): Promise<string> {\n const { dir, ref } = options;\n return git.resolveRef({ fs, dir, ref });\n }\n\n /** https://isomorphic-git.org/docs/en/log */\n async log(options: {\n dir: string;\n ref?: string;\n }): Promise<ReadCommitResult[]> {\n const { dir, ref } = options;\n return git.log({\n fs,\n dir,\n ref: ref ?? 'HEAD',\n });\n }\n\n private readonly onAuth: AuthCallback;\n\n private readonly onProgressHandler = (): ProgressCallback => {\n let currentPhase = '';\n\n return event => {\n if (currentPhase !== event.phase) {\n currentPhase = event.phase;\n this.config.logger?.info(event.phase);\n }\n const total = event.total\n ? `${Math.round((event.loaded / event.total) * 100)}%`\n : event.loaded;\n this.config.logger?.debug(`status={${event.phase},total={${total}}}`);\n };\n };\n\n static readonly fromAuth = (\n options: StaticAuthOptions | AuthCallbackOptions,\n ) => {\n if (isAuthCallbackOptions(options)) {\n const { onAuth, logger } = options;\n return new Git({ onAuth, logger });\n }\n\n const { username, password, token, logger } = options;\n return new Git({ onAuth: () => ({ username, password }), token, logger });\n };\n}\n"],"names":["git","fs","http","logger"],"mappings":";;;;;;;;;;;;AA2BA,SAAS,sBACP,OAAA,EACgC;AAChC,EAAA,OAAO,QAAA,IAAY,OAAA;AACrB;AAuCO,MAAM,GAAA,CAAI;AAAA,EAKP,YACW,MAAA,EAKjB;AALiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAMjB,IAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AAErB,IAAA,IAAA,CAAK,OAAA,GAAU;AAAA,MACb,YAAA,EAAc,qBAAA;AAAA,MACd,GAAI,MAAA,CAAO,KAAA,GAAQ,EAAE,aAAA,EAAe,UAAU,MAAA,CAAO,KAAK,CAAA,CAAA,EAAG,GAAI;AAAC,KACpE;AAAA,EACF;AAAA,EAjBiB,OAAA;AAAA,EAmBjB,MAAM,IAAI,OAAA,EAA2D;AACnE,IAAA,MAAM,EAAE,GAAA,EAAK,QAAA,EAAS,GAAI,OAAA;AAC1B,IAAA,IAAA,CAAK,OAAO,MAAA,EAAQ,IAAA,CAAK,oBAAoB,GAAG,CAAA,UAAA,EAAa,QAAQ,CAAA,CAAA,CAAG,CAAA;AAExE,IAAA,OAAOA,qBAAI,GAAA,CAAI,MAAEC,mBAAA,EAAI,GAAA,EAAK,UAAU,CAAA;AAAA,EACtC;AAAA,EAEA,MAAM,UAAU,OAAA,EAKE;AAChB,IAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAK,MAAA,EAAQ,OAAM,GAAI,OAAA;AACpC,IAAA,IAAA,CAAK,OAAO,MAAA,EAAQ,IAAA;AAAA,MAClB,CAAA,yBAAA,EAA4B,GAAG,CAAA,QAAA,EAAW,MAAM,QAAQ,GAAG,CAAA,CAAA;AAAA,KAC7D;AACA,IAAA,OAAOD,oBAAA,CAAI,UAAU,MAAEC,mBAAA,EAAI,KAAK,MAAA,EAAQ,GAAA,EAAK,OAAO,CAAA;AAAA,EACtD;AAAA,EAEA,MAAM,aAAa,OAAA,EAAyD;AAC1E,IAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAO,GAAI,OAAA;AACxB,IAAA,IAAA,CAAK,OAAO,MAAA,EAAQ,IAAA,CAAK,wBAAwB,GAAG,CAAA,QAAA,EAAW,MAAM,CAAA,CAAA,CAAG,CAAA;AACxE,IAAA,OAAOD,qBAAI,YAAA,CAAa,MAAEC,mBAAA,EAAI,GAAA,EAAK,QAAQ,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,SAAS,OAAA,EAAsD;AACnE,IAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,OAAA;AACrB,IAAA,IAAA,CAAK,OAAO,MAAA,EAAQ,IAAA,CAAK,4BAA4B,GAAG,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAA,CAAG,CAAA;AAEtE,IAAA,OAAOD,qBAAI,QAAA,CAAS,MAAEC,mBAAA,EAAI,GAAA,EAAK,KAAK,CAAA;AAAA,EACtC;AAAA,EAEA,MAAM,OAAO,OAAA,EAAsD;AACjE,IAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,OAAA;AACrB,IAAA,IAAA,CAAK,OAAO,MAAA,EAAQ,IAAA,CAAK,wBAAwB,GAAG,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAE,CAAA;AAEjE,IAAA,OAAOD,qBAAI,MAAA,CAAO,MAAEC,mBAAA,EAAI,GAAA,EAAK,KAAK,CAAA;AAAA,EACpC;AAAA,EAEA,MAAM,OAAO,OAAA,EAKO;AAClB,IAAA,MAAM,EAAE,GAAA,EAAK,OAAA,EAAS,MAAA,EAAQ,WAAU,GAAI,OAAA;AAC5C,IAAA,IAAA,CAAK,OAAO,MAAA,EAAQ,IAAA;AAAA,MAClB,CAAA,6BAAA,EAAgC,GAAG,CAAA,SAAA,EAAY,OAAO,CAAA,CAAA;AAAA,KACxD;AACA,IAAA,OAAOD,oBAAA,CAAI,OAAO,MAAEC,mBAAA,EAAI,KAAK,OAAA,EAAS,MAAA,EAAQ,WAAW,CAAA;AAAA,EAC3D;AAAA;AAAA,EAGA,MAAM,MAAM,OAAA,EAMM;AAChB,IAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,KAAA,EAAO,YAAW,GAAI,OAAA;AAC7C,IAAA,IAAA,CAAK,OAAO,MAAA,EAAQ,IAAA,CAAK,qBAAqB,GAAG,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAA,CAAG,CAAA;AAE/D,IAAA,IAAI;AACF,MAAA,OAAO,MAAMD,qBAAI,KAAA,CAAM;AAAA,YACrBC,mBAAA;AAAA,cACAC,qBAAA;AAAA,QACA,GAAA;AAAA,QACA,GAAA;AAAA,QACA,GAAA;AAAA,QACA,YAAA,EAAc,IAAA;AAAA,QACd,OAAO,KAAA,IAAS,CAAA;AAAA,QAChB,UAAA;AAAA,QACA,UAAA,EAAY,KAAK,iBAAA,EAAkB;AAAA,QACnC,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,QAAQ,IAAA,CAAK;AAAA,OACd,CAAA;AAAA,IACH,SAAS,EAAA,EAAS;AAChB,MAAA,IAAA,CAAK,OAAO,MAAA,EAAQ,KAAA,CAAM,6BAA6B,GAAG,CAAA,KAAA,EAAQ,GAAG,CAAA,CAAA,CAAG,CAAA;AACxE,MAAA,IAAI,GAAG,IAAA,EAAM;AACX,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,EAAA,CAAG,OAAO,CAAA,OAAA,EAAU,IAAA,CAAK,SAAA,CAAU,EAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,MACnE;AACA,MAAA,MAAM,EAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,cAAc,OAAA,EAGY;AAC9B,IAAA,MAAM,EAAE,GAAA,EAAK,QAAA,GAAW,KAAA,EAAM,GAAI,OAAA;AAClC,IAAA,OAAOF,qBAAI,aAAA,CAAc,MAAEC,qBAAI,GAAA,EAAK,QAAA,EAAU,UAAU,CAAA;AAAA,EAG1D;AAAA;AAAA,EAGA,MAAM,MAAM,OAAA,EAIM;AAChB,IAAA,MAAM,EAAE,GAAA,EAAK,MAAA,GAAS,QAAA,EAAU,IAAA,GAAO,OAAM,GAAI,OAAA;AACjD,IAAA,IAAA,CAAK,OAAO,MAAA,EAAQ,IAAA;AAAA,MAClB,CAAA,gBAAA,EAAmB,MAAM,CAAA,qBAAA,EAAwB,GAAG,CAAA,CAAA;AAAA,KACtD;AAEA,IAAA,IAAI;AACF,MAAA,MAAMD,qBAAI,KAAA,CAAM;AAAA,YACdC,mBAAA;AAAA,cACAC,qBAAA;AAAA,QACA,GAAA;AAAA,QACA,MAAA;AAAA,QACA,IAAA;AAAA,QACA,UAAA,EAAY,KAAK,iBAAA,EAAkB;AAAA,QACnC,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,QAAQ,IAAA,CAAK;AAAA,OACd,CAAA;AAAA,IACH,SAAS,EAAA,EAAS;AAChB,MAAA,IAAA,CAAK,OAAO,MAAA,EAAQ,KAAA;AAAA,QAClB,CAAA,0BAAA,EAA6B,GAAG,CAAA,QAAA,EAAW,MAAM,CAAA,CAAA;AAAA,OACnD;AACA,MAAA,IAAI,GAAG,IAAA,EAAM;AACX,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,EAAA,CAAG,OAAO,CAAA,OAAA,EAAU,IAAA,CAAK,SAAA,CAAU,EAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,MACnE;AACA,MAAA,MAAM,EAAA;AAAA,IACR;AAAA,EACF;AAAA,EAEA,MAAM,KAAK,OAAA,EAAiE;AAC1E,IAAA,MAAM,EAAE,GAAA,EAAK,aAAA,GAAgB,QAAA,EAAS,GAAI,OAAA;AAC1C,IAAA,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,IAAA,CAAK,CAAA,yBAAA,EAA4B,GAAG,CAAA,CAAA,CAAG,CAAA;AAE3D,IAAA,OAAOF,qBAAI,IAAA,CAAK;AAAA,UACdC,mBAAA;AAAA,MACA,GAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,MAAM,OAAA,EAMa;AACvB,IAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAQ,WAAU,GAAI,OAAA;AACjD,IAAA,IAAA,CAAK,OAAO,MAAA,EAAQ,IAAA;AAAA,MAClB,CAAA,gBAAA,EAAmB,MAAM,CAAA,QAAA,EAAW,IAAI,yBAAyB,GAAG,CAAA,CAAA;AAAA,KACtE;AAGA,IAAA,OAAOD,qBAAI,KAAA,CAAM;AAAA,UACfC,mBAAA;AAAA,MACA,GAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,KAAK,OAAA,EAKR;AACD,IAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAQ,SAAA,EAAW,OAAM,GAAI,OAAA;AAC1C,IAAA,IAAA,CAAK,OAAO,MAAA,EAAQ,IAAA;AAAA,MAClB,CAAA,iCAAA,EAAoC,GAAG,CAAA,QAAA,EAAW,MAAM,CAAA,CAAA;AAAA,KAC1D;AACA,IAAA,IAAI;AACF,MAAA,OAAO,MAAMD,qBAAI,IAAA,CAAK;AAAA,YACpBC,mBAAA;AAAA,QACA,GAAA;AAAA,cACAC,qBAAA;AAAA,QACA,UAAA,EAAY,KAAK,iBAAA,EAAkB;AAAA,QACnC,SAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,MAAA;AAAA,QACA,QAAQ,IAAA,CAAK;AAAA,OACd,CAAA;AAAA,IACH,SAAS,EAAA,EAAS;AAChB,MAAA,IAAA,CAAK,OAAO,MAAA,EAAQ,KAAA;AAAA,QAClB,CAAA,4BAAA,EAA+B,GAAG,CAAA,SAAA,EAAY,MAAM,CAAA,CAAA;AAAA,OACtD;AACA,MAAA,IAAI,GAAG,IAAA,EAAM;AACX,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,EAAA,CAAG,OAAO,CAAA,OAAA,EAAU,IAAA,CAAK,SAAA,CAAU,EAAA,CAAG,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,MACnE;AACA,MAAA,MAAM,EAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,WAAW,OAAA,EAGa;AAC5B,IAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,OAAA;AACrB,IAAA,OAAOF,qBAAI,UAAA,CAAW,MAAEC,qBAAI,GAAA,EAAK,GAAA,EAAK,KAAK,CAAA;AAAA,EAC7C;AAAA;AAAA,EAGA,MAAM,OAAO,OAAA,EAA2D;AACtE,IAAA,MAAM,EAAE,GAAA,EAAK,QAAA,EAAS,GAAI,OAAA;AAC1B,IAAA,IAAA,CAAK,OAAO,MAAA,EAAQ,IAAA;AAAA,MAClB,CAAA,kCAAA,EAAqC,GAAG,CAAA,UAAA,EAAa,QAAQ,CAAA,CAAA;AAAA,KAC/D;AACA,IAAA,OAAOD,qBAAI,MAAA,CAAO,MAAEC,mBAAA,EAAI,GAAA,EAAK,UAAU,CAAA;AAAA,EACzC;AAAA;AAAA,EAGA,MAAM,WAAW,OAAA,EAAwD;AACvE,IAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,OAAA;AACrB,IAAA,OAAOD,qBAAI,UAAA,CAAW,MAAEC,mBAAA,EAAI,GAAA,EAAK,KAAK,CAAA;AAAA,EACxC;AAAA;AAAA,EAGA,MAAM,IAAI,OAAA,EAGsB;AAC9B,IAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,OAAA;AACrB,IAAA,OAAOD,qBAAI,GAAA,CAAI;AAAA,UACbC,mBAAA;AAAA,MACA,GAAA;AAAA,MACA,KAAK,GAAA,IAAO;AAAA,KACb,CAAA;AAAA,EACH;AAAA,EAEiB,MAAA;AAAA,EAEA,oBAAoB,MAAwB;AAC3D,IAAA,IAAI,YAAA,GAAe,EAAA;AAEnB,IAAA,OAAO,CAAA,KAAA,KAAS;AACd,MAAA,IAAI,YAAA,KAAiB,MAAM,KAAA,EAAO;AAChC,QAAA,YAAA,GAAe,KAAA,CAAM,KAAA;AACrB,QAAA,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAAA,MACtC;AACA,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,GAChB,CAAA,EAAG,IAAA,CAAK,KAAA,CAAO,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,KAAA,GAAS,GAAG,CAAC,MACjD,KAAA,CAAM,MAAA;AACV,MAAA,IAAA,CAAK,MAAA,CAAO,QAAQ,KAAA,CAAM,CAAA,QAAA,EAAW,MAAM,KAAK,CAAA,QAAA,EAAW,KAAK,CAAA,EAAA,CAAI,CAAA;AAAA,IACtE,CAAA;AAAA,EACF,CAAA;AAAA,EAEA,OAAgB,QAAA,GAAW,CACzB,OAAA,KACG;AACH,IAAA,IAAI,qBAAA,CAAsB,OAAO,CAAA,EAAG;AAClC,MAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAAE,OAAAA,EAAO,GAAI,OAAA;AAC3B,MAAA,OAAO,IAAI,GAAA,CAAI,EAAE,MAAA,EAAQ,MAAA,EAAAA,SAAQ,CAAA;AAAA,IACnC;AAEA,IAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAU,KAAA,EAAO,QAAO,GAAI,OAAA;AAC9C,IAAA,OAAO,IAAI,GAAA,CAAI,EAAE,MAAA,EAAQ,OAAO,EAAE,QAAA,EAAU,QAAA,EAAS,CAAA,EAAI,KAAA,EAAO,MAAA,EAAQ,CAAA;AAAA,EAC1E,CAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Helper.cjs.js","sources":["../../src/service/Helper.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 { LoggerService } from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\n\nimport fs from 'fs-extra';\n\nimport os from 'os';\n\nexport async function retryAsyncFunction<T>(args: {\n asyncFn: () => Promise<T | undefined>;\n maxAttempts: number;\n delayMs: number;\n}): Promise<T> {\n let result: T | undefined;\n for (let i = 0; i < args.maxAttempts; i++) {\n result = await args.asyncFn();\n if (result !== undefined) {\n return result;\n }\n await new Promise(resolve => setTimeout(resolve, args.delayMs));\n }\n throw new Error('Exceeded maximum number of retries for async function');\n}\n\nexport async function getWorkingDirectory(\n config: Config,\n logger: LoggerService,\n): Promise<string> {\n if (!config.has('backend.workingDirectory')) {\n return os.tmpdir();\n }\n\n const workingDirectory = config.getString('backend.workingDirectory');\n try {\n // Check if working directory exists and is writable\n await fs.access(workingDirectory, fs.constants.F_OK | fs.constants.W_OK);\n logger.info(`using working directory: ${workingDirectory}`);\n } catch (err: any) {\n logger.error(\n `working directory ${workingDirectory} ${\n err.code === 'ENOENT' ? 'does not exist' : 'is not writable'\n }`,\n );\n throw err;\n }\n return workingDirectory;\n}\n\nexport async function executeWithRetry(\n action: () => Promise<Response>,\n maxErrors = 15,\n): Promise<Response> {\n let response: Response;\n let errorCount = 0;\n // execute with retry\n const backoff = 5000;\n while (errorCount < maxErrors) {\n try {\n response = await action();\n if (response.status >= 400) {\n errorCount++;\n // backoff\n await delay(backoff);\n } else {\n return response;\n }\n } catch (e) {\n errorCount++;\n await delay(backoff);\n }\n }\n throw new Error('Unable to execute query.');\n}\n\nexport function delay(time: number) {\n return new Promise(r => setTimeout(r, time));\n}\n"],"names":["os","fs"],"mappings":";;;;;;;;;;AAsBA,eAAsB,mBAAsB,IAI7B,EAAA;AACb,EAAI,IAAA,MAAA;AACJ,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,IAAA,CAAK,aAAa,CAAK,EAAA,EAAA;AACzC,IAAS,MAAA,GAAA,MAAM,KAAK,OAAQ,EAAA;AAC5B,IAAA,IAAI,WAAW,MAAW,EAAA;AACxB,MAAO,OAAA,MAAA;AAAA;AAET,IAAA,MAAM,IAAI,OAAQ,CAAA,CAAA,OAAA,KAAW,WAAW,OAAS,EAAA,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA;AAEhE,EAAM,MAAA,IAAI,MAAM,uDAAuD,CAAA;AACzE;AAEsB,eAAA,mBAAA,CACpB,QACA,MACiB,EAAA;AACjB,EAAA,IAAI,CAAC,MAAA,CAAO,GAAI,CAAA,0BAA0B,CAAG,EAAA;AAC3C,IAAA,OAAOA,oBAAG,MAAO,EAAA;AAAA;AAGnB,EAAM,MAAA,gBAAA,GAAmB,MAAO,CAAA,SAAA,CAAU,0BAA0B,CAAA;AACpE,EAAI,IAAA;AAEF,IAAM,MAAAC,mBAAA,CAAG,OAAO,gBAAkB,EAAAA,mBAAA,CAAG,UAAU,IAAO,GAAAA,mBAAA,CAAG,UAAU,IAAI,CAAA;AACvE,IAAO,MAAA,CAAA,IAAA,CAAK,CAA4B,yBAAA,EAAA,gBAAgB,CAAE,CAAA,CAAA;AAAA,WACnD,GAAU,EAAA;AACjB,IAAO,MAAA,CAAA,KAAA;AAAA,MACL,qBAAqB,gBAAgB,CAAA,CAAA,EACnC,IAAI,IAAS,KAAA,QAAA,GAAW,mBAAmB,iBAC7C,CAAA;AAAA,KACF;AACA,IAAM,MAAA,GAAA;AAAA;AAER,EAAO,OAAA,gBAAA;AACT;AAEsB,eAAA,gBAAA,CACpB,MACA,EAAA,SAAA,GAAY,EACO,EAAA;AACnB,EAAI,IAAA,QAAA;AACJ,EAAA,IAAI,UAAa,GAAA,CAAA;AAEjB,EAAA,MAAM,OAAU,GAAA,GAAA;AAChB,EAAA,OAAO,aAAa,SAAW,EAAA;AAC7B,IAAI,IAAA;AACF,MAAA,QAAA,GAAW,MAAM,MAAO,EAAA;AACxB,MAAI,IAAA,QAAA,CAAS,UAAU,GAAK,EAAA;AAC1B,QAAA,UAAA,EAAA;AAEA,QAAA,MAAM,MAAM,OAAO,CAAA;AAAA,OACd,MAAA;AACL,QAAO,OAAA,QAAA;AAAA;AACT,aACO,CAAG,EAAA;AACV,MAAA,UAAA,EAAA;AACA,MAAA,MAAM,MAAM,OAAO,CAAA;AAAA;AACrB;AAEF,EAAM,MAAA,IAAI,MAAM,0BAA0B,CAAA;AAC5C;AAEO,SAAS,MAAM,IAAc,EAAA;AAClC,EAAA,OAAO,IAAI,OAAQ,CAAA,CAAA,CAAA,KAAK,UAAW,CAAA,CAAA,EAAG,IAAI,CAAC,CAAA;AAC7C;;;;;;;"}
1
+ {"version":3,"file":"Helper.cjs.js","sources":["../../src/service/Helper.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 { LoggerService } from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\n\nimport fs from 'fs-extra';\n\nimport os from 'os';\n\nexport async function retryAsyncFunction<T>(args: {\n asyncFn: () => Promise<T | undefined>;\n maxAttempts: number;\n delayMs: number;\n}): Promise<T> {\n let result: T | undefined;\n for (let i = 0; i < args.maxAttempts; i++) {\n result = await args.asyncFn();\n if (result !== undefined) {\n return result;\n }\n await new Promise(resolve => setTimeout(resolve, args.delayMs));\n }\n throw new Error('Exceeded maximum number of retries for async function');\n}\n\nexport async function getWorkingDirectory(\n config: Config,\n logger: LoggerService,\n): Promise<string> {\n if (!config.has('backend.workingDirectory')) {\n return os.tmpdir();\n }\n\n const workingDirectory = config.getString('backend.workingDirectory');\n try {\n // Check if working directory exists and is writable\n await fs.access(workingDirectory, fs.constants.F_OK | fs.constants.W_OK);\n logger.info(`using working directory: ${workingDirectory}`);\n } catch (err: any) {\n logger.error(\n `working directory ${workingDirectory} ${\n err.code === 'ENOENT' ? 'does not exist' : 'is not writable'\n }`,\n );\n throw err;\n }\n return workingDirectory;\n}\n\nexport async function executeWithRetry(\n action: () => Promise<Response>,\n maxErrors = 15,\n): Promise<Response> {\n let response: Response;\n let errorCount = 0;\n // execute with retry\n const backoff = 5000;\n while (errorCount < maxErrors) {\n try {\n response = await action();\n if (response.status >= 400) {\n errorCount++;\n // backoff\n await delay(backoff);\n } else {\n return response;\n }\n } catch (e) {\n errorCount++;\n await delay(backoff);\n }\n }\n throw new Error('Unable to execute query.');\n}\n\nexport function delay(time: number) {\n return new Promise(r => setTimeout(r, time));\n}\n"],"names":["os","fs"],"mappings":";;;;;;;;;;AAsBA,eAAsB,mBAAsB,IAAA,EAI7B;AACb,EAAA,IAAI,MAAA;AACJ,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,aAAa,CAAA,EAAA,EAAK;AACzC,IAAA,MAAA,GAAS,MAAM,KAAK,OAAA,EAAQ;AAC5B,IAAA,IAAI,WAAW,MAAA,EAAW;AACxB,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,WAAW,OAAA,EAAS,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EAChE;AACA,EAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AACzE;AAEA,eAAsB,mBAAA,CACpB,QACA,MAAA,EACiB;AACjB,EAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,0BAA0B,CAAA,EAAG;AAC3C,IAAA,OAAOA,oBAAG,MAAA,EAAO;AAAA,EACnB;AAEA,EAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,SAAA,CAAU,0BAA0B,CAAA;AACpE,EAAA,IAAI;AAEF,IAAA,MAAMC,mBAAA,CAAG,OAAO,gBAAA,EAAkBA,mBAAA,CAAG,UAAU,IAAA,GAAOA,mBAAA,CAAG,UAAU,IAAI,CAAA;AACvE,IAAA,MAAA,CAAO,IAAA,CAAK,CAAA,yBAAA,EAA4B,gBAAgB,CAAA,CAAE,CAAA;AAAA,EAC5D,SAAS,GAAA,EAAU;AACjB,IAAA,MAAA,CAAO,KAAA;AAAA,MACL,qBAAqB,gBAAgB,CAAA,CAAA,EACnC,IAAI,IAAA,KAAS,QAAA,GAAW,mBAAmB,iBAC7C,CAAA;AAAA,KACF;AACA,IAAA,MAAM,GAAA;AAAA,EACR;AACA,EAAA,OAAO,gBAAA;AACT;AAEA,eAAsB,gBAAA,CACpB,MAAA,EACA,SAAA,GAAY,EAAA,EACO;AACnB,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,MAAM,OAAA,GAAU,GAAA;AAChB,EAAA,OAAO,aAAa,SAAA,EAAW;AAC7B,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAM,MAAA,EAAO;AACxB,MAAA,IAAI,QAAA,CAAS,UAAU,GAAA,EAAK;AAC1B,QAAA,UAAA,EAAA;AAEA,QAAA,MAAM,MAAM,OAAO,CAAA;AAAA,MACrB,CAAA,MAAO;AACL,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,IACF,SAAS,CAAA,EAAG;AACV,MAAA,UAAA,EAAA;AACA,MAAA,MAAM,MAAM,OAAO,CAAA;AAAA,IACrB;AAAA,EACF;AACA,EAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAC5C;AAEO,SAAS,MAAM,IAAA,EAAc;AAClC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAA,CAAA,KAAK,UAAA,CAAW,CAAA,EAAG,IAAI,CAAC,CAAA;AAC7C;;;;;;;"}