From 3499df498f162df98c99c30f9f8f09eb4861ed13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6ran=20Sander?= Date: Sat, 4 Jan 2025 15:31:19 +0100 Subject: [PATCH 1/3] feat(qseow task-vis): Show count for duplicate, identical triggers in task network view Implements #599 --- src/lib/cmd/qseow/vistask.js | 14 ++++++++++++ src/lib/task/get_task_sub_graph.js | 34 ++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/src/lib/cmd/qseow/vistask.js b/src/lib/cmd/qseow/vistask.js index 4796221..0a573c7 100644 --- a/src/lib/cmd/qseow/vistask.js +++ b/src/lib/cmd/qseow/vistask.js @@ -56,6 +56,9 @@ const visOptions = { arrows: 'to', width: 5, smooth: false, + font: { + size: 22, // Increase font size for text edge labels + }, }, layout: { randomSeed: 5.5, @@ -364,6 +367,17 @@ const prepareFile = async (url) => { }) .concat(nodesNetwork); + // Add a text with edge count for the edges where edgeCount > 1 + // No text for edges where edgeCount === 1 + // Update the edge label in taskModel.edges[] with the edge count + taskModel.edges.map((edge) => { + if (edge.edgeCount > 1) { + edge.label = `${edge.edgeCount}`; + } else { + edge.label = ''; + } + }); + const networkTask = { nodes: nodesNetwork, edges: taskModel.edges }; templateData.nodes = JSON.stringify(nodesNetwork); diff --git a/src/lib/task/get_task_sub_graph.js b/src/lib/task/get_task_sub_graph.js index fe5ab75..3ff8cc5 100644 --- a/src/lib/task/get_task_sub_graph.js +++ b/src/lib/task/get_task_sub_graph.js @@ -152,6 +152,29 @@ export function extGetTaskSubGraph(_, node, parentTreeLevel, parentNode, logger) } duplicateDownstreamNodes.push(tmp); + + // Update edge in main task network to reflect that there are multiple downstream nodes with the same ID and the same relationship + _.taskNetwork.edges = _.taskNetwork.edges.map((el) => { + if (el.from === edgeToDownstreamNode.from && el.to === edgeToDownstreamNode.to) { + return { + ...el, + edgeCount: tmp.length, + }; + } + return el; + }); + } else { + // No duplicate downstream nodes + // Update edge in main task network to reflect that there are no multiple downstream nodes with the same ID and the same relationship + _.taskNetwork.edges = _.taskNetwork.edges.map((el) => { + if (el.from === edgeToDownstreamNode.from && el.to === edgeToDownstreamNode.to) { + return { + ...el, + edgeCount: 1, + }; + } + return el; + }); } } } @@ -217,6 +240,17 @@ export function extGetTaskSubGraph(_, node, parentTreeLevel, parentNode, logger) } } + // Update edges with information about how many instances of the same edge there are. + // This has been temporarily stored in the main task network object's edges property. + // Copy it over to the edges in the subgraphEdges array. + subGraphEdges = subGraphEdges.map((el) => { + const edgeCount = _.taskNetwork.edges.find((edge) => edge.from === el.from && edge.to === el.to).edgeCount; + return { + ...el, + edgeCount: edgeCount, + }; + }); + return { nodes: subGraphNodes, edges: subGraphEdges, From 44de75d85bd6adb9c7f2c9d3b33949dd3a4ca328 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6ran=20Sander?= Date: Sun, 5 Jan 2025 11:46:17 +0100 Subject: [PATCH 2/3] feat(qseow task-vis): Always look for circular task chains and duplicate task triggers when starting Ctrl-Q Implements #600 and #597 fix(qseow task-vis): Only log found circular task chains once in console Fixes #596 feat(qseow task-vis): Add `--task-tag` and `--task-id` options for limiting what tasks are visualised Implements parts of #581 --- src/lib/cmd/qseow/vistask.js | 38 +++++- src/lib/task/class_alltasks.js | 49 +++++-- src/lib/task/find_circular_task_chain.js | 166 +++++++++++++++++++---- src/lib/task/get_task_sub_graph.js | 53 ++++---- 4 files changed, 235 insertions(+), 71 deletions(-) diff --git a/src/lib/cmd/qseow/vistask.js b/src/lib/cmd/qseow/vistask.js index 0a573c7..4c733cb 100644 --- a/src/lib/cmd/qseow/vistask.js +++ b/src/lib/cmd/qseow/vistask.js @@ -575,8 +575,8 @@ export async function visTask(options) { taskNetwork = qlikSenseTasks.taskNetwork; } else { // Task id filters specified. - // Get all task chains the tasks are part of, - // then get the rMeta nodeoot nodes of each chain. They will be the starting points for the task tree. + // Get all task chains the tasks are part of, then get the root nodes of each chain. + // They will be the starting points for the task tree. // Array to keep track of root nodes of task chains const rootNodes = await qlikSenseTasks.getRootNodesFromFilter(); @@ -598,7 +598,7 @@ export async function visTask(options) { }); // Get all nodes that are children of the root nodes - const { nodes, edges, tasks } = await qlikSenseTasks.getNodesAndEdgesFromRootNodes(rootNodes); + const { nodes, edges, tasks } = await qlikSenseTasks.getNetworkFromRootNodes(rootNodes); taskNetwork = { nodes, edges, tasks }; } @@ -608,13 +608,16 @@ export async function visTask(options) { logger.info('Looking for circular task chains in the task network'); try { - const circularTaskChains = findCircularTaskChains(taskNetwork, logger); + const result = findCircularTaskChains(taskNetwork, logger); // Errros? - if (circularTaskChains === false) { + if (result === false) { return false; } + const circularTaskChains = result.circularTaskChains; + const duplicateEdges = result.duplicateEdges; + // De-duplicate circular task chains (where fromTask.id and toTask.id matches in two different chains). const deduplicatedCircularTaskChain = circularTaskChains.filter((chain, index, self) => { return self.findIndex((c) => c.fromTask.id === chain.fromTask.id && c.toTask.id === chain.toTask.id) === index; @@ -633,6 +636,31 @@ export async function visTask(options) { } else { logger.info('No circular task chains found in task model'); } + + // Log duplicate edges, if any were found. + // De-duplicate first. If two edges have the same from and to task id, and the same rule state, it's a duplicate. + const deduplicatedDuplicateEdges = duplicateEdges.filter((edge, index, self) => { + return ( + self.findIndex( + (e) => + e.parentNode.id === edge.parentNode.id && + e.downstreamNode.id === edge.downstreamNode.id && + e.ruleState === edge.ruleState + ) === index + ); + }); + + if (deduplicatedDuplicateEdges?.length > 0) { + logger.warn(''); + logger.warn(`Found ${deduplicatedDuplicateEdges.length} duplicate task triggers in task model, across all examined tasks.`); + for (const duplicate of deduplicatedDuplicateEdges) { + logger.warn( + `Multiple downstream nodes (${duplicate.duplicateEdgeCount}) with the same ID and the same trigger relationship "${duplicate.ruleState}" with the parent node.` + ); + logger.warn(` Parent node : [${duplicate.parentNode.id}] "${duplicate.parentNode.completeTaskObject?.name}"`); + logger.warn(` Downstream node : [${duplicate.downstreamNode.id}] "${duplicate.downstreamNode.completeTaskObject?.name}"`); + } + } } catch (error) { catchLog('FIND CIRCULAR TASK CHAINS', error); return false; diff --git a/src/lib/task/class_alltasks.js b/src/lib/task/class_alltasks.js index 5a50744..86024e9 100644 --- a/src/lib/task/class_alltasks.js +++ b/src/lib/task/class_alltasks.js @@ -325,16 +325,16 @@ export class QlikSenseTasks { * - De-duplicate nodes where applicable. Node id is unique, but may appear at different places in the task network. * - Keep track of edges between nodes and store them in edgesToVisualize * - Store nodes in nodesToVisualize - * - Detect cyclic dependencies. Log warning if detected. - * - Detect identical, duplicate edges between nodes. Log warning if detected. + * - Detect cyclic dependencies to avoid infinite loops * * @param {Array} rootNodes - An array of root node objects from which the extraction begins. * @returns {Promise} - A promise that resolves to an object containing the nodes and edges. * Object properties: - * - nodes: Array of nodes, + * - nodes: Array of nodes * - edges: Array of edges + * - tasks: Array of tasks */ - async getNodesAndEdgesFromRootNodes(rootNodes) { + async getNetworkFromRootNodes(rootNodes) { // De-duplicate root nodes const uniqueRootNodes = rootNodes.filter((node, index, self) => { return index === self.findIndex((t) => t.id === node.id); @@ -353,9 +353,38 @@ export class QlikSenseTasks { logger.verbose(`No subgraph found for root node ${rootNode.id}.`); continue; } - nodesFound.push(...subGraph.nodes); - edgesFound.push(...subGraph.edges); - tasksFound.push(...subGraph.tasks); + + // Note: There are corner cases that need to be handled here. + // - Overlapping subnetworks. For example, Root1 > Node1 > Node2 and Root2 > Node1 > Node2. + // In this case, Node1 and Node2 should NOT be duplicated in the final result. + + // Only add nodes if they are not already in the nodesFound array + if (subGraph.nodes) { + for (const node of subGraph.nodes) { + if (!nodesFound.find((t) => t.id === node.id)) { + nodesFound.push(node); + } + } + } + + // Only add edges if they are not already in the edgesFound array + if (subGraph.edges) { + for (const edge of subGraph.edges) { + if (!edgesFound.find((t) => t.from === edge.from && t.to === edge.to)) { + // Add all edges (there can be multiple edges between the same nodes!) to the edgesFound array + const edges = subGraph.edges.filter((e) => e.from === edge.from && e.to === edge.to); + edgesFound.push(...edges); + } + } + } + // Only add tasks if they are not already in the tasksFound array + if (subGraph.tasks) { + for (const task of subGraph.tasks) { + if (!tasksFound.find((t) => t.taskId === task.taskId)) { + tasksFound.push(task); + } + } + } } // De-duplicate nodes using node id @@ -373,12 +402,6 @@ export class QlikSenseTasks { ); }); - // De-duplicate edges. - // Edges are identical if they connect the same two nodes, i.e. have the same from and to properties. - edgesFound = edgesFound.filter((edge, index, self) => { - return index === self.findIndex((t) => t.from === edge.from && t.to === edge.to); - }); - return { nodes: nodesFound, edges: edgesFound, tasks: tasksFound }; } } diff --git a/src/lib/task/find_circular_task_chain.js b/src/lib/task/find_circular_task_chain.js index e36e437..a7a393b 100644 --- a/src/lib/task/find_circular_task_chain.js +++ b/src/lib/task/find_circular_task_chain.js @@ -1,4 +1,5 @@ import { catchLog } from '../util/log.js'; +import { mapTaskType, mapRuleState } from '../util/qseow/lookups.js'; /** * Recursively detect circular task chains starting from a given task node. @@ -13,56 +14,162 @@ import { catchLog } from '../util/log.js'; * @param {Set} visitedNodes - Set of node IDs that have been visited. * @param {object} logger - Logger object for logging information. * - * @returns {Array} An array of objects, each with properties (which are all objects): - * - fromTask: The source node where the circular dependency was detected. - * - toTask: The target node where the circular dependency was detected. - * - edge: The edge connecting the two tasks. + * @returns {Object} An object with properties: + * - circularTaskChains: An array of objects representing circular task chains. Each object has properties: + * - fromTask: The source node where the circular dependency was detected. + * - toTask: The target node where the circular dependency was detected. + * - edge: The edge connecting the two tasks. + * - duplicateEdges: An array of objects representing edges with multiple downstream nodes with the same ID + * and the same relationship with the parent node. I.e. duplicate composite triggers. * * Returns false if something went wrong. */ function recursiveFindCircularTaskChain(taskNetwork, node, visitedNodes, logger) { try { - const circularTaskChain = []; + const circularTaskChains = []; + const duplicateDownstreamNodes = []; - // Get downstream nodes. Downstream nodes are identified by node.id === edge.from. + // Get edges to downstream nodes. Downstream nodes are identified by node.id === edge.from. // The downstream node id is then found in edge.to. - const downstreamEdges = taskNetwork.edges.filter((edge) => { + const edgesToDownstreamNodes = taskNetwork.edges.filter((edge) => { return edge.from === node.id; }); // Any downstream edges found? - if (downstreamEdges?.length > 0) { - for (const downstreamEdge of downstreamEdges) { + if (edgesToDownstreamNodes?.length > 0) { + // ----- Look for duplicate edges ----- + for (const edgeToDownstreamNode of edgesToDownstreamNodes) { + // Check for downstream nodes with the same ID and same relationship with parent node (e.g. on-success or on-failure) + // edgesToDownstreamNodes is an array of all downstream nodes from the current node. Properties are (the ones relevant here) + // - from: Source node ID + // - fromTaskType: Source node type. "Reload" or "ExternalProgram" + // - to: Destination node ID + // - toTaskType: Destination node type. "Reload", "ExternalProgram" or "Composite" + // - rule: Array of rules for the relationship between source and destination node. "on-success", "on-failure" etc. Properties for each object are + // - id: Rule ID + // - ruleState: Rule state/type. 1 = TaskSuccessful, 2 = TaskFail. mapRuleState.get(ruleState) gives the string representation of the rule state, given the number. + + // Check if there are multiple downstream nodes with the same ID and same relationship with the parent node. + // The relationship is the same if rule.ruleState is the same for two downstream nodes with the same ID. + // If there are, log a warning. + + // Are there any rules? + // edgeToDownstreamNode.rule is an array of rules. Properties are + // - id: Rule ID + // - ruleState: Rule state/type. 1 = TaskSuccessful, 2 = TaskFail. mapRuleState.get(ruleState) gives the string representation of the rule state, given the number. + if (edgeToDownstreamNode.rule) { + // Filter out downstream nodes with the same ID and the same rule state + const tmp = edgesToDownstreamNodes.filter((el) => { + const sameDest = el.to === edgeToDownstreamNode.to; + + // Same rule state? + // el.rule can be either an array or an object. If it's an object, convert it to an array. + if (!Array.isArray(el.rule)) { + el.rule = [el.rule]; + } + + // Is one of the rule's ruleState properties the same as one or more of edgeToDownstreamNode.rule[].ruleState? + const sameRuleState = el.rule.some((rule) => { + return edgeToDownstreamNode.rule.some((rule2) => { + return rule.ruleState === rule2.ruleState; + }); + }); + + return sameDest && sameRuleState; + }); + + if (tmp.length > 1) { + // Look up current and downstream node objects + const currentNode = taskNetwork.nodes.find((el) => el.id === edgeToDownstreamNode.from); + const edgeDownstreamNode = taskNetwork.nodes.find((el) => el.id === tmp[0].to); + + // Get the rule state that is shared between the downstream tasks and the parent task + const ruleState = mapRuleState.get(tmp[0].rule[0].ruleState); + + duplicateDownstreamNodes.push({ + parentNode: currentNode, + downstreamNode: edgeDownstreamNode, + ruleState: ruleState, + duplicateEdgeCount: tmp.length, + }); + + // Update edge in main task network to reflect that there are multiple downstream nodes with the same ID and the same relationship + taskNetwork.edges = taskNetwork.edges.map((el) => { + if (el.from === edgeToDownstreamNode.from && el.to === edgeToDownstreamNode.to) { + return { + ...el, + edgeCount: tmp.length, + }; + } + return el; + }); + } else { + // No duplicate downstream nodes + // Update edge in main task network to reflect that there are no multiple downstream nodes with the same ID and the same relationship + taskNetwork.edges = taskNetwork.edges.map((el) => { + if (el.from === edgeToDownstreamNode.from && el.to === edgeToDownstreamNode.to) { + return { + ...el, + edgeCount: 1, + }; + } + return el; + }); + } + } + } + + // ----- Look for circular dependencies ----- + + // Make sure edges to downstream nodes are unique, i.e. remove duplicates. + // Duplicates are identified by edgesToDownstreamNodes[].to properties being the same. + const uniqueEdgesToDownstreamNodes = Array.from(new Set(edgesToDownstreamNodes.map((edge) => edge.to))).map((to) => { + return edgesToDownstreamNodes.find((edge) => edge.to === to); + }); + + for (const edgeToDownstreamNode of uniqueEdgesToDownstreamNodes) { // Get downstream node - const downstreamNode = taskNetwork.nodes.find((n) => n.id === downstreamEdge.to); + const downstreamNode = taskNetwork.nodes.find((n) => n.id === edgeToDownstreamNode.to); + // If the task network is correctly defined in nodes and edges, the downstream node should always be found. // If not, there is an error in the task network definition. if (downstreamNode === undefined) { - logger.error(`DOWNSTREAM NODE NOT FOUND: ${downstreamEdge.to}`); + logger.error(`DOWNSTREAM NODE NOT FOUND: ${edgeToDownstreamNode.to}`); continue; } // Check if the downstream node has been visited before. // If so, a circular dependency has been detected. if (visitedNodes.has(downstreamNode.id)) { - circularTaskChain.push({ fromTask: node, toTask: downstreamNode, edge: downstreamEdge }); - return circularTaskChain; + circularTaskChains.push({ fromTask: node, toTask: downstreamNode, edge: edgeToDownstreamNode }); + return { circularTaskChains: circularTaskChains, duplicateEdges: duplicateDownstreamNodes }; } // Add downstream node to visited nodes. - // visitedNodes.add(downstreamNode.id); visitedNodes.add(node.id); // Recursively investigate downstream node. const result = recursiveFindCircularTaskChain(taskNetwork, downstreamNode, visitedNodes, logger); - if (result?.length > 0) { - circularTaskChain.push(...result); + // Remove downstream node from visited nodes. + visitedNodes.delete(node.id); + + if (!result) { + logger.error('Error when looking for circular task chains in task model'); + return false; + } + + if (result.circularTaskChains.length > 0) { + circularTaskChains.push(...result.circularTaskChains); + } + + if (result.duplicateEdges.length > 0) { + duplicateDownstreamNodes.push(...result.duplicateEdges); } } } - return circularTaskChain; + return { circularTaskChains: circularTaskChains, duplicateEdges: duplicateDownstreamNodes }; } catch (err) { catchLog('FIND CIRCULAR TASK CHAINS', err); return false; @@ -77,15 +184,19 @@ function recursiveFindCircularTaskChain(taskNetwork, node, visitedNodes, logger) * - edges: An array of task edges. * - tasks: An array of task objects. * @param {object} logger - Logger object for logging information. - * @returns {Array} An array of objects representing circular task chains, each with properties: - * - fromTask: The source node where the circular dependency was detected. - * - toTask: The target node where the circular dependency was detected. - * - edge: The edge connecting the two tasks. + * @returns {object} An object with properties: + * - circularTaskChains: An array of objects representing circular task chains. Each object has properties: + * - fromTask: The source node where the circular dependency was detected. + * - toTask: The target node where the circular dependency was detected. + * - edge: The edge connecting the two tasks. + * - duplicateEdges: An array of objects representing edges with multiple downstream nodes with the same ID + * and the same relationship with the parent node. I.e. duplicate composite triggers. * * Returns false if something went wrong. */ export function findCircularTaskChains(taskNetwork, logger) { const circularTaskChains = []; + const duplicateEdges = []; try { // Get all root nodes in task network. @@ -104,22 +215,25 @@ export function findCircularTaskChains(taskNetwork, logger) { // For each root node, find circular task chains. // Add all found circular task chains to the circularTaskChains array for (const rootNode of rootNodes) { - // Returns array of zero of more objects describing circular task chains, or false if something went wrong. + // Returns an object with properties: + // - circularTaskChains: An array of zero of more objects describing circular task chains + // - duplicateEdges: An array of zero or more objects describing duplicate edges + // + // Returns false if something went wrong. const result = recursiveFindCircularTaskChain(taskNetwork, rootNode, new Set(), logger); if (result) { - circularTaskChains.push(...result); + circularTaskChains.push(...result.circularTaskChains); + duplicateEdges.push(...result.duplicateEdges); } else { logger.error('Error when looking for circular task chains in task model'); return false; } } - return circularTaskChains; + return { circularTaskChains: circularTaskChains, duplicateEdges: duplicateEdges }; } catch (err) { catchLog('FIND CIRCULAR TASK CHAINS', err); return false; } - - return circularTaskChains; } diff --git a/src/lib/task/get_task_sub_graph.js b/src/lib/task/get_task_sub_graph.js index 3ff8cc5..13f66fa 100644 --- a/src/lib/task/get_task_sub_graph.js +++ b/src/lib/task/get_task_sub_graph.js @@ -2,7 +2,8 @@ import { catchLog } from '../util/log.js'; import { mapTaskType, mapRuleState } from '../util/qseow/lookups.js'; /** - * Function to get a subgraph of a task network/graph. + * Function to get a subgraph of a task network/graph, given a starting node. + * Detect cyclic task relationships and break the chain if a cyclic relationship is detected, to avoid infinite loops. * * @param {object} _ - QlikSenseTasks object. Corresponds to the 'this' keyword in a class. * @param {object} node - Node object @@ -138,19 +139,6 @@ export function extGetTaskSubGraph(_, node, parentTreeLevel, parentNode, logger) // Get the rule state that is shared between the downstream tasks and the parent task const ruleState = mapRuleState.get(tmp[0].rule[0].ruleState); - // Log warning unless this parent/child relationship is already in the list of duplicate downstream tasks - if ( - !duplicateDownstreamNodes.some( - (el) => el[0].to === tmp[0].to && el[0].rule[0].ruleState === tmp[0].rule[0].ruleState - ) - ) { - logger.warn( - `Multiple downstream nodes (${tmp.length}) with the same ID and the same trigger relationship "${ruleState}" with the parent node.` - ); - logger.warn(` Parent node : ${currentNode.completeTaskObject.name}`); - logger.warn(` Downstream node : ${edgeDownstreamNode.completeTaskObject.name}`); - } - duplicateDownstreamNodes.push(tmp); // Update edge in main task network to reflect that there are multiple downstream nodes with the same ID and the same relationship @@ -158,7 +146,7 @@ export function extGetTaskSubGraph(_, node, parentTreeLevel, parentNode, logger) if (el.from === edgeToDownstreamNode.from && el.to === edgeToDownstreamNode.to) { return { ...el, - edgeCount: tmp.length, + edgeCount0: tmp.length, }; } return el; @@ -170,7 +158,7 @@ export function extGetTaskSubGraph(_, node, parentTreeLevel, parentNode, logger) if (el.from === edgeToDownstreamNode.from && el.to === edgeToDownstreamNode.to) { return { ...el, - edgeCount: 1, + edgeCount0: 1, }; } return el; @@ -214,14 +202,13 @@ export function extGetTaskSubGraph(_, node, parentTreeLevel, parentNode, logger) // - edge: Edge object between sourceNode and edgeDownstreamNode _.taskCyclicStack.add(uniqueDownstreamNode.downstreamNode.id); - // // Add node to subGraphNodes - // subGraphNodes.push(uniqueDownstreamNode.downstreamNode); - - // Add edge to downstream node to subGraphEdges - subGraphEdges.push(uniqueDownstreamNode.edge); - - // // Add task to subGraphTasks - // subGraphTasks.push(task); + // Add edges from current node to downstream node to subGraphEdges + // Note that there may be multiple edges between node and downstream node. + // Get edges from validDownstreamNodes[].edge, given the downstream node ID + const tmpEdges = validDownstreamNodes + .filter((el) => el.edge.to === uniqueDownstreamNode.downstreamNode.id) + .map((el) => el.edge); + subGraphEdges = subGraphEdges.concat(...tmpEdges); // Examine downstream node const tmp3 = extGetTaskSubGraph(_, uniqueDownstreamNode.downstreamNode, newTreeLevel, node, logger); @@ -233,7 +220,19 @@ export function extGetTaskSubGraph(_, node, parentTreeLevel, parentNode, logger) subGraphNodes = subGraphNodes.concat(...tmp3.nodes); // Add tmp3.edges to subGraphEdges - subGraphEdges = subGraphEdges.concat(...tmp3.edges); + // Note that there are corner cases that need to be considered: + // - Overlapping subnetworks. For example, Root1 > Node1 > Node2 and Root2 > Node1 > Node2. + // In this case, Node1 and Node2 should NOT be duplicated in the final result. + // Only add nodes if they are not already in the nodesFound array + if (tmp3.edges) { + for (const edge of tmp3.edges) { + if (!subGraphEdges.find((t) => t.from === edge.from && t.to === edge.to)) { + // Add all edges (there can be multiple edges between the same nodes!) to the subGraphEdges array + const edges = tmp3.edges.filter((e) => e.from === edge.from && e.to === edge.to); + subGraphEdges.push(...edges); + } + } + } // Add tmp3.tasks to subGraphTasks subGraphTasks = subGraphTasks.concat(...tmp3.tasks); @@ -244,10 +243,10 @@ export function extGetTaskSubGraph(_, node, parentTreeLevel, parentNode, logger) // This has been temporarily stored in the main task network object's edges property. // Copy it over to the edges in the subgraphEdges array. subGraphEdges = subGraphEdges.map((el) => { - const edgeCount = _.taskNetwork.edges.find((edge) => edge.from === el.from && edge.to === el.to).edgeCount; + const edgeCount = _.taskNetwork.edges.find((edge) => edge.from === el.from && edge.to === el.to).edgeCount0; return { ...el, - edgeCount: edgeCount, + edgeCount0: edgeCount, }; }); From 8f84137a39bc48a031e2f2cfd1294ce8871c4aaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6ran=20Sander?= Date: Sun, 5 Jan 2025 11:47:55 +0100 Subject: [PATCH 3/3] chore(deps): Update dependencies --- package-lock.json | 217 +++++++++++++++++++++++++--------------------- package.json | 2 +- 2 files changed, 118 insertions(+), 101 deletions(-) diff --git a/package-lock.json b/package-lock.json index 740df8f..f419094 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ "csv-parse": "^5.6.0", "csv-stringify": "^6.5.2", "enigma.js": "^2.14.0", - "esbuild": "^0.24.0", + "esbuild": "^0.24.2", "form-data": "^4.0.1", "fs-extra": "^11.2.0", "handlebars": "^4.7.8", @@ -792,9 +792,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz", - "integrity": "sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", "cpu": [ "ppc64" ], @@ -808,9 +808,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.0.tgz", - "integrity": "sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", "cpu": [ "arm" ], @@ -824,9 +824,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz", - "integrity": "sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", "cpu": [ "arm64" ], @@ -840,9 +840,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.0.tgz", - "integrity": "sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", "cpu": [ "x64" ], @@ -856,9 +856,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz", - "integrity": "sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", "cpu": [ "arm64" ], @@ -872,9 +872,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz", - "integrity": "sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", "cpu": [ "x64" ], @@ -888,9 +888,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz", - "integrity": "sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", "cpu": [ "arm64" ], @@ -904,9 +904,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz", - "integrity": "sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", "cpu": [ "x64" ], @@ -920,9 +920,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz", - "integrity": "sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", "cpu": [ "arm" ], @@ -936,9 +936,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz", - "integrity": "sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", "cpu": [ "arm64" ], @@ -952,9 +952,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz", - "integrity": "sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", "cpu": [ "ia32" ], @@ -968,9 +968,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz", - "integrity": "sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", "cpu": [ "loong64" ], @@ -984,9 +984,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz", - "integrity": "sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", "cpu": [ "mips64el" ], @@ -1000,9 +1000,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz", - "integrity": "sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", "cpu": [ "ppc64" ], @@ -1016,9 +1016,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz", - "integrity": "sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", "cpu": [ "riscv64" ], @@ -1032,9 +1032,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz", - "integrity": "sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", "cpu": [ "s390x" ], @@ -1048,9 +1048,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz", - "integrity": "sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", "cpu": [ "x64" ], @@ -1063,10 +1063,26 @@ "node": ">=18" } }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz", - "integrity": "sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", "cpu": [ "x64" ], @@ -1080,9 +1096,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz", - "integrity": "sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", "cpu": [ "arm64" ], @@ -1096,9 +1112,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz", - "integrity": "sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", "cpu": [ "x64" ], @@ -1112,9 +1128,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz", - "integrity": "sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", "cpu": [ "x64" ], @@ -1128,9 +1144,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz", - "integrity": "sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", "cpu": [ "arm64" ], @@ -1144,9 +1160,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz", - "integrity": "sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", "cpu": [ "ia32" ], @@ -1160,9 +1176,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz", - "integrity": "sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", "cpu": [ "x64" ], @@ -2843,9 +2859,9 @@ "dev": true }, "node_modules/esbuild": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.0.tgz", - "integrity": "sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "hasInstallScript": true, "license": "MIT", "bin": { @@ -2855,30 +2871,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.0", - "@esbuild/android-arm": "0.24.0", - "@esbuild/android-arm64": "0.24.0", - "@esbuild/android-x64": "0.24.0", - "@esbuild/darwin-arm64": "0.24.0", - "@esbuild/darwin-x64": "0.24.0", - "@esbuild/freebsd-arm64": "0.24.0", - "@esbuild/freebsd-x64": "0.24.0", - "@esbuild/linux-arm": "0.24.0", - "@esbuild/linux-arm64": "0.24.0", - "@esbuild/linux-ia32": "0.24.0", - "@esbuild/linux-loong64": "0.24.0", - "@esbuild/linux-mips64el": "0.24.0", - "@esbuild/linux-ppc64": "0.24.0", - "@esbuild/linux-riscv64": "0.24.0", - "@esbuild/linux-s390x": "0.24.0", - "@esbuild/linux-x64": "0.24.0", - "@esbuild/netbsd-x64": "0.24.0", - "@esbuild/openbsd-arm64": "0.24.0", - "@esbuild/openbsd-x64": "0.24.0", - "@esbuild/sunos-x64": "0.24.0", - "@esbuild/win32-arm64": "0.24.0", - "@esbuild/win32-ia32": "0.24.0", - "@esbuild/win32-x64": "0.24.0" + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, "node_modules/escalade": { diff --git a/package.json b/package.json index 3dd9557..d05627b 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "csv-parse": "^5.6.0", "csv-stringify": "^6.5.2", "enigma.js": "^2.14.0", - "esbuild": "^0.24.0", + "esbuild": "^0.24.2", "form-data": "^4.0.1", "fs-extra": "^11.2.0", "handlebars": "^4.7.8",