summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/pipelines/components/parsing_utils.js
diff options
context:
space:
mode:
Diffstat (limited to 'app/assets/javascripts/pipelines/components/parsing_utils.js')
-rw-r--r--app/assets/javascripts/pipelines/components/parsing_utils.js36
1 files changed, 20 insertions, 16 deletions
diff --git a/app/assets/javascripts/pipelines/components/parsing_utils.js b/app/assets/javascripts/pipelines/components/parsing_utils.js
index 9d886e0e379..f1d9ced807b 100644
--- a/app/assets/javascripts/pipelines/components/parsing_utils.js
+++ b/app/assets/javascripts/pipelines/components/parsing_utils.js
@@ -55,28 +55,32 @@ export const createNodeDict = (nodes) => {
export const makeLinksFromNodes = (nodes, nodeDict) => {
const constantLinkValue = 10; // all links are the same weight
return nodes
- .map((group) => {
- return group.jobs.map((job) => {
- if (!job.needs) {
- return [];
- }
-
- return job.needs.map((needed) => {
- return {
- source: nodeDict[needed]?.name,
- target: group.name,
- value: constantLinkValue,
- };
- });
- });
- })
+ .map(({ jobs, name: groupName }) =>
+ jobs.map(({ needs = [] }) =>
+ needs.reduce((acc, needed) => {
+ // It's possible that we have an optional job, which
+ // is being needed by another job. In that scenario,
+ // the needed job doesn't exist, so we don't want to
+ // create link for it.
+ if (nodeDict[needed]?.name) {
+ acc.push({
+ source: nodeDict[needed].name,
+ target: groupName,
+ value: constantLinkValue,
+ });
+ }
+
+ return acc;
+ }, []),
+ ),
+ )
.flat(2);
};
export const getAllAncestors = (nodes, nodeDict) => {
const needs = nodes
.map((node) => {
- return nodeDict[node].needs || '';
+ return nodeDict[node]?.needs || '';
})
.flat()
.filter(Boolean);