From c0bf3338cfae800d3607b8d29f8646475aa23897 Mon Sep 17 00:00:00 2001 From: ceciliazaragoza Date: Tue, 23 Apr 2024 09:36:18 -0700 Subject: [PATCH 01/72] Issue #1080. Can display warning the first time that Enable Node Coloring is clicked and viewing a PPI. Want to change so that Warnings List is already collapsed and can view warning message immediately. Also found issue where Can enable node coloring from left panel with PPI but not with navbar menu --- web-client/public/js/update-app.js | 12 +++++++++++- web-client/public/js/warnings.js | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/web-client/public/js/update-app.js b/web-client/public/js/update-app.js index 48797d7a..17df0dcb 100644 --- a/web-client/public/js/update-app.js +++ b/web-client/public/js/update-app.js @@ -1,6 +1,6 @@ import { drawGraph, updaters } from "./graph"; import { uploadState } from "./upload"; -import { displayWarnings } from "./warnings"; +import { displayWarnings, displayPPINodeColorWarning } from "./warnings"; import { max } from "d3-array"; import { grnState } from "./grnstate"; @@ -870,6 +870,7 @@ export const updateApp = grnState => { if (grnState.workbook !== null && grnState.nodeColoring.nodeColoringEnabled && hasExpressionData(grnState.workbook.expression)) { grnState.nodeColoring.showMenu = true; + // TODO: check if PPI mode is enabled and then show warning $(AVG_REPLICATE_VALS_TOP_SIDEBAR).prop("checked", true); $(AVG_REPLICATE_VALS_BOTTOM_SIDEBAR).prop("checked", true); $(`${NODE_COLORING_TOGGLE_MENU} span`).addClass("glyphicon-ok"); @@ -934,6 +935,15 @@ export const updateApp = grnState => { } } + console.log( + "grnState mode", + grnState.mode, + "network ppi mode", + NETWORK_PPI_MODE + ); + if (grnState.mode === NETWORK_PPI_MODE) { + displayPPINodeColorWarning(); + } } else if (grnState.workbook !== null && !grnState.nodeColoring.nodeColoringEnabled) { $(NODE_COLORING_SIDEBAR_BODY).addClass("hidden"); $(NODE_COLORING_MENU).addClass("disabled"); diff --git a/web-client/public/js/warnings.js b/web-client/public/js/warnings.js index f17ad80e..85432177 100644 --- a/web-client/public/js/warnings.js +++ b/web-client/public/js/warnings.js @@ -58,3 +58,21 @@ export var displayWarnings = function (warnings) { $("#warningsModal").modal("show"); }; + +export var displayPPINodeColorWarning = function() { + + $("#warningsList").html("You are displaying mRNA-level expression data on a protein-protein interaction network."); + + var screenHeight = $(window).height(); + var MIN_SCREEN_HEIGHT = 600; + var BORDER = 425; + var setPanel = screenHeight - BORDER + "px"; + var minPanel = MIN_SCREEN_HEIGHT - BORDER + "px"; + if (screenHeight > MIN_SCREEN_HEIGHT) { + $("#list-frame").css({ height: setPanel }); + } else { + $("#list-frame").css({ height: minPanel }); + } + + $("#warningsModal").modal("show"); +}; From 8a15ec153ead1f058010794d851fe4aa44128e0b Mon Sep 17 00:00:00 2001 From: dondi Date: Wed, 2 Oct 2024 12:53:05 -0700 Subject: [PATCH 02/72] Set new version number for post-7.1.1 work. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8762b419..c4c5708e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grnsight", - "version": "7.1.1", + "version": "7.1.2", "description": "Web app and service for visualizing models of gene regulatory networks", "directories": { "test": "test" From f021ac925407154976d976bbc5df25622781fb4f Mon Sep 17 00:00:00 2001 From: ceciliazaragoza Date: Wed, 9 Oct 2024 08:26:16 -0700 Subject: [PATCH 03/72] now display node coloring warning each time there is a PPI network and nodeColoringEnabled. --- web-client/public/js/update-app.js | 15 ++++++++++----- web-client/public/js/warnings.js | 7 +++++++ 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/web-client/public/js/update-app.js b/web-client/public/js/update-app.js index 17df0dcb..94c469ec 100644 --- a/web-client/public/js/update-app.js +++ b/web-client/public/js/update-app.js @@ -543,16 +543,18 @@ const updateModeViews = () =>{ }; const checkWorkbookModeSettings = () => { + showNodeColoringMenus(); + if (grnState.mode === NETWORK_PPI_MODE) { grnState.nodeColoring.nodeColoringEnabled = false; grnState.colorOptimal = false; - disableNodeColoringMenus(); + // showNodeColoringMenus(); hideEdgeWeightOptions(); updateModeViews(); } else if (grnState.mode === NETWORK_GRN_MODE) { grnState.nodeColoring.nodeColoringEnabled = true; grnState.colorOptimal = true; - showNodeColoringMenus(); + // showNodeColoringMenus(); showEdgeWeightOptions(); updateModeViews(); } @@ -950,6 +952,7 @@ export const updateApp = grnState => { $(NODE_COLORING_NAVBAR_OPTIONS).addClass("hidden"); $(`${NODE_COLORING_TOGGLE_MENU} span`).removeClass("glyphicon-ok"); $(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked", false); + console.log("Node coloring disabled") } if (grnState.workbook !== null && grnState.workbook.sheetType === "weighted") { @@ -988,9 +991,11 @@ export const updateApp = grnState => { if (grnState.nodeColoring.showMenu) { showNodeColoringMenus(); - } else { - disableNodeColoringMenus(); - } + } + + // else { + // disableNodeColoringMenus(); + // } updateLogFoldChangeMaxValue(); updateTopDataset(); diff --git a/web-client/public/js/warnings.js b/web-client/public/js/warnings.js index 85432177..e18f2bd4 100644 --- a/web-client/public/js/warnings.js +++ b/web-client/public/js/warnings.js @@ -60,6 +60,13 @@ export var displayWarnings = function (warnings) { }; export var displayPPINodeColorWarning = function() { + // TODO: what should warning intro be? Should there be one? + $("#warningIntro").html( + "You are displaying mRNA-level expression data on a protein-protein interaction network. " + + "Please note that this may not be the most accurate representation of the data." + + " We recommend you review your file and ensure that it is formatted correctly." + + " To view the details of the warning(s), please click on the \"Warnings List\" below." + ); $("#warningsList").html("You are displaying mRNA-level expression data on a protein-protein interaction network."); From 129cd9d0e2de90ddaffa4e50efa82d49163884e0 Mon Sep 17 00:00:00 2001 From: dondi Date: Wed, 9 Oct 2024 13:28:39 -0700 Subject: [PATCH 04/72] New version because of Zenodo bump. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c4c5708e..8ceefc3e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grnsight", - "version": "7.1.2", + "version": "7.1.3", "description": "Web app and service for visualizing models of gene regulatory networks", "directories": { "test": "test" From a709872a3c81b3b17199ceb9fdef83f121210a8b Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Thu, 10 Oct 2024 11:31:27 -0700 Subject: [PATCH 05/72] Remove testing schema that I forgot to delete --- database/network-database/schema.sql | 4 ++-- database/protein-protein-database/schema.sql | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/database/network-database/schema.sql b/database/network-database/schema.sql index 59a315ff..377f845b 100644 --- a/database/network-database/schema.sql +++ b/database/network-database/schema.sql @@ -20,6 +20,6 @@ CREATE TABLE gene_regulatory_network.network ( time_stamp TIMESTAMP WITH TIME ZONE, source VARCHAR, FOREIGN KEY (regulator_gene_id, taxon_id) REFERENCES gene_regulatory_network.gene(gene_id, taxon_id), - FOREIGN KEY (target_gene_id, taxon_id) REFERENCES gene_regulatory_network_testing.gene(gene_id, taxon_id), - FOREIGN KEY (time_stamp, source) REFERENCES gene_regulatory_network_testing.source(time_stamp, source) + FOREIGN KEY (target_gene_id, taxon_id) REFERENCES gene_regulatory_network.gene(gene_id, taxon_id), + FOREIGN KEY (time_stamp, source) REFERENCES gene_regulatory_network.source(time_stamp, source) ); \ No newline at end of file diff --git a/database/protein-protein-database/schema.sql b/database/protein-protein-database/schema.sql index 922bfac2..a2f43a94 100644 --- a/database/protein-protein-database/schema.sql +++ b/database/protein-protein-database/schema.sql @@ -20,7 +20,7 @@ CREATE TABLE protein_protein_interactions.protein ( molecular_weight FLOAT, PI FLOAT, taxon_id VARCHAR, - FOREIGN KEY (gene_systematic_name, taxon_id) REFERENCES protein_protein_interactions_testing.gene(gene_id, taxon_id) + FOREIGN KEY (gene_systematic_name, taxon_id) REFERENCES protein_protein_interactions.gene(gene_id, taxon_id) ); CREATE TABLE protein_protein_interactions.physical_interactions ( @@ -30,8 +30,8 @@ CREATE TABLE protein_protein_interactions.physical_interactions ( experiment_name VARCHAR, time_stamp TIMESTAMP WITH TIME ZONE, source VARCHAR, - FOREIGN KEY (protein1) REFERENCES protein_protein_interactions_testing.protein(standard_name), - FOREIGN KEY (protein2) REFERENCES protein_protein_interactions_testing.protein(standard_name), - FOREIGN KEY (time_stamp, source) REFERENCES protein_protein_interactions_testing.source(time_stamp, source), + FOREIGN KEY (protein1) REFERENCES protein_protein_interactions.protein(standard_name), + FOREIGN KEY (protein2) REFERENCES protein_protein_interactions.protein(standard_name), + FOREIGN KEY (time_stamp, source) REFERENCES protein_protein_interactions.source(time_stamp, source), CONSTRAINT unique_physical_interaction UNIQUE (protein1, protein2, interaction_detection_methods_identifier, experiment_name, time_stamp, source) ); From 295e5cdb31c04557f9d04c15ea4dd0053f5565ac Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Thu, 10 Oct 2024 11:38:43 -0700 Subject: [PATCH 06/72] #1106 Allowing query all the genes even if it's not in grn network table --- server/dals/network-dal.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/server/dals/network-dal.js b/server/dals/network-dal.js index 0f53c713..cc2c1653 100644 --- a/server/dals/network-dal.js +++ b/server/dals/network-dal.js @@ -21,12 +21,10 @@ const buildNetworkSourceQuery = function () { return "SELECT * FROM gene_regulatory_network.source ORDER BY time_stamp DESC;"; }; -const buildNetworkGeneFromSourceQuery = function (gene, source, timestamp) { +const buildNetworkGeneFromSourceQuery = function (gene) { return `SELECT DISTINCT gene_id, display_gene_id FROM - gene_regulatory_network.network, gene_regulatory_network.gene WHERE - network.time_stamp='${timestamp}' AND network.source='${source}' AND - (gene.gene_id ='${gene}' OR gene.display_gene_id ='${gene}') AND - (gene.gene_id = network.regulator_gene_id OR gene.gene_id = network.target_gene_id);`; + gene_regulatory_network.gene WHERE (gene.gene_id ='${gene}' + OR gene.display_gene_id ='${gene}')`; }; const buildNetworkGenesQuery = function (geneString) { @@ -49,7 +47,7 @@ const buildGenerateNetworkQuery = function (genes, source, timestamp) { const buildQueryByType = function (queryType, query) { const networkQueries = { "NetworkSource": () => buildNetworkSourceQuery(), - "NetworkGeneFromSource": () => buildNetworkGeneFromSourceQuery(query.gene, query.source, query.timestamp), + "NetworkGeneFromSource": () => buildNetworkGeneFromSourceQuery(query.gene), "GenerateNetwork": () => buildGenerateNetworkQuery(query.genes, query.source, query.timestamp) }; if (Object.keys(networkQueries).includes(query.type)) { From e2872a799e63638a1c988445ec202be64ed262bb Mon Sep 17 00:00:00 2001 From: ceciliazaragoza Date: Wed, 16 Oct 2024 08:30:43 -0700 Subject: [PATCH 07/72] #1080. Can toggle between enabling and disabling node coloring for PPIs, but need to make sure node coloring sidebar not disabled when first load PPI and that don't get long list of console warnings when load PPI the first time --- web-client/public/js/update-app.js | 84 +++++++++++++++--------------- web-client/public/js/warnings.js | 11 ++-- 2 files changed, 46 insertions(+), 49 deletions(-) diff --git a/web-client/public/js/update-app.js b/web-client/public/js/update-app.js index 94c469ec..097a7614 100644 --- a/web-client/public/js/update-app.js +++ b/web-client/public/js/update-app.js @@ -548,13 +548,11 @@ const checkWorkbookModeSettings = () => { if (grnState.mode === NETWORK_PPI_MODE) { grnState.nodeColoring.nodeColoringEnabled = false; grnState.colorOptimal = false; - // showNodeColoringMenus(); hideEdgeWeightOptions(); updateModeViews(); } else if (grnState.mode === NETWORK_GRN_MODE) { grnState.nodeColoring.nodeColoringEnabled = true; grnState.colorOptimal = true; - // showNodeColoringMenus(); showEdgeWeightOptions(); updateModeViews(); } @@ -794,7 +792,7 @@ export const updateApp = grnState => { identifySpeciesOrTaxon(workbookSpecies); identifySpeciesOrTaxon(workbookTaxon); } - + // nodeColoringEnabled will only be set the very first time; because otherwise the user will have // made a choice and we will let the choice stick. if (hasExpressionData(grnState.workbook.expression)) { @@ -802,6 +800,7 @@ export const updateApp = grnState => { if (grnState.nodeColoring.nodeColoringEnabled === undefined) { grnState.nodeColoring.nodeColoringEnabled = true; } + console.log("has expression data") if (isNewWorkbook(name)) { grnState.nodeColoring.showMenu = true; @@ -870,9 +869,8 @@ export const updateApp = grnState => { // Node Coloring if (grnState.workbook !== null && grnState.nodeColoring.nodeColoringEnabled - && hasExpressionData(grnState.workbook.expression)) { + ) { grnState.nodeColoring.showMenu = true; - // TODO: check if PPI mode is enabled and then show warning $(AVG_REPLICATE_VALS_TOP_SIDEBAR).prop("checked", true); $(AVG_REPLICATE_VALS_BOTTOM_SIDEBAR).prop("checked", true); $(`${NODE_COLORING_TOGGLE_MENU} span`).addClass("glyphicon-ok"); @@ -881,37 +879,36 @@ export const updateApp = grnState => { $(NODE_COLORING_SIDEBAR_BODY).removeClass("hidden"); $(NODE_COLORING_MENU).removeClass("hidden"); $(NODE_COLORING_NAVBAR_OPTIONS).removeClass("hidden"); - if (grnState.database.expressionDatasets.includes(grnState.nodeColoring.topDataset) && + console.log("node coloring enabled") + + if (hasExpressionData(grnState.workbook.expression)) { + if (grnState.database.expressionDatasets.includes(grnState.nodeColoring.topDataset) && grnState.workbook.expression[grnState.nodeColoring.topDataset] === undefined) { - if ($(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked")) { - loadExpressionDatabase(true); - } - } else if (grnState.database.expressionDatasets.includes(grnState.nodeColoring.bottomDataset) && - !grnState.nodeColoring.bottomDataSameAsTop && - grnState.workbook.expression[grnState.nodeColoring.bottomDataset] === undefined) { - if (!grnState.nodeColoring.bottomDataSameAsTop) { - loadExpressionDatabase(false); + if ($(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked")) { + loadExpressionDatabase(true); + } + } else if (grnState.database.expressionDatasets.includes(grnState.nodeColoring.bottomDataset) && + !grnState.nodeColoring.bottomDataSameAsTop && + grnState.workbook.expression[grnState.nodeColoring.bottomDataset] === undefined) { + if (!grnState.nodeColoring.bottomDataSameAsTop) { + loadExpressionDatabase(false); + } + } else { + updaters.renderNodeColoring(); } } else { - updaters.renderNodeColoring(); - } - } else if (grnState.workbook !== null && !hasExpressionData(grnState.workbook.expression) - && grnState.nodeColoring.nodeColoringEnabled) { - if ((grnState.workbook.expression[grnState.nodeColoring.topDataset] === undefined) || - (!grnState.nodeColoring.bottomDataSameAsTop && - grnState.workbook.expression[grnState.nodeColoring.bottomDataset] === undefined)) { - updaters.removeNodeColoring(); - resetDatasetDropdownMenus(grnState.workbook); - } - grnState.nodeColoring.showMenu = true; - grnState.nodeColoring.topDataset = grnState.nodeColoring.topDataset ? - grnState.nodeColoring.topDataset : "Dahlquist_2018_wt"; - grnState.nodeColoring.bottomDataset = grnState.nodeColoring.bottomDataset ? - grnState.nodeColoring.bottomDataset : "Dahlquist_2018_wt"; - $(LOG_FOLD_CHANGE_MAX_VALUE_CLASS).addClass("hidden"); - $(LOG_FOLD_CHANGE_MAX_VALUE_SIDEBAR_BUTTON).addClass("hidden"); - $(LOG_FOLD_CHANGE_MAX_VALUE_HEADER).addClass("hidden"); - if ($(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked")) { + if ((grnState.workbook.expression[grnState.nodeColoring.topDataset] === undefined) || + (!grnState.nodeColoring.bottomDataSameAsTop && + grnState.workbook.expression[grnState.nodeColoring.bottomDataset] === undefined)) { + updaters.removeNodeColoring(); + resetDatasetDropdownMenus(grnState.workbook); + } + + grnState.nodeColoring.showMenu = true; + grnState.nodeColoring.topDataset = grnState.nodeColoring.topDataset ? + grnState.nodeColoring.topDataset : "Dahlquist_2018_wt"; + grnState.nodeColoring.bottomDataset = grnState.nodeColoring.bottomDataset ? + grnState.nodeColoring.bottomDataset : "Dahlquist_2018_wt"; if (grnState.workbook.expression[grnState.nodeColoring.topDataset] === undefined) { loadExpressionDatabase(true); } else if (!grnState.nodeColoring.bottomDataSameAsTop && @@ -936,23 +933,24 @@ export const updateApp = grnState => { setTimeout(() => updaters.renderNodeColoring(), 250); } + if (grnState.mode === NETWORK_PPI_MODE) { + displayPPINodeColorWarning(); + } + console.log( + "grnState mode", + grnState.mode, + "network ppi mode", + NETWORK_PPI_MODE + ); } - console.log( - "grnState mode", - grnState.mode, - "network ppi mode", - NETWORK_PPI_MODE - ); - if (grnState.mode === NETWORK_PPI_MODE) { - displayPPINodeColorWarning(); - } + refreshApp(); } else if (grnState.workbook !== null && !grnState.nodeColoring.nodeColoringEnabled) { $(NODE_COLORING_SIDEBAR_BODY).addClass("hidden"); $(NODE_COLORING_MENU).addClass("disabled"); $(NODE_COLORING_NAVBAR_OPTIONS).addClass("hidden"); $(`${NODE_COLORING_TOGGLE_MENU} span`).removeClass("glyphicon-ok"); $(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked", false); - console.log("Node coloring disabled") + console.log("node coloring disabled in line 953") } if (grnState.workbook !== null && grnState.workbook.sheetType === "weighted") { diff --git a/web-client/public/js/warnings.js b/web-client/public/js/warnings.js index e18f2bd4..9945930d 100644 --- a/web-client/public/js/warnings.js +++ b/web-client/public/js/warnings.js @@ -60,15 +60,14 @@ export var displayWarnings = function (warnings) { }; export var displayPPINodeColorWarning = function() { - // TODO: what should warning intro be? Should there be one? $("#warningIntro").html( - "You are displaying mRNA-level expression data on a protein-protein interaction network. " + - "Please note that this may not be the most accurate representation of the data." + - " We recommend you review your file and ensure that it is formatted correctly." + - " To view the details of the warning(s), please click on the \"Warnings List\" below." + "You are displaying mRNA-level expression data on a protein-protein interaction network." + + "Please note that this may not be the most appropriate representation of the data." ); + + $("#warningsList").addClass("hidden"); - $("#warningsList").html("You are displaying mRNA-level expression data on a protein-protein interaction network."); + // $("#warningsList").html("You are displaying mRNA-level expression data on a protein-protein interaction network."); var screenHeight = $(window).height(); var MIN_SCREEN_HEIGHT = 600; From 41043c90a27683c12e4979c1f0d659946ea9d976 Mon Sep 17 00:00:00 2001 From: ceciliazaragoza Date: Wed, 16 Oct 2024 09:01:57 -0700 Subject: [PATCH 08/72] #1080. Now node coloring sidebar not disabled when load PPI as first network --- web-client/public/js/update-app.js | 35 +++++++----------------------- 1 file changed, 8 insertions(+), 27 deletions(-) diff --git a/web-client/public/js/update-app.js b/web-client/public/js/update-app.js index 097a7614..0c2cc857 100644 --- a/web-client/public/js/update-app.js +++ b/web-client/public/js/update-app.js @@ -513,14 +513,8 @@ const showNodeColoringMenus = () => { $(NODE_COLORING_MENU).removeClass("disabled"); $(NODE_COLORING_MENU_CLASS).removeClass("disabled"); $(NODE_COLORING_SIDEBAR_HEADER_LINK).attr("data-toggle", "collapse"); -}; - -const disableNodeColoringMenus = () => { - $(NODE_COLORING_SIDEBAR_PANEL).addClass("disabled"); - $(NODE_COLORING_SIDEBAR_PANEL).removeClass("in"); - $(NODE_COLORING_MENU_CLASS).addClass("disabled"); - $(NODE_COLORING_MENU).addClass("disabled"); - $(NODE_COLORING_SIDEBAR_HEADER_LINK).attr("data-toggle", ""); + $(NODE_COLORING_MENU).removeClass("hidden"); + $(NODE_COLORING_NAVBAR_OPTIONS).removeClass("hidden"); }; const isNewWorkbook = (name) => { @@ -876,10 +870,8 @@ export const updateApp = grnState => { $(`${NODE_COLORING_TOGGLE_MENU} span`).addClass("glyphicon-ok"); $(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked", true); $(LOG_FOLD_CHANGE_MAX_VALUE_CLASS).val(DEFAULT_MAX_LOG_FOLD_CHANGE); - $(NODE_COLORING_SIDEBAR_BODY).removeClass("hidden"); $(NODE_COLORING_MENU).removeClass("hidden"); $(NODE_COLORING_NAVBAR_OPTIONS).removeClass("hidden"); - console.log("node coloring enabled") if (hasExpressionData(grnState.workbook.expression)) { if (grnState.database.expressionDatasets.includes(grnState.nodeColoring.topDataset) && @@ -897,6 +889,11 @@ export const updateApp = grnState => { updaters.renderNodeColoring(); } } else { + grnState.nodeColoring.topDataset = grnState.nodeColoring.topDataset ? + grnState.nodeColoring.topDataset : "Dahlquist_2018_wt"; + grnState.nodeColoring.bottomDataset = grnState.nodeColoring.bottomDataset ? + grnState.nodeColoring.bottomDataset : "Dahlquist_2018_wt"; + if ((grnState.workbook.expression[grnState.nodeColoring.topDataset] === undefined) || (!grnState.nodeColoring.bottomDataSameAsTop && grnState.workbook.expression[grnState.nodeColoring.bottomDataset] === undefined)) { @@ -904,11 +901,6 @@ export const updateApp = grnState => { resetDatasetDropdownMenus(grnState.workbook); } - grnState.nodeColoring.showMenu = true; - grnState.nodeColoring.topDataset = grnState.nodeColoring.topDataset ? - grnState.nodeColoring.topDataset : "Dahlquist_2018_wt"; - grnState.nodeColoring.bottomDataset = grnState.nodeColoring.bottomDataset ? - grnState.nodeColoring.bottomDataset : "Dahlquist_2018_wt"; if (grnState.workbook.expression[grnState.nodeColoring.topDataset] === undefined) { loadExpressionDatabase(true); } else if (!grnState.nodeColoring.bottomDataSameAsTop && @@ -936,21 +928,14 @@ export const updateApp = grnState => { if (grnState.mode === NETWORK_PPI_MODE) { displayPPINodeColorWarning(); } - console.log( - "grnState mode", - grnState.mode, - "network ppi mode", - NETWORK_PPI_MODE - ); } refreshApp(); } else if (grnState.workbook !== null && !grnState.nodeColoring.nodeColoringEnabled) { $(NODE_COLORING_SIDEBAR_BODY).addClass("hidden"); - $(NODE_COLORING_MENU).addClass("disabled"); $(NODE_COLORING_NAVBAR_OPTIONS).addClass("hidden"); $(`${NODE_COLORING_TOGGLE_MENU} span`).removeClass("glyphicon-ok"); $(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked", false); - console.log("node coloring disabled in line 953") + console.log("node coloring disabled in line 942") } if (grnState.workbook !== null && grnState.workbook.sheetType === "weighted") { @@ -990,10 +975,6 @@ export const updateApp = grnState => { if (grnState.nodeColoring.showMenu) { showNodeColoringMenus(); } - - // else { - // disableNodeColoringMenus(); - // } updateLogFoldChangeMaxValue(); updateTopDataset(); From 5b4c2c93944cfdba5e78647ce213113055e658fa Mon Sep 17 00:00:00 2001 From: ceciliazaragoza Date: Wed, 16 Oct 2024 09:10:35 -0700 Subject: [PATCH 09/72] #1080. removing unecessary comments and console.logs, changed warning for PPIs to be in warnings list --- web-client/public/js/update-app.js | 2 -- web-client/public/js/warnings.js | 11 +++-------- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/web-client/public/js/update-app.js b/web-client/public/js/update-app.js index 0c2cc857..c6400f74 100644 --- a/web-client/public/js/update-app.js +++ b/web-client/public/js/update-app.js @@ -794,7 +794,6 @@ export const updateApp = grnState => { if (grnState.nodeColoring.nodeColoringEnabled === undefined) { grnState.nodeColoring.nodeColoringEnabled = true; } - console.log("has expression data") if (isNewWorkbook(name)) { grnState.nodeColoring.showMenu = true; @@ -935,7 +934,6 @@ export const updateApp = grnState => { $(NODE_COLORING_NAVBAR_OPTIONS).addClass("hidden"); $(`${NODE_COLORING_TOGGLE_MENU} span`).removeClass("glyphicon-ok"); $(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked", false); - console.log("node coloring disabled in line 942") } if (grnState.workbook !== null && grnState.workbook.sheetType === "weighted") { diff --git a/web-client/public/js/warnings.js b/web-client/public/js/warnings.js index 9945930d..09e58f2e 100644 --- a/web-client/public/js/warnings.js +++ b/web-client/public/js/warnings.js @@ -43,8 +43,7 @@ export var displayWarnings = function (warnings) { index++; } - $("#warningsList").html(warningsString); - + var screenHeight = $(window).height(); var MIN_SCREEN_HEIGHT = 600; var BORDER = 425; @@ -60,15 +59,11 @@ export var displayWarnings = function (warnings) { }; export var displayPPINodeColorWarning = function() { - $("#warningIntro").html( - "You are displaying mRNA-level expression data on a protein-protein interaction network." + + $("#warningIntro").html("Protein-protein interaction node coloring warning."); + $("#warningsList").html("You are displaying mRNA-level expression data on a protein-protein interaction network." + "Please note that this may not be the most appropriate representation of the data." ); - $("#warningsList").addClass("hidden"); - - // $("#warningsList").html("You are displaying mRNA-level expression data on a protein-protein interaction network."); - var screenHeight = $(window).height(); var MIN_SCREEN_HEIGHT = 600; var BORDER = 425; From c26ac5416071f3ab4e234cf7ee416ddb9093ddcc Mon Sep 17 00:00:00 2001 From: dondi Date: Wed, 16 Oct 2024 11:22:04 -0700 Subject: [PATCH 10/72] Version bump. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8ceefc3e..7c01fa4c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grnsight", - "version": "7.1.3", + "version": "7.1.4", "description": "Web app and service for visualizing models of gene regulatory networks", "directories": { "test": "test" From a307f9af9b304191af18eedd589d9c84184b27c9 Mon Sep 17 00:00:00 2001 From: A'Kaia Phelps Date: Wed, 16 Oct 2024 12:54:09 -0700 Subject: [PATCH 11/72] #1118 github action --- .github/workflows/node.js.yml | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 .github/workflows/node.js.yml diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml new file mode 100644 index 00000000..39a7284c --- /dev/null +++ b/.github/workflows/node.js.yml @@ -0,0 +1,32 @@ +# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs + +name: Node.js CI + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [18.x, 20.x, 22.x] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + + steps: + - uses: actions/checkout@v4 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + + - run: npm ci + - run: npm run build --if-present + - run: npm test From 63f81edb00c47fec3438e6d630c56876f7a814a0 Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Thu, 17 Oct 2024 12:26:54 -0700 Subject: [PATCH 12/72] #1102 Adding tests and errors message for uploading mixed type relationship SIF file --- server/controllers/importers/sif.js | 17 +++++++++-------- server/controllers/sif-constants.js | 7 +++++++ test/import-sif-tests.js | 13 +++++++++++++ 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/server/controllers/importers/sif.js b/server/controllers/importers/sif.js index 34acbfad..ec4e996d 100644 --- a/server/controllers/importers/sif.js +++ b/server/controllers/importers/sif.js @@ -61,14 +61,15 @@ module.exports = function (sif) { if (allNumbers) { workbookType = constants.NETWORK_GRN_MODE; } else { - for (const relationship of relationships) { - if (relationship === "pp") { - workbookType = constants.NETWORK_PPI_MODE; - break; - } else if (relationship === "pd") { - workbookType = constants.NETWORK_GRN_MODE; - break; - } + let stringRelationships = relationships.filter(function (relationship) { + return !isNumber(relationship); + }); + if (stringRelationships.every(rel => rel === "pp")) { + workbookType = constants.NETWORK_PPI_MODE; + } else if (stringRelationships.every(rel => rel === "pd")) { + workbookType = constants.NETWORK_GRN_MODE; + } else if (stringRelationships.every(rel => rel === "pp" || rel === "pd")) { + errors.push(sifConstants.errors.SIF_MIXED_RELATIONSHIP_TYPE_ERROR); } } diff --git a/server/controllers/sif-constants.js b/server/controllers/sif-constants.js index eedf9e87..0b9d9b42 100644 --- a/server/controllers/sif-constants.js +++ b/server/controllers/sif-constants.js @@ -32,5 +32,12 @@ module.exports = { possibleCause: "GRNsight has detected stray data and/or extraneous blank rows in your SIF file. ", suggestedFix: "Please review the data and delete extraneous data from the file." }, + + SIF_MIXED_RELATIONSHIP_TYPE_ERROR: { + errorCode: "SIF_MIXED_RELATIONSHIP_TYPE_ERROR", + possibleCause: "The SIF importer detects a SIF file with mixed relationship types.", + suggestedFix: ["GRNsight only supports networks with a single relationship type.", + "Please review the relationships for consistency."].join(" ") + }, }, }; diff --git a/test/import-sif-tests.js b/test/import-sif-tests.js index c0aea2e9..818c93b6 100644 --- a/test/import-sif-tests.js +++ b/test/import-sif-tests.js @@ -316,6 +316,13 @@ var sifWithSemanticErrorOnly = [ "E" ].join("\r\n"); +var sifWithMixedRelationshipTypes = [ + [ "A", "pd", "A" ].join("\t"), + [ "B", "pd", "A", "C" ].join("\t"), + [ "C", "pd", "B" ].join("\t"), + [ "D", "pp", "D" ].join("\t"), +].join("\r\n"); + describe("Import from SIF", function () { it("should import unweighted workbooks from SIF correctly", function () { expect( @@ -514,4 +521,10 @@ describe("Import from SIF syntactic checker", function () { ).to.deep.equal(expectedUnweightedGRNWorkbook); }); + it("should throw an error for SIF files with mixed relationship types", function () { + expect( + importController.sifToGrnsight(sifWithMixedRelationshipTypes).errors[0].errorCode + ).to.equal("SIF_MIXED_RELATIONSHIP_TYPE_ERROR"); + }); + }); From cad88301a53ed0158dc823f20da62ee1dda2a628 Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Thu, 17 Oct 2024 14:15:53 -0700 Subject: [PATCH 13/72] #1055 Make the node coloring menu for top bar and side bar to be consistent, and fix lint errors --- web-client/public/js/update-app.js | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/web-client/public/js/update-app.js b/web-client/public/js/update-app.js index c6400f74..a49ed5e0 100644 --- a/web-client/public/js/update-app.js +++ b/web-client/public/js/update-app.js @@ -51,7 +51,6 @@ import { NODE_COLORING_MENU_CLASS, NODE_COLORING_NAVBAR_OPTIONS, NODE_COLORING_SIDEBAR_BODY, - NODE_COLORING_SIDEBAR_PANEL, NODE_COLORING_SIDEBAR_HEADER_LINK, NODE_COLORING_TOGGLE_SIDEBAR, AVG_REPLICATE_VALS_TOP_MENU, @@ -508,8 +507,7 @@ const updatetoGridLayout = () => {}; // Node Coloring Functions const showNodeColoringMenus = () => { - $(NODE_COLORING_SIDEBAR_PANEL).removeClass("disabled"); - $(NODE_COLORING_SIDEBAR_PANEL).addClass("in"); + $(NODE_COLORING_SIDEBAR_BODY).removeClass("hidden"); $(NODE_COLORING_MENU).removeClass("disabled"); $(NODE_COLORING_MENU_CLASS).removeClass("disabled"); $(NODE_COLORING_SIDEBAR_HEADER_LINK).attr("data-toggle", "collapse"); @@ -786,7 +784,6 @@ export const updateApp = grnState => { identifySpeciesOrTaxon(workbookSpecies); identifySpeciesOrTaxon(workbookTaxon); } - // nodeColoringEnabled will only be set the very first time; because otherwise the user will have // made a choice and we will let the choice stick. if (hasExpressionData(grnState.workbook.expression)) { @@ -896,8 +893,8 @@ export const updateApp = grnState => { if ((grnState.workbook.expression[grnState.nodeColoring.topDataset] === undefined) || (!grnState.nodeColoring.bottomDataSameAsTop && grnState.workbook.expression[grnState.nodeColoring.bottomDataset] === undefined)) { - updaters.removeNodeColoring(); - resetDatasetDropdownMenus(grnState.workbook); + updaters.removeNodeColoring(); + resetDatasetDropdownMenus(grnState.workbook); } if (grnState.workbook.expression[grnState.nodeColoring.topDataset] === undefined) { @@ -925,7 +922,7 @@ export const updateApp = grnState => { } if (grnState.mode === NETWORK_PPI_MODE) { - displayPPINodeColorWarning(); + displayPPINodeColorWarning(); } } refreshApp(); @@ -972,7 +969,7 @@ export const updateApp = grnState => { if (grnState.nodeColoring.showMenu) { showNodeColoringMenus(); - } + } updateLogFoldChangeMaxValue(); updateTopDataset(); From 7dfb20a904fc3422dee6b94e7137b5d20ba46dda Mon Sep 17 00:00:00 2001 From: ceciliazaragoza Date: Wed, 23 Oct 2024 07:05:01 -0700 Subject: [PATCH 14/72] #1080 now sidebar options display again when node coloring enabled --- web-client/public/js/update-app.js | 1 + web-client/public/js/warnings.js | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/web-client/public/js/update-app.js b/web-client/public/js/update-app.js index c6400f74..022ec44d 100644 --- a/web-client/public/js/update-app.js +++ b/web-client/public/js/update-app.js @@ -870,6 +870,7 @@ export const updateApp = grnState => { $(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked", true); $(LOG_FOLD_CHANGE_MAX_VALUE_CLASS).val(DEFAULT_MAX_LOG_FOLD_CHANGE); $(NODE_COLORING_MENU).removeClass("hidden"); + $(NODE_COLORING_SIDEBAR_BODY).removeClass("hidden"); $(NODE_COLORING_NAVBAR_OPTIONS).removeClass("hidden"); if (hasExpressionData(grnState.workbook.expression)) { diff --git a/web-client/public/js/warnings.js b/web-client/public/js/warnings.js index 09e58f2e..022c550c 100644 --- a/web-client/public/js/warnings.js +++ b/web-client/public/js/warnings.js @@ -60,8 +60,11 @@ export var displayWarnings = function (warnings) { export var displayPPINodeColorWarning = function() { $("#warningIntro").html("Protein-protein interaction node coloring warning."); - $("#warningsList").html("You are displaying mRNA-level expression data on a protein-protein interaction network." + - "Please note that this may not be the most appropriate representation of the data." + $("#warningsList").html( + [ + "You are displaying mRNA-level expression data on a protein-protein interaction network.", + "Please note that this may not be the most appropriate representation of the data.", + ].join(" ") ); var screenHeight = $(window).height(); From 042610c85dba4bc4505ed061639ace69d62ee04d Mon Sep 17 00:00:00 2001 From: ceciliazaragoza Date: Wed, 23 Oct 2024 07:29:57 -0700 Subject: [PATCH 15/72] added ppiNodeColorWarningDisplayed to grnState, so now only display warning when user first displays node coloring with PPI --- web-client/public/js/grnstate.js | 1 + web-client/public/js/update-app.js | 8 +++++++- web-client/public/js/warnings.js | 8 ++++++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/web-client/public/js/grnstate.js b/web-client/public/js/grnstate.js index 67b0d011..ffa20b93 100644 --- a/web-client/public/js/grnstate.js +++ b/web-client/public/js/grnstate.js @@ -85,6 +85,7 @@ export const grnState = { lastDataset: null, bottomDataSameAsTop: true, nodeColoringOptions: [], + ppiNodeColorWarningDisplayed: false, }, diff --git a/web-client/public/js/update-app.js b/web-client/public/js/update-app.js index 022ec44d..add00b1e 100644 --- a/web-client/public/js/update-app.js +++ b/web-client/public/js/update-app.js @@ -926,7 +926,10 @@ export const updateApp = grnState => { } if (grnState.mode === NETWORK_PPI_MODE) { - displayPPINodeColorWarning(); + displayPPINodeColorWarning( + grnState.nodeColoring.ppiNodeColorWarningDisplayed + ); + grnState.nodeColoring.ppiNodeColorWarningDisplayed = true; } } refreshApp(); @@ -935,6 +938,9 @@ export const updateApp = grnState => { $(NODE_COLORING_NAVBAR_OPTIONS).addClass("hidden"); $(`${NODE_COLORING_TOGGLE_MENU} span`).removeClass("glyphicon-ok"); $(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked", false); + if (grnState.mode === NETWORK_PPI_MODE) { + grnState.nodeColoring.ppiNodeColorWarningDisplayed = false; + } } if (grnState.workbook !== null && grnState.workbook.sheetType === "weighted") { diff --git a/web-client/public/js/warnings.js b/web-client/public/js/warnings.js index 022c550c..91c7ed37 100644 --- a/web-client/public/js/warnings.js +++ b/web-client/public/js/warnings.js @@ -58,12 +58,16 @@ export var displayWarnings = function (warnings) { $("#warningsModal").modal("show"); }; -export var displayPPINodeColorWarning = function() { +export var displayPPINodeColorWarning = function(warningDisplayed) { + if (warningDisplayed) { + return + } + $("#warningIntro").html("Protein-protein interaction node coloring warning."); $("#warningsList").html( [ "You are displaying mRNA-level expression data on a protein-protein interaction network.", - "Please note that this may not be the most appropriate representation of the data.", + "Please note that this may not be the most appropriate representation of the data." ].join(" ") ); From 8fe280f98acfe7aae4af4b0e7ed43d313bcf111e Mon Sep 17 00:00:00 2001 From: dondi Date: Wed, 23 Oct 2024 10:34:30 -0700 Subject: [PATCH 16/72] Version bump. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7c01fa4c..d918c1b6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grnsight", - "version": "7.1.4", + "version": "7.1.5", "description": "Web app and service for visualizing models of gene regulatory networks", "directories": { "test": "test" From 20c1e32b3320671898c9b1cf5e884fd6f283d200 Mon Sep 17 00:00:00 2001 From: ceciliazaragoza Date: Wed, 23 Oct 2024 12:08:43 -0700 Subject: [PATCH 17/72] #1080. Now nodes display white instead of gray color thanks to fix from Maika --- web-client/public/js/graph.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/web-client/public/js/graph.js b/web-client/public/js/graph.js index 6b069590..2ac8e73b 100644 --- a/web-client/public/js/graph.js +++ b/web-client/public/js/graph.js @@ -49,6 +49,7 @@ export var updaters = { removeNodeColoring: () => {}, }; +// TODO: export var drawGraph = function (workbook) { /* eslint-enable no-unused-vars */ var $container = $(".grnsight-container"); @@ -1118,6 +1119,9 @@ export var drawGraph = function (workbook) { .attr("stroke-width", "0px") .style("fill", function (d) { d = d || 0; // missing values are changed to 0 + if (d == 0) { + return "white" + } var scale = d3.scaleLinear() .domain([-logFoldChangeMaxValue, logFoldChangeMaxValue]) .range([0, 1]); From e2519d7b433ea511711e660395a6bf885a96aa39 Mon Sep 17 00:00:00 2001 From: ceciliazaragoza Date: Wed, 23 Oct 2024 13:16:54 -0700 Subject: [PATCH 18/72] Issue #1080. added === 0 so use triple equals sign --- web-client/public/js/graph.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web-client/public/js/graph.js b/web-client/public/js/graph.js index 545796d9..1828f2e1 100644 --- a/web-client/public/js/graph.js +++ b/web-client/public/js/graph.js @@ -1119,7 +1119,7 @@ export var drawGraph = function (workbook) { .attr("stroke-width", "0px") .style("fill", function (d) { d = d || 0; // missing values are changed to 0 - if (d == 0) { + if (d === 0) { return "white" } var scale = d3.scaleLinear() From 38f495364bf1bc7dfdc7d1bd21f3d6ce59eb67a7 Mon Sep 17 00:00:00 2001 From: ceciliazaragoza Date: Wed, 23 Oct 2024 17:40:26 -0700 Subject: [PATCH 19/72] adding console.log and removing comments to understand errors in console --- web-client/public/js/graph.js | 4 ++-- web-client/public/js/setup-load-and-import-handlers.js | 5 +++++ web-client/public/js/update-app.js | 8 ++++++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/web-client/public/js/graph.js b/web-client/public/js/graph.js index 1828f2e1..7cb45a96 100644 --- a/web-client/public/js/graph.js +++ b/web-client/public/js/graph.js @@ -49,7 +49,6 @@ export var updaters = { removeNodeColoring: () => {}, }; -// TODO: export var drawGraph = function (workbook) { /* eslint-enable no-unused-vars */ var $container = $(".grnsight-container"); @@ -311,7 +310,8 @@ export var drawGraph = function (workbook) { ) ) { zoomDisplay = grnState.zoomValue; - } else { + } + else { grnState.zoomValue = prevGrnstateZoomVal; zoomDisplay = grnState.zoomValue; } diff --git a/web-client/public/js/setup-load-and-import-handlers.js b/web-client/public/js/setup-load-and-import-handlers.js index 1e52fd5e..ee05ee08 100644 --- a/web-client/public/js/setup-load-and-import-handlers.js +++ b/web-client/public/js/setup-load-and-import-handlers.js @@ -115,6 +115,7 @@ const returnUploadRoute = (filename) => { } else if (filename.includes(".sif")) { return "upload-sif"; } else if (filename.includes(".graphml")) { + console.log("grn loaded?") return "upload-graphml"; } }; @@ -122,6 +123,7 @@ const returnUploadRoute = (filename) => { export const setupLoadAndImportHandlers = (grnState) => { const loadGrn = (name, formData) => { const uploadRoute = returnUploadRoute(name); + console.log("grn loaded") // The presence of formData is taken to indicate a POST. getWorkbookFromForm(formData, uploadRoute) .done((workbook, textStatus, jqXhr) => { @@ -152,6 +154,7 @@ export const setupLoadAndImportHandlers = (grnState) => { } else if (grnState.name.includes(".graphml")) { grnState.mode = NETWORK_GRN_MODE; } else { + console.log("workbook.meta.data.workbookType", workbook.meta.data.workbookType); grnState.mode = workbook.meta.data.workbookType; } grnState.workbook.expressionNames = Object.keys(workbook.expression); @@ -182,6 +185,7 @@ export const setupLoadAndImportHandlers = (grnState) => { reloader = () => loadGrn(url); grnState.graphLayout = FORCE_GRAPH; $("a.upload > input[type=file]").val(""); + console.log("eval happened?") }; const initializeDemoFile = (demoClass, demoPath, demoName) => { @@ -195,6 +199,7 @@ export const setupLoadAndImportHandlers = (grnState) => { const selected = `.${$("#demoSourceDropdown").val()}`; if (selected === demoClass) { loadDemo(demoPath, demoClass, demoName); + console.log("demo loaded in initializeDemoFile") } }); }; diff --git a/web-client/public/js/update-app.js b/web-client/public/js/update-app.js index 2ba8eca1..3662d9b3 100644 --- a/web-client/public/js/update-app.js +++ b/web-client/public/js/update-app.js @@ -50,6 +50,7 @@ import { NODE_COLORING_TOGGLE_MENU, NODE_COLORING_MENU_CLASS, NODE_COLORING_NAVBAR_OPTIONS, + NODE_COLORING_SIDEBAR_PANEL, NODE_COLORING_SIDEBAR_BODY, NODE_COLORING_SIDEBAR_HEADER_LINK, NODE_COLORING_TOGGLE_SIDEBAR, @@ -507,7 +508,9 @@ const updatetoGridLayout = () => {}; // Node Coloring Functions const showNodeColoringMenus = () => { - $(NODE_COLORING_SIDEBAR_BODY).removeClass("hidden"); + // $(NODE_COLORING_SIDEBAR_BODY).removeClass("hidden"); + $(NODE_COLORING_SIDEBAR_PANEL).removeClass("disabled"); + $(NODE_COLORING_SIDEBAR_PANEL).addClass("in"); $(NODE_COLORING_MENU).removeClass("disabled"); $(NODE_COLORING_MENU_CLASS).removeClass("disabled"); $(NODE_COLORING_SIDEBAR_HEADER_LINK).attr("data-toggle", "collapse"); @@ -771,6 +774,7 @@ if (!grnState.genePageData.identified) { export const updateApp = grnState => { if (grnState.newWorkbook) { + console.log("updateApp runs before BOUNDARY_MARGIN variable created") checkWorkbookModeSettings(); grnState.normalizationMax = max(grnState.workbook.positiveWeights.concat(grnState.workbook.negativeWeights)); displayworkbook(grnState.workbook, grnState.name); @@ -867,7 +871,7 @@ export const updateApp = grnState => { $(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked", true); $(LOG_FOLD_CHANGE_MAX_VALUE_CLASS).val(DEFAULT_MAX_LOG_FOLD_CHANGE); $(NODE_COLORING_MENU).removeClass("hidden"); - $(NODE_COLORING_SIDEBAR_BODY).removeClass("hidden"); + // $(NODE_COLORING_SIDEBAR_BODY).removeClass("hidden"); $(NODE_COLORING_NAVBAR_OPTIONS).removeClass("hidden"); if (hasExpressionData(grnState.workbook.expression)) { From aec65aa3ec21db74bcea0256d5e7614e6598a1b2 Mon Sep 17 00:00:00 2001 From: ceciliazaragoza Date: Wed, 23 Oct 2024 17:43:25 -0700 Subject: [PATCH 20/72] #1130. removed call to tic() in restrictGraphToViewport since graph refreshes whenever restrictGraphToViewport is clicked already. This removes error with path containing NaNs from displaying in the console. --- web-client/public/js/graph.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/web-client/public/js/graph.js b/web-client/public/js/graph.js index c204adbf..4f4398b7 100644 --- a/web-client/public/js/graph.js +++ b/web-client/public/js/graph.js @@ -456,8 +456,6 @@ export var drawGraph = function (workbook) { center(); } updateAppBasedOnZoomValue(); // Update zoom value within bounds - // Refresh the graph so that nodes and paths are adjusted to fit in viewport - tick(); }; d3.select("#restrict-graph-to-viewport").on("click", function () { From f3d6b36e24009bda845937853c393fc445073194 Mon Sep 17 00:00:00 2001 From: ceciliazaragoza Date: Wed, 23 Oct 2024 19:21:10 -0700 Subject: [PATCH 21/72] #1130. added BOUNDARY_MARGIN to constants, but now receiving error about attribute not having .length. will probably have to go back to #1080 and reserve issue there --- web-client/public/js/constants.js | 1 + web-client/public/js/graph.js | 5 ++--- web-client/public/js/update-app.js | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/web-client/public/js/constants.js b/web-client/public/js/constants.js index f826612a..4f624be5 100644 --- a/web-client/public/js/constants.js +++ b/web-client/public/js/constants.js @@ -55,6 +55,7 @@ export const MIN_EDGE_WEIGHT_NORMALIZATION = 0.0001; export const MAX_EDGE_WEIGHT_NORMALIZATION = 1000; export const DEFAULT_ZOOM_VALUE = 100; +export const BOUNDARY_MARGIN = 5; export const GREY_EDGE_THRESHOLD_MENU = "#gray-edge-threshold-menu"; export const GREY_EDGE_THRESHOLD_SLIDER_SIDEBAR = "#grayThresholdInput"; diff --git a/web-client/public/js/graph.js b/web-client/public/js/graph.js index 4f4398b7..83956243 100644 --- a/web-client/public/js/graph.js +++ b/web-client/public/js/graph.js @@ -11,7 +11,8 @@ import { ZOOM_DISPLAY_MAXIMUM_VALUE, ZOOM_DISPLAY_MIDDLE, ZOOM_ADAPTIVE_MAX_SCALE, - NETWORK_GRN_MODE + NETWORK_GRN_MODE, + BOUNDARY_MARGIN } from "./constants"; /* globals d3 */ @@ -1381,8 +1382,6 @@ export var drawGraph = function (workbook) { } }; - const BOUNDARY_MARGIN = 5; - function viewportBoundsMoveDrag (graphZoom, dx, dy) { updateZoomContainerInfo(); flexibleContainer = calcFlexiBox(); diff --git a/web-client/public/js/update-app.js b/web-client/public/js/update-app.js index a49ed5e0..1ed9e61c 100644 --- a/web-client/public/js/update-app.js +++ b/web-client/public/js/update-app.js @@ -383,6 +383,7 @@ const enableNodeColoringUI = function () { $(LOG_FOLD_CHANGE_MAX_VALUE_HEADER).removeClass("hidden"); }; +// this is where updateApp goes when change to Bareto top dataset const loadExpressionDatabase = function (isTopDataset) { const dataset = isTopDataset ? grnState.nodeColoring.topDataset : grnState.nodeColoring.bottomDataset; startLoadingIcon(); From 59b77ee00b984d346cece48a561f7b7693187651 Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Wed, 23 Oct 2024 20:48:59 -0700 Subject: [PATCH 22/72] #1068 Allow node coloring for PPI by matching the gene name --- server/dals/expression-dal.js | 4 ++-- web-client/public/js/graph.js | 11 ++++++++--- web-client/public/js/update-app.js | 7 ++++++- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/server/dals/expression-dal.js b/server/dals/expression-dal.js index 883a435a..7176b42e 100644 --- a/server/dals/expression-dal.js +++ b/server/dals/expression-dal.js @@ -20,7 +20,7 @@ var sequelize = new Sequelize( const buildExpressionGenesQuery = function (geneString) { let genes = ""; let geneList = geneString.split(","); - geneList.forEach(x => genes += ( `(gene_expression.gene.display_gene_id =\'${x}\') OR `)); + geneList.forEach(x => genes += ( `(LOWER(gene_expression.gene.display_gene_id) = LOWER(\'${x}\')) OR `)); return genes.substring(0, genes.length - 4); }; @@ -62,7 +62,7 @@ const buildExpressionQuery = function (query) { const listExpressionGeneData = function (gene, totalOutput) { let listOfData = []; totalOutput.forEach(function (x) { - if (x.display_gene_id === gene) { + if (x.display_gene_id.toLowerCase() === gene.toLowerCase()) { listOfData.push(Number(x.expression)); } }); diff --git a/web-client/public/js/graph.js b/web-client/public/js/graph.js index c204adbf..7932ef0c 100644 --- a/web-client/public/js/graph.js +++ b/web-client/public/js/graph.js @@ -11,7 +11,8 @@ import { ZOOM_DISPLAY_MAXIMUM_VALUE, ZOOM_DISPLAY_MIDDLE, ZOOM_ADAPTIVE_MAX_SCALE, - NETWORK_GRN_MODE + NETWORK_GRN_MODE, + NETWORK_PPI_MODE } from "./constants"; /* globals d3 */ @@ -1087,11 +1088,15 @@ export var drawGraph = function (workbook) { .selectAll(".coloring") .data(function () { if (grnState.workbook.expression[dataset]) { + var geneName = p.name; + if (grnState.workbook.meta.data.workbookType === NETWORK_PPI_MODE && geneName.endsWith("p")) { + geneName = geneName.slice(0, -1); + } if ( - grnState.workbook.expression[dataset].data[p.name] + grnState.workbook.expression[dataset].data[geneName] ) { const result = getExpressionData( - p.name, + geneName, dataset, average ); diff --git a/web-client/public/js/update-app.js b/web-client/public/js/update-app.js index a49ed5e0..d9441d5c 100644 --- a/web-client/public/js/update-app.js +++ b/web-client/public/js/update-app.js @@ -393,7 +393,12 @@ const loadExpressionDatabase = function (isTopDataset) { queryExpressionDatabase({ type:"ExpressionData", dataset, - genes : grnState.workbook.genes.map(gene => {return gene.name;}).join(","), + genes : grnState.workbook.genes.map(gene => { + if (grnState.workbook.meta.data.workbookType === NETWORK_PPI_MODE) { + return gene.name.endsWith("p") ? gene.name.slice(0, -1) : gene.name; + } + return gene.name; + }).join(","), timepoints: timepointsResponse[dataset] }).then(function (response) { if (isTopDataset) { From 284439a1ef25ac50c530535912b70acf7ae85a1e Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Thu, 24 Oct 2024 23:33:27 -0700 Subject: [PATCH 23/72] #1059 Cloning the svgElement to prevent changes to the current display graph --- web-client/public/js/setup-handlers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web-client/public/js/setup-handlers.js b/web-client/public/js/setup-handlers.js index c8bec3f7..4b71a42a 100644 --- a/web-client/public/js/setup-handlers.js +++ b/web-client/public/js/setup-handlers.js @@ -160,7 +160,7 @@ export const setupHandlers = grnState => { }; const exportSVG = (svgElement, name) => { - let source = svgElement; + let source = svgElement.cloneNode(true); sourceAttributeSetter(source); setInlineStyles(source); From 5bb4cf70a2b63ab0a5cb859f3646a364d7dc4c92 Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Fri, 25 Oct 2024 00:19:10 -0700 Subject: [PATCH 24/72] #1098 Fixing issue where file selector appears twice after importing wrong file --- web-client/public/js/setup-load-and-import-handlers.js | 5 +++-- web-client/views/upload.pug | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/web-client/public/js/setup-load-and-import-handlers.js b/web-client/public/js/setup-load-and-import-handlers.js index 1e52fd5e..0fff5897 100644 --- a/web-client/public/js/setup-load-and-import-handlers.js +++ b/web-client/public/js/setup-load-and-import-handlers.js @@ -171,8 +171,9 @@ export const setupLoadAndImportHandlers = (grnState) => { * for helping to resolve this. */ - // $(".upload").change(uploadHandler(loadGrn)); - $("body").on("change", ".upload", uploadHandler(loadGrn)); + $("body").on("change", "#upload-network", uploadHandler(loadGrn)); + $("body").on("change", "#upload-nav", uploadHandler(loadGrn)); + const loadDemo = (url, value) => { $("#demoSourceDropdown option[value='" + value.substring(1) + "']").prop( "selected", diff --git a/web-client/views/upload.pug b/web-client/views/upload.pug index 7132c0bd..a92dc8a9 100644 --- a/web-client/views/upload.pug +++ b/web-client/views/upload.pug @@ -513,7 +513,7 @@ html p(id='error') div(class='modal-footer') input(type='button' class='btn btn-default' data-dismiss='modal' value='Close') - input(type='button' id='launchFileOpen' class='btn btn-primary' data-dismiss='modal' value='Select New File' onclick="$('.upload').click()") + input(type='button' id='launchFileOpen' class='btn btn-primary' data-dismiss='modal' value='Select New File' onclick="$('#upload-network').click()") div(id='warningsModal' class='modal fade' tab-index='-1' role='dialog' aria-labelledby='mySmallModalLabel' aria-hidden='true' data-backdrop="static") div(class='modal-dialog') From 575fa73d6e637dbda81a12f9d82c820b617e1730 Mon Sep 17 00:00:00 2001 From: ceciliazaragoza Date: Fri, 25 Oct 2024 10:39:41 -0700 Subject: [PATCH 25/72] no longer receiving issue about length when load Barreto, need to make usr eot update logic for when check node adaptive or though --- web-client/public/js/graph.js | 13 ++- web-client/public/js/setup-handlers.js | 4 + .../js/setup-load-and-import-handlers.js | 5 - web-client/public/js/update-app.js | 97 ++++++++++--------- 4 files changed, 65 insertions(+), 54 deletions(-) diff --git a/web-client/public/js/graph.js b/web-client/public/js/graph.js index 6fc1651c..7c4db46a 100644 --- a/web-client/public/js/graph.js +++ b/web-client/public/js/graph.js @@ -54,6 +54,7 @@ export var drawGraph = function (workbook) { /* eslint-enable no-unused-vars */ var $container = $(".grnsight-container"); var CURSOR_CLASSES = "cursorGrab cursorGrabbing"; + console.log("draw graph again") d3.selectAll("svg").remove(); $container.removeClass(CURSOR_CLASSES).addClass("cursorGrab"); // allow graph dragging right away @@ -244,6 +245,7 @@ export var drawGraph = function (workbook) { d3.select("svg").on("dblclick.zoom", null); // disables double click zooming // this controls the D-pad + console.log("scroll button") d3.selectAll(".scrollBtn").on("click", null); // Remove event handlers, if there were any. var arrowMovement = [ "Up", "Left", "Right", "Down" ]; arrowMovement.forEach(function (direction) { @@ -465,6 +467,7 @@ export var drawGraph = function (workbook) { restrictGraphToViewport(fixed); }); + console.log("viewport change") d3.selectAll("input[name=viewport]").on("change", function () { var fixed = $(this).prop("checked"); restrictGraphToViewport(fixed); @@ -1073,9 +1076,15 @@ export var drawGraph = function (workbook) { return partialSum + currentValue; }, 0); avgs.push(sum / length); + console.log("hellooo") + }); + console.log("GET EXPRESSION DATA1", { + data: avgs, + timePoints: uniqueTimePoints, }); return {data: avgs, timePoints: uniqueTimePoints}; } + console.log("GET EXPRESSION DATA2", {data: strainData.data[gene], timePoints: strainData.timePoints}) return {data: strainData.data[gene], timePoints: strainData.timePoints}; }; @@ -1543,7 +1552,7 @@ export var drawGraph = function (workbook) { // currentXPos bounds the graph when toggle to !adaptive and moves each of the nodes to be in bounds var currentXPos = Math.max(getLeftXBoundaryMargin(), Math.min(rightBoundary, d.x)); if ( - adaptive && + width < MAX_WIDTH && (currentXPos === getLeftXBoundaryMargin() || currentXPos === rightBoundary) @@ -1583,7 +1592,7 @@ export var drawGraph = function (workbook) { // currentYPos bounds the graph when toggle to !adaptive and moves each of the nodes to be in bounds var currentYPos = Math.max(getTopYBoundaryMargin(), Math.min(bottomBoundary, d.y)); - if (adaptive && height < MAX_HEIGHT && + if (height < MAX_HEIGHT && (currentYPos === getTopYBoundaryMargin() || currentYPos === bottomBoundary)) { if (!d3.select(this).classed("fixed")) { height += OFFSET_VALUE; diff --git a/web-client/public/js/setup-handlers.js b/web-client/public/js/setup-handlers.js index c8bec3f7..21620549 100644 --- a/web-client/public/js/setup-handlers.js +++ b/web-client/public/js/setup-handlers.js @@ -227,9 +227,12 @@ export const setupHandlers = grnState => { // Node Coloring const updateTopDatasetSelection = (selection) => { grnState.nodeColoring.topDataset = selection; + console.log("new dataset selection", selection); if (grnState.nodeColoring.bottomDataSameAsTop) { + console.log("bottom dataset same as top") grnState.nodeColoring.bottomDataset = selection; } + console.log("update app called") updateApp(grnState); }; @@ -252,6 +255,7 @@ export const setupHandlers = grnState => { $(TOP_DATASET_SELECTION_SIDEBAR).change(() => { const selection = $(TOP_DATASET_SELECTION_SIDEBAR).find(":selected").attr("value"); + console.log("update Top Dataset Selection"); updateTopDatasetSelection(selection); }); diff --git a/web-client/public/js/setup-load-and-import-handlers.js b/web-client/public/js/setup-load-and-import-handlers.js index ee05ee08..1e52fd5e 100644 --- a/web-client/public/js/setup-load-and-import-handlers.js +++ b/web-client/public/js/setup-load-and-import-handlers.js @@ -115,7 +115,6 @@ const returnUploadRoute = (filename) => { } else if (filename.includes(".sif")) { return "upload-sif"; } else if (filename.includes(".graphml")) { - console.log("grn loaded?") return "upload-graphml"; } }; @@ -123,7 +122,6 @@ const returnUploadRoute = (filename) => { export const setupLoadAndImportHandlers = (grnState) => { const loadGrn = (name, formData) => { const uploadRoute = returnUploadRoute(name); - console.log("grn loaded") // The presence of formData is taken to indicate a POST. getWorkbookFromForm(formData, uploadRoute) .done((workbook, textStatus, jqXhr) => { @@ -154,7 +152,6 @@ export const setupLoadAndImportHandlers = (grnState) => { } else if (grnState.name.includes(".graphml")) { grnState.mode = NETWORK_GRN_MODE; } else { - console.log("workbook.meta.data.workbookType", workbook.meta.data.workbookType); grnState.mode = workbook.meta.data.workbookType; } grnState.workbook.expressionNames = Object.keys(workbook.expression); @@ -185,7 +182,6 @@ export const setupLoadAndImportHandlers = (grnState) => { reloader = () => loadGrn(url); grnState.graphLayout = FORCE_GRAPH; $("a.upload > input[type=file]").val(""); - console.log("eval happened?") }; const initializeDemoFile = (demoClass, demoPath, demoName) => { @@ -199,7 +195,6 @@ export const setupLoadAndImportHandlers = (grnState) => { const selected = `.${$("#demoSourceDropdown").val()}`; if (selected === demoClass) { loadDemo(demoPath, demoClass, demoName); - console.log("demo loaded in initializeDemoFile") } }); }; diff --git a/web-client/public/js/update-app.js b/web-client/public/js/update-app.js index b6558f9a..ec96570d 100644 --- a/web-client/public/js/update-app.js +++ b/web-client/public/js/update-app.js @@ -1,6 +1,6 @@ import { drawGraph, updaters } from "./graph"; import { uploadState } from "./upload"; -import { displayWarnings, displayPPINodeColorWarning } from "./warnings"; +import { displayWarnings } from "./warnings"; import { max } from "d3-array"; import { grnState } from "./grnstate"; @@ -50,8 +50,8 @@ import { NODE_COLORING_TOGGLE_MENU, NODE_COLORING_MENU_CLASS, NODE_COLORING_NAVBAR_OPTIONS, - NODE_COLORING_SIDEBAR_PANEL, NODE_COLORING_SIDEBAR_BODY, + NODE_COLORING_SIDEBAR_PANEL, NODE_COLORING_SIDEBAR_HEADER_LINK, NODE_COLORING_TOGGLE_SIDEBAR, AVG_REPLICATE_VALS_TOP_MENU, @@ -127,9 +127,12 @@ queryExpressionDatabase({type:"ExpressionDatasets"}).then(function (response) { }); const refreshApp = () => { + console.log("refreshApp"); if (uploadState && uploadState.currentWorkbook) { + console.log("uploadState and uploadState.currentWorkbook not null"); drawGraph(uploadState.currentWorkbook); } + console.log('finish refresh app') }; const displayworkbook = (workbook, name) => { @@ -384,7 +387,6 @@ const enableNodeColoringUI = function () { $(LOG_FOLD_CHANGE_MAX_VALUE_HEADER).removeClass("hidden"); }; -// this is where updateApp goes when change to Bareto top dataset const loadExpressionDatabase = function (isTopDataset) { const dataset = isTopDataset ? grnState.nodeColoring.topDataset : grnState.nodeColoring.bottomDataset; startLoadingIcon(); @@ -509,14 +511,19 @@ const updatetoGridLayout = () => {}; // Node Coloring Functions const showNodeColoringMenus = () => { - // $(NODE_COLORING_SIDEBAR_BODY).removeClass("hidden"); $(NODE_COLORING_SIDEBAR_PANEL).removeClass("disabled"); $(NODE_COLORING_SIDEBAR_PANEL).addClass("in"); $(NODE_COLORING_MENU).removeClass("disabled"); $(NODE_COLORING_MENU_CLASS).removeClass("disabled"); $(NODE_COLORING_SIDEBAR_HEADER_LINK).attr("data-toggle", "collapse"); - $(NODE_COLORING_MENU).removeClass("hidden"); - $(NODE_COLORING_NAVBAR_OPTIONS).removeClass("hidden"); +}; + +const disableNodeColoringMenus = () => { + $(NODE_COLORING_SIDEBAR_PANEL).addClass("disabled"); + $(NODE_COLORING_SIDEBAR_PANEL).removeClass("in"); + $(NODE_COLORING_MENU_CLASS).addClass("disabled"); + $(NODE_COLORING_MENU).addClass("disabled"); + $(NODE_COLORING_SIDEBAR_HEADER_LINK).attr("data-toggle", ""); }; const isNewWorkbook = (name) => { @@ -539,16 +546,16 @@ const updateModeViews = () =>{ }; const checkWorkbookModeSettings = () => { - showNodeColoringMenus(); - if (grnState.mode === NETWORK_PPI_MODE) { grnState.nodeColoring.nodeColoringEnabled = false; grnState.colorOptimal = false; + disableNodeColoringMenus(); hideEdgeWeightOptions(); updateModeViews(); } else if (grnState.mode === NETWORK_GRN_MODE) { grnState.nodeColoring.nodeColoringEnabled = true; grnState.colorOptimal = true; + showNodeColoringMenus(); showEdgeWeightOptions(); updateModeViews(); } @@ -775,7 +782,6 @@ if (!grnState.genePageData.identified) { export const updateApp = grnState => { if (grnState.newWorkbook) { - console.log("updateApp runs before BOUNDARY_MARGIN variable created") checkWorkbookModeSettings(); grnState.normalizationMax = max(grnState.workbook.positiveWeights.concat(grnState.workbook.negativeWeights)); displayworkbook(grnState.workbook, grnState.name); @@ -789,6 +795,7 @@ export const updateApp = grnState => { identifySpeciesOrTaxon(workbookSpecies); identifySpeciesOrTaxon(workbookTaxon); } + // nodeColoringEnabled will only be set the very first time; because otherwise the user will have // made a choice and we will let the choice stick. if (hasExpressionData(grnState.workbook.expression)) { @@ -821,6 +828,7 @@ export const updateApp = grnState => { // Rare exception to the MVC cycle: right now we have no way of knowing whether the workbook has changed // (which is what necessitates displayworkbook), so we mark the model here. grnState.newWorkbook = false; + console.log("finished update app") } synchronizeNormalizationValues(grnState.normalizationMax); @@ -864,45 +872,47 @@ export const updateApp = grnState => { // Node Coloring if (grnState.workbook !== null && grnState.nodeColoring.nodeColoringEnabled - ) { + && hasExpressionData(grnState.workbook.expression)) { grnState.nodeColoring.showMenu = true; $(AVG_REPLICATE_VALS_TOP_SIDEBAR).prop("checked", true); $(AVG_REPLICATE_VALS_BOTTOM_SIDEBAR).prop("checked", true); $(`${NODE_COLORING_TOGGLE_MENU} span`).addClass("glyphicon-ok"); $(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked", true); $(LOG_FOLD_CHANGE_MAX_VALUE_CLASS).val(DEFAULT_MAX_LOG_FOLD_CHANGE); + $(NODE_COLORING_SIDEBAR_BODY).removeClass("hidden"); $(NODE_COLORING_MENU).removeClass("hidden"); - // $(NODE_COLORING_SIDEBAR_BODY).removeClass("hidden"); $(NODE_COLORING_NAVBAR_OPTIONS).removeClass("hidden"); - - if (hasExpressionData(grnState.workbook.expression)) { - if (grnState.database.expressionDatasets.includes(grnState.nodeColoring.topDataset) && + if (grnState.database.expressionDatasets.includes(grnState.nodeColoring.topDataset) && grnState.workbook.expression[grnState.nodeColoring.topDataset] === undefined) { - if ($(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked")) { - loadExpressionDatabase(true); - } - } else if (grnState.database.expressionDatasets.includes(grnState.nodeColoring.bottomDataset) && - !grnState.nodeColoring.bottomDataSameAsTop && - grnState.workbook.expression[grnState.nodeColoring.bottomDataset] === undefined) { - if (!grnState.nodeColoring.bottomDataSameAsTop) { - loadExpressionDatabase(false); - } - } else { - updaters.renderNodeColoring(); + if ($(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked")) { + loadExpressionDatabase(true); } - } else { - grnState.nodeColoring.topDataset = grnState.nodeColoring.topDataset ? - grnState.nodeColoring.topDataset : "Dahlquist_2018_wt"; - grnState.nodeColoring.bottomDataset = grnState.nodeColoring.bottomDataset ? - grnState.nodeColoring.bottomDataset : "Dahlquist_2018_wt"; - - if ((grnState.workbook.expression[grnState.nodeColoring.topDataset] === undefined) || - (!grnState.nodeColoring.bottomDataSameAsTop && - grnState.workbook.expression[grnState.nodeColoring.bottomDataset] === undefined)) { - updaters.removeNodeColoring(); - resetDatasetDropdownMenus(grnState.workbook); + } else if (grnState.database.expressionDatasets.includes(grnState.nodeColoring.bottomDataset) && + !grnState.nodeColoring.bottomDataSameAsTop && + grnState.workbook.expression[grnState.nodeColoring.bottomDataset] === undefined) { + if (!grnState.nodeColoring.bottomDataSameAsTop) { + loadExpressionDatabase(false); } - + } else { + updaters.renderNodeColoring(); + } + } else if (grnState.workbook !== null && !hasExpressionData(grnState.workbook.expression) + && grnState.nodeColoring.nodeColoringEnabled) { + if ((grnState.workbook.expression[grnState.nodeColoring.topDataset] === undefined) || + (!grnState.nodeColoring.bottomDataSameAsTop && + grnState.workbook.expression[grnState.nodeColoring.bottomDataset] === undefined)) { + updaters.removeNodeColoring(); + resetDatasetDropdownMenus(grnState.workbook); + } + grnState.nodeColoring.showMenu = true; + grnState.nodeColoring.topDataset = grnState.nodeColoring.topDataset ? + grnState.nodeColoring.topDataset : "Dahlquist_2018_wt"; + grnState.nodeColoring.bottomDataset = grnState.nodeColoring.bottomDataset ? + grnState.nodeColoring.bottomDataset : "Dahlquist_2018_wt"; + $(LOG_FOLD_CHANGE_MAX_VALUE_CLASS).addClass("hidden"); + $(LOG_FOLD_CHANGE_MAX_VALUE_SIDEBAR_BUTTON).addClass("hidden"); + $(LOG_FOLD_CHANGE_MAX_VALUE_HEADER).addClass("hidden"); + if ($(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked")) { if (grnState.workbook.expression[grnState.nodeColoring.topDataset] === undefined) { loadExpressionDatabase(true); } else if (!grnState.nodeColoring.bottomDataSameAsTop && @@ -927,22 +937,13 @@ export const updateApp = grnState => { setTimeout(() => updaters.renderNodeColoring(), 250); } - if (grnState.mode === NETWORK_PPI_MODE) { - displayPPINodeColorWarning( - grnState.nodeColoring.ppiNodeColorWarningDisplayed - ); - grnState.nodeColoring.ppiNodeColorWarningDisplayed = true; - } } - refreshApp(); } else if (grnState.workbook !== null && !grnState.nodeColoring.nodeColoringEnabled) { $(NODE_COLORING_SIDEBAR_BODY).addClass("hidden"); + $(NODE_COLORING_MENU).addClass("disabled"); $(NODE_COLORING_NAVBAR_OPTIONS).addClass("hidden"); $(`${NODE_COLORING_TOGGLE_MENU} span`).removeClass("glyphicon-ok"); $(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked", false); - if (grnState.mode === NETWORK_PPI_MODE) { - grnState.nodeColoring.ppiNodeColorWarningDisplayed = false; - } } if (grnState.workbook !== null && grnState.workbook.sheetType === "weighted") { @@ -981,6 +982,8 @@ export const updateApp = grnState => { if (grnState.nodeColoring.showMenu) { showNodeColoringMenus(); + } else { + disableNodeColoringMenus(); } updateLogFoldChangeMaxValue(); From 793dea10a0b9502842a3227df7d91bc304c30932 Mon Sep 17 00:00:00 2001 From: ceciliazaragoza Date: Fri, 25 Oct 2024 16:26:53 -0700 Subject: [PATCH 26/72] #1080. removing console.logs --- web-client/public/js/graph.js | 47 ++++++++++++++--------------------- 1 file changed, 19 insertions(+), 28 deletions(-) diff --git a/web-client/public/js/graph.js b/web-client/public/js/graph.js index 7c4db46a..39a3574d 100644 --- a/web-client/public/js/graph.js +++ b/web-client/public/js/graph.js @@ -1076,15 +1076,9 @@ export var drawGraph = function (workbook) { return partialSum + currentValue; }, 0); avgs.push(sum / length); - console.log("hellooo") - }); - console.log("GET EXPRESSION DATA1", { - data: avgs, - timePoints: uniqueTimePoints, }); return {data: avgs, timePoints: uniqueTimePoints}; } - console.log("GET EXPRESSION DATA2", {data: strainData.data[gene], timePoints: strainData.timePoints}) return {data: strainData.data[gene], timePoints: strainData.timePoints}; }; @@ -1536,24 +1530,21 @@ export var drawGraph = function (workbook) { try { node.attr("x", function (d) { var selfReferringEdge = getSelfReferringEdge(d); - var selfReferringEdgeWidth = (selfReferringEdge ? getSelfReferringRadius(selfReferringEdge) + selfReferringEdge.strokeWidth + 2 : 0); var rightBoundary = width - (d.textWidth + OFFSET_VALUE) - BOUNDARY_MARGIN - selfReferringEdgeWidth; - if (!adaptive) { - rightBoundary = - -xTranslation / graphZoom + - BOUNDARY_MARGIN / 2 + - width / graphZoom - - BOUNDARY_MARGIN - - (d.textWidth + OFFSET_VALUE) - - selfReferringEdgeWidth; - } + // if (!adaptive) { + // rightBoundary = + // -xTranslation / graphZoom + + // BOUNDARY_MARGIN / 2 + + // width / graphZoom - + // BOUNDARY_MARGIN - + // (d.textWidth + OFFSET_VALUE) - + // selfReferringEdgeWidth; + // } // currentXPos bounds the graph when toggle to !adaptive and moves each of the nodes to be in bounds var currentXPos = Math.max(getLeftXBoundaryMargin(), Math.min(rightBoundary, d.x)); - if ( - - width < MAX_WIDTH && + if (width < MAX_WIDTH && (currentXPos === getLeftXBoundaryMargin() || currentXPos === rightBoundary) ) { @@ -1580,15 +1571,15 @@ export var drawGraph = function (workbook) { var selfReferringEdgeHeight = (selfReferringEdge ? getSelfReferringRadius(selfReferringEdge) + selfReferringEdge.strokeWidth + SELF_REFERRING_Y_OFFSET + 0.5 : 0); var bottomBoundary = height - nodeHeight - BOUNDARY_MARGIN - selfReferringEdgeHeight; - if (!adaptive) { - bottomBoundary = - -yTranslation / graphZoom + - BOUNDARY_MARGIN / 2 + - height / graphZoom - - BOUNDARY_MARGIN - - nodeHeight - - selfReferringEdgeHeight; - } + // if (!adaptive) { + // bottomBoundary = + // -yTranslation / graphZoom + + // BOUNDARY_MARGIN / 2 + + // height / graphZoom - + // BOUNDARY_MARGIN - + // nodeHeight - + // selfReferringEdgeHeight; + // } // currentYPos bounds the graph when toggle to !adaptive and moves each of the nodes to be in bounds var currentYPos = Math.max(getTopYBoundaryMargin(), Math.min(bottomBoundary, d.y)); From ac88f29cde2ff88b039e81e9b8fdecff51a802ae Mon Sep 17 00:00:00 2001 From: ceciliazaragoza Date: Sat, 26 Oct 2024 19:13:42 -0700 Subject: [PATCH 27/72] #1080. fixing lint errors and can enable and disable nav and sidebar correctly for node coloring. investigating why when load a database, it says it's NETWORK_PPI_MODE and even though node coloring enabled, node coloring doesn't display on node until change dataset and len of timepoints array is 0, so not querying expression database correctly --- web-client/public/js/graph.js | 8 +--- web-client/public/js/setup-handlers.js | 4 -- web-client/public/js/update-app.js | 53 ++++++++++++++++++-------- web-client/public/js/warnings.js | 15 +++----- 4 files changed, 45 insertions(+), 35 deletions(-) diff --git a/web-client/public/js/graph.js b/web-client/public/js/graph.js index 39a3574d..ce22c556 100644 --- a/web-client/public/js/graph.js +++ b/web-client/public/js/graph.js @@ -54,7 +54,6 @@ export var drawGraph = function (workbook) { /* eslint-enable no-unused-vars */ var $container = $(".grnsight-container"); var CURSOR_CLASSES = "cursorGrab cursorGrabbing"; - console.log("draw graph again") d3.selectAll("svg").remove(); $container.removeClass(CURSOR_CLASSES).addClass("cursorGrab"); // allow graph dragging right away @@ -245,7 +244,6 @@ export var drawGraph = function (workbook) { d3.select("svg").on("dblclick.zoom", null); // disables double click zooming // this controls the D-pad - console.log("scroll button") d3.selectAll(".scrollBtn").on("click", null); // Remove event handlers, if there were any. var arrowMovement = [ "Up", "Left", "Right", "Down" ]; arrowMovement.forEach(function (direction) { @@ -313,8 +311,7 @@ export var drawGraph = function (workbook) { ) ) { zoomDisplay = grnState.zoomValue; - } - else { + } else { grnState.zoomValue = prevGrnstateZoomVal; zoomDisplay = grnState.zoomValue; } @@ -467,7 +464,6 @@ export var drawGraph = function (workbook) { restrictGraphToViewport(fixed); }); - console.log("viewport change") d3.selectAll("input[name=viewport]").on("change", function () { var fixed = $(this).prop("checked"); restrictGraphToViewport(fixed); @@ -1122,7 +1118,7 @@ export var drawGraph = function (workbook) { .style("fill", function (d) { d = d || 0; // missing values are changed to 0 if (d === 0) { - return "white" + return "white"; } var scale = d3.scaleLinear() .domain([-logFoldChangeMaxValue, logFoldChangeMaxValue]) diff --git a/web-client/public/js/setup-handlers.js b/web-client/public/js/setup-handlers.js index 21620549..c8bec3f7 100644 --- a/web-client/public/js/setup-handlers.js +++ b/web-client/public/js/setup-handlers.js @@ -227,12 +227,9 @@ export const setupHandlers = grnState => { // Node Coloring const updateTopDatasetSelection = (selection) => { grnState.nodeColoring.topDataset = selection; - console.log("new dataset selection", selection); if (grnState.nodeColoring.bottomDataSameAsTop) { - console.log("bottom dataset same as top") grnState.nodeColoring.bottomDataset = selection; } - console.log("update app called") updateApp(grnState); }; @@ -255,7 +252,6 @@ export const setupHandlers = grnState => { $(TOP_DATASET_SELECTION_SIDEBAR).change(() => { const selection = $(TOP_DATASET_SELECTION_SIDEBAR).find(":selected").attr("value"); - console.log("update Top Dataset Selection"); updateTopDatasetSelection(selection); }); diff --git a/web-client/public/js/update-app.js b/web-client/public/js/update-app.js index ec96570d..30a1b803 100644 --- a/web-client/public/js/update-app.js +++ b/web-client/public/js/update-app.js @@ -127,12 +127,9 @@ queryExpressionDatabase({type:"ExpressionDatasets"}).then(function (response) { }); const refreshApp = () => { - console.log("refreshApp"); if (uploadState && uploadState.currentWorkbook) { - console.log("uploadState and uploadState.currentWorkbook not null"); drawGraph(uploadState.currentWorkbook); } - console.log('finish refresh app') }; const displayworkbook = (workbook, name) => { @@ -381,6 +378,7 @@ const stopLoadingIcon = function () { $(EXPRESSION_DB_LOADER_TEXT).css("display", "none"); }; const enableNodeColoringUI = function () { + console.log("node coloring UI enabled") grnState.nodeColoring.nodeColoringEnabled = true; $(LOG_FOLD_CHANGE_MAX_VALUE_CLASS).removeClass("hidden"); $(LOG_FOLD_CHANGE_MAX_VALUE_SIDEBAR_BUTTON).removeClass("hidden"); @@ -394,6 +392,14 @@ const loadExpressionDatabase = function (isTopDataset) { type: "ExpressionTimePoints", dataset }).then(function (timepointsResponse) { + console.log( + "genes", + grnState.workbook.genes + .map((gene) => { + return gene.name; + }) + .join(",") + ); queryExpressionDatabase({ type:"ExpressionData", dataset, @@ -401,13 +407,16 @@ const loadExpressionDatabase = function (isTopDataset) { timepoints: timepointsResponse[dataset] }).then(function (response) { if (isTopDataset) { + console.log("query expresison database response", response); grnState.workbook.expression[grnState.nodeColoring.topDataset] = response; } else { grnState.workbook.expression[grnState.nodeColoring.bottomDataset] = response; } + console.log("try to update top dataset") enableNodeColoringUI(); stopLoadingIcon(); updaters.renderNodeColoring(); + console.log("render node coloring") }).catch(function (error) { console.log(error.stack); console.log(error.name); @@ -518,13 +527,13 @@ const showNodeColoringMenus = () => { $(NODE_COLORING_SIDEBAR_HEADER_LINK).attr("data-toggle", "collapse"); }; -const disableNodeColoringMenus = () => { - $(NODE_COLORING_SIDEBAR_PANEL).addClass("disabled"); - $(NODE_COLORING_SIDEBAR_PANEL).removeClass("in"); - $(NODE_COLORING_MENU_CLASS).addClass("disabled"); - $(NODE_COLORING_MENU).addClass("disabled"); - $(NODE_COLORING_SIDEBAR_HEADER_LINK).attr("data-toggle", ""); -}; +// const disableNodeColoringMenus = () => { +// $(NODE_COLORING_SIDEBAR_PANEL).addClass("disabled"); +// $(NODE_COLORING_SIDEBAR_PANEL).removeClass("in"); +// $(NODE_COLORING_MENU_CLASS).addClass("disabled"); +// $(NODE_COLORING_MENU).addClass("disabled"); +// $(NODE_COLORING_SIDEBAR_HEADER_LINK).attr("data-toggle", ""); +// }; const isNewWorkbook = (name) => { return grnState.nodeColoring.lastDataset === null || grnState.nodeColoring.lastDataset !== name; @@ -546,16 +555,16 @@ const updateModeViews = () =>{ }; const checkWorkbookModeSettings = () => { + showNodeColoringMenus(); + if (grnState.mode === NETWORK_PPI_MODE) { grnState.nodeColoring.nodeColoringEnabled = false; grnState.colorOptimal = false; - disableNodeColoringMenus(); hideEdgeWeightOptions(); updateModeViews(); } else if (grnState.mode === NETWORK_GRN_MODE) { grnState.nodeColoring.nodeColoringEnabled = true; grnState.colorOptimal = true; - showNodeColoringMenus(); showEdgeWeightOptions(); updateModeViews(); } @@ -828,7 +837,6 @@ export const updateApp = grnState => { // Rare exception to the MVC cycle: right now we have no way of knowing whether the workbook has changed // (which is what necessitates displayworkbook), so we mark the model here. grnState.newWorkbook = false; - console.log("finished update app") } synchronizeNormalizationValues(grnState.normalizationMax); @@ -874,6 +882,7 @@ export const updateApp = grnState => { if (grnState.workbook !== null && grnState.nodeColoring.nodeColoringEnabled && hasExpressionData(grnState.workbook.expression)) { grnState.nodeColoring.showMenu = true; + console.log("enable node coloring but with expression data") $(AVG_REPLICATE_VALS_TOP_SIDEBAR).prop("checked", true); $(AVG_REPLICATE_VALS_BOTTOM_SIDEBAR).prop("checked", true); $(`${NODE_COLORING_TOGGLE_MENU} span`).addClass("glyphicon-ok"); @@ -901,24 +910,37 @@ export const updateApp = grnState => { if ((grnState.workbook.expression[grnState.nodeColoring.topDataset] === undefined) || (!grnState.nodeColoring.bottomDataSameAsTop && grnState.workbook.expression[grnState.nodeColoring.bottomDataset] === undefined)) { + console.log("remove node coloring and reset data dropdowns") updaters.removeNodeColoring(); resetDatasetDropdownMenus(grnState.workbook); } + console.log("enable node coloring no expression data") grnState.nodeColoring.showMenu = true; grnState.nodeColoring.topDataset = grnState.nodeColoring.topDataset ? grnState.nodeColoring.topDataset : "Dahlquist_2018_wt"; grnState.nodeColoring.bottomDataset = grnState.nodeColoring.bottomDataset ? grnState.nodeColoring.bottomDataset : "Dahlquist_2018_wt"; + if (grnState.mode = NETWORK_PPI_MODE) { + console.log("network ppi mode") + $(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked", true); + $(LOG_FOLD_CHANGE_MAX_VALUE_CLASS).val(DEFAULT_MAX_LOG_FOLD_CHANGE); + $(NODE_COLORING_SIDEBAR_BODY).removeClass("hidden"); + $(NODE_COLORING_MENU).removeClass("hidden"); + $(NODE_COLORING_NAVBAR_OPTIONS).removeClass("hidden"); + } $(LOG_FOLD_CHANGE_MAX_VALUE_CLASS).addClass("hidden"); $(LOG_FOLD_CHANGE_MAX_VALUE_SIDEBAR_BUTTON).addClass("hidden"); $(LOG_FOLD_CHANGE_MAX_VALUE_HEADER).addClass("hidden"); if ($(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked")) { if (grnState.workbook.expression[grnState.nodeColoring.topDataset] === undefined) { + console.log('load expression database 1') loadExpressionDatabase(true); } else if (!grnState.nodeColoring.bottomDataSameAsTop && grnState.workbook.expression[grnState.nodeColoring.bottomDataset] === undefined) { + console.log("load expression database 2") loadExpressionDatabase(false); } else { + console.log("else statement called") enableNodeColoringUI(); // There is as problem here! When a dataset from the database is used to do node coloring, // but then the layout of the graph is changed (force graph to grid layout, for instance), @@ -935,12 +957,13 @@ export const updateApp = grnState => { // Investigate why a timeout is required in order for node coloring to take place // successfully in this case. setTimeout(() => updaters.renderNodeColoring(), 250); + console.log("set timeout") } } } else if (grnState.workbook !== null && !grnState.nodeColoring.nodeColoringEnabled) { + console.log("disable node coloring") $(NODE_COLORING_SIDEBAR_BODY).addClass("hidden"); - $(NODE_COLORING_MENU).addClass("disabled"); $(NODE_COLORING_NAVBAR_OPTIONS).addClass("hidden"); $(`${NODE_COLORING_TOGGLE_MENU} span`).removeClass("glyphicon-ok"); $(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked", false); @@ -982,8 +1005,6 @@ export const updateApp = grnState => { if (grnState.nodeColoring.showMenu) { showNodeColoringMenus(); - } else { - disableNodeColoringMenus(); } updateLogFoldChangeMaxValue(); diff --git a/web-client/public/js/warnings.js b/web-client/public/js/warnings.js index 91c7ed37..b229603b 100644 --- a/web-client/public/js/warnings.js +++ b/web-client/public/js/warnings.js @@ -43,7 +43,6 @@ export var displayWarnings = function (warnings) { index++; } - var screenHeight = $(window).height(); var MIN_SCREEN_HEIGHT = 600; var BORDER = 425; @@ -58,17 +57,15 @@ export var displayWarnings = function (warnings) { $("#warningsModal").modal("show"); }; -export var displayPPINodeColorWarning = function(warningDisplayed) { +export var displayPPINodeColorWarning = function (warningDisplayed) { if (warningDisplayed) { - return + return; } $("#warningIntro").html("Protein-protein interaction node coloring warning."); $("#warningsList").html( - [ - "You are displaying mRNA-level expression data on a protein-protein interaction network.", - "Please note that this may not be the most appropriate representation of the data." - ].join(" ") + ["You are displaying mRNA-level expression data on a protein-protein interaction network.", + "Please note that this may not be the most appropriate representation of the data."].join(" ") ); var screenHeight = $(window).height(); @@ -77,9 +74,9 @@ export var displayPPINodeColorWarning = function(warningDisplayed) { var setPanel = screenHeight - BORDER + "px"; var minPanel = MIN_SCREEN_HEIGHT - BORDER + "px"; if (screenHeight > MIN_SCREEN_HEIGHT) { - $("#list-frame").css({ height: setPanel }); + $("#list-frame").css({ height: setPanel }); } else { - $("#list-frame").css({ height: minPanel }); + $("#list-frame").css({ height: minPanel }); } $("#warningsModal").modal("show"); From 39181a9eed7074d67aca6b57011440f98d10ab52 Mon Sep 17 00:00:00 2001 From: ceciliazaragoza Date: Sat, 26 Oct 2024 20:12:58 -0700 Subject: [PATCH 28/72] #1080. display warning when PPI mode enabled, but for some reason PPI warning displays when load a database too --- web-client/public/js/update-app.js | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/web-client/public/js/update-app.js b/web-client/public/js/update-app.js index 30a1b803..74447973 100644 --- a/web-client/public/js/update-app.js +++ b/web-client/public/js/update-app.js @@ -1,6 +1,6 @@ import { drawGraph, updaters } from "./graph"; import { uploadState } from "./upload"; -import { displayWarnings } from "./warnings"; +import { displayWarnings, displayPPINodeColorWarning } from "./warnings"; import { max } from "d3-array"; import { grnState } from "./grnstate"; @@ -109,7 +109,7 @@ import { NETWORK_MODE_GRN, EXPORT_TO_UNWEIGHTED_GML_MENU, NETWORK_GRN_MODE, - NETWORK_PPI_MODE + NETWORK_PPI_MODE, // EXPRESSION_SOURCE, } from "./constants"; @@ -527,20 +527,11 @@ const showNodeColoringMenus = () => { $(NODE_COLORING_SIDEBAR_HEADER_LINK).attr("data-toggle", "collapse"); }; -// const disableNodeColoringMenus = () => { -// $(NODE_COLORING_SIDEBAR_PANEL).addClass("disabled"); -// $(NODE_COLORING_SIDEBAR_PANEL).removeClass("in"); -// $(NODE_COLORING_MENU_CLASS).addClass("disabled"); -// $(NODE_COLORING_MENU).addClass("disabled"); -// $(NODE_COLORING_SIDEBAR_HEADER_LINK).attr("data-toggle", ""); -// }; - const isNewWorkbook = (name) => { return grnState.nodeColoring.lastDataset === null || grnState.nodeColoring.lastDataset !== name; }; // Workbook Mode Functions - const updateModeViews = () =>{ // Select correct dropdown item $(`${NETWORK_MODE_DROPDOWN} option`).removeAttr("selected"); @@ -960,6 +951,11 @@ export const updateApp = grnState => { console.log("set timeout") } + + if (grnState.mode === NETWORK_PPI_MODE) { + displayPPINodeColorWarning(grnState.ppiNodeColorWarningDisplayed); + grnState.ppiNodeColorWarningDisplayed = true; + } } } else if (grnState.workbook !== null && !grnState.nodeColoring.nodeColoringEnabled) { console.log("disable node coloring") @@ -967,6 +963,9 @@ export const updateApp = grnState => { $(NODE_COLORING_NAVBAR_OPTIONS).addClass("hidden"); $(`${NODE_COLORING_TOGGLE_MENU} span`).removeClass("glyphicon-ok"); $(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked", false); + if (grnState.mode === NETWORK_PPI_MODE) { + grnState.ppiNodeColorWarningDisplayed = false; + } } if (grnState.workbook !== null && grnState.workbook.sheetType === "weighted") { From 533b879c230d83ac33743d70580a47b5ec7891eb Mon Sep 17 00:00:00 2001 From: ceciliazaragoza Date: Sat, 26 Oct 2024 21:27:39 -0700 Subject: [PATCH 29/72] Issue #1080. was accidentally assigning grnState.mode to NETWORK_PPI_MODE, and removed that code so that now databases load in correct mode --- web-client/public/js/update-app.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/web-client/public/js/update-app.js b/web-client/public/js/update-app.js index 74447973..b118a888 100644 --- a/web-client/public/js/update-app.js +++ b/web-client/public/js/update-app.js @@ -520,11 +520,14 @@ const updatetoGridLayout = () => {}; // Node Coloring Functions const showNodeColoringMenus = () => { + $(NODE_COLORING_SIDEBAR_BODY).removeClass("hidden"); $(NODE_COLORING_SIDEBAR_PANEL).removeClass("disabled"); - $(NODE_COLORING_SIDEBAR_PANEL).addClass("in"); + // $(NODE_COLORING_SIDEBAR_PANEL).addClass("in"); $(NODE_COLORING_MENU).removeClass("disabled"); $(NODE_COLORING_MENU_CLASS).removeClass("disabled"); $(NODE_COLORING_SIDEBAR_HEADER_LINK).attr("data-toggle", "collapse"); + $(NODE_COLORING_MENU).removeClass("hidden"); + $(NODE_COLORING_NAVBAR_OPTIONS).removeClass("hidden"); }; const isNewWorkbook = (name) => { @@ -905,13 +908,12 @@ export const updateApp = grnState => { updaters.removeNodeColoring(); resetDatasetDropdownMenus(grnState.workbook); } - console.log("enable node coloring no expression data") grnState.nodeColoring.showMenu = true; grnState.nodeColoring.topDataset = grnState.nodeColoring.topDataset ? grnState.nodeColoring.topDataset : "Dahlquist_2018_wt"; grnState.nodeColoring.bottomDataset = grnState.nodeColoring.bottomDataset ? grnState.nodeColoring.bottomDataset : "Dahlquist_2018_wt"; - if (grnState.mode = NETWORK_PPI_MODE) { + if (grnState.mode === NETWORK_PPI_MODE) { console.log("network ppi mode") $(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked", true); $(LOG_FOLD_CHANGE_MAX_VALUE_CLASS).val(DEFAULT_MAX_LOG_FOLD_CHANGE); From 77189f3ffaa01748e0aa6a5b69a8c7efe8468c3c Mon Sep 17 00:00:00 2001 From: ceciliazaragoza Date: Wed, 30 Oct 2024 09:29:40 -0700 Subject: [PATCH 30/72] #1080. Can now enable and disable node coloring with PPIs where navbar and side menu display the same status of node coloring and when node coloring disabled, the navbar and sidebar options for node coloring are hidden --- web-client/public/js/graph.js | 40 ++++++++++---------- web-client/public/js/update-app.js | 61 +++++++++++++----------------- 2 files changed, 46 insertions(+), 55 deletions(-) diff --git a/web-client/public/js/graph.js b/web-client/public/js/graph.js index ce22c556..6b1155f2 100644 --- a/web-client/public/js/graph.js +++ b/web-client/public/js/graph.js @@ -1529,18 +1529,18 @@ export var drawGraph = function (workbook) { var selfReferringEdgeWidth = (selfReferringEdge ? getSelfReferringRadius(selfReferringEdge) + selfReferringEdge.strokeWidth + 2 : 0); var rightBoundary = width - (d.textWidth + OFFSET_VALUE) - BOUNDARY_MARGIN - selfReferringEdgeWidth; - // if (!adaptive) { - // rightBoundary = - // -xTranslation / graphZoom + - // BOUNDARY_MARGIN / 2 + - // width / graphZoom - - // BOUNDARY_MARGIN - - // (d.textWidth + OFFSET_VALUE) - - // selfReferringEdgeWidth; - // } + if (!adaptive) { + rightBoundary = + -xTranslation / graphZoom + + BOUNDARY_MARGIN / 2 + + width / graphZoom - + BOUNDARY_MARGIN - + (d.textWidth + OFFSET_VALUE) - + selfReferringEdgeWidth; + } // currentXPos bounds the graph when toggle to !adaptive and moves each of the nodes to be in bounds var currentXPos = Math.max(getLeftXBoundaryMargin(), Math.min(rightBoundary, d.x)); - if (width < MAX_WIDTH && + if (adaptive && width < MAX_WIDTH && (currentXPos === getLeftXBoundaryMargin() || currentXPos === rightBoundary) ) { @@ -1567,19 +1567,19 @@ export var drawGraph = function (workbook) { var selfReferringEdgeHeight = (selfReferringEdge ? getSelfReferringRadius(selfReferringEdge) + selfReferringEdge.strokeWidth + SELF_REFERRING_Y_OFFSET + 0.5 : 0); var bottomBoundary = height - nodeHeight - BOUNDARY_MARGIN - selfReferringEdgeHeight; - // if (!adaptive) { - // bottomBoundary = - // -yTranslation / graphZoom + - // BOUNDARY_MARGIN / 2 + - // height / graphZoom - - // BOUNDARY_MARGIN - - // nodeHeight - - // selfReferringEdgeHeight; - // } + if (!adaptive) { + bottomBoundary = + -yTranslation / graphZoom + + BOUNDARY_MARGIN / 2 + + height / graphZoom - + BOUNDARY_MARGIN - + nodeHeight - + selfReferringEdgeHeight; + } // currentYPos bounds the graph when toggle to !adaptive and moves each of the nodes to be in bounds var currentYPos = Math.max(getTopYBoundaryMargin(), Math.min(bottomBoundary, d.y)); - if (height < MAX_HEIGHT && + if (adaptive && height < MAX_HEIGHT && (currentYPos === getTopYBoundaryMargin() || currentYPos === bottomBoundary)) { if (!d3.select(this).classed("fixed")) { height += OFFSET_VALUE; diff --git a/web-client/public/js/update-app.js b/web-client/public/js/update-app.js index b118a888..7fcf3716 100644 --- a/web-client/public/js/update-app.js +++ b/web-client/public/js/update-app.js @@ -378,7 +378,6 @@ const stopLoadingIcon = function () { $(EXPRESSION_DB_LOADER_TEXT).css("display", "none"); }; const enableNodeColoringUI = function () { - console.log("node coloring UI enabled") grnState.nodeColoring.nodeColoringEnabled = true; $(LOG_FOLD_CHANGE_MAX_VALUE_CLASS).removeClass("hidden"); $(LOG_FOLD_CHANGE_MAX_VALUE_SIDEBAR_BUTTON).removeClass("hidden"); @@ -392,14 +391,6 @@ const loadExpressionDatabase = function (isTopDataset) { type: "ExpressionTimePoints", dataset }).then(function (timepointsResponse) { - console.log( - "genes", - grnState.workbook.genes - .map((gene) => { - return gene.name; - }) - .join(",") - ); queryExpressionDatabase({ type:"ExpressionData", dataset, @@ -407,16 +398,13 @@ const loadExpressionDatabase = function (isTopDataset) { timepoints: timepointsResponse[dataset] }).then(function (response) { if (isTopDataset) { - console.log("query expresison database response", response); grnState.workbook.expression[grnState.nodeColoring.topDataset] = response; } else { grnState.workbook.expression[grnState.nodeColoring.bottomDataset] = response; } - console.log("try to update top dataset") enableNodeColoringUI(); stopLoadingIcon(); updaters.renderNodeColoring(); - console.log("render node coloring") }).catch(function (error) { console.log(error.stack); console.log(error.name); @@ -520,14 +508,19 @@ const updatetoGridLayout = () => {}; // Node Coloring Functions const showNodeColoringMenus = () => { - $(NODE_COLORING_SIDEBAR_BODY).removeClass("hidden"); $(NODE_COLORING_SIDEBAR_PANEL).removeClass("disabled"); - // $(NODE_COLORING_SIDEBAR_PANEL).addClass("in"); + $(NODE_COLORING_SIDEBAR_PANEL).addClass("in"); $(NODE_COLORING_MENU).removeClass("disabled"); $(NODE_COLORING_MENU_CLASS).removeClass("disabled"); $(NODE_COLORING_SIDEBAR_HEADER_LINK).attr("data-toggle", "collapse"); - $(NODE_COLORING_MENU).removeClass("hidden"); - $(NODE_COLORING_NAVBAR_OPTIONS).removeClass("hidden"); +}; + +const disableNodeColoringMenus = () => { + $(NODE_COLORING_SIDEBAR_PANEL).addClass("disabled"); + $(NODE_COLORING_SIDEBAR_PANEL).removeClass("in"); + $(NODE_COLORING_MENU_CLASS).addClass("disabled"); + $(NODE_COLORING_MENU).addClass("disabled"); + $(NODE_COLORING_SIDEBAR_HEADER_LINK).attr("data-toggle", ""); }; const isNewWorkbook = (name) => { @@ -549,16 +542,18 @@ const updateModeViews = () =>{ }; const checkWorkbookModeSettings = () => { - showNodeColoringMenus(); - if (grnState.mode === NETWORK_PPI_MODE) { grnState.nodeColoring.nodeColoringEnabled = false; + grnState.nodeColoring.showMenu = true; grnState.colorOptimal = false; + showNodeColoringMenus(); hideEdgeWeightOptions(); updateModeViews(); } else if (grnState.mode === NETWORK_GRN_MODE) { grnState.nodeColoring.nodeColoringEnabled = true; + grnState.nodeColoring.showMenu = true; grnState.colorOptimal = true; + showNodeColoringMenus(); showEdgeWeightOptions(); updateModeViews(); } @@ -876,7 +871,6 @@ export const updateApp = grnState => { if (grnState.workbook !== null && grnState.nodeColoring.nodeColoringEnabled && hasExpressionData(grnState.workbook.expression)) { grnState.nodeColoring.showMenu = true; - console.log("enable node coloring but with expression data") $(AVG_REPLICATE_VALS_TOP_SIDEBAR).prop("checked", true); $(AVG_REPLICATE_VALS_BOTTOM_SIDEBAR).prop("checked", true); $(`${NODE_COLORING_TOGGLE_MENU} span`).addClass("glyphicon-ok"); @@ -885,6 +879,10 @@ export const updateApp = grnState => { $(NODE_COLORING_SIDEBAR_BODY).removeClass("hidden"); $(NODE_COLORING_MENU).removeClass("hidden"); $(NODE_COLORING_NAVBAR_OPTIONS).removeClass("hidden"); + if (grnState.mode === NETWORK_PPI_MODE) { + displayPPINodeColorWarning(grnState.ppiNodeColorWarningDisplayed); + grnState.ppiNodeColorWarningDisplayed = true; + } if (grnState.database.expressionDatasets.includes(grnState.nodeColoring.topDataset) && grnState.workbook.expression[grnState.nodeColoring.topDataset] === undefined) { if ($(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked")) { @@ -904,7 +902,6 @@ export const updateApp = grnState => { if ((grnState.workbook.expression[grnState.nodeColoring.topDataset] === undefined) || (!grnState.nodeColoring.bottomDataSameAsTop && grnState.workbook.expression[grnState.nodeColoring.bottomDataset] === undefined)) { - console.log("remove node coloring and reset data dropdowns") updaters.removeNodeColoring(); resetDatasetDropdownMenus(grnState.workbook); } @@ -913,27 +910,22 @@ export const updateApp = grnState => { grnState.nodeColoring.topDataset : "Dahlquist_2018_wt"; grnState.nodeColoring.bottomDataset = grnState.nodeColoring.bottomDataset ? grnState.nodeColoring.bottomDataset : "Dahlquist_2018_wt"; - if (grnState.mode === NETWORK_PPI_MODE) { - console.log("network ppi mode") - $(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked", true); - $(LOG_FOLD_CHANGE_MAX_VALUE_CLASS).val(DEFAULT_MAX_LOG_FOLD_CHANGE); - $(NODE_COLORING_SIDEBAR_BODY).removeClass("hidden"); - $(NODE_COLORING_MENU).removeClass("hidden"); - $(NODE_COLORING_NAVBAR_OPTIONS).removeClass("hidden"); - } + $(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked", true); + $(`${NODE_COLORING_TOGGLE_MENU} span`).addClass("glyphicon-ok"); + $(NODE_COLORING_SIDEBAR_BODY).removeClass("hidden"); + $(NODE_COLORING_MENU).removeClass("hidden"); + $(NODE_COLORING_NAVBAR_OPTIONS).removeClass("hidden"); + $(LOG_FOLD_CHANGE_MAX_VALUE_CLASS).val(DEFAULT_MAX_LOG_FOLD_CHANGE); $(LOG_FOLD_CHANGE_MAX_VALUE_CLASS).addClass("hidden"); $(LOG_FOLD_CHANGE_MAX_VALUE_SIDEBAR_BUTTON).addClass("hidden"); $(LOG_FOLD_CHANGE_MAX_VALUE_HEADER).addClass("hidden"); if ($(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked")) { if (grnState.workbook.expression[grnState.nodeColoring.topDataset] === undefined) { - console.log('load expression database 1') loadExpressionDatabase(true); } else if (!grnState.nodeColoring.bottomDataSameAsTop && grnState.workbook.expression[grnState.nodeColoring.bottomDataset] === undefined) { - console.log("load expression database 2") loadExpressionDatabase(false); } else { - console.log("else statement called") enableNodeColoringUI(); // There is as problem here! When a dataset from the database is used to do node coloring, // but then the layout of the graph is changed (force graph to grid layout, for instance), @@ -950,18 +942,15 @@ export const updateApp = grnState => { // Investigate why a timeout is required in order for node coloring to take place // successfully in this case. setTimeout(() => updaters.renderNodeColoring(), 250); - console.log("set timeout") - } - if (grnState.mode === NETWORK_PPI_MODE) { displayPPINodeColorWarning(grnState.ppiNodeColorWarningDisplayed); grnState.ppiNodeColorWarningDisplayed = true; } } } else if (grnState.workbook !== null && !grnState.nodeColoring.nodeColoringEnabled) { - console.log("disable node coloring") $(NODE_COLORING_SIDEBAR_BODY).addClass("hidden"); + $(NODE_COLORING_MENU).addClass("disabled"); $(NODE_COLORING_NAVBAR_OPTIONS).addClass("hidden"); $(`${NODE_COLORING_TOGGLE_MENU} span`).removeClass("glyphicon-ok"); $(NODE_COLORING_TOGGLE_SIDEBAR).prop("checked", false); @@ -1006,6 +995,8 @@ export const updateApp = grnState => { if (grnState.nodeColoring.showMenu) { showNodeColoringMenus(); + } else { + disableNodeColoringMenus(); } updateLogFoldChangeMaxValue(); From 38a69a8c9586415d436975fac611e67bd8722730 Mon Sep 17 00:00:00 2001 From: A'Kaia Phelps Date: Wed, 30 Oct 2024 12:35:56 -0700 Subject: [PATCH 31/72] Sync package-lock.json with package.json --- package-lock.json | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index bebb0710..8f911266 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "grnsight", - "version": "6.0.0", + "version": "7.1.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "grnsight", - "version": "6.0.0", + "version": "7.1.4", "license": "BSD-3-Clause", "dependencies": { "body-parser": "1.18.2", @@ -28,7 +28,7 @@ "node-xlsx": "0.7.2", "nodemon": "1.19.1", "parallelshell": "3.0.1", - "pg": "8.0.0", + "pg": "8.0.3", "pg-hstore": "2.3.3", "pug": "3.0.2", "querystring": "0.2.0", @@ -11468,15 +11468,15 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "node_modules/pg": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.0.0.tgz", - "integrity": "sha512-jinx9Xcmkeh7Y7gatu2EJiXr37mcDeF0G5X14MjqPMwYjoZMk7PMMSTTXQQl03GRp2IICxo/zyybqfv2RNgXsg==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.0.3.tgz", + "integrity": "sha512-fvcNXn4o/iq4jKq15Ix/e58q3jPSmzOp6/8C3CaHoSR/bsxdg+1FXfDRePdtE/zBb3++TytvOrS1hNef3WC/Kg==", "dependencies": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", "pg-connection-string": "0.1.3", - "pg-packet-stream": "^1.1.0", - "pg-pool": "^3.0.0", + "pg-pool": "^3.1.1", + "pg-protocol": "^1.2.2", "pg-types": "^2.1.0", "pgpass": "1.x", "semver": "4.3.2" @@ -11509,11 +11509,6 @@ "node": ">=4.0.0" } }, - "node_modules/pg-packet-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pg-packet-stream/-/pg-packet-stream-1.1.0.tgz", - "integrity": "sha512-kRBH0tDIW/8lfnnOyTwKD23ygJ/kexQVXZs7gEyBljw4FYqimZFxnMMx50ndZ8In77QgfGuItS5LLclC2TtjYg==" - }, "node_modules/pg-pool": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.4.1.tgz", @@ -11522,6 +11517,11 @@ "pg": ">=8.0" } }, + "node_modules/pg-protocol": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz", + "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==" + }, "node_modules/pg-types": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", @@ -27084,15 +27084,15 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, "pg": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.0.0.tgz", - "integrity": "sha512-jinx9Xcmkeh7Y7gatu2EJiXr37mcDeF0G5X14MjqPMwYjoZMk7PMMSTTXQQl03GRp2IICxo/zyybqfv2RNgXsg==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.0.3.tgz", + "integrity": "sha512-fvcNXn4o/iq4jKq15Ix/e58q3jPSmzOp6/8C3CaHoSR/bsxdg+1FXfDRePdtE/zBb3++TytvOrS1hNef3WC/Kg==", "requires": { "buffer-writer": "2.0.0", "packet-reader": "1.0.0", "pg-connection-string": "0.1.3", - "pg-packet-stream": "^1.1.0", - "pg-pool": "^3.0.0", + "pg-pool": "^3.1.1", + "pg-protocol": "^1.2.2", "pg-types": "^2.1.0", "pgpass": "1.x", "semver": "4.3.2" @@ -27123,17 +27123,17 @@ "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==" }, - "pg-packet-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pg-packet-stream/-/pg-packet-stream-1.1.0.tgz", - "integrity": "sha512-kRBH0tDIW/8lfnnOyTwKD23ygJ/kexQVXZs7gEyBljw4FYqimZFxnMMx50ndZ8In77QgfGuItS5LLclC2TtjYg==" - }, "pg-pool": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.4.1.tgz", "integrity": "sha512-TVHxR/gf3MeJRvchgNHxsYsTCHQ+4wm3VIHSS19z8NC0+gioEhq1okDY1sm/TYbfoP6JLFx01s0ShvZ3puP/iQ==", "requires": {} }, + "pg-protocol": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.7.0.tgz", + "integrity": "sha512-hTK/mE36i8fDDhgDFjy6xNOG+LCorxLG3WO17tku+ij6sVHXh1jQUJ8hYAnRhNla4QVD2H8er/FOjc/+EgC6yQ==" + }, "pg-types": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", From 390898543f81bc7969e8cec78f707fe005643bd4 Mon Sep 17 00:00:00 2001 From: A'Kaia Phelps Date: Wed, 30 Oct 2024 12:57:13 -0700 Subject: [PATCH 32/72] system dependencies needed by the 'canvas' package --- .github/workflows/node.js.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 39a7284c..8a0c1691 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -17,10 +17,15 @@ jobs: strategy: matrix: node-version: [18.x, 20.x, 22.x] - # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ steps: - uses: actions/checkout@v4 + # install system dependencies needed by the 'canvas' package + - name: Install dependencies for canvas + run: | + sudo apt-get update + sudo apt-get install -y libcairo2-dev libpango1.0-dev + libjpeg-dev libgif-dev librsvg2-dev - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: From 1b6dbc2933cdbde7cd69185c8e81b959ab384a3d Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Wed, 30 Oct 2024 14:02:13 -0700 Subject: [PATCH 33/72] #1078 style fix --- web-client/public/js/graph.js | 13 +++++++------ web-client/public/js/update-app.js | 14 +++++++++----- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/web-client/public/js/graph.js b/web-client/public/js/graph.js index 7932ef0c..e3b72b93 100644 --- a/web-client/public/js/graph.js +++ b/web-client/public/js/graph.js @@ -1,6 +1,11 @@ import Grid from "d3-v4-grid"; import { grnState } from "./grnstate"; -import { modifyChargeParameter, modifyLinkDistanceParameter, valueValidator } from "./update-app"; +import { + modifyChargeParameter, + modifyLinkDistanceParameter, + valueValidator, + adjustGeneNameForExpression, +} from "./update-app"; import { ENDS_IN_EXPRESSION_REGEXP, VIEWPORT_FIT, @@ -12,7 +17,6 @@ import { ZOOM_DISPLAY_MIDDLE, ZOOM_ADAPTIVE_MAX_SCALE, NETWORK_GRN_MODE, - NETWORK_PPI_MODE } from "./constants"; /* globals d3 */ @@ -1088,10 +1092,7 @@ export var drawGraph = function (workbook) { .selectAll(".coloring") .data(function () { if (grnState.workbook.expression[dataset]) { - var geneName = p.name; - if (grnState.workbook.meta.data.workbookType === NETWORK_PPI_MODE && geneName.endsWith("p")) { - geneName = geneName.slice(0, -1); - } + const geneName = adjustGeneNameForExpression(p); if ( grnState.workbook.expression[dataset].data[geneName] ) { diff --git a/web-client/public/js/update-app.js b/web-client/public/js/update-app.js index d9441d5c..72a98273 100644 --- a/web-client/public/js/update-app.js +++ b/web-client/public/js/update-app.js @@ -383,6 +383,13 @@ const enableNodeColoringUI = function () { $(LOG_FOLD_CHANGE_MAX_VALUE_HEADER).removeClass("hidden"); }; +const adjustGeneNameForExpression = function(gene) { + return grnState.workbook.meta.data.workbookType === NETWORK_PPI_MODE && + gene.name.endsWith("p") + ? gene.name.slice(0, -1) + : gene.name; +}; + const loadExpressionDatabase = function (isTopDataset) { const dataset = isTopDataset ? grnState.nodeColoring.topDataset : grnState.nodeColoring.bottomDataset; startLoadingIcon(); @@ -394,10 +401,7 @@ const loadExpressionDatabase = function (isTopDataset) { type:"ExpressionData", dataset, genes : grnState.workbook.genes.map(gene => { - if (grnState.workbook.meta.data.workbookType === NETWORK_PPI_MODE) { - return gene.name.endsWith("p") ? gene.name.slice(0, -1) : gene.name; - } - return gene.name; + return adjustGeneNameForExpression(gene); }).join(","), timepoints: timepointsResponse[dataset] }).then(function (response) { @@ -1004,4 +1008,4 @@ export const updateApp = grnState => { }; -export { stopLoadingIcon, startLoadingIcon}; \ No newline at end of file +export { stopLoadingIcon, startLoadingIcon, adjustGeneNameForExpression}; \ No newline at end of file From 616362a7ba13246e9e1c04bae65a7441bb54d1a2 Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Wed, 30 Oct 2024 14:36:19 -0700 Subject: [PATCH 34/72] #1098 reverse back the changes to when upload class is changed, trigger uploadHandler --- web-client/public/js/setup-load-and-import-handlers.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/web-client/public/js/setup-load-and-import-handlers.js b/web-client/public/js/setup-load-and-import-handlers.js index 0fff5897..c6f80dbf 100644 --- a/web-client/public/js/setup-load-and-import-handlers.js +++ b/web-client/public/js/setup-load-and-import-handlers.js @@ -171,8 +171,7 @@ export const setupLoadAndImportHandlers = (grnState) => { * for helping to resolve this. */ - $("body").on("change", "#upload-network", uploadHandler(loadGrn)); - $("body").on("change", "#upload-nav", uploadHandler(loadGrn)); + $("body").on("change", ".upload", uploadHandler(loadGrn)); const loadDemo = (url, value) => { $("#demoSourceDropdown option[value='" + value.substring(1) + "']").prop( From 019589e123a723b34d92662ff901dc4e688405dc Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Wed, 30 Oct 2024 14:47:49 -0700 Subject: [PATCH 35/72] #1197 Modify alpha value on optimization_parameters from 0.002 to 0.02 --- server/controllers/demo-workbooks.js | 4 ++-- test/additional-sheet-parser-tests.js | 2 +- web-client/public/js/upload.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/server/controllers/demo-workbooks.js b/server/controllers/demo-workbooks.js index 3bdc0536..b18d0301 100644 --- a/server/controllers/demo-workbooks.js +++ b/server/controllers/demo-workbooks.js @@ -515,7 +515,7 @@ var demoWorkbook1 = function (path, res, app) { }, meta: { data: { - alpha: 0.002, + alpha: 0.02, kk_max: 1, MaxIter: 100000000, TolFun: 0.000001, @@ -2679,7 +2679,7 @@ var demoWorkbook2 = function (path, res, app) { }, meta: { data: { - alpha: 0.002, + alpha: 0.02, kk_max: 1, MaxIter: 100000000, TolFun: 0.000001, diff --git a/test/additional-sheet-parser-tests.js b/test/additional-sheet-parser-tests.js index 4566a1fa..8c41d1f1 100644 --- a/test/additional-sheet-parser-tests.js +++ b/test/additional-sheet-parser-tests.js @@ -62,7 +62,7 @@ describe("additional-sheet-parser", function () { var data = parseAdditionalSheets(workbook); /* eslint-disable */ assert(data.meta, { - alpha: 0.002, + alpha: 0.02, kk_max: 1, MaxIter: 100000000, TolFun: 0.000001, diff --git a/web-client/public/js/upload.js b/web-client/public/js/upload.js index 50ac8d39..6266f3b8 100644 --- a/web-client/public/js/upload.js +++ b/web-client/public/js/upload.js @@ -120,7 +120,7 @@ export const upload = function () { const updateOptimizationParameters = (finalExportSheets) => { let optimizationParameters = { data: grnState.mode === NETWORK_GRN_MODE ? { - alpha: 0.002, + alpha: 0.02, "kk_max": 1, MaxIter: 100000000, TolFun: 0.000001, From fe4b7e9bd6a2bdb5f5ada15edf45c95083846131 Mon Sep 17 00:00:00 2001 From: A'Kaia Phelps Date: Wed, 30 Oct 2024 18:48:09 -0700 Subject: [PATCH 36/72] fixing syntax error --- .github/workflows/node.js.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 8a0c1691..dfe8d8d7 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -24,8 +24,7 @@ jobs: - name: Install dependencies for canvas run: | sudo apt-get update - sudo apt-get install -y libcairo2-dev libpango1.0-dev - libjpeg-dev libgif-dev librsvg2-dev + sudo apt-get install -y libcairo2-dev libpango1.0-dev libjpeg-dev libgif-dev librsvg2-dev - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: From dca83bc5006306f7193b4c21594cfb5b608d8399 Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Mon, 4 Nov 2024 12:14:25 -0800 Subject: [PATCH 37/72] #1068 improve the code quality --- web-client/public/js/update-app.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/web-client/public/js/update-app.js b/web-client/public/js/update-app.js index 72a98273..b5fc8401 100644 --- a/web-client/public/js/update-app.js +++ b/web-client/public/js/update-app.js @@ -383,11 +383,12 @@ const enableNodeColoringUI = function () { $(LOG_FOLD_CHANGE_MAX_VALUE_HEADER).removeClass("hidden"); }; -const adjustGeneNameForExpression = function(gene) { +const adjustGeneNameForExpression = function (gene) { + const geneName = gene.name; return grnState.workbook.meta.data.workbookType === NETWORK_PPI_MODE && - gene.name.endsWith("p") - ? gene.name.slice(0, -1) - : gene.name; + geneName.endsWith("p") + ? geneName.slice(0, -1) + : geneName; }; const loadExpressionDatabase = function (isTopDataset) { @@ -400,9 +401,9 @@ const loadExpressionDatabase = function (isTopDataset) { queryExpressionDatabase({ type:"ExpressionData", dataset, - genes : grnState.workbook.genes.map(gene => { - return adjustGeneNameForExpression(gene); - }).join(","), + genes: grnState.workbook.genes + .map(adjustGeneNameForExpression) + .join(","), timepoints: timepointsResponse[dataset] }).then(function (response) { if (isTopDataset) { From 57b0a58667b66209717aa9b29cd81f6ecf974580 Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Mon, 4 Nov 2024 13:36:42 -0800 Subject: [PATCH 38/72] #1108 When export, making network and network_weights sheets to be identical --- web-client/public/js/upload.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web-client/public/js/upload.js b/web-client/public/js/upload.js index 50ac8d39..1e8b1133 100644 --- a/web-client/public/js/upload.js +++ b/web-client/public/js/upload.js @@ -261,7 +261,7 @@ export const upload = function () { } else if (sheet === "network") { finalExportSheets.networks[sheet] = grnState.workbook.network; } else if (sheet === "network_weights") { - finalExportSheets.networks[sheet] = grnState.workbook.networkWeights; + finalExportSheets.networks[sheet] = grnState.workbook.network; // network_weights is identical to network } else if (sheet === "optimization_diagnostics") { // Get the additional Sheets finalExportSheets[sheet] = grnState.workbook.meta2; } else if (sheet === "optimization_parameters") { @@ -430,7 +430,7 @@ export const upload = function () { let networks = [ [grnState.workbook.network !== undefined, "network"], [grnState.workbook.networkOptimizedWeights !== undefined, "network_optimized_weights"], - [grnState.workbook.networkWeights !== undefined, "network_weights"]]; + [grnState.workbook.network !== undefined, "network_weights"]]; // network_weights is always available if network is available // networks = networks.filter(x => x !== false); let additionalsheets = grnState.workbook.twoColumnSheets ? [ ...Object.keys(grnState.workbook.twoColumnSheets), From 13dcde511bbdfbb9f9094d5c2e3c36b84ad9e545 Mon Sep 17 00:00:00 2001 From: dondi Date: Mon, 4 Nov 2024 15:51:59 -0800 Subject: [PATCH 39/72] Version bump. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d918c1b6..84d95654 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grnsight", - "version": "7.1.5", + "version": "7.1.6", "description": "Web app and service for visualizing models of gene regulatory networks", "directories": { "test": "test" From edc33e5d4830acbbd50a68a1433cda2755b2e4ef Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Mon, 4 Nov 2024 21:06:17 -0800 Subject: [PATCH 40/72] #1053 Fixing p.length is unavailable error --- web-client/public/js/graph.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/web-client/public/js/graph.js b/web-client/public/js/graph.js index cbe01034..754b9e3d 100644 --- a/web-client/public/js/graph.js +++ b/web-client/public/js/graph.js @@ -1101,11 +1101,12 @@ export var drawGraph = function (workbook) { average ); timePoints = result.timePoints; - return result.data; - } else { - return 0; + return result.data && result.data.length > 0 + ? result.data + : []; } } + return []; }) .attr("class", "coloring") .enter().append("rect") From 5262d021360ee1777e3afd4eb41af35cbc1c235f Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Tue, 5 Nov 2024 14:39:17 -0800 Subject: [PATCH 41/72] #1093 svg image appear with white background --- web-client/public/js/setup-handlers.js | 40 ++++++++++++-------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/web-client/public/js/setup-handlers.js b/web-client/public/js/setup-handlers.js index 4b71a42a..deaca827 100644 --- a/web-client/public/js/setup-handlers.js +++ b/web-client/public/js/setup-handlers.js @@ -94,13 +94,11 @@ export const setupHandlers = grnState => { window.document.body.appendChild(emptySvg); var emptySvgDeclarationComputed = getComputedStyle(emptySvg); - const traverse = svg => { - var tree = []; - tree.push(svg); - // implement DFS - const visit = (node) => { - if (node && node.hasChildNodes()) { - var child = node.firstChild; + const traverse = (node) => { + const tree = []; + const visit = (currentNode) => { + if (currentNode && currentNode.hasChildNodes()) { + let child = currentNode.firstChild; while (child) { if (child.nodeType === 1 && child.nodeName !== "SCRIPT") { tree.push(child); @@ -110,38 +108,38 @@ export const setupHandlers = grnState => { } } }; - visit(svg); + visit(node); return tree; }; const explicitlySetStyle = element => { const cSSStyleDeclarationComputed = window.getComputedStyle(element); - let i; - let len; - let key; - let value; let computedStyleStr = ""; - for (i = 0, len = cSSStyleDeclarationComputed.length; i < len; i++) { - key = cSSStyleDeclarationComputed[i]; - value = cSSStyleDeclarationComputed.getPropertyValue(key); + for (let i = 0; i < cSSStyleDeclarationComputed.length; i++) { + const key = cSSStyleDeclarationComputed[i]; + const value = cSSStyleDeclarationComputed.getPropertyValue(key); if (value !== emptySvgDeclarationComputed.getPropertyValue(key)) { // Don't set computed style of width and height. Makes SVG elmements disappear. if ((key !== "height") && (key !== "width")) { - computedStyleStr += key + ":" + value + ";"; + computedStyleStr += `${key}:${value};`; } } } - element.setAttribute("style", computedStyleStr); + + if (element.classList.contains("weight")) { + computedStyleStr += "visibility: hidden;"; + } + + if (computedStyleStr) { + element.setAttribute("style", computedStyleStr); + } }; // hardcode computed css styles inside svg var allElements = traverse(svg); - var i = allElements.length; - while (i--) { - explicitlySetStyle(allElements[i]); - } + allElements.forEach(explicitlySetStyle); }; const sourceAttributeSetter = (svg) => { From 0f0c5f3d49e68570e5388d052f42141e9799e0f8 Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Tue, 5 Nov 2024 15:21:40 -0800 Subject: [PATCH 42/72] Fixing the exportToPDF so the image doesn't too scale on width or height --- web-client/public/js/setup-handlers.js | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/web-client/public/js/setup-handlers.js b/web-client/public/js/setup-handlers.js index 4b71a42a..4550b93d 100644 --- a/web-client/public/js/setup-handlers.js +++ b/web-client/public/js/setup-handlers.js @@ -185,10 +185,24 @@ export const setupHandlers = grnState => { const imgData = canvas.toDataURL("image/png"); const pdf = new jsPDF("l", "mm", "letter"); - const width = pdf.internal.pageSize.getWidth(); - const height = pdf.internal.pageSize.getHeight(); + const pdfWidth = pdf.internal.pageSize.getWidth(); + const pdfHeight = pdf.internal.pageSize.getHeight(); - pdf.addImage(imgData, "PNG", 0, 0, width, height); + const svgWidth = canvas.width; + const svgHeight = canvas.height; + + const aspectRatio = svgWidth / svgHeight; + let scaledWidth = pdfWidth; + let scaledHeight = pdfWidth / aspectRatio; + + if (scaledHeight > pdfHeight) { + scaledHeight = pdfHeight; + scaledWidth = pdfHeight * aspectRatio; + } + + pdf.addImage(imgData, "PNG", 0, 0, scaledWidth, scaledHeight); + + // pdf.addImage(imgData, "PNG", 0, 0, width, height); pdf.save(name); }; From 0bd532223f24b01fb8a92f0fc5fc909bfa6d9ba6 Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Tue, 5 Nov 2024 15:29:46 -0800 Subject: [PATCH 43/72] Clean code for #59 --- web-client/public/js/setup-handlers.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/web-client/public/js/setup-handlers.js b/web-client/public/js/setup-handlers.js index 4550b93d..9dd2a97d 100644 --- a/web-client/public/js/setup-handlers.js +++ b/web-client/public/js/setup-handlers.js @@ -193,7 +193,8 @@ export const setupHandlers = grnState => { const aspectRatio = svgWidth / svgHeight; let scaledWidth = pdfWidth; - let scaledHeight = pdfWidth / aspectRatio; + // ratio = width/height --> height = width/ratio + let scaledHeight = scaledWidth / aspectRatio; if (scaledHeight > pdfHeight) { scaledHeight = pdfHeight; @@ -201,8 +202,6 @@ export const setupHandlers = grnState => { } pdf.addImage(imgData, "PNG", 0, 0, scaledWidth, scaledHeight); - - // pdf.addImage(imgData, "PNG", 0, 0, width, height); pdf.save(name); }; From fbb13df1647ffbb9bce4b0377ae2993db756b745 Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Tue, 5 Nov 2024 16:22:20 -0800 Subject: [PATCH 44/72] #59 change the background color from black to white for PNG export --- web-client/public/js/setup-handlers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web-client/public/js/setup-handlers.js b/web-client/public/js/setup-handlers.js index 9dd2a97d..f353efdd 100644 --- a/web-client/public/js/setup-handlers.js +++ b/web-client/public/js/setup-handlers.js @@ -222,7 +222,7 @@ export const setupHandlers = grnState => { $(EXPORT_TO_PNG).click(() => { var svgContainer = document.getElementById("exportContainer"); var editedName = grnState.name.replace(determineFileType(grnState.name), "") + ".png"; - saveSvgAsPng(svgContainer, editedName); + saveSvgAsPng(svgContainer, editedName, { backgroundColor: "white"}); }); $(EXPORT_TO_SVG).click(() => { From 261b7038b525f55b9819eee8bcadfd4f1955c542 Mon Sep 17 00:00:00 2001 From: A'Kaia Phelps Date: Tue, 5 Nov 2024 20:05:34 -0800 Subject: [PATCH 45/72] reducing node version workflow --- .github/workflows/node.js.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index dfe8d8d7..1c40f616 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -16,7 +16,7 @@ jobs: strategy: matrix: - node-version: [18.x, 20.x, 22.x] + node-version: [20.x] steps: - uses: actions/checkout@v4 From 808f6c4367fa0ea3ac72352fde096ef7db146255 Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Tue, 5 Nov 2024 21:26:01 -0800 Subject: [PATCH 46/72] Modify the location of the image in pdf --- web-client/public/js/setup-handlers.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/web-client/public/js/setup-handlers.js b/web-client/public/js/setup-handlers.js index f353efdd..f3f82de5 100644 --- a/web-client/public/js/setup-handlers.js +++ b/web-client/public/js/setup-handlers.js @@ -201,7 +201,14 @@ export const setupHandlers = grnState => { scaledWidth = pdfHeight * aspectRatio; } - pdf.addImage(imgData, "PNG", 0, 0, scaledWidth, scaledHeight); + pdf.addImage( + imgData, + "PNG", + (pdfWidth - scaledWidth) / 2, + (pdfHeight - scaledHeight) / 2, + scaledWidth, + scaledHeight + ); pdf.save(name); }; From 66e075807a3ccd415cadaf75794a860c8bdfa7ae Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Wed, 6 Nov 2024 09:56:01 -0800 Subject: [PATCH 47/72] #1053 improve code quality --- web-client/public/js/graph.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/web-client/public/js/graph.js b/web-client/public/js/graph.js index 754b9e3d..d47b6d32 100644 --- a/web-client/public/js/graph.js +++ b/web-client/public/js/graph.js @@ -1101,9 +1101,7 @@ export var drawGraph = function (workbook) { average ); timePoints = result.timePoints; - return result.data && result.data.length > 0 - ? result.data - : []; + return result.data || []; } } return []; From 17b4280691d182e3e41db48229ef28e4d6d67673 Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Wed, 6 Nov 2024 10:10:58 -0800 Subject: [PATCH 48/72] #1093 rename variable, and switching to Object.assign for copying style to reexisting nodes --- web-client/public/js/setup-handlers.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/web-client/public/js/setup-handlers.js b/web-client/public/js/setup-handlers.js index deaca827..81aef80c 100644 --- a/web-client/public/js/setup-handlers.js +++ b/web-client/public/js/setup-handlers.js @@ -113,27 +113,28 @@ export const setupHandlers = grnState => { }; const explicitlySetStyle = element => { - const cSSStyleDeclarationComputed = window.getComputedStyle(element); - let computedStyleStr = ""; + const cssStyleDeclarationComputed = window.getComputedStyle(element); + const computedStyleObj = {}; - for (let i = 0; i < cSSStyleDeclarationComputed.length; i++) { - const key = cSSStyleDeclarationComputed[i]; + + for (let i = 0; i < cssStyleDeclarationComputed.length; i++) { + const key = cssStyleDeclarationComputed[i]; const value = cSSStyleDeclarationComputed.getPropertyValue(key); if (value !== emptySvgDeclarationComputed.getPropertyValue(key)) { // Don't set computed style of width and height. Makes SVG elmements disappear. if ((key !== "height") && (key !== "width")) { - computedStyleStr += `${key}:${value};`; + computedStyleObj[key] = value; } } } if (element.classList.contains("weight")) { - computedStyleStr += "visibility: hidden;"; + computedStyleObj["visibility"] = "hidden"; } - if (computedStyleStr) { - element.setAttribute("style", computedStyleStr); + if (computedStyleObj) { + Object.assign(element.style, computedStyleObj) } }; From 70d90b645c2a3f64e1de1b214fc1861c9ffba09e Mon Sep 17 00:00:00 2001 From: A'Kaia Phelps <109131321+akaiap@users.noreply.github.com> Date: Wed, 6 Nov 2024 11:45:33 -0800 Subject: [PATCH 49/72] Update node.js.yml adding necessary ubuntu package --- .github/workflows/node.js.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 1c40f616..b9d323f9 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -24,7 +24,10 @@ jobs: - name: Install dependencies for canvas run: | sudo apt-get update - sudo apt-get install -y libcairo2-dev libpango1.0-dev libjpeg-dev libgif-dev librsvg2-dev + sudo apt-get install -y software-properties-common + sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main" + sudo apt-get update + sudo apt-get install -y libcairo2-dev libpango1.0-dev libjpeg8-dev libgif-dev librsvg2-dev - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: From 927a45c3409eb2a15d9292a960b78769c8adfd0e Mon Sep 17 00:00:00 2001 From: A'Kaia Phelps <109131321+akaiap@users.noreply.github.com> Date: Wed, 6 Nov 2024 11:50:44 -0800 Subject: [PATCH 50/72] Update node.js.yml adding the replacement for libjpeg-dev --- .github/workflows/node.js.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index b9d323f9..8494e905 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -27,7 +27,7 @@ jobs: sudo apt-get install -y software-properties-common sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main" sudo apt-get update - sudo apt-get install -y libcairo2-dev libpango1.0-dev libjpeg8-dev libgif-dev librsvg2-dev + sudo apt-get install -y libcairo2-dev libpango1.0-dev libjpeg62 libgif-dev librsvg2-dev libjpeg62 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: From 1cd43f3110a7212d10c17f66c134445726216ab0 Mon Sep 17 00:00:00 2001 From: dondi Date: Wed, 6 Nov 2024 12:51:58 -0800 Subject: [PATCH 51/72] =?UTF-8?q?Experimental:=20change=20=E2=80=9Con?= =?UTF-8?q?=E2=80=9D=20event=20for=20running=20workflow.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/node.js.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 8494e905..60137021 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -5,9 +5,9 @@ name: Node.js CI on: push: - branches: [ "master" ] + branches: [ "issue-1118-github-actions" ] pull_request: - branches: [ "master" ] + branches: [ "issue-1118-github-actions" ] jobs: build: From 9de56c97d3425108a55466796f4b1b476455e387 Mon Sep 17 00:00:00 2001 From: dondi Date: Wed, 6 Nov 2024 12:58:13 -0800 Subject: [PATCH 52/72] Try eliminating branch specificity. --- .github/workflows/node.js.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 60137021..4ed11c9c 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -3,11 +3,7 @@ name: Node.js CI -on: - push: - branches: [ "issue-1118-github-actions" ] - pull_request: - branches: [ "issue-1118-github-actions" ] +on: [push] jobs: build: From b1e3afc09f504dd71a7bab5e1fc4c233e4a4663b Mon Sep 17 00:00:00 2001 From: A'Kaia Phelps Date: Wed, 13 Nov 2024 01:07:35 -0800 Subject: [PATCH 53/72] removing the 'xenial-security' repository and installing dependencies directly. --- .github/workflows/node.js.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 4ed11c9c..d0de7f18 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -20,10 +20,7 @@ jobs: - name: Install dependencies for canvas run: | sudo apt-get update - sudo apt-get install -y software-properties-common - sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main" - sudo apt-get update - sudo apt-get install -y libcairo2-dev libpango1.0-dev libjpeg62 libgif-dev librsvg2-dev libjpeg62 + sudo apt-get install -y libcairo2-dev libpango1.0-dev libjpeg62 libgif-dev librsvg2-dev - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: @@ -33,3 +30,5 @@ jobs: - run: npm ci - run: npm run build --if-present - run: npm test + + \ No newline at end of file From fba3982246e962a45b35832cef137f4ef37168f6 Mon Sep 17 00:00:00 2001 From: A'Kaia Phelps Date: Wed, 13 Nov 2024 01:18:31 -0800 Subject: [PATCH 54/72] downgrading node version to 18.x for compatibility with canvas package --- .github/workflows/node.js.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index d0de7f18..61d6b14a 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -12,7 +12,7 @@ jobs: strategy: matrix: - node-version: [20.x] + node-version: [18.x] steps: - uses: actions/checkout@v4 From 061ad532dada3c0299161eb1a27dbfcf6f371635 Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Wed, 13 Nov 2024 10:23:24 -0800 Subject: [PATCH 55/72] Fixing wrong capitlization in naming --- web-client/public/js/setup-handlers.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web-client/public/js/setup-handlers.js b/web-client/public/js/setup-handlers.js index 81aef80c..e40b4357 100644 --- a/web-client/public/js/setup-handlers.js +++ b/web-client/public/js/setup-handlers.js @@ -119,7 +119,7 @@ export const setupHandlers = grnState => { for (let i = 0; i < cssStyleDeclarationComputed.length; i++) { const key = cssStyleDeclarationComputed[i]; - const value = cSSStyleDeclarationComputed.getPropertyValue(key); + const value = cssStyleDeclarationComputed.getPropertyValue(key); if (value !== emptySvgDeclarationComputed.getPropertyValue(key)) { // Don't set computed style of width and height. Makes SVG elmements disappear. if ((key !== "height") && (key !== "width")) { From 0f3377af01af58ffc0988807674e35375c7cd39f Mon Sep 17 00:00:00 2001 From: dondi Date: Wed, 13 Nov 2024 10:39:20 -0800 Subject: [PATCH 56/72] Version bump. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 84d95654..6262b55c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grnsight", - "version": "7.1.6", + "version": "7.1.7", "description": "Web app and service for visualizing models of gene regulatory networks", "directories": { "test": "test" From ae7cb3da1d26eed9220885ee373da00de368c50a Mon Sep 17 00:00:00 2001 From: ceciliazaragoza Date: Wed, 13 Nov 2024 12:44:01 -0800 Subject: [PATCH 57/72] Issue #1142. Now warnings list should display correctly. Added line that must have accidentally deleted in previous PR --- web-client/public/js/warnings.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/web-client/public/js/warnings.js b/web-client/public/js/warnings.js index b229603b..61223d9d 100644 --- a/web-client/public/js/warnings.js +++ b/web-client/public/js/warnings.js @@ -43,6 +43,8 @@ export var displayWarnings = function (warnings) { index++; } + $("#warningsList").html(warningsString); + var screenHeight = $(window).height(); var MIN_SCREEN_HEIGHT = 600; var BORDER = 425; From 0acca885dfa5dbe0e5de12d0c3e10aa9db03f4b0 Mon Sep 17 00:00:00 2001 From: dondi Date: Fri, 15 Nov 2024 18:45:41 -0800 Subject: [PATCH 58/72] =?UTF-8?q?7.1.8=E2=80=A6when=20GRNsight=20got=20its?= =?UTF-8?q?=20CI=20groove=20back.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6262b55c..67eebd8d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grnsight", - "version": "7.1.7", + "version": "7.1.8", "description": "Web app and service for visualizing models of gene regulatory networks", "directories": { "test": "test" From 2cec36241bcb291d99bd0cceb5c5814deb3a6478 Mon Sep 17 00:00:00 2001 From: A'Kaia Phelps Date: Wed, 20 Nov 2024 00:21:07 -0800 Subject: [PATCH 59/72] Add npm lint step to GitHub Actions workflow --- .github/workflows/node.js.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 61d6b14a..35023b22 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -28,6 +28,7 @@ jobs: cache: 'npm' - run: npm ci + - run: npm run lint - run: npm run build --if-present - run: npm test From c8c22bbfc83d2c65830e0033eb56453a1f49e57e Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Wed, 20 Nov 2024 12:36:08 -0800 Subject: [PATCH 60/72] #1144 Adding code to set node-coloring enable only when having expression spreadsheet --- web-client/public/js/update-app.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/web-client/public/js/update-app.js b/web-client/public/js/update-app.js index dfb26f9e..32547c2a 100644 --- a/web-client/public/js/update-app.js +++ b/web-client/public/js/update-app.js @@ -552,14 +552,15 @@ const updateModeViews = () =>{ }; const checkWorkbookModeSettings = () => { - if (grnState.mode === NETWORK_PPI_MODE) { + const hasExpression = hasExpressionData(workbook.expression); + if (grnState.mode === NETWORK_PPI_MODE || !hasExpression) { grnState.nodeColoring.nodeColoringEnabled = false; grnState.nodeColoring.showMenu = true; grnState.colorOptimal = false; showNodeColoringMenus(); hideEdgeWeightOptions(); updateModeViews(); - } else if (grnState.mode === NETWORK_GRN_MODE) { + } else if (grnState.mode === NETWORK_GRN_MODE && hasExpression) { grnState.nodeColoring.nodeColoringEnabled = true; grnState.nodeColoring.showMenu = true; grnState.colorOptimal = true; From 05cd4bbea02b20d7a3570b0f0d1dfae28a32d5f1 Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Tue, 26 Nov 2024 17:09:17 -0800 Subject: [PATCH 61/72] #1144 fix previous commit code that didn't work, changing from workbook.expression -> grnState.workbook.expression --- web-client/public/js/update-app.js | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/web-client/public/js/update-app.js b/web-client/public/js/update-app.js index 32547c2a..85efe72f 100644 --- a/web-client/public/js/update-app.js +++ b/web-client/public/js/update-app.js @@ -512,6 +512,15 @@ const toggleLayout = (on, off) => { } }; +const hasExpressionData = (sheets) => { + for (var property in sheets) { + if (property.match(ENDS_IN_EXPRESSION_REGEXP)) { + return true; + } + } + return false; +}; + const updatetoForceGraph = () => {}; const updatetoGridLayout = () => {}; @@ -552,7 +561,8 @@ const updateModeViews = () =>{ }; const checkWorkbookModeSettings = () => { - const hasExpression = hasExpressionData(workbook.expression); + const hasExpression = hasExpressionData(grnState.workbook.expression); + if (grnState.mode === NETWORK_PPI_MODE || !hasExpression) { grnState.nodeColoring.nodeColoringEnabled = false; grnState.nodeColoring.showMenu = true; @@ -599,15 +609,6 @@ const shortenExpressionSheetName = (name) => { (name.slice(0, MAX_NUM_CHARACTERS_DROPDOWN) + "...") : name; }; -const hasExpressionData = (sheets) => { - for (var property in sheets) { - if (property.match(ENDS_IN_EXPRESSION_REGEXP)) { - return true; - } - } - return false; -}; - const updateSpeciesMenu = () => { $(SPECIES_DISPLAY).val(grnState.genePageData.species); $(SPECIES_BUTTON_CRESS + " span").removeClass("glyphicon-ok"); From eed34ff8ab625674e81a66029cd675738513e646 Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Tue, 26 Nov 2024 17:15:58 -0800 Subject: [PATCH 62/72] Clean code --- web-client/public/js/setup-handlers.js | 4 ++-- web-client/public/js/update-app.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/web-client/public/js/setup-handlers.js b/web-client/public/js/setup-handlers.js index 00937f33..9c81d86b 100644 --- a/web-client/public/js/setup-handlers.js +++ b/web-client/public/js/setup-handlers.js @@ -114,7 +114,7 @@ export const setupHandlers = grnState => { const explicitlySetStyle = element => { const cssStyleDeclarationComputed = window.getComputedStyle(element); - const computedStyleObj = {}; + const computedStyleObj = {}; for (let i = 0; i < cssStyleDeclarationComputed.length; i++) { @@ -134,7 +134,7 @@ export const setupHandlers = grnState => { } if (computedStyleObj) { - Object.assign(element.style, computedStyleObj) + Object.assign(element.style, computedStyleObj); } }; diff --git a/web-client/public/js/update-app.js b/web-client/public/js/update-app.js index 85efe72f..cbaf2018 100644 --- a/web-client/public/js/update-app.js +++ b/web-client/public/js/update-app.js @@ -570,7 +570,7 @@ const checkWorkbookModeSettings = () => { showNodeColoringMenus(); hideEdgeWeightOptions(); updateModeViews(); - } else if (grnState.mode === NETWORK_GRN_MODE && hasExpression) { + } else if (grnState.mode === NETWORK_GRN_MODE) { grnState.nodeColoring.nodeColoringEnabled = true; grnState.nodeColoring.showMenu = true; grnState.colorOptimal = true; From a712c97a143af78d97afd764766a9c83a4065904 Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Tue, 26 Nov 2024 17:43:54 -0800 Subject: [PATCH 63/72] #1030 Remove lint changes and only change the variable name --- server/dals/expression-dal.js | 4 ++-- server/dals/grnsetting-dal.js | 4 ++-- server/dals/network-dal.js | 4 ++-- server/dals/protein-dal.js | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/server/dals/expression-dal.js b/server/dals/expression-dal.js index 7176b42e..11084515 100644 --- a/server/dals/expression-dal.js +++ b/server/dals/expression-dal.js @@ -4,8 +4,8 @@ var env = process.env.NODE_ENV || "development"; var config = require("../config/config")[env]; var sequelize = new Sequelize( config.databaseName, - process.env.EXPRESSION_DB_USERNAME, - process.env.EXPRESSION_DB_PASSWORD, + process.env.DB_USERNAME, + process.env.DB_PASSWORD, { host: config.databaseHost, dialect: config.databaseDialect, diff --git a/server/dals/grnsetting-dal.js b/server/dals/grnsetting-dal.js index 2a19cdda..a5f67f75 100644 --- a/server/dals/grnsetting-dal.js +++ b/server/dals/grnsetting-dal.js @@ -4,8 +4,8 @@ var env = process.env.NODE_ENV || "development"; var config = require("../config/config")[env]; var sequelize = new Sequelize( config.databaseName, - process.env.EXPRESSION_DB_USERNAME, - process.env.EXPRESSION_DB_PASSWORD, + process.env.DB_USERNAME, + process.env.DB_PASSWORD, { host: config.databaseHost, dialect: config.databaseDialect, diff --git a/server/dals/network-dal.js b/server/dals/network-dal.js index cc2c1653..65665655 100644 --- a/server/dals/network-dal.js +++ b/server/dals/network-dal.js @@ -4,8 +4,8 @@ var env = process.env.NODE_ENV || "development"; var config = require("../config/config")[env]; var sequelize = new Sequelize( config.databaseName, - process.env.EXPRESSION_DB_USERNAME, - process.env.EXPRESSION_DB_PASSWORD, + process.env.DB_USERNAME, + process.env.DB_PASSWORD, { host: config.databaseHost, dialect: config.databaseDialect, diff --git a/server/dals/protein-dal.js b/server/dals/protein-dal.js index bfd8dd3e..47127b21 100644 --- a/server/dals/protein-dal.js +++ b/server/dals/protein-dal.js @@ -4,8 +4,8 @@ var env = process.env.NODE_ENV || "development"; var config = require("../config/config")[env]; var sequelize = new Sequelize( config.databaseName, - process.env.EXPRESSION_DB_USERNAME, - process.env.EXPRESSION_DB_PASSWORD, + process.env.DB_USERNAME, + process.env.DB_PASSWORD, { host: config.databaseHost, dialect: config.databaseDialect, From 4c5bd5019fdcecfc91fd99e2aa8c7c28c8fe2bcf Mon Sep 17 00:00:00 2001 From: dondi Date: Tue, 26 Nov 2024 22:03:06 -0800 Subject: [PATCH 64/72] Version bump for new environment variable names. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 67eebd8d..aadd93f2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grnsight", - "version": "7.1.8", + "version": "7.1.9", "description": "Web app and service for visualizing models of gene regulatory networks", "directories": { "test": "test" From ebac79b2aa24d33615f911cec6189c915c8faa13 Mon Sep 17 00:00:00 2001 From: A'Kaia Phelps Date: Thu, 28 Nov 2024 20:41:26 -0800 Subject: [PATCH 65/72] correcting trailing spaces and missing semicolon according to npm lint --- web-client/public/js/setup-handlers.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/web-client/public/js/setup-handlers.js b/web-client/public/js/setup-handlers.js index 00937f33..9c81d86b 100644 --- a/web-client/public/js/setup-handlers.js +++ b/web-client/public/js/setup-handlers.js @@ -114,7 +114,7 @@ export const setupHandlers = grnState => { const explicitlySetStyle = element => { const cssStyleDeclarationComputed = window.getComputedStyle(element); - const computedStyleObj = {}; + const computedStyleObj = {}; for (let i = 0; i < cssStyleDeclarationComputed.length; i++) { @@ -134,7 +134,7 @@ export const setupHandlers = grnState => { } if (computedStyleObj) { - Object.assign(element.style, computedStyleObj) + Object.assign(element.style, computedStyleObj); } }; From 4c847af03fea9c3b3c9aa9beeb51585799d4fc73 Mon Sep 17 00:00:00 2001 From: A'Kaia Phelps Date: Thu, 28 Nov 2024 22:08:22 -0800 Subject: [PATCH 66/72] updated package json with the canvg package 3.0.10 and added canvas 2.11.2 as a direct dependency rather than transparent. Updated node-versions for testing --- .github/workflows/node.js.yml | 2 +- package-lock.json | 753 +++++++++++++++++++--------------- package.json | 3 +- 3 files changed, 425 insertions(+), 333 deletions(-) diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml index 61d6b14a..b0517299 100644 --- a/.github/workflows/node.js.yml +++ b/.github/workflows/node.js.yml @@ -12,7 +12,7 @@ jobs: strategy: matrix: - node-version: [18.x] + node-version: [18.x, 20.x, 22.x] steps: - uses: actions/checkout@v4 diff --git a/package-lock.json b/package-lock.json index 8f911266..b03f6255 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,17 @@ { "name": "grnsight", - "version": "7.1.4", + "version": "7.1.9", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "grnsight", - "version": "7.1.4", + "version": "7.1.9", "license": "BSD-3-Clause", "dependencies": { "body-parser": "1.18.2", - "canvg": "2.0.0", + "canvas": "^2.11.2", + "canvg": "3.0.10", "cors": "2.8.1", "cytoscape": "2.7.14", "d3-v4-grid": "2.0.1", @@ -114,6 +115,22 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/runtime": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime/node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, "node_modules/@babel/types": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", @@ -127,15 +144,14 @@ } }, "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz", - "integrity": "sha512-CMGKi28CF+qlbXh26hDe6NxCd7amqeAzEqnS6IHeO6LoaKyM/n+Xw3HT1COdq8cuioOdlKdqn/hCmqPUOMOywg==", - "peer": true, + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", "dependencies": { - "detect-libc": "^1.0.3", + "detect-libc": "^2.0.0", "https-proxy-agent": "^5.0.0", "make-dir": "^3.1.0", - "node-fetch": "^2.6.5", + "node-fetch": "^2.6.7", "nopt": "^5.0.0", "npmlog": "^5.0.1", "rimraf": "^3.0.2", @@ -146,23 +162,10 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "peer": true, "dependencies": { "semver": "^6.0.0" }, @@ -174,19 +177,17 @@ } }, "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true, + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } }, "node_modules/@mapbox/node-pre-gyp/node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "peer": true, + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -206,7 +207,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "peer": true, "dependencies": { "abbrev": "1" }, @@ -221,7 +221,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "peer": true, + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dependencies": { "glob": "^7.1.3" }, @@ -233,13 +233,9 @@ } }, "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "peer": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "bin": { "semver": "bin/semver.js" }, @@ -250,19 +246,12 @@ "node_modules/@mapbox/node-pre-gyp/node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "peer": true, + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, - "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "peer": true - }, "node_modules/@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", @@ -356,6 +345,11 @@ "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "dev": true }, + "node_modules/@types/raf": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.3.tgz", + "integrity": "sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==" + }, "node_modules/abab": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", @@ -441,6 +435,7 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true, "engines": { "node": ">=0.4.0" } @@ -460,7 +455,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "peer": true, "dependencies": { "debug": "4" }, @@ -469,12 +463,11 @@ } }, "node_modules/agent-base/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "peer": true, + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -486,10 +479,9 @@ } }, "node_modules/agent-base/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "peer": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/ajv": { "version": "6.12.6", @@ -601,7 +593,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "peer": true, + "deprecated": "This package is no longer supported.", "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" @@ -611,10 +603,9 @@ } }, "node_modules/are-we-there-yet/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "peer": true, + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -641,14 +632,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "peer": true + ] }, "node_modules/are-we-there-yet/node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "peer": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -860,7 +849,8 @@ "node_modules/async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true }, "node_modules/asynckit": { "version": "0.4.0", @@ -2170,7 +2160,8 @@ "node_modules/browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true }, "node_modules/browserify-aes": { "version": "1.2.0", @@ -2519,14 +2510,13 @@ } }, "node_modules/canvas": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.9.0.tgz", - "integrity": "sha512-0l93g7uxp7rMyr7H+XRQ28A3ud0dKIUTIEkUe1Dxh4rjUYN7B93+SjC3r1PDKA18xcQN87OFGgUnyw7LSgNLSQ==", + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", + "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", "hasInstallScript": true, - "peer": true, "dependencies": { "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.15.0", + "nan": "^2.17.0", "simple-get": "^3.0.3" }, "engines": { @@ -2534,22 +2524,38 @@ } }, "node_modules/canvg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/canvg/-/canvg-2.0.0.tgz", - "integrity": "sha512-PiKa+sjzzAv8HONsBaJZRhZ3eCM5uJkpFgF0rSzcamOrdXdls81ukjNxtz7JYyxucj6WpIkZwk9j7Jku0+ivqQ==", - "dependencies": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.10.tgz", + "integrity": "sha512-qwR2FRNO9NlzTeKIPIKpnTY6fqwuYSequ8Ru8c0YkYU7U0oW+hLUvWadLvAu1Rl72OMNiFhoLu4f8eUjQ7l/+Q==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@types/raf": "^3.4.0", + "core-js": "^3.8.3", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.7", "rgbcolor": "^1.0.1", - "stackblur-canvas": "^2.0.0" + "stackblur-canvas": "^2.0.0", + "svg-pathdata": "^6.0.3" }, "engines": { - "node": "*" - }, - "peerDependencies": { - "canvas": "^2.1.0", - "jsdom": "^13.0.0", - "xmldom": "^0.1.27" + "node": ">=10.0.0" + } + }, + "node_modules/canvg/node_modules/core-js": { + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.39.0.tgz", + "integrity": "sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" } }, + "node_modules/canvg/node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, "node_modules/capture-stack-trace": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", @@ -3035,7 +3041,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "peer": true, "bin": { "color-support": "bin.js" } @@ -3128,8 +3133,7 @@ "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "peer": true + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" }, "node_modules/constantinople": { "version": "4.0.1", @@ -3816,6 +3820,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, "dependencies": { "abab": "^2.0.0", "whatwg-mimetype": "^2.2.0", @@ -3825,12 +3830,14 @@ "node_modules/data-urls/node_modules/abab": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true }, "node_modules/data-urls/node_modules/tr46": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -3838,12 +3845,14 @@ "node_modules/data-urls/node_modules/webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true }, "node_modules/data-urls/node_modules/whatwg-url": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", @@ -4014,8 +4023,7 @@ "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "peer": true + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, "node_modules/depd": { "version": "1.1.2", @@ -4070,15 +4078,11 @@ } }, "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "peer": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "engines": { - "node": ">=0.10" + "node": ">=8" } }, "node_modules/diff": { @@ -4148,6 +4152,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, "dependencies": { "webidl-conversions": "^4.0.2" } @@ -4155,7 +4160,8 @@ "node_modules/domexception/node_modules/webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true }, "node_modules/dot-prop": { "version": "4.2.1", @@ -5843,7 +5849,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -5851,6 +5856,22 @@ "node": ">= 8" } }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/fs-write-stream-atomic": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", @@ -5961,7 +5982,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "peer": true, + "deprecated": "This package is no longer supported.", "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.2", @@ -5981,7 +6002,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "peer": true, "engines": { "node": ">=8" } @@ -5990,7 +6010,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "peer": true, "engines": { "node": ">=8" } @@ -5998,8 +6017,7 @@ "node_modules/gauge/node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "peer": true, + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "engines": { "node": ">=0.10.0" } @@ -6008,7 +6026,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -6022,7 +6039,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -6661,8 +6677,7 @@ "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "peer": true + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, "node_modules/has-value": { "version": "1.0.0", @@ -6860,6 +6875,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, "dependencies": { "whatwg-encoding": "^1.0.1" } @@ -6920,10 +6936,9 @@ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "peer": true, + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dependencies": { "agent-base": "6", "debug": "4" @@ -6933,12 +6948,11 @@ } }, "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "peer": true, + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -6950,10 +6964,9 @@ } }, "node_modules/https-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "peer": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/human-signals": { "version": "1.1.1", @@ -8243,6 +8256,7 @@ "version": "13.2.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-13.2.0.tgz", "integrity": "sha512-cG1NtMWO9hWpqRNRR3dSvEQa8bFI6iLlqU2x4kwX51FQjp0qus8T9aBaAO6iGp3DeBrhdwuKxckknohkmfvsFw==", + "dev": true, "dependencies": { "abab": "^2.0.0", "acorn": "^6.0.4", @@ -8278,12 +8292,14 @@ "node_modules/jsdom/node_modules/abab": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true }, "node_modules/jsdom/node_modules/acorn": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -8295,6 +8311,7 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "dev": true, "dependencies": { "acorn": "^6.0.1", "acorn-walk": "^6.0.1" @@ -8304,6 +8321,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "dev": true, "dependencies": { "cssom": "0.3.x" } @@ -8311,12 +8329,14 @@ "node_modules/jsdom/node_modules/parse5": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "dev": true }, "node_modules/jsdom/node_modules/qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, "engines": { "node": ">=0.6" } @@ -8326,6 +8346,7 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dev": true, "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -8356,6 +8377,7 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, "funding": [ { "type": "github", @@ -8375,6 +8397,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -8382,12 +8405,14 @@ "node_modules/jsdom/node_modules/webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true }, "node_modules/jsdom/node_modules/whatwg-url": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", @@ -8397,7 +8422,8 @@ "node_modules/jsdom/node_modules/xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true }, "node_modules/jsesc": { "version": "0.5.0", @@ -9146,7 +9172,8 @@ "node_modules/lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true }, "node_modules/lodash.template": { "version": "4.5.0", @@ -9812,28 +9839,17 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "node_modules/minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "engines": { "node": ">=8" } }, - "node_modules/minipass/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "peer": true - }, "node_modules/minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "peer": true, "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -9842,11 +9858,21 @@ "node": ">= 8" } }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/minizlib/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "peer": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/mississippi": { "version": "2.0.0", @@ -10235,9 +10261,9 @@ "dev": true }, "node_modules/nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", + "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==" }, "node_modules/nanomatch": { "version": "1.2.13", @@ -10711,7 +10737,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "peer": true, + "deprecated": "This package is no longer supported.", "dependencies": { "are-we-there-yet": "^2.0.0", "console-control-strings": "^1.1.0", @@ -10736,7 +10762,8 @@ "node_modules/nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true }, "node_modules/oauth-sign": { "version": "0.9.0", @@ -11697,7 +11724,8 @@ "node_modules/pn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true }, "node_modules/posix-character-classes": { "version": "0.1.1", @@ -12124,6 +12152,14 @@ "node": ">=0.4.x" } }, + "node_modules/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dependencies": { + "performance-now": "^2.1.0" + } + }, "node_modules/random-bytes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", @@ -12667,6 +12703,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, "dependencies": { "lodash": "^4.17.19" }, @@ -12682,6 +12719,7 @@ "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "dev": true, "dependencies": { "request-promise-core": "1.1.4", "stealthy-require": "^1.1.1", @@ -13062,6 +13100,7 @@ "version": "3.1.11", "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "dev": true, "dependencies": { "xmlchars": "^2.1.1" }, @@ -13453,14 +13492,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "peer": true + ] }, "node_modules/simple-get": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", - "peer": true, "dependencies": { "decompress-response": "^4.2.0", "once": "^1.3.1", @@ -13471,7 +13508,6 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "peer": true, "dependencies": { "mimic-response": "^2.0.0" }, @@ -13483,7 +13519,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "peer": true, "engines": { "node": ">=8" }, @@ -13933,6 +13968,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -14340,6 +14376,14 @@ "node": ">=4" } }, + "node_modules/svg-pathdata": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz", + "integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/symbol-observable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", @@ -14451,27 +14495,25 @@ } }, "node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "peer": true, + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, "engines": { - "node": ">= 10" + "node": ">=10" } }, "node_modules/tar/node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "peer": true, "engines": { "node": ">=10" } @@ -14479,8 +14521,7 @@ "node_modules/tar/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "peer": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/temp": { "version": "0.8.4", @@ -15244,6 +15285,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, "dependencies": { "browser-process-hrtime": "^1.0.0" } @@ -15252,6 +15294,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.0.1.tgz", "integrity": "sha512-XZGI1OH/OLQr/NaJhhPmzhngwcAnZDLytsvXnRmlYeRkmbb0I7sqFFA22erq4WQR0sUu17ZSQOAV9mFwCqKRNg==", + "dev": true, "dependencies": { "domexception": "^1.0.1", "webidl-conversions": "^4.0.2", @@ -15261,12 +15304,14 @@ "node_modules/w3c-xmlserializer/node_modules/webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true }, "node_modules/w3c-xmlserializer/node_modules/xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true }, "node_modules/watchpack": { "version": "1.7.5", @@ -15951,6 +15996,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, "dependencies": { "iconv-lite": "0.4.24" } @@ -15959,6 +16005,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -15975,7 +16022,8 @@ "node_modules/whatwg-mimetype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true }, "node_modules/whatwg-url": { "version": "2.0.1", @@ -16007,7 +16055,6 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "peer": true, "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } @@ -16245,6 +16292,7 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, "dependencies": { "async-limiter": "~1.0.0" } @@ -16313,7 +16361,8 @@ "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true }, "node_modules/xmldom": { "version": "0.1.31", @@ -17805,6 +17854,21 @@ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.4.tgz", "integrity": "sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==" }, + "@babel/runtime": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", + "requires": { + "regenerator-runtime": "^0.14.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + } + } + }, "@babel/types": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", @@ -17815,15 +17879,14 @@ } }, "@mapbox/node-pre-gyp": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz", - "integrity": "sha512-CMGKi28CF+qlbXh26hDe6NxCd7amqeAzEqnS6IHeO6LoaKyM/n+Xw3HT1COdq8cuioOdlKdqn/hCmqPUOMOywg==", - "peer": true, + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", "requires": { - "detect-libc": "^1.0.3", + "detect-libc": "^2.0.0", "https-proxy-agent": "^5.0.0", "make-dir": "^3.1.0", - "node-fetch": "^2.6.5", + "node-fetch": "^2.6.7", "nopt": "^5.0.0", "npmlog": "^5.0.1", "rimraf": "^3.0.2", @@ -17831,37 +17894,25 @@ "tar": "^6.1.11" }, "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "peer": true, - "requires": { - "yallist": "^4.0.0" - } - }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "peer": true, "requires": { "semver": "^6.0.0" }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "peer": true + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "peer": true, + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "requires": { "whatwg-url": "^5.0.0" } @@ -17870,7 +17921,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", - "peer": true, "requires": { "abbrev": "1" } @@ -17879,35 +17929,23 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "peer": true, "requires": { "glob": "^7.1.3" } }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "peer": true, - "requires": { - "lru-cache": "^6.0.0" - } + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" }, "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "peer": true, + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "requires": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "peer": true } } }, @@ -17995,6 +18033,11 @@ "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "dev": true }, + "@types/raf": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.3.tgz", + "integrity": "sha512-c4YAvMedbPZ5tEyxzQdMoOhhJ4RD3rngZIdwC2/qDN3d7JpEhB6fiBRKVY1lg5B7Wk+uPBjn5f39j1/2MY1oOw==" + }, "abab": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", @@ -18062,7 +18105,8 @@ "acorn-walk": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", - "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==" + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true }, "adler-32": { "version": "1.3.0", @@ -18076,25 +18120,22 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "peer": true, "requires": { "debug": "4" }, "dependencies": { "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "peer": true, + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "requires": { - "ms": "2.1.2" + "ms": "^2.1.3" } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "peer": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, @@ -18186,17 +18227,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", - "peer": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" }, "dependencies": { "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "peer": true, + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -18206,14 +18245,12 @@ "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "peer": true + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "peer": true, "requires": { "safe-buffer": "~5.2.0" } @@ -18392,7 +18429,8 @@ "async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true }, "asynckit": { "version": "0.4.0", @@ -19593,7 +19631,8 @@ "browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true }, "browserify-aes": { "version": "1.2.0", @@ -19888,23 +19927,40 @@ } }, "canvas": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.9.0.tgz", - "integrity": "sha512-0l93g7uxp7rMyr7H+XRQ28A3ud0dKIUTIEkUe1Dxh4rjUYN7B93+SjC3r1PDKA18xcQN87OFGgUnyw7LSgNLSQ==", - "peer": true, + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.11.2.tgz", + "integrity": "sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==", "requires": { "@mapbox/node-pre-gyp": "^1.0.0", - "nan": "^2.15.0", + "nan": "^2.17.0", "simple-get": "^3.0.3" } }, "canvg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/canvg/-/canvg-2.0.0.tgz", - "integrity": "sha512-PiKa+sjzzAv8HONsBaJZRhZ3eCM5uJkpFgF0rSzcamOrdXdls81ukjNxtz7JYyxucj6WpIkZwk9j7Jku0+ivqQ==", - "requires": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/canvg/-/canvg-3.0.10.tgz", + "integrity": "sha512-qwR2FRNO9NlzTeKIPIKpnTY6fqwuYSequ8Ru8c0YkYU7U0oW+hLUvWadLvAu1Rl72OMNiFhoLu4f8eUjQ7l/+Q==", + "requires": { + "@babel/runtime": "^7.12.5", + "@types/raf": "^3.4.0", + "core-js": "^3.8.3", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.7", "rgbcolor": "^1.0.1", - "stackblur-canvas": "^2.0.0" + "stackblur-canvas": "^2.0.0", + "svg-pathdata": "^6.0.3" + }, + "dependencies": { + "core-js": { + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.39.0.tgz", + "integrity": "sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==" + }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + } } }, "capture-stack-trace": { @@ -20306,8 +20362,7 @@ "color-support": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "peer": true + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" }, "colors": { "version": "0.6.2", @@ -20382,8 +20437,7 @@ "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "peer": true + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" }, "constantinople": { "version": "4.0.1", @@ -20944,6 +20998,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, "requires": { "abab": "^2.0.0", "whatwg-mimetype": "^2.2.0", @@ -20953,12 +21008,14 @@ "abab": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true }, "tr46": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, "requires": { "punycode": "^2.1.0" } @@ -20966,12 +21023,14 @@ "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true }, "whatwg-url": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, "requires": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", @@ -21107,8 +21166,7 @@ "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "peer": true + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, "depd": { "version": "1.1.2", @@ -21156,10 +21214,9 @@ } }, "detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", - "peer": true + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==" }, "diff": { "version": "1.4.0", @@ -21217,6 +21274,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, "requires": { "webidl-conversions": "^4.0.2" }, @@ -21224,7 +21282,8 @@ "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true } } }, @@ -22645,9 +22704,23 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "peer": true, "requires": { "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } } }, "fs-write-stream-atomic": { @@ -22733,7 +22806,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", - "peer": true, "requires": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.2", @@ -22749,26 +22821,22 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "peer": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "peer": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "peer": true + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "peer": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -22779,7 +22847,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "peer": true, "requires": { "ansi-regex": "^5.0.1" } @@ -23270,8 +23337,7 @@ "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "peer": true + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, "has-value": { "version": "1.0.0", @@ -23422,6 +23488,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, "requires": { "whatwg-encoding": "^1.0.1" } @@ -23472,29 +23539,26 @@ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" }, "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", - "peer": true, + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "requires": { "agent-base": "6", "debug": "4" }, "dependencies": { "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "peer": true, + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "requires": { - "ms": "2.1.2" + "ms": "^2.1.3" } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "peer": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, @@ -24473,6 +24537,7 @@ "version": "13.2.0", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-13.2.0.tgz", "integrity": "sha512-cG1NtMWO9hWpqRNRR3dSvEQa8bFI6iLlqU2x4kwX51FQjp0qus8T9aBaAO6iGp3DeBrhdwuKxckknohkmfvsFw==", + "dev": true, "requires": { "abab": "^2.0.0", "acorn": "^6.0.4", @@ -24505,17 +24570,20 @@ "abab": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", - "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true }, "acorn": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true }, "acorn-globals": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "dev": true, "requires": { "acorn": "^6.0.1", "acorn-walk": "^6.0.1" @@ -24525,6 +24593,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", + "dev": true, "requires": { "cssom": "0.3.x" } @@ -24532,17 +24601,20 @@ "parse5": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==" + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "dev": true }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -24569,12 +24641,14 @@ "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true }, "tr46": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, "requires": { "punycode": "^2.1.0" } @@ -24582,12 +24656,14 @@ "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true }, "whatwg-url": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dev": true, "requires": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", @@ -24597,7 +24673,8 @@ "xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true } } }, @@ -25215,7 +25292,8 @@ "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true }, "lodash.template": { "version": "4.5.0", @@ -25745,37 +25823,31 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "minipass": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", - "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "peer": true, - "requires": { - "yallist": "^4.0.0" - }, - "dependencies": { - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "peer": true - } - } + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==" }, "minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "peer": true, "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" }, "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "peer": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -26086,9 +26158,9 @@ "dev": true }, "nan": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", + "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==" }, "nanomatch": { "version": "1.2.13", @@ -26491,7 +26563,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", - "peer": true, "requires": { "are-we-there-yet": "^2.0.0", "console-control-strings": "^1.1.0", @@ -26513,7 +26584,8 @@ "nwsapi": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", - "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true }, "oauth-sign": { "version": "0.9.0", @@ -27256,7 +27328,8 @@ "pn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true }, "posix-character-classes": { "version": "0.1.1", @@ -27596,6 +27669,14 @@ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" }, + "raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "requires": { + "performance-now": "^2.1.0" + } + }, "random-bytes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", @@ -28141,6 +28222,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, "requires": { "lodash": "^4.17.19" } @@ -28149,6 +28231,7 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dev": true, "requires": { "request-promise-core": "1.1.4", "stealthy-require": "^1.1.1", @@ -28348,6 +28431,7 @@ "version": "3.1.11", "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz", "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==", + "dev": true, "requires": { "xmlchars": "^2.1.1" } @@ -28657,14 +28741,12 @@ "simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "peer": true + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" }, "simple-get": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", - "peer": true, "requires": { "decompress-response": "^4.2.0", "once": "^1.3.1", @@ -28675,7 +28757,6 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "peer": true, "requires": { "mimic-response": "^2.0.0" } @@ -28683,8 +28764,7 @@ "mimic-response": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "peer": true + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" } } }, @@ -29037,7 +29117,8 @@ "stealthy-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true }, "stream-browserify": { "version": "2.0.2", @@ -29393,6 +29474,11 @@ "has-flag": "^3.0.0" } }, + "svg-pathdata": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/svg-pathdata/-/svg-pathdata-6.0.3.tgz", + "integrity": "sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==" + }, "symbol-observable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", @@ -29483,14 +29569,13 @@ "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" }, "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "peer": true, + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" @@ -29499,14 +29584,12 @@ "chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "peer": true + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "peer": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -30123,6 +30206,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, "requires": { "browser-process-hrtime": "^1.0.0" } @@ -30131,6 +30215,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.0.1.tgz", "integrity": "sha512-XZGI1OH/OLQr/NaJhhPmzhngwcAnZDLytsvXnRmlYeRkmbb0I7sqFFA22erq4WQR0sUu17ZSQOAV9mFwCqKRNg==", + "dev": true, "requires": { "domexception": "^1.0.1", "webidl-conversions": "^4.0.2", @@ -30140,12 +30225,14 @@ "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true }, "xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true } } }, @@ -30688,6 +30775,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, "requires": { "iconv-lite": "0.4.24" }, @@ -30696,6 +30784,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -30711,7 +30800,8 @@ "whatwg-mimetype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true }, "whatwg-url": { "version": "2.0.1", @@ -30740,7 +30830,6 @@ "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "peer": true, "requires": { "string-width": "^1.0.2 || 2 || 3 || 4" } @@ -30933,6 +31022,7 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dev": true, "requires": { "async-limiter": "~1.0.0" } @@ -30988,7 +31078,8 @@ "xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true }, "xmldom": { "version": "0.1.31", diff --git a/package.json b/package.json index aadd93f2..07cc7e18 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ }, "dependencies": { "body-parser": "1.18.2", - "canvg": "2.0.0", + "canvas": "^2.11.2", + "canvg": "3.0.10", "cors": "2.8.1", "cytoscape": "2.7.14", "d3-v4-grid": "2.0.1", From 301576243a67263e914611af6ab0121b1de311bb Mon Sep 17 00:00:00 2001 From: A'Kaia Phelps Date: Fri, 29 Nov 2024 12:08:23 -0800 Subject: [PATCH 67/72] adding Node.js CI badge to README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0691c9c1..55ab02da 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ GRNsight [![DOI](https://zenodo.org/badge/16195791.svg)](https://zenodo.org/badge/latestdoi/16195791) [![Build Status](https://app.travis-ci.com/dondi/GRNsight.svg?branch=master)](https://app.travis-ci.com/dondi/GRNsight) [![Coverage Status](https://coveralls.io/repos/github/dondi/GRNsight/badge.svg?branch=master)](https://coveralls.io/github/dondi/GRNsight?branch=master) +[![Node.js CI](https://github.com/dondi/GRNsight/actions/workflows/node.js.yml/badge.svg)](https://github.com/dondi/GRNsight/actions/workflows/node.js.yml) http://dondi.github.io/GRNsight/ From e94143abfbb1bc81b47d0bc5c37d7b0dc8959402 Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Fri, 29 Nov 2024 23:16:09 -0800 Subject: [PATCH 68/72] Rewrite hasExpressionData function to use -some- call --- web-client/public/js/graph.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/web-client/public/js/graph.js b/web-client/public/js/graph.js index d47b6d32..771cb188 100644 --- a/web-client/public/js/graph.js +++ b/web-client/public/js/graph.js @@ -1235,12 +1235,7 @@ export var drawGraph = function (workbook) { }; const hasExpressionData = sheets => { - for (var property in sheets) { - if (property.match(ENDS_IN_EXPRESSION_REGEXP)) { - return true; - } - } - return false; + return Object.keys(sheets).some(property => property.match(ENDS_IN_EXPRESSION_REGEXP)); }; if (!$.isEmptyObject(workbook.expression) && hasExpressionData(workbook.expression) && From ad231027cfb0835edde26edfe53c1b819589d0ef Mon Sep 17 00:00:00 2001 From: dondi Date: Tue, 3 Dec 2024 22:35:44 -0800 Subject: [PATCH 69/72] =?UTF-8?q?Version=20bump=E2=80=94this=20one=20only?= =?UTF-8?q?=20has=20CI=20changes.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 07cc7e18..dbceca68 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grnsight", - "version": "7.1.9", + "version": "7.1.10", "description": "Web app and service for visualizing models of gene regulatory networks", "directories": { "test": "test" From d071741ab9dbc029d4c69a038d266e7a8af94b8b Mon Sep 17 00:00:00 2001 From: ntran18 <108908370+ntran18@users.noreply.github.com> Date: Tue, 3 Dec 2024 23:09:19 -0800 Subject: [PATCH 70/72] Remove one hasExpressionData function --- web-client/public/js/graph.js | 5 +---- web-client/public/js/update-app.js | 9 ++------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/web-client/public/js/graph.js b/web-client/public/js/graph.js index 771cb188..ea128d97 100644 --- a/web-client/public/js/graph.js +++ b/web-client/public/js/graph.js @@ -5,6 +5,7 @@ import { modifyLinkDistanceParameter, valueValidator, adjustGeneNameForExpression, + hasExpressionData, } from "./update-app"; import { ENDS_IN_EXPRESSION_REGEXP, @@ -1234,10 +1235,6 @@ export var drawGraph = function (workbook) { } }; - const hasExpressionData = sheets => { - return Object.keys(sheets).some(property => property.match(ENDS_IN_EXPRESSION_REGEXP)); - }; - if (!$.isEmptyObject(workbook.expression) && hasExpressionData(workbook.expression) && grnState.nodeColoring.topDataset !== undefined) { updaters.renderNodeColoring(); diff --git a/web-client/public/js/update-app.js b/web-client/public/js/update-app.js index cbaf2018..abb76750 100644 --- a/web-client/public/js/update-app.js +++ b/web-client/public/js/update-app.js @@ -512,13 +512,8 @@ const toggleLayout = (on, off) => { } }; -const hasExpressionData = (sheets) => { - for (var property in sheets) { - if (property.match(ENDS_IN_EXPRESSION_REGEXP)) { - return true; - } - } - return false; +export const hasExpressionData = (sheets) => { + return Object.keys(sheets).some(property => property.match(ENDS_IN_EXPRESSION_REGEXP)); }; const updatetoForceGraph = () => {}; From cfa34078bf6f4e00180b850c6efb7f3748606382 Mon Sep 17 00:00:00 2001 From: dondi Date: Wed, 4 Dec 2024 11:18:31 -0800 Subject: [PATCH 71/72] #1144 Remove unused import. --- web-client/public/js/graph.js | 1 - 1 file changed, 1 deletion(-) diff --git a/web-client/public/js/graph.js b/web-client/public/js/graph.js index ea128d97..cc844469 100644 --- a/web-client/public/js/graph.js +++ b/web-client/public/js/graph.js @@ -8,7 +8,6 @@ import { hasExpressionData, } from "./update-app"; import { - ENDS_IN_EXPRESSION_REGEXP, VIEWPORT_FIT, ZOOM_INPUT, ZOOM_PERCENT, From afc94dd2fa4100ab530700f7f9cdb4b34a372d27 Mon Sep 17 00:00:00 2001 From: dondi Date: Wed, 4 Dec 2024 11:21:46 -0800 Subject: [PATCH 72/72] Version bump to include #1144 fix. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index dbceca68..6675de48 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "grnsight", - "version": "7.1.10", + "version": "7.1.11", "description": "Web app and service for visualizing models of gene regulatory networks", "directories": { "test": "test"