From 67858a4df6814118469bf962ee8bfbad81ab46ab Mon Sep 17 00:00:00 2001 From: Jordan McClintock Date: Wed, 23 Feb 2022 12:57:24 -0600 Subject: [PATCH 1/6] - Added vertical flow view - Made vertical flow view default to on - Changed default grid size to 10 --- .../editor-client/locales/en-US/editor.json | 4 +- .../editor-client/src/js/ui/palette.js | 11 +- .../editor-client/src/js/ui/userSettings.js | 5 +- .../@node-red/editor-client/src/js/ui/view.js | 188 +++++++++++++++--- 4 files changed, 176 insertions(+), 32 deletions(-) diff --git a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json index 1ab148217..349812ade 100755 --- a/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json +++ b/packages/node_modules/@node-red/editor-client/locales/en-US/editor.json @@ -1,4 +1,5 @@ { + "_comment" : "2022 Modification Copyright - Defense Unicorns", "common": { "label": { "name": "Name", @@ -86,7 +87,8 @@ "rtl": "Right-to-left", "auto": "Contextual", "language": "Language", - "browserDefault": "Browser default" + "browserDefault": "Browser default", + "flowVertical": "Vertical flow" }, "sidebar": { "show": "Show sidebar" diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js index 09f4758f1..2e1f9ad78 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/palette.js @@ -14,6 +14,8 @@ * limitations under the License. **/ +// 2022 Modification Copyright - Defense Unicorns + RED.palette = (function() { var exclusion = ['config','unknown','deprecated']; @@ -147,7 +149,14 @@ RED.palette = (function() { var labelElement = el.find(".red-ui-palette-label"); labelElement.html(lines).attr('dir', RED.text.bidi.resolveBaseTextDir(lines)); - el.find(".red-ui-palette-port").css({top:(multiLineNodeHeight/2-5)+"px"}); + if (RED.view.vertical()) { + el.find(".red-ui-palette-port").css({top:(multiLineNodeHeight/2-5)+"px", left: "55px"}); + el.find(".red-ui-palette-port-output").css({top:(multiLineNodeHeight-5)+"px", right: "55px"}); + el.find(".red-ui-palette-port-input").css({top: "-5px"}); + }else{ + el.find(".red-ui-palette-port").css({top:(multiLineNodeHeight/2-5)+"px"}); + // el.find(".palette_port_output").css({top:(multiLineNodeHeight/2-5)+"px", right: "-6px", left: "auto"}); + } var popOverContent; try { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/userSettings.js b/packages/node_modules/@node-red/editor-client/src/js/ui/userSettings.js index 1b61f396e..9befbd717 100644 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/userSettings.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/userSettings.js @@ -14,6 +14,8 @@ * limitations under the License. **/ +// 2022 Modification Copyright - Defense Unicorns + RED.userSettings = (function() { var trayWidth = 700; @@ -133,7 +135,8 @@ RED.userSettings = (function() { options: [ {setting:"view-show-grid",oldSetting:"menu-menu-item-view-show-grid",label:"menu.label.view.showGrid", default: true, toggle:true,onchange:"core:toggle-show-grid"}, {setting:"view-snap-grid",oldSetting:"menu-menu-item-view-snap-grid",label:"menu.label.view.snapGrid", default: true, toggle:true,onchange:"core:toggle-snap-grid"}, - {setting:"view-grid-size",label:"menu.label.view.gridSize",type:"number",default: 20, onchange:RED.view.gridSize} + {setting:"view-grid-size",label:"menu.label.view.gridSize",type:"number",default: 10, onchange:RED.view.gridSize}, + {setting:"view-flow-vertical",label:"menu.label.view.flowVertical",toggle:true,default:true,onchange:RED.view.vertical} ] }, { diff --git a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js index 5b9285152..72f0eed0a 100755 --- a/packages/node_modules/@node-red/editor-client/src/js/ui/view.js +++ b/packages/node_modules/@node-red/editor-client/src/js/ui/view.js @@ -14,6 +14,7 @@ * limitations under the License. **/ +// 2022 Modification Copyright - Defense Unicorns /*
#red-ui-workspace-chart * \- "outer" @@ -28,7 +29,7 @@ * |- "nodeLayer" */ -RED.view = (function() { + RED.view = (function() { var space_width = 5000, space_height = 5000, lineCurveScale = 0.75, @@ -47,6 +48,7 @@ RED.view = (function() { var gridSize = 20; var snapGrid = false; + var vertical = false; var activeSpliceLink; var spliceActive = false; @@ -927,6 +929,75 @@ RED.view = (function() { } } + function generateLinkPathV(origX,origY, destX, destY, sc) { + var dy = destY-origY; + var dx = destX-origX; + var delta = Math.sqrt(dy*dy+dx*dx); + var scale = lineCurveScale; + var scaleX = 0; + if (dy*sc > 0) { + if (delta < node_height) { + scale = 0.75-0.75*((node_height-delta)/node_height); + // scale += 2*(Math.min(5*node_height,Math.abs(dx))/(5*node_height)); + // if (Math.abs(dy) < 3*node_height) { + // scaleY = ((dy>0)?0.5:-0.5)*(((3*node_height)-Math.abs(dy))/(3*node_height))*(Math.min(node_height,Math.abs(dx))/(node_height)) ; + // } + } + } else { + scale = 0.4-0.2*(Math.max(0,(node_height-Math.min(Math.abs(dx),Math.abs(dy)))/node_height)); + } + if (dy*sc > 0) { + return "M "+origX+" "+origY+ + " C "+(origX+(node_width*scaleX))+" "+(origY+sc*scale*node_height)+" "+ + (destX-(node_width*scaleX))+" "+(destY-sc*scale*node_height)+" "+ + destX+" "+destY + } else { + + var midX = Math.floor(destX-dx/2); + var midY = Math.floor(destY-dy/2); + // + if (dx === 0) { + midX = destX + node_width; + } + var cp_width = node_width/2; + var x1 = (destX + midX)/2; + var topX = dx>0? Math.min(x1 - dx/2 , origX+cp_width) : Math.max(x1 - dx/2 , origX-cp_width); + var topY = origY + sc*node_height*scale; + var bottomX = dx>0?Math.max(x1, destX-cp_width):Math.min(x1, destX+cp_width); + var bottomY = destY - sc*node_height*scale; + var y1 = (origY+topY)/2; + var scx = dx>0?1:-1; + var cp = [ + [origX,y1], + [dx>0 ? Math.max(origX, topX-cp_width) : Math.min(origX, topX+cp_width), topY], + [dx>0 ? Math.max(midX, topX-cp_width) : Math.min(midX, topX-cp_width), y1], + [dx>0 ? Math.max(midX, bottomX-cp_width): Math.min(midX, bottomX+cp_width), bottomY], + [destX,(destY+bottomY)/2] + ]; + if (cp[2][0] === topX+scx*cp_width) { + if (Math.abs(dx) < cp_width*10) { + cp[1][0] = topX-scx*cp_width/2; + cp[3][0] = bottomX-scx*cp_width/2; + } + cp[2][1] = topY; + } + return "M "+origX+" "+origY+ + " C "+ + cp[0][0]+" "+cp[0][1]+" "+ + cp[1][0]+" "+cp[1][1]+" "+ + topX+" "+topY+ + " S "+ + cp[2][0]+" "+cp[2][1]+" "+ + midX+" "+midY+ + " S "+ + cp[3][0]+" "+cp[3][1]+" "+ + bottomX+" "+bottomY+ + " S "+ + cp[4][0]+" "+cp[4][1]+" "+ + destX+" "+destY + } + } + function addNode(type,x,y) { var m = /^subflow:(.+)$/.exec(type); @@ -976,8 +1047,13 @@ RED.view = (function() { nn.changed = true; nn.moved = true; - nn.w = node_width; - nn.h = Math.max(node_height,(nn.outputs||0) * 15); + if (vertical) { + nn.w = Math.max(node_width,(nn.outputs||0) * 15); + nn.h = node_height; + } else { + nn.w = node_width; + nn.h = Math.max(node_height,(nn.outputs||0) * 15); + } nn.resize = true; var historyEvent = { @@ -1143,9 +1219,17 @@ RED.view = (function() { } var numOutputs = (quickAddLink.portType === PORT_TYPE_OUTPUT)?(quickAddLink.node.outputs || 1):1; var sourcePort = quickAddLink.port; - var portY = -((numOutputs-1)/2)*13 +13*sourcePort; + if (vertical) { + var portX = -((numOutputs-1)/2)*13 +13*sourcePort; + } else { + var portY = -((numOutputs-1)/2)*13 +13*sourcePort; + } var sc = (quickAddLink.portType === PORT_TYPE_OUTPUT)?1:-1; - quickAddLink.el.attr("d",generateLinkPath(quickAddLink.node.x+sc*quickAddLink.node.w/2,quickAddLink.node.y+portY,point[0]-sc*node_width/2,point[1],sc)); + if (vertical) { + quickAddLink.el.attr("d",generateLinkPathV(quickAddLink.node.x+portX,quickAddLink.node.y+sc*quickAddLink.node.h/2,point[0]-sc*node_width/2,point[1],sc)); + }else{ + quickAddLink.el.attr("d",generateLinkPath(quickAddLink.node.x+sc*quickAddLink.node.w/2,quickAddLink.node.y+portY,point[0]-sc*node_width/2,point[1],sc)); + } } if (quickAddLink) { rebuildQuickAddLink(); @@ -1554,10 +1638,18 @@ RED.view = (function() { var drag_line = drag_lines[i]; var numOutputs = (drag_line.portType === PORT_TYPE_OUTPUT)?(drag_line.node.outputs || 1):1; var sourcePort = drag_line.port; - var portY = -((numOutputs-1)/2)*13 +13*sourcePort; + if (vertical) { + var portX = -((numOutputs-1)/2)*13 +13*sourcePort; + } else { + var portY = -((numOutputs-1)/2)*13 +13*sourcePort; + } var sc = (drag_line.portType === PORT_TYPE_OUTPUT)?1:-1; - drag_line.el.attr("d",generateLinkPath(drag_line.node.x+sc*drag_line.node.w/2,drag_line.node.y+portY,mousePos[0],mousePos[1],sc)); + if (vertical) { + drag_line.el.attr("d",generateLinkPathV(drag_line.node.x+portX,drag_line.node.y+sc*drag_line.node.h/2,mousePos[0],mousePos[1],sc)); + } else { + drag_line.el.attr("d",generateLinkPath(drag_line.node.x+sc*drag_line.node.w/2,drag_line.node.y+portY,mousePos[0],mousePos[1],sc)); + } } d3.event.preventDefault(); } else if (mouse_mode == RED.state.MOVING) { @@ -4051,8 +4143,9 @@ RED.view = (function() { node[0][0].__textGroup__ = text; nodeContents.append(text); + var attr_output_translate = (vertical) ? 'translate(15,-5)' : 'translate(-5,15)'; var portEl = document.createElementNS("http://www.w3.org/2000/svg","g"); - portEl.setAttribute('transform','translate(-5,15)') + portEl.setAttribute('transform',attr_output_translate) var port = document.createElementNS("http://www.w3.org/2000/svg","rect"); port.setAttribute("class","red-ui-flow-port"); @@ -4090,7 +4183,8 @@ RED.view = (function() { .on("touchstart",nodeTouchStart) .on("touchend", nodeTouchEnd); - inGroup.append("g").attr('transform','translate(35,15)').append("rect").attr("class","red-ui-flow-port").attr("rx",3).attr("ry",3).attr("width",10).attr("height",10) + var attr_input_translate = (vertical) ? 'translate(15,35)' : 'translate(35,15)'; + inGroup.append("g").attr('transform',attr_input_translate).append("rect").attr("class","red-ui-flow-port").attr("rx",3).attr("ry",3).attr("width",10).attr("height",10) .on("mousedown", function(d,i){portMouseDown(d,PORT_TYPE_OUTPUT,i);} ) .on("touchstart", function(d,i){portMouseDown(d,PORT_TYPE_OUTPUT,i);d3.event.preventDefault();} ) .on("mouseup", function(d,i){portMouseUp(d,PORT_TYPE_OUTPUT,i);}) @@ -4115,7 +4209,8 @@ RED.view = (function() { .on("touchstart",nodeTouchStart) .on("touchend", nodeTouchEnd); - statusGroup.append("g").attr('transform','translate(-5,15)').append("rect").attr("class","red-ui-flow-port").attr("rx",3).attr("ry",3).attr("width",10).attr("height",10) + var attr_status_translate = (vertical) ? 'translate(15,-5)' : 'translate(-5,15)'; + statusGroup.append("g").attr('transform',attr_status_translate).append("rect").attr("class","red-ui-flow-port").attr("rx",3).attr("ry",3).attr("width",10).attr("height",10) .on("mousedown", function(d,i){portMouseDown(d,PORT_TYPE_INPUT,0);} ) .on("touchstart", function(d,i){portMouseDown(d,PORT_TYPE_INPUT,0);d3.event.preventDefault();} ) .on("mouseup", function(d,i){portMouseUp(d,PORT_TYPE_INPUT,0);}) @@ -4432,7 +4527,11 @@ RED.view = (function() { if (hideLabel) { d.w = node_height; } else { - d.w = Math.max(node_width,20*(Math.ceil((labelParts.width+50+(d._def.inputs>0?7:0))/20)) ); + if (vertical) { + d.w = Math.max(node_width,20*(Math.ceil((labelParts.width+50+(d._def.inputs>0?7:0))/20)),(d.outputs||0) * 15 ); + }else{ + d.w = Math.max(node_width,20*(Math.ceil((labelParts.width+50+(d._def.inputs>0?7:0))/20)) ); + } } if (ow !== undefined) { d.x += (d.w-ow)/2; @@ -4527,7 +4626,7 @@ RED.view = (function() { if (d.type === "link in") { inputGroupPorts = inputGroup.append("circle") - .attr("cx",-1).attr("cy",5) + .attr("cx",vertical ? 5 : -1).attr("cy",vertical ? -1 : 5) .attr("r",5) .attr("class","red-ui-flow-port red-ui-flow-link-port") } else { @@ -4553,7 +4652,11 @@ RED.view = (function() { numOutputs = 0; } } - var y = (d.h/2)-((numOutputs-1)/2)*13; + if (vertical) { + var x = (d.w/2)-((numOutputs-1)/2)*13; + }else{ + var y = (d.h/2)-((numOutputs-1)/2)*13; + } // Remove extra ports while (this.__outputs__.length > numOutputs) { @@ -4575,8 +4678,8 @@ RED.view = (function() { var portPort; if (d.type === "link out") { portPort = document.createElementNS("http://www.w3.org/2000/svg","circle"); - portPort.setAttribute("cx",11); - portPort.setAttribute("cy",5); + portPort.setAttribute("cx",vertical ? 6 : 11); + portPort.setAttribute("cy",vertical ? 11 : 6); portPort.setAttribute("r",5); portPort.setAttribute("class","red-ui-flow-port red-ui-flow-link-port"); } else { @@ -4605,9 +4708,18 @@ RED.view = (function() { } else { portGroup = this.__outputs__[portIndex]; } - var x = d.w - 5; - var y = (d.h/2)-((numOutputs-1)/2)*13; - portGroup.setAttribute("transform","translate("+x+","+((y+13*portIndex)-5)+")") + if (vertical) { + x = (d.w/2)-((numOutputs-1)/2)*13; + var y = d.h - 5; + }else{ + y = (d.h/2)-((numOutputs-1)/2)*13; + var x = d.w - 5; + } + if (vertical) { + portGroup.setAttribute("transform","translate("+((d.w/2)-5)+", 25)") + }else{ + portGroup.setAttribute("transform","translate("+x+","+((y+13*i)-5)+")") + } } if (d._def.icon) { var icon = thisNode.select(".red-ui-flow-node-icon"); @@ -4645,7 +4757,11 @@ RED.view = (function() { thisNode.selectAll(".red-ui-flow-port-input").each(function(d,i) { var port = d3.select(this); - port.attr("transform",function(d){return "translate(-5,"+((d.h/2)-5)+")";}) + if (vertical) { + port.attr("transform",function(d){return "translate("+((d.w/2)-5)+", -5)";}) + }else{ + port.attr("transform",function(d){return "translate(-5,"+((d.h/2)-5)+")";}) + } }); if (d._def.button) { @@ -4765,17 +4881,23 @@ RED.view = (function() { if (d.added || d.selected || dirtyNodes[d.source.id] || dirtyNodes[d.target.id]) { var numOutputs = d.source.outputs || 1; var sourcePort = d.sourcePort || 0; - var y = -((numOutputs-1)/2)*13 +13*sourcePort; - d.x1 = d.source.x+d.source.w/2; - d.y1 = d.source.y+y; - d.x2 = d.target.x-d.target.w/2; - d.y2 = d.target.y; + var path; + if (vertical) { + var x = -((numOutputs-1)/2)*13 +13*sourcePort; + d.x1 = d.source.x+x; + d.y1 = d.source.y+d.source.h/2; + d.x2 = d.target.x; + d.y2 = d.target.y-d.target.h/2; + path = generateLinkPathV(d.x1,d.y1,d.x2,d.y2,1); + } else { + var y = -((numOutputs-1)/2)*13 +13*sourcePort; + d.x1 = d.source.x+d.source.w/2; + d.y1 = d.source.y+y; + d.x2 = d.target.x-d.target.w/2; + d.y2 = d.target.y; + path = generateLinkPath(d.x1,d.y1,d.x2,d.y2,1); + } - // return "M "+d.x1+" "+d.y1+ - // " C "+(d.x1+scale*node_width)+" "+(d.y1+scaleY*node_height)+" "+ - // (d.x2-scale*node_width)+" "+(d.y2-scaleY*node_height)+" "+ - // d.x2+" "+d.y2; - var path = generateLinkPath(d.x1,d.y1,d.x2,d.y2,1); if (/NaN/.test(path)) { path = "" } @@ -5664,6 +5786,14 @@ RED.view = (function() { updateGrid(); } }, + vertical: function(v) { + if (v === undefined) { + return vertical; + } else { + vertical = v; + RED.view.redraw(); + } + }, getActiveNodes: function() { return activeNodes; }, From 8fc1345bae6c69e9be974e523101b465af4d3e57 Mon Sep 17 00:00:00 2001 From: Jordan McClintock Date: Wed, 23 Feb 2022 12:57:36 -0600 Subject: [PATCH 2/6] initial guide flow update --- data/flows.json | 223 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 160 insertions(+), 63 deletions(-) diff --git a/data/flows.json b/data/flows.json index bf5103e0d..e8985ee9d 100644 --- a/data/flows.json +++ b/data/flows.json @@ -23,8 +23,8 @@ "category": "", "in": [ { - "x": 240, - "y": 180, + "x": 140, + "y": 40, "wires": [ { "id": "73521b98841c6355" @@ -34,8 +34,8 @@ ], "out": [ { - "x": 1720, - "y": 300, + "x": 550, + "y": 630, "wires": [ { "id": "752d2d1fc700d27e", @@ -66,8 +66,8 @@ "z": "0ac7681ed1c2bc4b", "name": "Kubernetes", "info": "# Description\n\n\n## Resources\n- https://kubernetes.io/docs/home/ ***\n- https://www.youtube.com/watch?v=VnvRFRk_51k \n- https://www.youtube.com/watch?v=X48VuDVv0do (long video, covers most topics in this flow)", - "x": 450, - "y": 180, + "x": 240, + "y": 130, "wires": [ [ "90665185044d3fc2", @@ -83,7 +83,7 @@ "z": "0ac7681ed1c2bc4b", "name": "Kubernetes Objects", "info": "", - "x": 780, + "x": 700, "y": 180, "wires": [ [ @@ -98,8 +98,8 @@ "z": "0ac7681ed1c2bc4b", "name": "Kubernetes Networking", "info": "", - "x": 810, - "y": 260, + "x": 440, + "y": 320, "wires": [ [] ] @@ -110,8 +110,8 @@ "z": "0ac7681ed1c2bc4b", "name": "Kubernetes Storage", "info": "", - "x": 820, - "y": 340, + "x": 460, + "y": 220, "wires": [ [] ] @@ -122,8 +122,8 @@ "z": "0ac7681ed1c2bc4b", "name": "Kubernetes App Manifests", "info": "", - "x": 780, - "y": 420, + "x": 200, + "y": 270, "wires": [ [] ] @@ -134,8 +134,8 @@ "z": "0ac7681ed1c2bc4b", "name": "Configurations", "info": "", - "x": 1040, - "y": 220, + "x": 650, + "y": 270, "wires": [ [ "c53965f3ddc770ad", @@ -149,8 +149,8 @@ "z": "0ac7681ed1c2bc4b", "name": "Deployments", "info": "", - "x": 1030, - "y": 100, + "x": 820, + "y": 270, "wires": [ [ "752d2d1fc700d27e" @@ -163,8 +163,8 @@ "z": "0ac7681ed1c2bc4b", "name": "Pods", "info": "", - "x": 1290, - "y": 100, + "x": 810, + "y": 420, "wires": [ [] ] @@ -175,8 +175,8 @@ "z": "0ac7681ed1c2bc4b", "name": "Configmaps", "info": "", - "x": 1270, - "y": 200, + "x": 530, + "y": 420, "wires": [ [] ] @@ -187,8 +187,8 @@ "z": "0ac7681ed1c2bc4b", "name": "Secrets", "info": "", - "x": 1260, - "y": 280, + "x": 680, + "y": 420, "wires": [ [] ] @@ -199,8 +199,8 @@ "z": "eb7909bcf5fcaf8a", "name": "Containerization", "info": "", - "x": 80, - "y": 300, + "x": 430, + "y": 50, "wires": [ [ "ea946e25b7c2079f" @@ -213,8 +213,8 @@ "z": "eb7909bcf5fcaf8a", "name": "Helm", "info": "", - "x": 890, - "y": 440, + "x": 610, + "y": 200, "wires": [ [ "e328f5849309e731" @@ -227,8 +227,8 @@ "z": "eb7909bcf5fcaf8a", "name": "Custom Resource Definitions", "info": "", - "x": 940, - "y": 500, + "x": 430, + "y": 200, "wires": [ [ "e328f5849309e731" @@ -241,8 +241,8 @@ "z": "eb7909bcf5fcaf8a", "name": "Kustomization", "info": "", - "x": 920, - "y": 640, + "x": 90, + "y": 200, "wires": [ [ "e328f5849309e731" @@ -255,8 +255,8 @@ "z": "eb7909bcf5fcaf8a", "name": "GitOps", "info": "", - "x": 920, - "y": 260, + "x": 720, + "y": 150, "wires": [ [ "45465f711df6da7e" @@ -269,8 +269,8 @@ "z": "eb7909bcf5fcaf8a", "name": "git", "info": "# Description\n\n[Git](https://git-scm.com/) is a free and open source distributed version control system.\n\n## Resources\n- https://git-scm.com/docs\n\n\n## Examples\n- github.com\n- gitlab.com\n- https://gitea.com/", - "x": 750, - "y": 180, + "x": 720, + "y": 50, "wires": [ [ "71a96ec4058930db" @@ -283,8 +283,8 @@ "z": "eb7909bcf5fcaf8a", "name": "Flux", "info": "", - "x": 1130, - "y": 300, + "x": 720, + "y": 200, "wires": [ [ "e328f5849309e731" @@ -297,8 +297,8 @@ "z": "eb7909bcf5fcaf8a", "name": "Big Bang", "info": "", - "x": 1440, - "y": 480, + "x": 430, + "y": 620, "wires": [ [] ] @@ -308,8 +308,8 @@ "type": "subflow:0ac7681ed1c2bc4b", "z": "eb7909bcf5fcaf8a", "name": "", - "x": 400, - "y": 300, + "x": 430, + "y": 110, "wires": [ [ "8c04bec4a15f6702", @@ -326,8 +326,8 @@ "z": "eb7909bcf5fcaf8a", "name": "Operators", "info": "https://www.youtube.com/watch?v=ha3LjlD6g7g", - "x": 890, - "y": 380, + "x": 240, + "y": 200, "wires": [ [ "e328f5849309e731" @@ -339,12 +339,13 @@ "type": "comment", "z": "c86af370eff94afa", "name": "Deploy K3d", - "info": "https://k3d.io/v5.2.2/\n\n### Choose your platform\nThe preferred free VM software is [VirtualBox](https://www.virtualbox.org/); however, it is not compatible with M1 chips! So, if you are using an M1 Mac, we highly recommend you go with the [Cloud](#Cloud) option below\n\n##### Cloud\nRecommend using an EC2 instance with the following specs:\n- AMI: Ubuntu Server (64-bit, x86)\n- Instance Type: t3a.2xlarge\n- 100 GB EBS\n- Security group rules for allowing web traffic\n\n##### Local\nUse [Vagrant](https://www.vagrantup.com/) to spin up a VM with at least the following specs:\n- 10GB RAM\n- 4 CPU cores\n- An IP that can be [accessed](https://www.vagrantup.com/docs/networking/private_network#static-ip) from the host machine. \n\nDepending on RAM/CPU availability, you may want to run 2 or more K3d nodes\n\n## Cluster creation\n\nOnce you have a host for deploying a k3d cluster - you can configure a cluster for future nodes in this training.\n\nOne possible configuration would be a 3 node cluster with 1 server and 2 agents (to get started).\n\nAnother consideration is exposing applications after the cluster is running and apps have been deployed w/ services and ingresses.\n\nA possible configuration might look like:\n\n`k3d cluster create -s 1 -a 2 -p \"8081:80@loadbalancer\" dev-cluster`\n\n-s 1 represents 1 server node\n-a 2 represents 2 agent nodes\n\n-p \"8081:80@loadbalancer\" represents mapping 8081 on this k3d host to ports 80 internally.", - "x": 240, - "y": 160, + "info": "Throughout this guide you will be using K3d to deploy and manage kubernetes instances.\n\n## Choose your platform\nThe preferred free VM software is [VirtualBox](https://www.virtualbox.org/); however, it is not compatible with M1 chips! So, if you are using an M1 Mac, we highly recommend you go with the [Cloud](#Cloud) option below\n\n### Cloud\nRecommend using an EC2 instance with the following specs:\n- AMI: Ubuntu Server (64-bit, x86)\n- Instance Type: t3a.2xlarge\n- 100 GB EBS\n- Security group rules for allowing web traffic\n\n### Local VM\nUse [Vagrant](https://www.vagrantup.com/) to spin up a VM with at least the following specs:\n- 10GB RAM\n- 4 CPU cores\n- An IP that can be [accessed](https://www.vagrantup.com/docs/networking/private_network#static-ip) from the host machine. \n\n### Local\nAny Docker installation except a non-WSL2 Windows installation will work with K3d natively.\n\n## K3d setup\n\nSetup instructions for K3d can be found at the link below.\n\nhttps://k3d.io/v5.2.2/\n\n## Cluster creation\n\nOnce you have a host for deploying a k3d cluster - you can configure a cluster for future nodes in this training.\n\nOne possible configuration would be a 3 node cluster with 1 server and 2 agents (to get started).\n\nAnother consideration is exposing applications after the cluster is running and apps have been deployed w/ services and ingresses.\n\nDepending on RAM/CPU availability, you may want to run 2 or more K3d nodes\n\nA possible configuration might look like:\n\n`k3d cluster create -s 1 -a 2 -p \"8081:80@loadbalancer\" dev-cluster`\n\n-s 1 represents 1 server node\n-a 2 represents 2 agent nodes\n\n-p \"8081:80@loadbalancer\" represents mapping 8081 on this k3d host to ports 80 internally.", + "x": 510, + "y": 40, "wires": [ [ - "691424f6cfd58372" + "691424f6cfd58372", + "1458b18889c13942" ] ] }, @@ -354,8 +355,8 @@ "z": "c86af370eff94afa", "name": "Deploy a pod info application (with Kustomize)", "info": "# Kustomize\n\n\"Kustomize is a command-line configuration manager for Kubernetes objects. Integrated with kubectl since 1.14, it allows you to make declarative changes to your configurations without touching a template.\"\n\n## Recommended Reading\n\n`https://www.mirantis.com/blog/introduction-to-kustomize-part-1-creating-a-kubernetes-app-out-of-multiple-pieces/`\n\nThe above tutorial can be run on the k3d cluster you have created. This is a much more complex example than the podinfo example you will deploy below.\n\n## Podinfo\n\n\"Podinfo is a tiny web application made with Go that showcases best practices of running microservices in Kubernetes\"\n\n### Deployment\n\nNavigate to `https://github.com/stefanprodan/podinfo`\n\nClone the repository to your local machine\n\nFrom within the cloned directory, we can execute kustomize through the built in functionality in `kubectl`.\n\n`kubectl kustomize ./kustomize`\n\nThis will return the built manifest for the application to be deployed. You can then deploy the application to the cluster through `kubectl apply -k ./kustomize`\n\n## Success Criteria\n\n- 2 podinfo pods in the target namespace (default if not specified)\n- A podinfo service\n- A horizontal pod autoscaler\n\nWe can port-forward this applications service and visit it in browser to confirm functionality.\n\n`kubectl port-forward service/podinfo 9898:http`\n\nThis port fowards the podinfo service `http` port (as defined in the service) to the 9898 host port.", - "x": 580, - "y": 160, + "x": 630, + "y": 130, "wires": [ [ "2d66fece0a8f5fdf" @@ -368,8 +369,8 @@ "z": "c86af370eff94afa", "name": "Expose podinfo with an Ingress", "info": "# Ingress\n\nIn the previous exercise, we deployed the podinfo application and confirmed functionality by visiting it in-browser through port-forwarding with kubectl. We can instead use an ingress and the default traefik ingress-controller to handle this functionaity more natively. \n\nOfficial k3d docs: https://k3d.io/v5.0.0/usage/exposing_services/\n\n## Ingress deployment\nDue to the cluster configuration that we executed in the first node (See the -p loadbalancer parameter). we can configure an ingress to expose the application, as is one of a few standard practices for exposing internal applications to external traffic.\n\n### Ingress template\n\nIngress docs: https://kubernetes.io/docs/concepts/services-networking/ingress/\n\nGiven the template from the docs/tutorial we can write an ingress to support this traffic.\n\n## Success Criteria\n\nAfter the ingress is deployed (and given you configured your cluster as described in the first node), then you should be able to access the podinfo application without port-forwarding at `http://localhost:8081` \n\n## Cleanup\n\nThis concludes this deployment of podinfo. You'll want to cleanup the resources we have created. ", - "x": 1010, - "y": 160, + "x": 630, + "y": 200, "wires": [ [ "52eb692e4c51108f" @@ -382,8 +383,8 @@ "z": "c86af370eff94afa", "name": "Create a podinfo helm chart", "info": "# Helm\n\"Helm is the package manager for Kubernetes\"\n\n## Recommended Reading\nhttps://helm.sh/\nhttps://helm.sh/docs/intro/\n\n## Podinfo Helm Chart from Scratch\n\nTODO - Insert content for:\n- deployment\n- service\n- ingress\n- HPA\n* All templated from scratch\n\n## Deploy the official podinfo chart from local files\n\nPreviously we cloned the podinfo repository to our/a local machine. Under the root of the project there is a `charts` directory with a `podinfo` directory that contains the podinfo chart content.\n\n## Basic deployment\n\nLet's create a testing namespace for our target\n`kubectl create ns testing`\n\nWith Helm installed and our k3d cluster still running/configured, we can install the chart in it's vanilla form (without enabling any additional content).\n\n(From the charts directory)\n`helm install podinfo-dev ./podinfo -n testing`\n\nThis will deploy the chart which results in the deployment and service creation in the target namespace.\n\n## Customizations\nWe can inject exposed customizations as outlined in the README/values.yaml for the purpose of configuring the end package being suited for our needs.\n\nWe can make an edit to the values.yaml and upgrade our application.\n\nhpa:\n enabled: true\n \n`helm upgrade podinfo-dev -n testing ./podinfo`\n\nThis should result in an HPA being deployed to our namespace for the application.\n", - "x": 1410, - "y": 160, + "x": 630, + "y": 270, "wires": [ [ "5361df412a99db12" @@ -396,8 +397,8 @@ "z": "c86af370eff94afa", "name": "Deploy BigBang on a new K3d cluster", "info": "# Big Bang\n\nUsing our machine with k3d, we can instantiate a development/prototype deployment of Big Bang.\n\n## Objective\n\nFollow the qiuckstart here:\nhttps://repo1.dso.mil/platform-one/big-bang/bigbang/-/blob/master/docs/guides/deployment_scenarios/quickstart.md\n\n## Success Criteria\n\nAs noted in step 13 - the web UI's should be resolvable and accessible. All pods should be up and healthy (running). ", - "x": 1810, - "y": 160, + "x": 630, + "y": 340, "wires": [ [ "67415f95eb8ab46c" @@ -410,8 +411,8 @@ "z": "c86af370eff94afa", "name": "Deploy podinfo helmchart in a bigbang cluster", "info": "# Big Bang Extensibility\n\nUp to now - we have configured and deployed k3d clusters, we've used `kustomize` and `Helm` to orchestrate deploying `podinfo` to our cluster.\n\nWe then used flux and it's controllers to deploy bigbang (which is using helm and kustomize under the hood).\n\n## Recommended Reading\n\n## Objective\nNow we will look at extending the big bang deployment to include deploying the podinfo helm chart and ensuring the deployment architecture aligns with the Big Bang \"Core\" technologies.\n\nThis is a precursory step to follow-on nodes in this flow. \n\n## Execution\n\nClone the podinfo repository if not done already.\n\nCreate a namespace with the label:\n`istio-injection: enabled`\n\nDeploy the helm chart for the podinfo applicaiton as we have done previously.\n\n## Success Criteria\nDeploy the podinfo helm chart into your cluster that already has big bang deployed.\n\nThe application should come online and be able to be reached via `kubectl port-forward`\n\nContinue to the next node for extending this with Istio", - "x": 2270, - "y": 160, + "x": 630, + "y": 410, "wires": [ [ "9b8fdffdc9b5cc53" @@ -424,8 +425,8 @@ "z": "c86af370eff94afa", "name": "Add Istio Virtual Service for the podinfo deployment", "info": "# Istio VirtualServices\n\n## Recommended Reading\n\n- https://istio.io/latest/docs/reference/config/networking/virtual-service/\n\n### Example\n- https://repo1.dso.mil/platform-one/big-bang/apps/core/kiali/-/blob/main/chart/values.yaml#:~:text=istio%3A,kiali.%7B%7B%20.Values.hostname%20%7D%7D\n- https://repo1.dso.mil/platform-one/big-bang/apps/core/kiali/-/blob/main/chart/templates/bigbang/virtualservice.yaml\n\n## Objective\nWith the podinfo helm chart deployed (in it's basic state), we will look to leverage some of th technologies that Big Bang has reconciled and configured.\n\nBig Bang exposes cluster applications to external traffic through an Istio Ingress Gateway.\n\nVirtual services are then used to link kubernetes services to traffic from the ingresss gateways.\n\n## Execution\n\n\n\n## Success Criteria\nWrite a virtual service resource definition file for the podinfo application that was deployed as part of the last node.\n\nIf you add the `podinfo.bigbang.dev` endpoint to your hosts file, then it should be resolveable from the browser.\n\n## Solution\n
show\n

\n\n```\napiVersion: networking.istio.io/v1beta1\nkind: VirtualService\nmetadata:\n name: podinfo\n namespace: podinfo\nspec:\n gateways:\n - istio-system/public\n hosts:\n - podinfo.bigbang.dev\n http:\n - route:\n - destination:\n host: podinfo.podinfo.svc.cluster.local\n port:\n number: 9898\n```\n\n

\n", - "x": 2750, - "y": 160, + "x": 630, + "y": 480, "wires": [ [ "339481fd79e107a6" @@ -438,8 +439,8 @@ "z": "c86af370eff94afa", "name": "Deploy podinfo as a Flux HelmRelease", "info": "# Flux helm release reconciliation\n\"Big Bang follows a GitOps approach to configuration management, using Flux v2 to reconcile Git with the cluster. Environments (e.g. dev, prod) and packages (e.g. istio) can be fully configured to suit the deployment needs.\"\n\n## Prerequisites\n- Remove all prior content for podinfo from your cluster. \n\n## Recommended Reading\n- https://repo1.dso.mil/platform-one/big-bang/bigbang/-/blob/master/README.md\n\n## Objective\nFollowing the umbrella structure in the Big Bang chart, we can create the templates under a `podinfo` directory (under the templates dir).\n\nNote: there are many ways to accomplish this task - the podinfo directory under the templates directory most-accurately represents how the umbrella structure works.\n\n### Minimum Requirements\n- namespace resource\n- git repository resource\n- helm release resource\n- virtual service resource\n\nThis would meet the bare minimum requirements.\n\n### Additional Content\n- values file (a helper generates a secret resource from this)\n\n## Success Criteria\nIf we run the `helm upgrade` command against the modified Big Bang helm chart, it should deploy the podinfo chart (if properly enabled) with the ability to access/resolve the application through the `Ingress Gateway`.", - "x": 3210, - "y": 160, + "x": 630, + "y": 550, "wires": [ [ "0f9889d8e9cb7edb" @@ -452,10 +453,106 @@ "z": "c86af370eff94afa", "name": "Play DOOM using ZARF", "info": "# Zarf!\n\nZarf is a Defense Unicorns developed tool - please read about it below!\n\n## Recommended Reading\n- https://github.com/defenseunicorns/zarf\n\n\n## Objective\nUsing Zarf, we will follow the guide below in order to play DOOM.\n\nhttps://github.com/defenseunicorns/zarf/tree/master/examples/game\n\n## Success Criteria\nPackaging, Deployment and execution of playing DOOM from within the browser.", - "x": 3620, - "y": 160, + "x": 630, + "y": 620, "wires": [ [] ] + }, + { + "id": "1458b18889c13942", + "type": "comment", + "z": "c86af370eff94afa", + "name": "Deploy and Access the Kubernetes Dashboard", + "info": "# Description\n\n# Resources\n\n# Unicorn SME(s)\n", + "x": 240, + "y": 130, + "wires": [ + [] + ] + }, + { + "id": "6d2d525b92151db2", + "type": "comment", + "z": "c86af370eff94afa", + "name": "Kustomize", + "info": "# Description\n\n# Resources\n\n# Unicorn SME(s)\n", + "x": 740, + "y": 40, + "wires": [ + [ + "691424f6cfd58372" + ] + ] + }, + { + "id": "a25127e60aa3afac", + "type": "comment", + "z": "c86af370eff94afa", + "name": "Helm", + "info": "# Description\n\n# Resources\n\n# Unicorn SME(s)\n", + "x": 910, + "y": 200, + "wires": [ + [ + "52eb692e4c51108f" + ] + ] + }, + { + "id": "bd30d9f248bb244a", + "type": "comment", + "z": "c86af370eff94afa", + "name": "Big Bang", + "info": "# Description\n\n# Resources\n\n# Unicorn SME(s)\n", + "x": 910, + "y": 270, + "wires": [ + [ + "5361df412a99db12" + ] + ] + }, + { + "id": "f17eae05b57f6a2e", + "type": "comment", + "z": "c86af370eff94afa", + "name": "Istio", + "info": "# Description\n\n# Resources\n\n# Unicorn SME(s)\n", + "x": 910, + "y": 410, + "wires": [ + [ + "9b8fdffdc9b5cc53" + ] + ] + }, + { + "id": "3a185c296c95de08", + "type": "comment", + "z": "c86af370eff94afa", + "name": "Flux", + "info": "# Description\n\n# Resources\n\n# Unicorn SME(s)\n", + "x": 910, + "y": 480, + "wires": [ + [ + "339481fd79e107a6" + ] + ] + }, + { + "id": "14c8378318de0a59", + "type": "comment", + "z": "c86af370eff94afa", + "name": "Traefix Ingress", + "info": "# Description\n\n# Resources\n\n# Unicorn SME(s)\n", + "x": 910, + "y": 130, + "wires": [ + [ + "2d66fece0a8f5fdf" + ] + ] } ] \ No newline at end of file From be2c1f1859643fbd745c862e22d3daf9ca082670 Mon Sep 17 00:00:00 2001 From: Jordan McClintock Date: Wed, 23 Feb 2022 13:16:56 -0600 Subject: [PATCH 3/6] update package lock using latest npm --- package-lock.json | 1921 --------------------------------------------- 1 file changed, 1921 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8d310e675..4b5f0018c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -64,7 +64,6 @@ "xml2js": "0.4.23" }, "devDependencies": { - "cypress": "^9.3.1", "dompurify": "2.3.4", "grunt": "1.4.1", "grunt-chmod": "~1.1.1", @@ -361,96 +360,6 @@ "node": ">=6.9.0" } }, - "node_modules/@cypress/request": { - "version": "2.88.10", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz", - "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==", - "dev": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "http-signature": "~1.3.6", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@cypress/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/@cypress/request/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" - } - }, - "node_modules/@cypress/request/node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/@cypress/xvfb": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", - "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", - "dev": true, - "dependencies": { - "debug": "^3.1.0", - "lodash.once": "^4.1.1" - } - }, - "node_modules/@cypress/xvfb/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/@cypress/xvfb/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.7.tgz", @@ -620,28 +529,6 @@ "@types/node": "*" } }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", - "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", - "dev": true - }, - "node_modules/@types/sizzle": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", - "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", - "dev": true - }, - "node_modules/@types/yauzl": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", - "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -725,19 +612,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ajv": { "version": "8.9.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", @@ -791,21 +665,6 @@ "node": ">=6" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -866,26 +725,6 @@ "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "optional": true }, - "node_modules/arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/archiver": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz", @@ -1106,33 +945,6 @@ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", "dev": true }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/async": { "version": "0.1.22", "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", @@ -1154,30 +966,6 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, "node_modules/axios": { "version": "0.25.0", "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", @@ -1241,15 +1029,6 @@ "node": ">= 10.0.0" } }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, "node_modules/bcryptjs": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", @@ -1274,12 +1053,6 @@ "readable-stream": "^3.4.0" } }, - "node_modules/blob-util": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", - "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", - "dev": true - }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -1558,15 +1331,6 @@ "node": ">=8" } }, - "node_modules/cachedir": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", - "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/caching-transform": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", @@ -1635,12 +1399,6 @@ "node": ">=6" } }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "node_modules/catharsis": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", @@ -1681,15 +1439,6 @@ "node": ">=8" } }, - "node_modules/check-more-types": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", - "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/cheerio": { "version": "1.0.0-rc.10", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", @@ -1760,21 +1509,6 @@ "node": ">=10" } }, - "node_modules/ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", - "dev": true - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/cli": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", @@ -1800,18 +1534,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/cli-table": { "version": "0.3.11", "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", @@ -1831,37 +1553,6 @@ "node": ">=0.1.90" } }, - "node_modules/cli-table3": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", - "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "colors": "1.4.0" - } - }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -1929,22 +1620,6 @@ "color-support": "bin.js" } }, - "node_modules/colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", - "dev": true - }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -2044,15 +1719,6 @@ "node": ">=4" } }, - "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/commist": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz", @@ -2071,15 +1737,6 @@ "node": ">=8" } }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -2431,113 +2088,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/cypress": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-9.3.1.tgz", - "integrity": "sha512-BODdPesxX6bkVUnH8BVsV8I/jn57zQtO1FEOUTiuG2us3kslW7g0tcuwiny7CKCmJUZz8S/D587ppC+s58a+5Q==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@cypress/request": "^2.88.10", - "@cypress/xvfb": "^1.2.4", - "@types/node": "^14.14.31", - "@types/sinonjs__fake-timers": "8.1.1", - "@types/sizzle": "^2.3.2", - "arch": "^2.2.0", - "blob-util": "^2.0.2", - "bluebird": "^3.7.2", - "buffer": "^5.6.0", - "cachedir": "^2.3.0", - "chalk": "^4.1.0", - "check-more-types": "^2.24.0", - "cli-cursor": "^3.1.0", - "cli-table3": "~0.6.1", - "commander": "^5.1.0", - "common-tags": "^1.8.0", - "dayjs": "^1.10.4", - "debug": "^4.3.2", - "enquirer": "^2.3.6", - "eventemitter2": "^6.4.3", - "execa": "4.1.0", - "executable": "^4.1.1", - "extract-zip": "2.0.1", - "figures": "^3.2.0", - "fs-extra": "^9.1.0", - "getos": "^3.2.1", - "is-ci": "^3.0.0", - "is-installed-globally": "~0.4.0", - "lazy-ass": "^1.6.0", - "listr2": "^3.8.3", - "lodash": "^4.17.21", - "log-symbols": "^4.0.0", - "minimist": "^1.2.5", - "ospath": "^1.2.2", - "pretty-bytes": "^5.6.0", - "proxy-from-env": "1.0.0", - "request-progress": "^3.0.0", - "supports-color": "^8.1.1", - "tmp": "~0.2.1", - "untildify": "^4.0.0", - "url": "^0.11.0", - "yauzl": "^2.10.0" - }, - "bin": { - "cypress": "bin/cypress" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/cypress/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/cypress/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cypress/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==", - "dev": true - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -2553,12 +2103,6 @@ "node": "*" } }, - "node_modules/dayjs": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz", - "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==", - "dev": true - }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -2877,16 +2421,6 @@ "stream-shift": "^1.0.0" } }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -3009,47 +2543,6 @@ "node": ">= 0.6" } }, - "node_modules/eventemitter2": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.5.tgz", - "integrity": "sha512-bXE7Dyc1i6oQElDG0jMRZJrRAn9QR2xyyFGmBdZleNmyQX0FqGYmhZIrIrpPfm/w//LTo4tVQGOGQcGCb5q9uw==", - "dev": true - }, - "node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/executable": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", - "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", - "dev": true, - "dependencies": { - "pify": "^2.2.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -3190,58 +2683,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extract-zip/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/extract-zip/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==", - "dev": true - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true, - "engines": [ - "node >=0.6.0" - ] - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3271,30 +2712,6 @@ "node": ">=0.4.0" } }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/file-set": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/file-set/-/file-set-4.0.2.tgz", @@ -3568,15 +2985,6 @@ "which": "bin/which" } }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -3767,30 +3175,6 @@ "node": ">=10" } }, - "node_modules/getos": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", - "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", - "dev": true, - "dependencies": { - "async": "^3.2.0" - } - }, - "node_modules/getos/node_modules/async": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", - "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==", - "dev": true - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, "node_modules/glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", @@ -4799,20 +4183,6 @@ "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==", "dev": true }, - "node_modules/http-signature": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", - "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^2.0.2", - "sshpk": "^1.14.1" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/http2-wrapper": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", @@ -4858,15 +4228,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "engines": { - "node": ">=8.12.0" - } - }, "node_modules/i18next": { "version": "21.6.10", "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.6.10.tgz", @@ -5035,18 +4396,6 @@ "node": ">=8" } }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, "node_modules/is-core-module": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", @@ -5177,18 +4526,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -5259,12 +4596,6 @@ "node": ">=0.10.0" } }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "node_modules/istanbul-lib-coverage": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", @@ -5520,12 +4851,6 @@ "xmlcreate": "^2.0.4" } }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, "node_modules/jsdoc": { "version": "3.6.7", "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.7.tgz", @@ -5809,12 +5134,6 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, "node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -5844,21 +5163,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/jsprim": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", - "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, "node_modules/just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", @@ -5909,15 +5213,6 @@ "node": ">=8" } }, - "node_modules/lazy-ass": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", - "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=", - "dev": true, - "engines": { - "node": "> 0.8" - } - }, "node_modules/lazystream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", @@ -6011,33 +5306,6 @@ "uc.micro": "^1.0.1" } }, - "node_modules/listr2": { - "version": "3.13.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.13.5.tgz", - "integrity": "sha512-3n8heFQDSk+NcwBn3CgxEibZGaRzx+pC64n3YjpMD1qguV4nWus3Al+Oo3KooqFKTQEJ1v7MmnbnyyNspgx3NA==", - "dev": true, - "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.16", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.4.0", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } - } - }, "node_modules/livereload-js": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", @@ -6155,12 +5423,6 @@ "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=", "dev": true }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=", - "dev": true - }, "node_modules/lodash.padend": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", @@ -6195,55 +5457,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", @@ -6514,12 +5727,6 @@ "node": ">=0.10.0" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -6571,15 +5778,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -7738,18 +6936,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/npmlog": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.0.tgz", @@ -8229,21 +7415,6 @@ "wrappy": "1" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/opted": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/opted/-/opted-1.0.2.tgz", @@ -8284,12 +7455,6 @@ "os-tmpdir": "^1.0.0" } }, - "node_modules/ospath": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", - "integrity": "sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs=", - "dev": true - }, "node_modules/p-cancelable": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", @@ -8328,21 +7493,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -8757,18 +7907,6 @@ "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, "node_modules/picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", @@ -8781,15 +7919,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -8927,12 +8056,6 @@ "node": ">= 0.10" } }, - "node_modules/proxy-from-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", - "dev": true - }, "node_modules/proxy/node_modules/debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -9069,16 +8192,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", @@ -9467,15 +8580,6 @@ "node": ">=4" } }, - "node_modules/request-progress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", - "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", - "dev": true, - "dependencies": { - "throttleit": "^1.0.0" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -9556,19 +8660,6 @@ "lowercase-keys": "^2.0.0" } }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/retry": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.6.1.tgz", @@ -9597,21 +8688,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rxjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", - "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", - "dev": true, - "dependencies": { - "tslib": "~2.1.0" - } - }, - "node_modules/rxjs/node_modules/tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true - }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -10002,20 +9078,6 @@ "node": ">=8" } }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/sort-array": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/sort-array/-/sort-array-4.1.4.tgz", @@ -10160,31 +9222,6 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, - "node_modules/sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -10326,15 +9363,6 @@ "node": ">=4" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -10679,18 +9707,6 @@ "node": ">=4" } }, - "node_modules/throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, "node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -10754,18 +9770,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -10863,24 +9867,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -10890,18 +9876,6 @@ "node": ">=4" } }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -11037,15 +10011,6 @@ "node": ">= 0.8" } }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/update-notifier": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", @@ -11109,16 +10074,6 @@ "node": ">= 0.10" } }, - "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, "node_modules/url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -11131,12 +10086,6 @@ "node": ">=4" } }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -11188,20 +10137,6 @@ "node": ">= 0.8" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "node_modules/walk-back": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-5.1.0.tgz", @@ -11490,16 +10425,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -11724,88 +10649,6 @@ "to-fast-properties": "^2.0.0" } }, - "@cypress/request": { - "version": "2.88.10", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz", - "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "http-signature": "~1.3.6", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^8.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "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 - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, - "@cypress/xvfb": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", - "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", - "dev": true, - "requires": { - "debug": "^3.1.0", - "lodash.once": "^4.1.1" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, "@mapbox/node-pre-gyp": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.7.tgz", @@ -11956,28 +10799,6 @@ "@types/node": "*" } }, - "@types/sinonjs__fake-timers": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", - "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", - "dev": true - }, - "@types/sizzle": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", - "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", - "dev": true - }, - "@types/yauzl": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", - "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", - "dev": true, - "optional": true, - "requires": { - "@types/node": "*" - } - }, "@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -12037,16 +10858,6 @@ } } }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, "ajv": { "version": "8.9.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", @@ -12089,15 +10900,6 @@ } } }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -12143,12 +10945,6 @@ "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "optional": true }, - "arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "dev": true - }, "archiver": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.0.tgz", @@ -12339,27 +11135,6 @@ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", "dev": true }, - "asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, "async": { "version": "0.1.22", "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", @@ -12378,24 +11153,6 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, - "at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", - "dev": true - }, "axios": { "version": "0.25.0", "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", @@ -12438,15 +11195,6 @@ "node-addon-api": "^3.1.0" } }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, "bcryptjs": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", @@ -12468,12 +11216,6 @@ "readable-stream": "^3.4.0" } }, - "blob-util": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", - "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", - "dev": true - }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -12697,12 +11439,6 @@ "responselike": "^2.0.0" } }, - "cachedir": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", - "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", - "dev": true - }, "caching-transform": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", @@ -12755,12 +11491,6 @@ "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", "dev": true }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true - }, "catharsis": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", @@ -12791,12 +11521,6 @@ } } }, - "check-more-types": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", - "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=", - "dev": true - }, "cheerio": { "version": "1.0.0-rc.10", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", @@ -12844,18 +11568,6 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" }, - "ci-info": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", - "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==", - "dev": true - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, "cli": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", @@ -12872,15 +11584,6 @@ "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", "dev": true }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, "cli-table": { "version": "0.3.11", "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", @@ -12896,26 +11599,6 @@ } } }, - "cli-table3": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz", - "integrity": "sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA==", - "dev": true, - "requires": { - "colors": "1.4.0", - "string-width": "^4.2.0" - } - }, - "cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - } - }, "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -12971,19 +11654,6 @@ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", "optional": true }, - "colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", - "dev": true - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "optional": true - }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -13065,12 +11735,6 @@ } } }, - "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", - "dev": true - }, "commist": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz", @@ -13086,12 +11750,6 @@ "integrity": "sha512-jAg09gkdkrDO9EWTdXfv80WWH3yeZl5oT69fGfedBNS9pXUKYInVJ1bJ+/ht2+Moeei48TmSbQDYMc8EOx9G0g==", "dev": true }, - "common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true - }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -13371,94 +12029,6 @@ "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==" }, - "cypress": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-9.3.1.tgz", - "integrity": "sha512-BODdPesxX6bkVUnH8BVsV8I/jn57zQtO1FEOUTiuG2us3kslW7g0tcuwiny7CKCmJUZz8S/D587ppC+s58a+5Q==", - "dev": true, - "requires": { - "@cypress/request": "^2.88.10", - "@cypress/xvfb": "^1.2.4", - "@types/node": "^14.14.31", - "@types/sinonjs__fake-timers": "8.1.1", - "@types/sizzle": "^2.3.2", - "arch": "^2.2.0", - "blob-util": "^2.0.2", - "bluebird": "^3.7.2", - "buffer": "^5.6.0", - "cachedir": "^2.3.0", - "chalk": "^4.1.0", - "check-more-types": "^2.24.0", - "cli-cursor": "^3.1.0", - "cli-table3": "~0.6.1", - "commander": "^5.1.0", - "common-tags": "^1.8.0", - "dayjs": "^1.10.4", - "debug": "^4.3.2", - "enquirer": "^2.3.6", - "eventemitter2": "^6.4.3", - "execa": "4.1.0", - "executable": "^4.1.1", - "extract-zip": "2.0.1", - "figures": "^3.2.0", - "fs-extra": "^9.1.0", - "getos": "^3.2.1", - "is-ci": "^3.0.0", - "is-installed-globally": "~0.4.0", - "lazy-ass": "^1.6.0", - "listr2": "^3.8.3", - "lodash": "^4.17.21", - "log-symbols": "^4.0.0", - "minimist": "^1.2.5", - "ospath": "^1.2.2", - "pretty-bytes": "^5.6.0", - "proxy-from-env": "1.0.0", - "request-progress": "^3.0.0", - "supports-color": "^8.1.1", - "tmp": "~0.2.1", - "untildify": "^4.0.0", - "url": "^0.11.0", - "yauzl": "^2.10.0" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "requires": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -13471,12 +12041,6 @@ "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", "dev": true }, - "dayjs": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz", - "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==", - "dev": true - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -13717,16 +12281,6 @@ "stream-shift": "^1.0.0" } }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -13821,38 +12375,6 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, - "eventemitter2": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.5.tgz", - "integrity": "sha512-bXE7Dyc1i6oQElDG0jMRZJrRAn9QR2xyyFGmBdZleNmyQX0FqGYmhZIrIrpPfm/w//LTo4tVQGOGQcGCb5q9uw==", - "dev": true - }, - "execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - } - }, - "executable": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", - "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", - "dev": true, - "requires": { - "pify": "^2.2.0" - } - }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -13951,41 +12473,6 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "requires": { - "@types/yauzl": "^2.9.1", - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "dependencies": { - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -14012,24 +12499,6 @@ "websocket-driver": ">=0.5.1" } }, - "fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", - "dev": true, - "requires": { - "pend": "~1.2.0" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, "file-set": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/file-set/-/file-set-4.0.2.tgz", @@ -14239,12 +12708,6 @@ } } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true - }, "form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -14385,32 +12848,6 @@ "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", "dev": true }, - "getos": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", - "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", - "dev": true, - "requires": { - "async": "^3.2.0" - }, - "dependencies": { - "async": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.2.tgz", - "integrity": "sha512-H0E+qZaDEfx/FY4t7iLRv1W2fFI6+pyCeTw1uN20AQPiwqwM6ojPxHxdLv4z8hi2DtnW9BOckSspLucW7pIE5g==", - "dev": true - } - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, "glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", @@ -15195,17 +13632,6 @@ "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==", "dev": true }, - "http-signature": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", - "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^2.0.2", - "sshpk": "^1.14.1" - } - }, "http2-wrapper": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", @@ -15239,12 +13665,6 @@ } } }, - "human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true - }, "i18next": { "version": "21.6.10", "resolved": "https://registry.npmjs.org/i18next/-/i18next-21.6.10.tgz", @@ -15361,15 +13781,6 @@ "binary-extensions": "^2.0.0" } }, - "is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "requires": { - "ci-info": "^3.2.0" - } - }, "is-core-module": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", @@ -15458,12 +13869,6 @@ "is-unc-path": "^1.0.0" } }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -15519,12 +13924,6 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true - }, "istanbul-lib-coverage": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", @@ -15724,12 +14123,6 @@ "xmlcreate": "^2.0.4" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, "jsdoc": { "version": "3.6.7", "resolved": "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.7.tgz", @@ -15962,12 +14355,6 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, - "json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true - }, "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -15992,18 +14379,6 @@ "universalify": "^2.0.0" } }, - "jsprim": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", - "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, "just-extend": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", @@ -16048,12 +14423,6 @@ "package-json": "^6.3.0" } }, - "lazy-ass": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", - "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=", - "dev": true - }, "lazystream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", @@ -16139,22 +14508,6 @@ "uc.micro": "^1.0.1" } }, - "listr2": { - "version": "3.13.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.13.5.tgz", - "integrity": "sha512-3n8heFQDSk+NcwBn3CgxEibZGaRzx+pC64n3YjpMD1qguV4nWus3Al+Oo3KooqFKTQEJ1v7MmnbnyyNspgx3NA==", - "dev": true, - "requires": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.16", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.4.0", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - } - }, "livereload-js": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", @@ -16259,12 +14612,6 @@ "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=", "dev": true }, - "lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=", - "dev": true - }, "lodash.padend": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", @@ -16293,42 +14640,6 @@ "is-unicode-supported": "^0.1.0" } }, - "log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, "lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", @@ -16539,12 +14850,6 @@ } } }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -16578,12 +14883,6 @@ "mime-db": "1.51.0" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -17535,15 +15834,6 @@ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, "npmlog": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.0.tgz", @@ -17918,15 +16208,6 @@ "wrappy": "1" } }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, "opted": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/opted/-/opted-1.0.2.tgz", @@ -17958,12 +16239,6 @@ "os-tmpdir": "^1.0.0" } }, - "ospath": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", - "integrity": "sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs=", - "dev": true - }, "p-cancelable": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", @@ -17987,15 +16262,6 @@ "p-limit": "^3.0.2" } }, - "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -18323,30 +16589,12 @@ "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=" }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, "picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", "dev": true }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", @@ -18461,12 +16709,6 @@ "ipaddr.js": "1.9.1" } }, - "proxy-from-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=", - "dev": true - }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -18570,12 +16812,6 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, "quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", @@ -18877,15 +17113,6 @@ "es6-error": "^4.0.1" } }, - "request-progress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", - "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", - "dev": true, - "requires": { - "throttleit": "^1.0.0" - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -18951,16 +17178,6 @@ "lowercase-keys": "^2.0.0" } }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, "retry": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.6.1.tgz", @@ -18980,23 +17197,6 @@ "glob": "^7.1.3" } }, - "rxjs": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz", - "integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==", - "dev": true, - "requires": { - "tslib": "~2.1.0" - }, - "dependencies": { - "tslib": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", - "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", - "dev": true - } - } - }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -19328,17 +17528,6 @@ } } }, - "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, "sort-array": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/sort-array/-/sort-array-4.1.4.tgz", @@ -19463,23 +17652,6 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -19580,12 +17752,6 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -19850,18 +18016,6 @@ } } }, - "throttleit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", - "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, "through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -19929,15 +18083,6 @@ } } }, - "tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", - "dev": true, - "requires": { - "rimraf": "^3.0.0" - } - }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -20012,33 +18157,12 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true - }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -20146,12 +18270,6 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, - "untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true - }, "update-notifier": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", @@ -20205,24 +18323,6 @@ "integrity": "sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI=", "dev": true }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, "url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -20271,17 +18371,6 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, "walk-back": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-5.1.0.tgz", @@ -20500,16 +18589,6 @@ } } }, - "yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", - "dev": true, - "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", From f093ef1bb19c8810aef2baf0af96f7c2798fa349 Mon Sep 17 00:00:00 2001 From: Jordan McClintock Date: Wed, 23 Feb 2022 15:39:24 -0600 Subject: [PATCH 4/6] docs update --- docs/code-contribution.md | 2 +- docs/sparkles-guides-contribution.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/code-contribution.md b/docs/code-contribution.md index 039f12267..689e86f67 100644 --- a/docs/code-contribution.md +++ b/docs/code-contribution.md @@ -2,7 +2,7 @@ Sparkles guide is forked from Node-red, which has a LOT of functionality in addition to the nice UI we use. As such, much code is not relevant for our purpose. -Since this is a derivative work, using an Apache 2.0 license. We MUST add a modification copyright to any changed files not originated by us. Add `2021 Modification Copyright - Defense Unicorns` as a comment to the top of any changed file. +Since this is a derivative work, using an Apache 2.0 license. We MUST add a modification copyright to any changed files not originated by us. Add `2022 Modification Copyright - Defense Unicorns` as a comment to the top of any changed file. Finally, deleting code often has unintended consequences - you should, at a minimum, add cypress tests to confirm basic, common functionality to ensure functionality. diff --git a/docs/sparkles-guides-contribution.md b/docs/sparkles-guides-contribution.md index a8a656cc8..5d43a930c 100644 --- a/docs/sparkles-guides-contribution.md +++ b/docs/sparkles-guides-contribution.md @@ -11,7 +11,7 @@ At the simplest level: ## Conventions and Guidelines -- Topics within flows, build upon each other from left to right. For example, knowing containerization prior to kubernetes. +- Topics within flows, build upon each other from top to bottom. For example, knowing containerization prior to kubernetes. - Use subflows when a common topic exists. Ex. Zarf requires golang, which is a learning topic itself, or BigBang requires kubernetes - Add materials (youtube, course, SME, article, etc...) to the description of nodes. - Add a * to materials that you found helpful From 8fd328d58026a2b81d67902dc8998680ff4125b0 Mon Sep 17 00:00:00 2001 From: Jordan McClintock Date: Wed, 23 Feb 2022 16:59:16 -0600 Subject: [PATCH 5/6] Remove old nodes and add new ones --- .../nodes/core/common/20-inject.html | 711 --------------- .../@node-red/nodes/core/common/guide.html | 67 ++ .../@node-red/nodes/core/common/guide.js | 25 + .../@node-red/nodes/core/common/resource.html | 67 ++ .../@node-red/nodes/core/common/resource.js | 25 + .../@node-red/nodes/core/common/task.html | 67 ++ .../@node-red/nodes/core/common/task.js | 25 + .../nodes/core/function/10-function.html | 611 ------------- .../nodes/core/function/10-function.js | 510 ----------- .../nodes/core/function/89-delay.html | 284 ------ .../@node-red/nodes/core/function/90-exec.js | 200 ---- .../@node-red/nodes/core/function/rbe.js | 97 -- .../nodes/core/network/21-httprequest.js | 675 -------------- .../nodes/core/network/22-websocket.html | 292 ------ .../nodes/core/network/22-websocket.js | 423 --------- .../nodes/core/network/31-tcpin.html | 383 -------- .../@node-red/nodes/core/network/31-tcpin.js | 852 ------------------ .../@node-red/nodes/core/parsers/70-JSON.js | 138 --- .../@node-red/nodes/icons/guide.svg | 1 + 19 files changed, 277 insertions(+), 5176 deletions(-) delete mode 100644 packages/node_modules/@node-red/nodes/core/common/20-inject.html create mode 100644 packages/node_modules/@node-red/nodes/core/common/guide.html create mode 100644 packages/node_modules/@node-red/nodes/core/common/guide.js create mode 100644 packages/node_modules/@node-red/nodes/core/common/resource.html create mode 100644 packages/node_modules/@node-red/nodes/core/common/resource.js create mode 100644 packages/node_modules/@node-red/nodes/core/common/task.html create mode 100644 packages/node_modules/@node-red/nodes/core/common/task.js delete mode 100644 packages/node_modules/@node-red/nodes/core/function/10-function.html delete mode 100644 packages/node_modules/@node-red/nodes/core/function/10-function.js delete mode 100644 packages/node_modules/@node-red/nodes/core/function/89-delay.html delete mode 100644 packages/node_modules/@node-red/nodes/core/function/90-exec.js delete mode 100644 packages/node_modules/@node-red/nodes/core/function/rbe.js delete mode 100644 packages/node_modules/@node-red/nodes/core/network/21-httprequest.js delete mode 100644 packages/node_modules/@node-red/nodes/core/network/22-websocket.html delete mode 100644 packages/node_modules/@node-red/nodes/core/network/22-websocket.js delete mode 100644 packages/node_modules/@node-red/nodes/core/network/31-tcpin.html delete mode 100644 packages/node_modules/@node-red/nodes/core/network/31-tcpin.js delete mode 100644 packages/node_modules/@node-red/nodes/core/parsers/70-JSON.js create mode 100644 packages/node_modules/@node-red/nodes/icons/guide.svg diff --git a/packages/node_modules/@node-red/nodes/core/common/20-inject.html b/packages/node_modules/@node-red/nodes/core/common/20-inject.html deleted file mode 100644 index f233c62fd..000000000 --- a/packages/node_modules/@node-red/nodes/core/common/20-inject.html +++ /dev/null @@ -1,711 +0,0 @@ - - - - - - diff --git a/packages/node_modules/@node-red/nodes/core/common/guide.html b/packages/node_modules/@node-red/nodes/core/common/guide.html new file mode 100644 index 000000000..dfff21e3e --- /dev/null +++ b/packages/node_modules/@node-red/nodes/core/common/guide.html @@ -0,0 +1,67 @@ + + + + + + diff --git a/packages/node_modules/@node-red/nodes/core/common/guide.js b/packages/node_modules/@node-red/nodes/core/common/guide.js new file mode 100644 index 000000000..44802d135 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/core/common/guide.js @@ -0,0 +1,25 @@ +/** + * Copyright JS Foundation and other contributors, http://js.foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +// 2022 Modification Copyright - Defense Unicorns + +module.exports = function(RED) { + "use strict"; + function GuideNode(n) { + RED.nodes.createNode(this,n); + } + RED.nodes.registerType("guide",GuideNode); +} diff --git a/packages/node_modules/@node-red/nodes/core/common/resource.html b/packages/node_modules/@node-red/nodes/core/common/resource.html new file mode 100644 index 000000000..d4db2f931 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/core/common/resource.html @@ -0,0 +1,67 @@ + + + + + + diff --git a/packages/node_modules/@node-red/nodes/core/common/resource.js b/packages/node_modules/@node-red/nodes/core/common/resource.js new file mode 100644 index 000000000..180a600f2 --- /dev/null +++ b/packages/node_modules/@node-red/nodes/core/common/resource.js @@ -0,0 +1,25 @@ +/** + * Copyright JS Foundation and other contributors, http://js.foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +// 2022 Modification Copyright - Defense Unicorns + +module.exports = function(RED) { + "use strict"; + function ResourceNode(n) { + RED.nodes.createNode(this,n); + } + RED.nodes.registerType("resource",ResourceNode); +} diff --git a/packages/node_modules/@node-red/nodes/core/common/task.html b/packages/node_modules/@node-red/nodes/core/common/task.html new file mode 100644 index 000000000..c1f8ebdac --- /dev/null +++ b/packages/node_modules/@node-red/nodes/core/common/task.html @@ -0,0 +1,67 @@ + + + + + + diff --git a/packages/node_modules/@node-red/nodes/core/common/task.js b/packages/node_modules/@node-red/nodes/core/common/task.js new file mode 100644 index 000000000..ce1c1410e --- /dev/null +++ b/packages/node_modules/@node-red/nodes/core/common/task.js @@ -0,0 +1,25 @@ +/** + * Copyright JS Foundation and other contributors, http://js.foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + +// 2022 Modification Copyright - Defense Unicorns + +module.exports = function(RED) { + "use strict"; + function TaskNode(n) { + RED.nodes.createNode(this,n); + } + RED.nodes.registerType("task",TaskNode); +} diff --git a/packages/node_modules/@node-red/nodes/core/function/10-function.html b/packages/node_modules/@node-red/nodes/core/function/10-function.html deleted file mode 100644 index a1ed14f6d..000000000 --- a/packages/node_modules/@node-red/nodes/core/function/10-function.html +++ /dev/null @@ -1,611 +0,0 @@ - - - diff --git a/packages/node_modules/@node-red/nodes/core/function/10-function.js b/packages/node_modules/@node-red/nodes/core/function/10-function.js deleted file mode 100644 index b84ee8571..000000000 --- a/packages/node_modules/@node-red/nodes/core/function/10-function.js +++ /dev/null @@ -1,510 +0,0 @@ -/** - * Copyright JS Foundation and other contributors, http://js.foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -module.exports = function(RED) { - "use strict"; - - var util = require("util"); - var vm = require("vm"); - var acorn = require("acorn"); - var acornWalk = require("acorn-walk"); - - function sendResults(node,send,_msgid,msgs,cloneFirstMessage) { - if (msgs == null) { - return; - } else if (!util.isArray(msgs)) { - msgs = [msgs]; - } - var msgCount = 0; - for (var m=0; m0) { - send(msgs); - } - } - - function createVMOpt(node, kind) { - var opt = { - filename: 'Function node'+kind+':'+node.id+(node.name?' ['+node.name+']':''), // filename for stack traces - displayErrors: true - // Using the following options causes node 4/6 to not include the line number - // in the stack output. So don't use them. - // lineOffset: -11, // line number offset to be used for stack traces - // columnOffset: 0, // column number offset to be used for stack traces - }; - return opt; - } - - function updateErrorInfo(err) { - if (err.stack) { - var stack = err.stack.toString(); - var m = /^([^:]+):([^:]+):(\d+).*/.exec(stack); - if (m) { - var line = parseInt(m[3]) -1; - var kind = "body:"; - if (/setup/.exec(m[1])) { - kind = "setup:"; - } - if (/cleanup/.exec(m[1])) { - kind = "cleanup:"; - } - err.message += " ("+kind+"line "+line+")"; - } - } - } - - function FunctionNode(n) { - RED.nodes.createNode(this,n); - var node = this; - node.name = n.name; - node.func = n.func; - node.outputs = n.outputs; - node.ini = n.initialize ? n.initialize.trim() : ""; - node.fin = n.finalize ? n.finalize.trim() : ""; - node.libs = n.libs || []; - - if (RED.settings.functionExternalModules === false && node.libs.length > 0) { - throw new Error(RED._("function.error.externalModuleNotAllowed")); - } - - - - var functionText = "var results = null;"+ - "results = (async function(msg,__send__,__done__){ "+ - "var __msgid__ = msg._msgid;"+ - "var node = {"+ - "id:__node__.id,"+ - "name:__node__.name,"+ - "path:__node__.path,"+ - "outputCount:__node__.outputCount,"+ - "log:__node__.log,"+ - "error:__node__.error,"+ - "warn:__node__.warn,"+ - "debug:__node__.debug,"+ - "trace:__node__.trace,"+ - "on:__node__.on,"+ - "status:__node__.status,"+ - "send:function(msgs,cloneMsg){ __node__.send(__send__,__msgid__,msgs,cloneMsg);},"+ - "done:__done__"+ - "};\n"+ - node.func+"\n"+ - "})(msg,__send__,__done__);"; - - var handleNodeDoneCall = true; - - // Check to see if the Function appears to call `node.done()`. If so, - // we will assume it is well written and does actually call node.done(). - // Otherwise, we will call node.done() after the function returns regardless. - if (/node\.done\s*\(\s*\)/.test(functionText)) { - // We have spotted the code contains `node.done`. It could be in a comment - // so need to do the extra work to parse the AST and examine it properly. - acornWalk.simple(acorn.parse(functionText,{ecmaVersion: "latest"} ), { - CallExpression(astNode) { - if (astNode.callee && astNode.callee.object) { - if (astNode.callee.object.name === "node" && astNode.callee.property.name === "done") { - handleNodeDoneCall = false; - } - } - } - }) - } - - var finScript = null; - var finOpt = null; - node.topic = n.topic; - node.outstandingTimers = []; - node.outstandingIntervals = []; - node.clearStatus = false; - - var sandbox = { - console:console, - util:util, - Buffer:Buffer, - Date: Date, - RED: { - util: RED.util - }, - __node__: { - id: node.id, - name: node.name, - path: node._path, - outputCount: node.outputs, - log: function() { - node.log.apply(node, arguments); - }, - error: function() { - node.error.apply(node, arguments); - }, - warn: function() { - node.warn.apply(node, arguments); - }, - debug: function() { - node.debug.apply(node, arguments); - }, - trace: function() { - node.trace.apply(node, arguments); - }, - send: function(send, id, msgs, cloneMsg) { - sendResults(node, send, id, msgs, cloneMsg); - }, - on: function() { - if (arguments[0] === "input") { - throw new Error(RED._("function.error.inputListener")); - } - node.on.apply(node, arguments); - }, - status: function() { - node.clearStatus = true; - node.status.apply(node, arguments); - } - }, - context: { - set: function() { - node.context().set.apply(node,arguments); - }, - get: function() { - return node.context().get.apply(node,arguments); - }, - keys: function() { - return node.context().keys.apply(node,arguments); - }, - get global() { - return node.context().global; - }, - get flow() { - return node.context().flow; - } - }, - flow: { - set: function() { - node.context().flow.set.apply(node,arguments); - }, - get: function() { - return node.context().flow.get.apply(node,arguments); - }, - keys: function() { - return node.context().flow.keys.apply(node,arguments); - } - }, - global: { - set: function() { - node.context().global.set.apply(node,arguments); - }, - get: function() { - return node.context().global.get.apply(node,arguments); - }, - keys: function() { - return node.context().global.keys.apply(node,arguments); - } - }, - env: { - get: function(envVar) { - return RED.util.getSetting(node, envVar); - } - }, - setTimeout: function () { - var func = arguments[0]; - var timerId; - arguments[0] = function() { - sandbox.clearTimeout(timerId); - try { - func.apply(node,arguments); - } catch(err) { - node.error(err,{}); - } - }; - timerId = setTimeout.apply(node,arguments); - node.outstandingTimers.push(timerId); - return timerId; - }, - clearTimeout: function(id) { - clearTimeout(id); - var index = node.outstandingTimers.indexOf(id); - if (index > -1) { - node.outstandingTimers.splice(index,1); - } - }, - setInterval: function() { - var func = arguments[0]; - var timerId; - arguments[0] = function() { - try { - func.apply(node,arguments); - } catch(err) { - node.error(err,{}); - } - }; - timerId = setInterval.apply(node,arguments); - node.outstandingIntervals.push(timerId); - return timerId; - }, - clearInterval: function(id) { - clearInterval(id); - var index = node.outstandingIntervals.indexOf(id); - if (index > -1) { - node.outstandingIntervals.splice(index,1); - } - } - }; - if (util.hasOwnProperty('promisify')) { - sandbox.setTimeout[util.promisify.custom] = function(after, value) { - return new Promise(function(resolve, reject) { - sandbox.setTimeout(function(){ resolve(value); }, after); - }); - }; - sandbox.promisify = util.promisify; - } - const moduleLoadPromises = []; - - if (node.hasOwnProperty("libs")) { - let moduleErrors = false; - var modules = node.libs; - modules.forEach(module => { - var vname = module.hasOwnProperty("var") ? module.var : null; - if (vname && (vname !== "")) { - if (sandbox.hasOwnProperty(vname) || vname === 'node') { - node.error(RED._("function.error.moduleNameError",{name:vname})) - moduleErrors = true; - return; - } - sandbox[vname] = null; - var spec = module.module; - if (spec && (spec !== "")) { - moduleLoadPromises.push(RED.import(module.module).then(lib => { - sandbox[vname] = lib.default; - }).catch(err => { - node.error(RED._("function.error.moduleLoadError",{module:module.spec, error:err.toString()})) - throw err; - })); - } - } - }); - if (moduleErrors) { - throw new Error(RED._("function.error.externalModuleLoadError")); - } - } - const RESOLVING = 0; - const RESOLVED = 1; - const ERROR = 2; - var state = RESOLVING; - var messages = []; - var processMessage = (() => {}); - - node.on("input", function(msg,send,done) { - if(state === RESOLVING) { - messages.push({msg:msg, send:send, done:done}); - } - else if(state === RESOLVED) { - processMessage(msg, send, done); - } - }); - Promise.all(moduleLoadPromises).then(() => { - var context = vm.createContext(sandbox); - try { - var iniScript = null; - var iniOpt = null; - if (node.ini && (node.ini !== "")) { - var iniText = ` - (async function(__send__) { - var node = { - id:__node__.id, - name:__node__.name, - path:__node__.path, - outputCount:__node__.outputCount, - log:__node__.log, - error:__node__.error, - warn:__node__.warn, - debug:__node__.debug, - trace:__node__.trace, - status:__node__.status, - send: function(msgs, cloneMsg) { - __node__.send(__send__, RED.util.generateId(), msgs, cloneMsg); - } - }; - `+ node.ini +` - })(__initSend__);`; - iniOpt = createVMOpt(node, " setup"); - iniScript = new vm.Script(iniText, iniOpt); - } - node.script = vm.createScript(functionText, createVMOpt(node, "")); - if (node.fin && (node.fin !== "")) { - var finText = `(function () { - var node = { - id:__node__.id, - name:__node__.name, - path:__node__.path, - outputCount:__node__.outputCount, - log:__node__.log, - error:__node__.error, - warn:__node__.warn, - debug:__node__.debug, - trace:__node__.trace, - status:__node__.status, - send: function(msgs, cloneMsg) { - __node__.error("Cannot send from close function"); - } - }; - `+node.fin +` - })();`; - finOpt = createVMOpt(node, " cleanup"); - finScript = new vm.Script(finText, finOpt); - } - var promise = Promise.resolve(); - if (iniScript) { - context.__initSend__ = function(msgs) { node.send(msgs); }; - promise = iniScript.runInContext(context, iniOpt); - } - - processMessage = function (msg, send, done) { - var start = process.hrtime(); - context.msg = msg; - context.__send__ = send; - context.__done__ = done; - - node.script.runInContext(context); - context.results.then(function(results) { - sendResults(node,send,msg._msgid,results,false); - if (handleNodeDoneCall) { - done(); - } - - var duration = process.hrtime(start); - var converted = Math.floor((duration[0] * 1e9 + duration[1])/10000)/100; - node.metric("duration", msg, converted); - if (process.env.NODE_RED_FUNCTION_TIME) { - node.status({fill:"yellow",shape:"dot",text:""+converted}); - } - }).catch(err => { - if ((typeof err === "object") && err.hasOwnProperty("stack")) { - //remove unwanted part - var index = err.stack.search(/\n\s*at ContextifyScript.Script.runInContext/); - err.stack = err.stack.slice(0, index).split('\n').slice(0,-1).join('\n'); - var stack = err.stack.split(/\r?\n/); - - //store the error in msg to be used in flows - msg.error = err; - - var line = 0; - var errorMessage; - if (stack.length > 0) { - while (line < stack.length && stack[line].indexOf("ReferenceError") !== 0) { - line++; - } - - if (line < stack.length) { - errorMessage = stack[line]; - var m = /:(\d+):(\d+)$/.exec(stack[line+1]); - if (m) { - var lineno = Number(m[1])-1; - var cha = m[2]; - errorMessage += " (line "+lineno+", col "+cha+")"; - } - } - } - if (!errorMessage) { - errorMessage = err.toString(); - } - done(errorMessage); - } - else if (typeof err === "string") { - done(err); - } - else { - done(JSON.stringify(err)); - } - }); - } - - node.on("close", function() { - if (finScript) { - try { - finScript.runInContext(context, finOpt); - } - catch (err) { - node.error(err); - } - } - while (node.outstandingTimers.length > 0) { - clearTimeout(node.outstandingTimers.pop()); - } - while (node.outstandingIntervals.length > 0) { - clearInterval(node.outstandingIntervals.pop()); - } - if (node.clearStatus) { - node.status({}); - } - }); - - promise.then(function (v) { - var msgs = messages; - messages = []; - while (msgs.length > 0) { - msgs.forEach(function (s) { - processMessage(s.msg, s.send, s.done); - }); - msgs = messages; - messages = []; - } - state = RESOLVED; - }).catch((error) => { - messages = []; - state = ERROR; - node.error(error); - }); - - } - catch(err) { - // eg SyntaxError - which v8 doesn't include line number information - // so we can't do better than this - updateErrorInfo(err); - node.error(err); - } - }).catch(err => { - node.error(RED._("function.error.externalModuleLoadError")); - }); - } - RED.nodes.registerType("function",FunctionNode, { - dynamicModuleList: "libs", - settings: { - functionExternalModules: { value: true, exportable: true } - } - }); - RED.library.register("functions"); -}; diff --git a/packages/node_modules/@node-red/nodes/core/function/89-delay.html b/packages/node_modules/@node-red/nodes/core/function/89-delay.html deleted file mode 100644 index 8ee404924..000000000 --- a/packages/node_modules/@node-red/nodes/core/function/89-delay.html +++ /dev/null @@ -1,284 +0,0 @@ - - - - - diff --git a/packages/node_modules/@node-red/nodes/core/function/90-exec.js b/packages/node_modules/@node-red/nodes/core/function/90-exec.js deleted file mode 100644 index 2ae9947dd..000000000 --- a/packages/node_modules/@node-red/nodes/core/function/90-exec.js +++ /dev/null @@ -1,200 +0,0 @@ -/** - * Copyright JS Foundation and other contributors, http://js.foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -module.exports = function(RED) { - "use strict"; - var spawn = require('child_process').spawn; - var exec = require('child_process').exec; - var fs = require('fs'); - var isUtf8 = require('is-utf8'); - - function ExecNode(n) { - RED.nodes.createNode(this,n); - this.cmd = (n.command || "").trim(); - if (n.addpay === undefined) { n.addpay = true; } - this.addpay = n.addpay; - if (this.addpay === true) { - this.addpay = "payload"; - } - this.append = (n.append || "").trim(); - this.useSpawn = (n.useSpawn == "true"); - this.timer = Number(n.timer || 0)*1000; - this.activeProcesses = {}; - this.oldrc = (n.oldrc || false).toString(); - this.execOpt = {encoding:'binary', maxBuffer:RED.settings.execMaxBufferSize||10000000, windowsHide: (n.winHide === true)}; - this.spawnOpt = {windowsHide: (n.winHide === true) } - var node = this; - - if (process.platform === 'linux' && fs.existsSync('/bin/bash')) { node.execOpt.shell = '/bin/bash'; } - - var cleanup = function(p) { - node.activeProcesses[p].kill(); - //node.status({fill:"red",shape:"dot",text:"timeout"}); - //node.error("Exec node timeout"); - } - - this.on("input", function(msg, nodeSend, nodeDone) { - if (msg.hasOwnProperty("kill")) { - if (typeof msg.kill !== "string" || msg.kill.length === 0 || !msg.kill.toUpperCase().startsWith("SIG") ) { msg.kill = "SIGTERM"; } - if (msg.hasOwnProperty("pid")) { - if (node.activeProcesses.hasOwnProperty(msg.pid) ) { - node.activeProcesses[msg.pid].kill(msg.kill.toUpperCase()); - node.status({fill:"red",shape:"dot",text:"killed"}); - } - } - else { - if (Object.keys(node.activeProcesses).length === 1) { - node.activeProcesses[Object.keys(node.activeProcesses)[0]].kill(msg.kill.toUpperCase()); - node.status({fill:"red",shape:"dot",text:"killed"}); - } - } - nodeDone(); - } - else { - var child; - // make the extra args into an array - // then prepend with the msg.payload - var arg = node.cmd; - if (node.addpay) { - var value = RED.util.getMessageProperty(msg, node.addpay); - if (value !== undefined) { - arg += " " + value; - } - } - if (node.append.trim() !== "") { arg += " " + node.append; } - if (this.useSpawn === true) { - // slice whole line by spaces and removes any quotes since spawn can't handle them - arg = arg.match(/(?:[^\s"]+|"[^"]*")+/g).map((a) => { - if (/^".*"$/.test(a)) { - return a.slice(1,-1) - } else { - return a - } - }); - var cmd = arg.shift(); - /* istanbul ignore else */ - node.debug(cmd+" ["+arg+"]"); - child = spawn(cmd,arg,node.spawnOpt); - node.status({fill:"blue",shape:"dot",text:"pid:"+child.pid}); - var unknownCommand = (child.pid === undefined); - if (node.timer !== 0) { - child.tout = setTimeout(function() { cleanup(child.pid); }, node.timer); - } - node.activeProcesses[child.pid] = child; - child.stdout.on('data', function (data) { - if (node.activeProcesses.hasOwnProperty(child.pid) && node.activeProcesses[child.pid] !== null) { - // console.log('[exec] stdout: ' + data,child.pid); - if (isUtf8(data)) { msg.payload = data.toString(); } - else { msg.payload = data; } - nodeSend([RED.util.cloneMessage(msg),null,null]); - } - }); - child.stderr.on('data', function (data) { - if (node.activeProcesses.hasOwnProperty(child.pid) && node.activeProcesses[child.pid] !== null) { - if (isUtf8(data)) { msg.payload = data.toString(); } - else { msg.payload = Buffer.from(data); } - nodeSend([null,RED.util.cloneMessage(msg),null]); - } - }); - child.on('close', function (code,signal) { - if (unknownCommand || (node.activeProcesses.hasOwnProperty(child.pid) && node.activeProcesses[child.pid] !== null)) { - delete node.activeProcesses[child.pid]; - if (child.tout) { clearTimeout(child.tout); } - msg.payload = code; - if (node.oldrc === "false") { - msg.payload = {code:code}; - if (signal) { msg.payload.signal = signal; } - } - if (code === 0) { node.status({}); } - if (code === null) { node.status({fill:"red",shape:"dot",text:"killed"}); } - else if (code < 0) { node.status({fill:"red",shape:"dot",text:"rc:"+code}); } - else { node.status({fill:"yellow",shape:"dot",text:"rc:"+code}); } - nodeSend([null,null,RED.util.cloneMessage(msg)]); - } - nodeDone(); - }); - child.on('error', function (code) { - if (child.tout) { clearTimeout(child.tout); } - delete node.activeProcesses[child.pid]; - if (node.activeProcesses.hasOwnProperty(child.pid) && node.activeProcesses[child.pid] !== null) { - node.error(code,RED.util.cloneMessage(msg)); - } - }); - } - else { - /* istanbul ignore else */ - node.debug(arg); - child = exec(arg, node.execOpt, function (error, stdout, stderr) { - var msg2, msg3; - delete msg.payload; - if (stderr) { - msg2 = RED.util.cloneMessage(msg); - msg2.payload = stderr; - } - msg.payload = Buffer.from(stdout,"binary"); - if (isUtf8(msg.payload)) { msg.payload = msg.payload.toString(); } - node.status({}); - //console.log('[exec] stdout: ' + stdout); - //console.log('[exec] stderr: ' + stderr); - if (error !== null) { - msg3 = RED.util.cloneMessage(msg); - msg3.payload = {code:error.code, message:error.message}; - if (error.signal) { msg3.payload.signal = error.signal; } - if (error.code === null) { node.status({fill:"red",shape:"dot",text:"killed"}); } - else { node.status({fill:"red",shape:"dot",text:"error:"+error.code}); } - node.debug('error:' + error); - } - else if (node.oldrc === "false") { - msg3 = RED.util.cloneMessage(msg); - msg3.payload = {code:0}; - } - if (!msg3) { node.status({}); } - else { - msg.rc = msg3.payload; - if (msg2) { msg2.rc = msg3.payload; } - } - nodeSend([msg,msg2,msg3]); - if (child.tout) { clearTimeout(child.tout); } - delete node.activeProcesses[child.pid]; - nodeDone(); - }); - node.status({fill:"blue",shape:"dot",text:"pid:"+child.pid}); - child.on('error',function() {}); - if (node.timer !== 0) { - child.tout = setTimeout(function() { cleanup(child.pid); }, node.timer); - } - node.activeProcesses[child.pid] = child; - } - } - }); - - this.on('close',function() { - for (var pid in node.activeProcesses) { - /* istanbul ignore else */ - if (node.activeProcesses.hasOwnProperty(pid)) { - if (node.activeProcesses[pid].tout) { clearTimeout(node.activeProcesses[pid].tout); } - // console.log("KILLING",pid); - var process = node.activeProcesses[pid]; - node.activeProcesses[pid] = null; - process.kill(); - } - } - node.activeProcesses = {}; - node.status({}); - }); - } - RED.nodes.registerType("exec",ExecNode); -} diff --git a/packages/node_modules/@node-red/nodes/core/function/rbe.js b/packages/node_modules/@node-red/nodes/core/function/rbe.js deleted file mode 100644 index eb526a441..000000000 --- a/packages/node_modules/@node-red/nodes/core/function/rbe.js +++ /dev/null @@ -1,97 +0,0 @@ - -module.exports = function(RED) { - "use strict"; - function RbeNode(n) { - RED.nodes.createNode(this,n); - this.func = n.func || "rbe"; - this.gap = n.gap || "0"; - this.start = n.start || ''; - this.inout = n.inout || "out"; - this.pc = false; - if (this.gap.substr(-1) === "%") { - this.pc = true; - this.gap = parseFloat(this.gap); - } - this.g = this.gap; - this.property = n.property || "payload"; - this.topi = n.topi || "topic"; - this.septopics = true; - if (n.septopics !== undefined && n.septopics === false) { - this.septopics = false; - } - - var node = this; - - node.previous = {}; - this.on("input",function(msg) { - var topic; - try { - topic = RED.util.getMessageProperty(msg,node.topi); - } - catch(e) { } - if (msg.hasOwnProperty("reset")) { - if (node.septopics && topic && (typeof topic === "string") && (topic !== "")) { - delete node.previous[msg.topic]; - } - else { node.previous = {}; } - } - var value = RED.util.getMessageProperty(msg,node.property); - if (value !== undefined) { - var t = "_no_topic"; - if (node.septopics) { t = topic || t; } - if ((this.func === "rbe") || (this.func === "rbei")) { - var doSend = (this.func !== "rbei") || (node.previous.hasOwnProperty(t)) || false; - if (typeof(value) === "object") { - if (typeof(node.previous[t]) !== "object") { node.previous[t] = {}; } - if (!RED.util.compareObjects(value, node.previous[t])) { - node.previous[t] = RED.util.cloneMessage(value); - if (doSend) { node.send(msg); } - } - } - else { - if (value !== node.previous[t]) { - node.previous[t] = RED.util.cloneMessage(value); - if (doSend) { node.send(msg); } - } - } - } - else { - var n = parseFloat(value); - if (!isNaN(n)) { - if ((typeof node.previous[t] === 'undefined') && (this.func === "narrowband" || this.func === "narrowbandEq")) { - if (node.start === '') { node.previous[t] = n; } - else { node.previous[t] = node.start; } - } - if (node.pc) { node.gap = Math.abs(node.previous[t] * node.g / 100) || 0; } - else { node.gap = Number(node.gap); } - if ((node.previous[t] === undefined) && (node.func === "narrowbandEq")) { node.previous[t] = n; } - if (node.previous[t] === undefined) { node.previous[t] = n - node.gap - 1; } - if (Math.abs(n - node.previous[t]) === node.gap) { - if ((this.func === "deadbandEq")||(this.func === "narrowband")) { - if (node.inout === "out") { node.previous[t] = n; } - node.send(msg); - } - } - else if (Math.abs(n - node.previous[t]) > node.gap) { - if (this.func === "deadband" || this.func === "deadbandEq") { - if (node.inout === "out") { node.previous[t] = n; } - node.send(msg); - } - } - else if (Math.abs(n - node.previous[t]) < node.gap) { - if ((this.func === "narrowband")||(this.func === "narrowbandEq")) { - if (node.inout === "out") { node.previous[t] = n; } - node.send(msg); - } - } - if (node.inout === "in") { node.previous[t] = n; } - } - else { - node.warn(RED._("rbe.warn.nonumber")); - } - } - } // ignore msg with no payload property. - }); - } - RED.nodes.registerType("rbe",RbeNode); -} diff --git a/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js b/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js deleted file mode 100644 index bf677b490..000000000 --- a/packages/node_modules/@node-red/nodes/core/network/21-httprequest.js +++ /dev/null @@ -1,675 +0,0 @@ -/** - * Copyright JS Foundation and other contributors, http://js.foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -module.exports = function(RED) { - "use strict"; - const got = require("got"); - const {CookieJar} = require("tough-cookie"); - const { HttpProxyAgent, HttpsProxyAgent } = require('hpagent'); - const FormData = require('form-data'); - const { v4: uuid } = require('uuid'); - const crypto = require('crypto'); - const URL = require("url").URL - var mustache = require("mustache"); - var querystring = require("querystring"); - var cookie = require("cookie"); - var hashSum = require("hash-sum"); - - - // Cache a reference to the existing https.request function - // so we can compare later to see if an old agent-base instance - // has been required. - // This is generally okay as the core nodes are required before - // any contrib nodes. Where it will fail is if the agent-base module - // is required via the settings file or outside of Node-RED before it - // is started. - // If there are other modules that patch the function, they will get undone - // as well. Not much we can do about that right now. Patching core - // functions is bad. - const HTTPS_MODULE = require("https"); - const HTTPS_REQUEST = HTTPS_MODULE.request; - - function checkNodeAgentPatch() { - if (HTTPS_MODULE.request !== HTTPS_REQUEST && HTTPS_MODULE.request.length === 2) { - RED.log.warn(` - ---------------------------------------------------------------------- -Patched https.request function detected. This will break the -HTTP Request node. The original code has now been restored. - -This is likely caused by a contrib node including an old version of -the 'agent-base@<5.0.0' module. - -You can identify what node is at fault by running: - npm list agent-base -in your Node-RED user directory (${RED.settings.userDir}). ---------------------------------------------------------------------- -`); - HTTPS_MODULE.request = HTTPS_REQUEST - } - } - - function HTTPRequest(n) { - RED.nodes.createNode(this,n); - checkNodeAgentPatch(); - var node = this; - var nodeUrl = n.url; - var isTemplatedUrl = (nodeUrl||"").indexOf("{{") != -1; - var nodeMethod = n.method || "GET"; - var paytoqs = false; - var paytobody = false; - var redirectList = []; - var sendErrorsToCatch = n.senderr; - - var nodeHTTPPersistent = n["persist"]; - if (n.tls) { - var tlsNode = RED.nodes.getNode(n.tls); - } - this.ret = n.ret || "txt"; - this.authType = n.authType || "basic"; - if (RED.settings.httpRequestTimeout) { this.reqTimeout = parseInt(RED.settings.httpRequestTimeout) || 120000; } - else { this.reqTimeout = 120000; } - - if (n.paytoqs === true || n.paytoqs === "query") { paytoqs = true; } - else if (n.paytoqs === "body") { paytobody = true; } - - - var prox, noprox; - if (process.env.http_proxy) { prox = process.env.http_proxy; } - if (process.env.HTTP_PROXY) { prox = process.env.HTTP_PROXY; } - if (process.env.no_proxy) { noprox = process.env.no_proxy.split(","); } - if (process.env.NO_PROXY) { noprox = process.env.NO_PROXY.split(","); } - - var proxyConfig = null; - if (n.proxy) { - proxyConfig = RED.nodes.getNode(n.proxy); - prox = proxyConfig.url; - noprox = proxyConfig.noproxy; - } - - let timingLog = false; - if (RED.settings.hasOwnProperty("httpRequestTimingLog")) { - timingLog = RED.settings.httpRequestTimingLog; - } - - this.on("input",function(msg,nodeSend,nodeDone) { - checkNodeAgentPatch(); - //reset redirectList on each request - redirectList = []; - var preRequestTimestamp = process.hrtime(); - node.status({fill:"blue",shape:"dot",text:"httpin.status.requesting"}); - var url = nodeUrl || msg.url; - if (msg.url && nodeUrl && (nodeUrl !== msg.url)) { // revert change below when warning is finally removed - node.warn(RED._("common.errors.nooverride")); - } - - if (isTemplatedUrl) { - url = mustache.render(nodeUrl,msg); - } - if (!url) { - node.error(RED._("httpin.errors.no-url"),msg); - nodeDone(); - return; - } - - - // url must start http:// or https:// so assume http:// if not set - if (url.indexOf("://") !== -1 && url.indexOf("http") !== 0) { - node.warn(RED._("httpin.errors.invalid-transport")); - node.status({fill:"red",shape:"ring",text:"httpin.errors.invalid-transport"}); - nodeDone(); - return; - } - if (!((url.indexOf("http://") === 0) || (url.indexOf("https://") === 0))) { - if (tlsNode) { - url = "https://"+url; - } else { - url = "http://"+url; - } - } - - // The Request module used in Node-RED 1.x was tolerant of query strings that - // were partially encoded. For example - "?a=hello%20there&b=20%" - // The GOT module doesn't like that. - // The following is an attempt to normalise the url to ensure it is properly - // encoded. We cannot just encode it directly as we don't want any valid - // encoded entity to end up doubly encoded. - if (url.indexOf("?") > -1) { - // Only do this if there is a query string to deal with - const [hostPath, ...queryString] = url.split("?") - const query = queryString.join("?"); - if (query) { - // Look for any instance of % not followed by two hex chars. - // Replace any we find with %25. - const escapedQueryString = query.replace(/(%.?.?)/g, function(v) { - if (/^%[a-f0-9]{2}/i.test(v)) { - return v; - } - return v.replace(/%/,"%25") - }) - url = hostPath+"?"+escapedQueryString; - } - } - - var method = nodeMethod.toUpperCase() || "GET"; - if (msg.method && n.method && (n.method !== "use")) { // warn if override option not set - node.warn(RED._("common.errors.nooverride")); - } - if (msg.method && n.method && (n.method === "use")) { - method = msg.method.toUpperCase(); // use the msg parameter - } - - // var isHttps = (/^https/i.test(url)); - - var opts = {}; - // set defaultport, else when using HttpsProxyAgent, it's defaultPort of 443 will be used :(. - // Had to remove this to get http->https redirect to work - // opts.defaultPort = isHttps?443:80; - opts.timeout = node.reqTimeout; - opts.throwHttpErrors = false; - // TODO: add UI option to auto decompress. Setting to false for 1.x compatibility - opts.decompress = false; - opts.method = method; - opts.headers = {}; - opts.retry = 0; - opts.responseType = 'buffer'; - opts.maxRedirects = 21; - opts.cookieJar = new CookieJar(); - opts.ignoreInvalidCookies = true; - opts.forever = nodeHTTPPersistent; - if (msg.requestTimeout !== undefined) { - if (isNaN(msg.requestTimeout)) { - node.warn(RED._("httpin.errors.timeout-isnan")); - } else if (msg.requestTimeout < 1) { - node.warn(RED._("httpin.errors.timeout-isnegative")); - } else { - opts.timeout = msg.requestTimeout; - } - } - const originalHeaderMap = {}; - - opts.hooks = { - beforeRequest: [ - options => { - // Whilst HTTP headers are meant to be case-insensitive, - // in the real world, there are servers that aren't so compliant. - // GOT will lower case all headers given a chance, so we need - // to restore the case of any headers the user has set. - Object.keys(options.headers).forEach(h => { - if (originalHeaderMap[h] && originalHeaderMap[h] !== h) { - options.headers[originalHeaderMap[h]] = options.headers[h]; - delete options.headers[h]; - } - }) - } - ], - beforeRedirect: [ - (options, response) => { - let redirectInfo = { - location: response.headers.location - } - if (response.headers.hasOwnProperty('set-cookie')) { - redirectInfo.cookies = extractCookies(response.headers['set-cookie']); - } - redirectList.push(redirectInfo) - } - ] - } - - var ctSet = "Content-Type"; // set default camel case - var clSet = "Content-Length"; - if (msg.headers) { - if (msg.headers.hasOwnProperty('x-node-red-request-node')) { - var headerHash = msg.headers['x-node-red-request-node']; - delete msg.headers['x-node-red-request-node']; - var hash = hashSum(msg.headers); - if (hash === headerHash) { - delete msg.headers; - } - } - if (msg.headers) { - for (var v in msg.headers) { - if (msg.headers.hasOwnProperty(v)) { - var name = v.toLowerCase(); - if (name !== "content-type" && name !== "content-length") { - // only normalise the known headers used later in this - // function. Otherwise leave them alone. - name = v; - } - else if (name === 'content-type') { ctSet = v; } - else { clSet = v; } - opts.headers[name] = msg.headers[v]; - } - } - } - } - - if (msg.hasOwnProperty('followRedirects')) { - opts.followRedirect = !!msg.followRedirects; - } - - if (opts.headers.hasOwnProperty('cookie')) { - var cookies = cookie.parse(opts.headers.cookie, {decode:String}); - for (var name in cookies) { - opts.cookieJar.setCookieSync(cookie.serialize(name, cookies[name], {encode:String}), url, {ignoreError: true}); - } - delete opts.headers.cookie; - } - if (msg.cookies) { - for (var name in msg.cookies) { - if (msg.cookies.hasOwnProperty(name)) { - if (msg.cookies[name] === null || msg.cookies[name].value === null) { - // This case clears a cookie for HTTP In/Response nodes. - // Ignore for this node. - } else if (typeof msg.cookies[name] === 'object') { - if(msg.cookies[name].encode === false){ - // If the encode option is false, the value is not encoded. - opts.cookieJar.setCookieSync(cookie.serialize(name, msg.cookies[name].value, {encode: String}), url, {ignoreError: true}); - } else { - // The value is encoded by encodeURIComponent(). - opts.cookieJar.setCookieSync(cookie.serialize(name, msg.cookies[name].value), url, {ignoreError: true}); - } - } else { - opts.cookieJar.setCookieSync(cookie.serialize(name, msg.cookies[name]), url, {ignoreError: true}); - } - } - } - } - var parsedURL = new URL(url) - this.credentials = this.credentials || {} - if (parsedURL.username && !this.credentials.user) { - this.credentials.user = parsedURL.username - } - if (parsedURL.password && !this.credentials.password) { - this.credentials.password = parsedURL.password - } - if (Object.keys(this.credentials).length != 0) { - if (this.authType === "basic") { - // Workaround for https://github.com/sindresorhus/got/issues/1169 (fixed in got v12) - // var cred = "" - if (this.credentials.user || this.credentials.password) { - // cred = `${this.credentials.user}:${this.credentials.password}`; - if (this.credentials.user === undefined) { this.credentials.user = ""} - if (this.credentials.password === undefined) { this.credentials.password = ""} - opts.headers.Authorization = "Basic " + Buffer.from(`${this.credentials.user}:${this.credentials.password}`).toString("base64"); - } - // build own basic auth header - // opts.headers.Authorization = "Basic " + Buffer.from(cred).toString("base64"); - } else if (this.authType === "digest") { - let digestCreds = this.credentials; - let sentCreds = false; - opts.hooks.afterResponse = [(response, retry) => { - if (response.statusCode === 401) { - if (sentCreds) { - return response - } - const requestUrl = new URL(response.request.requestUrl); - const options = response.request.options; - const normalisedHeaders = {}; - Object.keys(response.headers).forEach(k => { - normalisedHeaders[k.toLowerCase()] = response.headers[k] - }) - if (normalisedHeaders['www-authenticate']) { - let authHeader = buildDigestHeader(digestCreds.user,digestCreds.password, options.method, requestUrl.pathname, normalisedHeaders['www-authenticate']) - options.headers.Authorization = authHeader; - } - sentCreds = true; - return retry(options); - } - return response - }]; - } else if (this.authType === "bearer") { - opts.headers.Authorization = `Bearer ${this.credentials.password||""}` - } - } - var payload = null; - - - if (method !== 'GET' && method !== 'HEAD' && typeof msg.payload !== "undefined") { - if (opts.headers['content-type'] == 'multipart/form-data' && typeof msg.payload === "object") { - let formData = new FormData(); - for (var opt in msg.payload) { - if (msg.payload.hasOwnProperty(opt)) { - var val = msg.payload[opt]; - if (val !== undefined && val !== null) { - if (typeof val === 'string' || Buffer.isBuffer(val)) { - formData.append(opt, val); - } else if (typeof val === 'object' && val.hasOwnProperty('value')) { - formData.append(opt,val.value,val.options || {}); - } else { - formData.append(opt,JSON.stringify(val)); - } - } - } - } - // GOT will only set the content-type header with the correct boundary - // if the header isn't set. So we delete it here, for GOT to reset it. - delete opts.headers['content-type']; - opts.body = formData; - } else { - if (typeof msg.payload === "string" || Buffer.isBuffer(msg.payload)) { - payload = msg.payload; - } else if (typeof msg.payload == "number") { - payload = msg.payload+""; - } else { - if (opts.headers['content-type'] == 'application/x-www-form-urlencoded') { - payload = querystring.stringify(msg.payload); - } else { - payload = JSON.stringify(msg.payload); - if (opts.headers['content-type'] == null) { - opts.headers[ctSet] = "application/json"; - } - } - } - if (opts.headers['content-length'] == null) { - if (Buffer.isBuffer(payload)) { - opts.headers[clSet] = payload.length; - } else { - opts.headers[clSet] = Buffer.byteLength(payload); - } - } - opts.body = payload; - } - } - - - if (method == 'GET' && typeof msg.payload !== "undefined" && paytoqs) { - if (typeof msg.payload === "object") { - try { - if (url.indexOf("?") !== -1) { - url += (url.endsWith("?")?"":"&") + querystring.stringify(msg.payload); - } else { - url += "?" + querystring.stringify(msg.payload); - } - } catch(err) { - - node.error(RED._("httpin.errors.invalid-payload"),msg); - nodeDone(); - return; - } - } else { - - node.error(RED._("httpin.errors.invalid-payload"),msg); - nodeDone(); - return; - } - } else if ( method == "GET" && typeof msg.payload !== "undefined" && paytobody) { - opts.allowGetBody = true; - if (typeof msg.payload === "object") { - opts.body = JSON.stringify(msg.payload); - } else if (typeof msg.payload == "number") { - opts.body = msg.payload+""; - } else if (typeof msg.payload === "string" || Buffer.isBuffer(msg.payload)) { - opts.body = msg.payload; - } - } - - // revert to user supplied Capitalisation if needed. - if (opts.headers.hasOwnProperty('content-type') && (ctSet !== 'content-type')) { - opts.headers[ctSet] = opts.headers['content-type']; - delete opts.headers['content-type']; - } - if (opts.headers.hasOwnProperty('content-length') && (clSet !== 'content-length')) { - opts.headers[clSet] = opts.headers['content-length']; - delete opts.headers['content-length']; - } - - var noproxy; - if (noprox) { - for (var i = 0; i < noprox.length; i += 1) { - if (url.indexOf(noprox[i]) !== -1) { noproxy=true; } - } - } - if (prox && !noproxy) { - var match = prox.match(/^(https?:\/\/)?(.+)?:([0-9]+)?/i); - if (match) { - let proxyAgent; - let proxyURL = new URL(prox); - //set username/password to null to stop empty creds header - let proxyOptions = { - proxy: { - protocol: proxyURL.protocol, - hostname: proxyURL.hostname, - port: proxyURL.port, - username: null, - password: null - }, - maxFreeSockets: 256, - maxSockets: 256, - keepAlive: true - } - if (proxyConfig && proxyConfig.credentials) { - let proxyUsername = proxyConfig.credentials.username || ''; - let proxyPassword = proxyConfig.credentials.password || ''; - if (proxyUsername || proxyPassword) { - proxyOptions.proxy.username = proxyUsername; - proxyOptions.proxy.password = proxyPassword; - } - } else if (proxyURL.username || proxyURL.password){ - proxyOptions.proxy.username = proxyURL.username; - proxyOptions.proxy.password = proxyURL.password; - } - //need both incase of http -> https redirect - opts.agent = { - http: new HttpProxyAgent(proxyOptions), - https: new HttpsProxyAgent(proxyOptions) - }; - - } else { - node.warn("Bad proxy url: "+ prox); - } - } - if (tlsNode) { - opts.https = {}; - tlsNode.addTLSOptions(opts.https); - if (opts.https.ca) { - opts.https.certificateAuthority = opts.https.ca; - delete opts.https.ca; - } - if (opts.https.cert) { - opts.https.certificate = opts.https.cert; - delete opts.https.cert; - } - } else { - if (msg.hasOwnProperty('rejectUnauthorized')) { - opts.https = { rejectUnauthorized: msg.rejectUnauthorized }; - } - } - - // Now we have established all of our own headers, take a snapshot - // of their case so we can restore it prior to the request being sent. - if (opts.headers) { - Object.keys(opts.headers).forEach(h => { - originalHeaderMap[h.toLowerCase()] = h - }) - } - got(url,opts).then(res => { - msg.statusCode = res.statusCode; - msg.headers = res.headers; - msg.responseUrl = res.url; - msg.payload = res.body; - msg.redirectList = redirectList; - msg.retry = 0; - - if (msg.headers.hasOwnProperty('set-cookie')) { - msg.responseCookies = extractCookies(msg.headers['set-cookie']); - } - msg.headers['x-node-red-request-node'] = hashSum(msg.headers); - // msg.url = url; // revert when warning above finally removed - if (node.metric()) { - // Calculate request time - var diff = process.hrtime(preRequestTimestamp); - var ms = diff[0] * 1e3 + diff[1] * 1e-6; - var metricRequestDurationMillis = ms.toFixed(3); - node.metric("duration.millis", msg, metricRequestDurationMillis); - if (res.client && res.client.bytesRead) { - node.metric("size.bytes", msg, res.client.bytesRead); - } - if (timingLog) { - emitTimingMetricLog(res.timings, msg); - } - } - - // Convert the payload to the required return type - if (node.ret !== "bin") { - msg.payload = msg.payload.toString('utf8'); // txt - - if (node.ret === "obj") { - try { msg.payload = JSON.parse(msg.payload); } // obj - catch(e) { node.warn(RED._("httpin.errors.json-error")); } - } - } - node.status({}); - nodeSend(msg); - nodeDone(); - }).catch(err => { - // Pre 2.1, any errors would be sent to both Catch node and sent on as normal. - // This is not ideal but is the legacy behaviour of the node. - // 2.1 adds the 'senderr' option, if set to true, will *only* send errors - // to Catch nodes. If false, it still does both behaviours. - // TODO: 3.0 - make it one or the other. - - if (err.code === 'ETIMEDOUT' || err.code === 'ESOCKETTIMEDOUT') { - node.error(RED._("common.notification.errors.no-response"), msg); - node.status({fill:"red", shape:"ring", text:"common.notification.errors.no-response"}); - } else { - node.error(err,msg); - node.status({fill:"red", shape:"ring", text:err.code}); - } - msg.payload = err.toString() + " : " + url; - msg.statusCode = err.code || (err.response?err.response.statusCode:undefined); - if (node.metric() && timingLog) { - emitTimingMetricLog(err.timings, msg); - } - if (!sendErrorsToCatch) { - nodeSend(msg); - } - nodeDone(); - }); - }); - - this.on("close",function() { - node.status({}); - }); - - function emitTimingMetricLog(timings, msg) { - const props = [ - "start", - "socket", - "lookup", - "connect", - "secureConnect", - "upload", - "response", - "end", - "error", - "abort" - ]; - if (timings) { - props.forEach(p => { - if (timings[p]) { - node.metric(`timings.${p}`, msg, timings[p]); - } - }); - } - } - - function extractCookies(setCookie) { - var cookies = {}; - setCookie.forEach(function(c) { - var parsedCookie = cookie.parse(c); - var eq_idx = c.indexOf('='); - var key = c.substr(0, eq_idx).trim() - parsedCookie.value = parsedCookie[key]; - delete parsedCookie[key]; - cookies[key] = parsedCookie; - }); - return cookies; - } - } - - RED.nodes.registerType("http request",HTTPRequest,{ - credentials: { - user: {type:"text"}, - password: {type: "password"} - } - }); - - const md5 = (value) => { return crypto.createHash('md5').update(value).digest('hex') } - - function ha1Compute(algorithm, user, realm, pass, nonce, cnonce) { - /** - * RFC 2617: handle both MD5 and MD5-sess algorithms. - * - * If the algorithm directive's value is "MD5" or unspecified, then HA1 is - * HA1=MD5(username:realm:password) - * If the algorithm directive's value is "MD5-sess", then HA1 is - * HA1=MD5(MD5(username:realm:password):nonce:cnonce) - */ - var ha1 = md5(user + ':' + realm + ':' + pass) - if (algorithm && algorithm.toLowerCase() === 'md5-sess') { - return md5(ha1 + ':' + nonce + ':' + cnonce) - } else { - return ha1 - } - } - - - function buildDigestHeader(user, pass, method, path, authHeader) { - var challenge = {} - var re = /([a-z0-9_-]+)=(?:"([^"]+)"|([a-z0-9_-]+))/gi - for (;;) { - var match = re.exec(authHeader) - if (!match) { - break - } - challenge[match[1]] = match[2] || match[3] - } - var qop = /(^|,)\s*auth\s*($|,)/.test(challenge.qop) && 'auth' - var nc = qop && '00000001' - var cnonce = qop && uuid().replace(/-/g, '') - var ha1 = ha1Compute(challenge.algorithm, user, challenge.realm, pass, challenge.nonce, cnonce) - var ha2 = md5(method + ':' + path) - var digestResponse = qop - ? md5(ha1 + ':' + challenge.nonce + ':' + nc + ':' + cnonce + ':' + qop + ':' + ha2) - : md5(ha1 + ':' + challenge.nonce + ':' + ha2) - var authValues = { - username: user, - realm: challenge.realm, - nonce: challenge.nonce, - uri: path, - qop: qop, - response: digestResponse, - nc: nc, - cnonce: cnonce, - algorithm: challenge.algorithm, - opaque: challenge.opaque - } - - authHeader = [] - for (var k in authValues) { - if (authValues[k]) { - if (k === 'qop' || k === 'nc' || k === 'algorithm') { - authHeader.push(k + '=' + authValues[k]) - } else { - authHeader.push(k + '="' + authValues[k] + '"') - } - } - } - authHeader = 'Digest ' + authHeader.join(', ') - return authHeader - } -} diff --git a/packages/node_modules/@node-red/nodes/core/network/22-websocket.html b/packages/node_modules/@node-red/nodes/core/network/22-websocket.html deleted file mode 100644 index a7b54d72f..000000000 --- a/packages/node_modules/@node-red/nodes/core/network/22-websocket.html +++ /dev/null @@ -1,292 +0,0 @@ - - - - - - - - - - - - - - diff --git a/packages/node_modules/@node-red/nodes/core/network/22-websocket.js b/packages/node_modules/@node-red/nodes/core/network/22-websocket.js deleted file mode 100644 index ed4c93b09..000000000 --- a/packages/node_modules/@node-red/nodes/core/network/22-websocket.js +++ /dev/null @@ -1,423 +0,0 @@ -/** - * Copyright JS Foundation and other contributors, http://js.foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -module.exports = function(RED) { - "use strict"; - var ws = require("ws"); - var inspect = require("util").inspect; - var url = require("url"); - var HttpsProxyAgent = require('https-proxy-agent'); - - - var serverUpgradeAdded = false; - function handleServerUpgrade(request, socket, head) { - const pathname = url.parse(request.url).pathname; - if (listenerNodes.hasOwnProperty(pathname)) { - listenerNodes[pathname].server.handleUpgrade(request, socket, head, function done(ws) { - listenerNodes[pathname].server.emit('connection', ws, request); - }); - } else { - // Don't destroy the socket as other listeners may want to handle the - // event. - } - } - var listenerNodes = {}; - var activeListenerNodes = 0; - - - // A node red node that sets up a local websocket server - function WebSocketListenerNode(n) { - // Create a RED node - RED.nodes.createNode(this,n); - var node = this; - - // Store local copies of the node configuration (as defined in the .html) - node.path = n.path; - if (typeof n.subprotocol === "string") { - // Split the string on comma and trim each result - node.subprotocol = n.subprotocol.split(",").map(v => v.trim()) - } else { - node.subprotocol = []; - } - node.wholemsg = (n.wholemsg === "true"); - - node._inputNodes = []; // collection of nodes that want to receive events - node._clients = {}; - // match absolute url - node.isServer = !/^ws{1,2}:\/\//i.test(node.path); - node.closing = false; - node.tls = n.tls; - - if (n.hb) { - var heartbeat = parseInt(n.hb); - if (heartbeat > 0) { - node.heartbeat = heartbeat * 1000; - } - } - - function startconn() { // Connect to remote endpoint - node.tout = null; - var prox, noprox; - if (process.env.http_proxy) { prox = process.env.http_proxy; } - if (process.env.HTTP_PROXY) { prox = process.env.HTTP_PROXY; } - if (process.env.no_proxy) { noprox = process.env.no_proxy.split(","); } - if (process.env.NO_PROXY) { noprox = process.env.NO_PROXY.split(","); } - - var noproxy = false; - if (noprox) { - for (var i in noprox) { - if (node.path.indexOf(noprox[i].trim()) !== -1) { noproxy=true; } - } - } - - var agent = undefined; - if (prox && !noproxy) { - agent = new HttpsProxyAgent(prox); - } - - var options = {}; - if (agent) { - options.agent = agent; - } - if (node.tls) { - var tlsNode = RED.nodes.getNode(node.tls); - if (tlsNode) { - tlsNode.addTLSOptions(options); - } - } - var socket = new ws(node.path,node.subprotocol,options); - socket.setMaxListeners(0); - node.server = socket; // keep for closing - handleConnection(socket); - } - - function handleConnection(/*socket*/socket) { - var id = RED.util.generateId(); - socket.nrId = id; - socket.nrPendingHeartbeat = false; - if (node.isServer) { - node._clients[id] = socket; - node.emit('opened',{count:Object.keys(node._clients).length,id:id}); - } - socket.on('open',function() { - if (!node.isServer) { - if (node.heartbeat) { - clearInterval(node.heartbeatInterval); - node.heartbeatInterval = setInterval(function() { - if (socket.nrPendingHeartbeat) { - // No pong received - socket.terminate(); - socket.nrErrorHandler(new Error("timeout")); - return; - } - socket.nrPendingHeartbeat = true; - try { - socket.ping(); - } catch(err) {} - },node.heartbeat); - } - node.emit('opened',{count:'',id:id}); - } - }); - socket.on('close',function() { - clearInterval(node.heartbeatInterval); - if (node.isServer) { - delete node._clients[id]; - node.emit('closed',{count:Object.keys(node._clients).length,id:id}); - } else { - node.emit('closed',{count:'',id:id}); - } - if (!node.closing && !node.isServer) { - clearTimeout(node.tout); - node.tout = setTimeout(function() { startconn(); }, 3000); // try to reconnect every 3 secs... bit fast ? - } - }); - socket.on('message',function(data,flags) { - node.handleEvent(id,socket,'message',data,flags); - }); - socket.nrErrorHandler = function(err) { - clearInterval(node.heartbeatInterval); - node.emit('erro',{err:err,id:id}); - if (!node.closing && !node.isServer) { - clearTimeout(node.tout); - node.tout = setTimeout(function() { startconn(); }, 3000); // try to reconnect every 3 secs... bit fast ? - } - } - socket.on('error',socket.nrErrorHandler); - socket.on('ping', function() { - socket.nrPendingHeartbeat = false; - }) - socket.on('pong', function() { - socket.nrPendingHeartbeat = false; - }) - } - - if (node.isServer) { - activeListenerNodes++; - if (!serverUpgradeAdded) { - RED.server.on('upgrade', handleServerUpgrade); - serverUpgradeAdded = true - } - - var path = RED.settings.httpNodeRoot || "/"; - path = path + (path.slice(-1) == "/" ? "":"/") + (node.path.charAt(0) == "/" ? node.path.substring(1) : node.path); - node.fullPath = path; - - if (listenerNodes.hasOwnProperty(path)) { - node.error(RED._("websocket.errors.duplicate-path",{path: node.path})); - return; - } - listenerNodes[node.fullPath] = node; - var serverOptions = { - noServer: true - } - if (RED.settings.webSocketNodeVerifyClient) { - serverOptions.verifyClient = RED.settings.webSocketNodeVerifyClient; - } - // Create a WebSocket Server - node.server = new ws.Server(serverOptions); - node.server.setMaxListeners(0); - node.server.on('connection', handleConnection); - // Not adding server-initiated heartbeats yet - // node.heartbeatInterval = setInterval(function() { - // node.server.clients.forEach(function(ws) { - // if (ws.nrPendingHeartbeat) { - // // No pong received - // ws.terminate(); - // ws.nrErrorHandler(new Error("timeout")); - // return; - // } - // ws.nrPendingHeartbeat = true; - // ws.ping(); - // }); - // }) - } - else { - node.closing = false; - startconn(); // start outbound connection - } - - node.on("close", function() { - if (node.heartbeatInterval) { - clearInterval(node.heartbeatInterval); - } - if (node.isServer) { - delete listenerNodes[node.fullPath]; - node.server.close(); - node._inputNodes = []; - activeListenerNodes--; - // if (activeListenerNodes === 0 && serverUpgradeAdded) { - // RED.server.removeListener('upgrade', handleServerUpgrade); - // serverUpgradeAdded = false; - // } - } - else { - node.closing = true; - node.server.close(); - if (node.tout) { - clearTimeout(node.tout); - node.tout = null; - } - } - }); - } - RED.nodes.registerType("websocket-listener",WebSocketListenerNode); - RED.nodes.registerType("websocket-client",WebSocketListenerNode); - - WebSocketListenerNode.prototype.registerInputNode = function(/*Node*/handler) { - this._inputNodes.push(handler); - } - - WebSocketListenerNode.prototype.removeInputNode = function(/*Node*/handler) { - this._inputNodes.forEach(function(node, i, inputNodes) { - if (node === handler) { - inputNodes.splice(i, 1); - } - }); - } - - WebSocketListenerNode.prototype.handleEvent = function(id,/*socket*/socket,/*String*/event,/*Object*/data,/*Object*/flags) { - var msg; - if (this.wholemsg) { - try { - msg = JSON.parse(data); - if (typeof msg !== "object" && !Array.isArray(msg) && (msg !== null)) { - msg = { payload:msg }; - } - } - catch(err) { - msg = { payload:data }; - } - } else { - msg = { - payload:data - }; - } - msg._session = {type:"websocket",id:id}; - for (var i = 0; i < this._inputNodes.length; i++) { - this._inputNodes[i].send(msg); - } - } - - WebSocketListenerNode.prototype.broadcast = function(data) { - if (this.isServer) { - for (let client in this._clients) { - if (this._clients.hasOwnProperty(client)) { - try { - this._clients[client].send(data); - } catch(err) { - this.warn(RED._("websocket.errors.send-error")+" "+client+" "+err.toString()) - } - } - } - } - else { - try { - this.server.send(data); - } catch(err) { - this.warn(RED._("websocket.errors.send-error")+" "+err.toString()) - } - } - } - - WebSocketListenerNode.prototype.reply = function(id,data) { - var session = this._clients[id]; - if (session) { - try { - session.send(data); - } - catch(e) { // swallow any errors - } - } - } - - function WebSocketInNode(n) { - RED.nodes.createNode(this,n); - this.server = (n.client)?n.client:n.server; - var node = this; - this.serverConfig = RED.nodes.getNode(this.server); - if (this.serverConfig) { - this.serverConfig.registerInputNode(this); - // TODO: nls - this.serverConfig.on('opened', function(event) { - node.status({ - fill:"green",shape:"dot",text:RED._("websocket.status.connected",{count:event.count}), - event:"connect", - _session: {type:"websocket",id:event.id} - }); - }); - this.serverConfig.on('erro', function(event) { - node.status({ - fill:"red",shape:"ring",text:"common.status.error", - event:"error", - _session: {type:"websocket",id:event.id} - }); - }); - this.serverConfig.on('closed', function(event) { - var status; - if (event.count > 0) { - status = {fill:"green",shape:"dot",text:RED._("websocket.status.connected",{count:event.count})}; - } else { - status = {fill:"red",shape:"ring",text:"common.status.disconnected"}; - } - status.event = "disconnect"; - status._session = {type:"websocket",id:event.id} - node.status(status); - }); - } else { - this.error(RED._("websocket.errors.missing-conf")); - } - this.on('close', function() { - if (node.serverConfig) { - node.serverConfig.removeInputNode(node); - } - node.status({}); - }); - } - RED.nodes.registerType("websocket in",WebSocketInNode); - - function WebSocketOutNode(n) { - RED.nodes.createNode(this,n); - var node = this; - this.server = (n.client)?n.client:n.server; - this.serverConfig = RED.nodes.getNode(this.server); - if (!this.serverConfig) { - return this.error(RED._("websocket.errors.missing-conf")); - } - else { - // TODO: nls - this.serverConfig.on('opened', function(event) { - node.status({ - fill:"green",shape:"dot",text:RED._("websocket.status.connected",{count:event.count}), - event:"connect", - _session: {type:"websocket",id:event.id} - }); - }); - this.serverConfig.on('erro', function(event) { - node.status({ - fill:"red",shape:"ring",text:"common.status.error", - event:"error", - _session: {type:"websocket",id:event.id} - }) - }); - this.serverConfig.on('closed', function(event) { - var status; - if (event.count > 0) { - status = {fill:"green",shape:"dot",text:RED._("websocket.status.connected",{count:event.count})}; - } else { - status = {fill:"red",shape:"ring",text:"common.status.disconnected"}; - } - status.event = "disconnect"; - status._session = {type:"websocket",id:event.id} - node.status(status); - }); - } - this.on("input", function(msg, nodeSend, nodeDone) { - var payload; - if (this.serverConfig.wholemsg) { - var sess; - if (msg._session) { sess = JSON.stringify(msg._session); } - delete msg._session; - payload = JSON.stringify(msg); - if (sess) { msg._session = JSON.parse(sess); } - } - else if (msg.hasOwnProperty("payload")) { - if (!Buffer.isBuffer(msg.payload)) { // if it's not a buffer make sure it's a string. - payload = RED.util.ensureString(msg.payload); - } - else { - payload = msg.payload; - } - } - if (payload) { - if (msg._session && msg._session.type == "websocket") { - node.serverConfig.reply(msg._session.id,payload); - } else { - node.serverConfig.broadcast(payload,function(error) { - if (!!error) { - node.warn(RED._("websocket.errors.send-error")+inspect(error)); - } - }); - } - } - nodeDone(); - }); - this.on('close', function() { - node.status({}); - }); - } - RED.nodes.registerType("websocket out",WebSocketOutNode); -} diff --git a/packages/node_modules/@node-red/nodes/core/network/31-tcpin.html b/packages/node_modules/@node-red/nodes/core/network/31-tcpin.html deleted file mode 100644 index 97c8eb4d7..000000000 --- a/packages/node_modules/@node-red/nodes/core/network/31-tcpin.html +++ /dev/null @@ -1,383 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js b/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js deleted file mode 100644 index 24e6abf7e..000000000 --- a/packages/node_modules/@node-red/nodes/core/network/31-tcpin.js +++ /dev/null @@ -1,852 +0,0 @@ -/** - * Copyright JS Foundation and other contributors, http://js.foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -module.exports = function(RED) { - "use strict"; - let reconnectTime = RED.settings.socketReconnectTime || 10000; - let socketTimeout = RED.settings.socketTimeout || null; - const msgQueueSize = RED.settings.tcpMsgQueueSize || 1000; - const Denque = require('denque'); - const net = require('net'); - const tls = require('tls'); - - let connectionPool = {}; - - function normalizeConnectArgs(listArgs) { - const args = net._normalizeArgs(listArgs); - const options = args[0]; - const cb = args[1]; - - // If args[0] was options, then normalize dealt with it. - // If args[0] is port, or args[0], args[1] is host, port, we need to - // find the options and merge them in, normalize's options has only - // the host/port/path args that it knows about, not the tls options. - // This means that options.host overrides a host arg. - if (listArgs[1] !== null && typeof listArgs[1] === 'object') { - ObjectAssign(options, listArgs[1]); - } else if (listArgs[2] !== null && typeof listArgs[2] === 'object') { - ObjectAssign(options, listArgs[2]); - } - - return cb ? [options, cb] : [options]; - } - - function getAllowUnauthorized() { - const allowUnauthorized = process.env.NODE_TLS_REJECT_UNAUTHORIZED === '0'; - - if (allowUnauthorized) { - process.emitWarning( - 'Setting the NODE_TLS_REJECT_UNAUTHORIZED ' + - 'environment variable to \'0\' makes TLS connections ' + - 'and HTTPS requests insecure by disabling ' + - 'certificate verification.'); - } - return allowUnauthorized; - } - - /** - * Enqueue `item` in `queue` - * @param {Denque} queue - Queue - * @param {*} item - Item to enqueue - * @private - * @returns {Denque} `queue` - */ - const enqueue = (queue, item) => { - // drop msgs from front of queue if size is going to be exceeded - if (queue.length === msgQueueSize) { queue.shift(); } - queue.push(item); - return queue; - }; - - /** - * Shifts item off front of queue - * @param {Deque} queue - Queue - * @private - * @returns {*} Item previously at front of queue - */ - const dequeue = queue => queue.shift(); - - function TcpIn(n) { - RED.nodes.createNode(this,n); - this.host = n.host; - this.port = n.port * 1; - this.topic = n.topic; - this.stream = (!n.datamode||n.datamode=='stream'); /* stream,single*/ - this.datatype = n.datatype||'buffer'; /* buffer,utf8,base64 */ - this.newline = (n.newline||"").replace("\\n","\n").replace("\\r","\r").replace("\\t","\t"); - this.base64 = n.base64; - this.server = (typeof n.server == 'boolean')?n.server:(n.server == "server"); - this.closing = false; - this.connected = false; - var node = this; - var count = 0; - if (n.tls) { var tlsNode = RED.nodes.getNode(n.tls); } - - if (!node.server) { - var buffer = null; - var client; - var reconnectTimeout; - var end = false; - var setupTcpClient = function() { - node.log(RED._("tcpin.status.connecting",{host:node.host,port:node.port})); - node.status({fill:"grey",shape:"dot",text:"common.status.connecting"}); - var id = RED.util.generateId(); - var connOpts = {host: node.host}; - if (n.tls) { - var connOpts = tlsNode.addTLSOptions({host: node.host}); - client = tls.connect(node.port, connOpts, function() { - buffer = (node.datatype == 'buffer') ? Buffer.alloc(0) : ""; - node.connected = true; - node.log(RED._("status.connected", {host: node.host, port: node.port})); - node.status({fill:"green",shape:"dot",text:"common.status.connected",_session:{type:"tcp",id:id}}); - }); - } - else { - client = net.connect(node.port, node.host, function() { - buffer = (node.datatype == 'buffer') ? Buffer.alloc(0) : ""; - node.connected = true; - node.log(RED._("tcpin.status.connected",{host:node.host,port:node.port})); - node.status({fill:"green",shape:"dot",text:"common.status.connected",_session:{type:"tcp",id:id}}); - }); - } - client.setKeepAlive(true, 120000); - connectionPool[id] = client; - - client.on('data', function (data) { - if (node.datatype != 'buffer') { - data = data.toString(node.datatype); - } - if (node.stream) { - var msg; - if ((node.datatype) === "utf8" && node.newline !== "") { - buffer = buffer+data; - var parts = buffer.split(node.newline); - for (var i = 0; i 0)) { - var msg = {topic:node.topic, payload:buffer}; - msg._session = {type:"tcp",id:id}; - if (buffer.length !== 0) { - end = true; // only ask for fast re-connect if we actually got something - node.send(msg); - } - buffer = null; - } - }); - client.on('close', function() { - delete connectionPool[id]; - node.connected = false; - node.status({fill:"red",shape:"ring",text:"common.status.disconnected",_session:{type:"tcp",id:id}}); - if (!node.closing) { - if (end) { // if we were asked to close then try to reconnect once very quick. - end = false; - reconnectTimeout = setTimeout(setupTcpClient, 20); - } - else { - node.log(RED._("tcpin.errors.connection-lost",{host:node.host,port:node.port})); - reconnectTimeout = setTimeout(setupTcpClient, reconnectTime); - } - } else { - if (node.doneClose) { node.doneClose(); } - } - }); - client.on('error', function(err) { - node.log(err); - }); - } - setupTcpClient(); - - this.on('close', function(done) { - node.doneClose = done; - this.closing = true; - if (client) { client.destroy(); } - clearTimeout(reconnectTimeout); - if (!node.connected) { done(); } - }); - } - else { - let srv = net; - let connOpts; - if (n.tls) { - srv = tls; - connOpts = tlsNode.addTLSOptions({}); - } - var server = srv.createServer(connOpts, function (socket) { - socket.setKeepAlive(true,120000); - if (socketTimeout !== null) { socket.setTimeout(socketTimeout); } - var id = RED.util.generateId(); - var fromi; - var fromp; - connectionPool[id] = socket; - count++; - node.status({ - text:RED._("tcpin.status.connections",{count:count}), - event:"connect", - ip:socket.remoteAddress, - port:socket.remotePort, - _session: {type:"tcp",id:id} - }); - - var buffer = (node.datatype == 'buffer') ? Buffer.alloc(0) : ""; - socket.on('data', function (data) { - if (node.datatype != 'buffer') { - data = data.toString(node.datatype); - } - if (node.stream) { - var msg; - if ((typeof data) === "string" && node.newline !== "") { - buffer = buffer+data; - var parts = buffer.split(node.newline); - for (var i = 0; i 0) { - var msg = {topic:node.topic, payload:buffer, ip:fromi, port:fromp}; - msg._session = {type:"tcp",id:id}; - node.send(msg); - } - buffer = null; - } - }); - socket.on('timeout', function() { - node.log(RED._("tcpin.errors.timeout",{port:node.port})); - socket.end(); - }); - socket.on('close', function() { - delete connectionPool[id]; - count--; - node.status({ - text:RED._("tcpin.status.connections",{count:count}), - event:"disconnect", - ip:socket.remoteAddress, - port:socket.remotePort, - _session: {type:"tcp",id:id} - - }); - }); - socket.on('error',function(err) { - node.log(err); - }); - }); - - server.on('error', function(err) { - if (err) { - node.error(RED._("tcpin.errors.cannot-listen",{port:node.port,error:err.toString()})); - } - }); - - server.listen(node.port, function(err) { - if (err) { - node.error(RED._("tcpin.errors.cannot-listen",{port:node.port,error:err.toString()})); - } else { - node.log(RED._("tcpin.status.listening-port",{port:node.port})); - node.on('close', function() { - for (var c in connectionPool) { - if (connectionPool.hasOwnProperty(c)) { - connectionPool[c].end(); - connectionPool[c].unref(); - } - } - node.closing = true; - server.close(); - node.log(RED._("tcpin.status.stopped-listening",{port:node.port})); - }); - } - }); - } - } - RED.nodes.registerType("tcp in",TcpIn); - - - function TcpOut(n) { - RED.nodes.createNode(this,n); - this.host = n.host; - this.port = n.port * 1; - this.base64 = n.base64; - this.doend = n.end || false; - this.beserver = n.beserver; - this.name = n.name; - this.closing = false; - this.connected = false; - var node = this; - if (n.tls) { var tlsNode = RED.nodes.getNode(n.tls); } - - if (!node.beserver || node.beserver == "client") { - var reconnectTimeout; - var client = null; - var end = false; - - var setupTcpClient = function() { - node.log(RED._("tcpin.status.connecting",{host:node.host,port:node.port})); - node.status({fill:"grey",shape:"dot",text:"common.status.connecting"}); - if (n.tls) { - // connOpts = tlsNode.addTLSOptions(connOpts); - // client = tls.connect(connOpts, function() { - var connOpts = tlsNode.addTLSOptions({host: node.host}); - client = tls.connect(node.port, connOpts, function() { - // buffer = (node.datatype == 'buffer') ? Buffer.alloc(0) : ""; - node.connected = true; - node.log(RED._("status.connected", {host: node.host, port: node.port})); - node.status({fill:"green",shape:"dot",text:"common.status.connected"}); - }); - } - else { - client = net.connect(node.port, node.host, function() { - node.connected = true; - node.log(RED._("tcpin.status.connected",{host:node.host,port:node.port})); - node.status({fill:"green",shape:"dot",text:"common.status.connected"}); - }); - } - client.setKeepAlive(true,120000); - client.on('error', function (err) { - node.log(RED._("tcpin.errors.error",{error:err.toString()})); - }); - client.on('end', function (err) { - node.status({}); - node.connected = false; - }); - client.on('close', function() { - node.status({fill:"red",shape:"ring",text:"common.status.disconnected"}); - node.connected = false; - client.destroy(); - if (!node.closing) { - if (end) { - end = false; - reconnectTimeout = setTimeout(setupTcpClient,20); - } - else { - node.log(RED._("tcpin.errors.connection-lost",{host:node.host,port:node.port})); - reconnectTimeout = setTimeout(setupTcpClient,reconnectTime); - } - } else { - if (node.doneClose) { node.doneClose(); } - } - }); - } - setupTcpClient(); - - node.on("input", function(msg, nodeSend, nodeDone) { - if (node.connected && msg.payload != null) { - if (Buffer.isBuffer(msg.payload)) { - client.write(msg.payload); - } else if (typeof msg.payload === "string" && node.base64) { - client.write(Buffer.from(msg.payload,'base64')); - } else { - client.write(Buffer.from(""+msg.payload)); - } - if (node.doend === true) { - end = true; - if (client) { node.status({}); client.destroy(); } - } - } - nodeDone(); - }); - - node.on("close", function(done) { - node.doneClose = done; - this.closing = true; - if (client) { client.destroy(); } - clearTimeout(reconnectTimeout); - if (!node.connected) { done(); } - }); - - } - else if (node.beserver == "reply") { - node.on("input",function(msg, nodeSend, nodeDone) { - if (msg._session && msg._session.type == "tcp") { - var client = connectionPool[msg._session.id]; - if (client) { - if (Buffer.isBuffer(msg.payload)) { - client.write(msg.payload); - } else if (typeof msg.payload === "string" && node.base64) { - client.write(Buffer.from(msg.payload,'base64')); - } else { - client.write(Buffer.from(""+msg.payload)); - } - } - } - else { - for (var i in connectionPool) { - if (Buffer.isBuffer(msg.payload)) { - connectionPool[i].write(msg.payload); - } else if (typeof msg.payload === "string" && node.base64) { - connectionPool[i].write(Buffer.from(msg.payload,'base64')); - } else { - connectionPool[i].write(Buffer.from(""+msg.payload)); - } - } - } - nodeDone(); - }); - } - else { - var connectedSockets = []; - node.status({text:RED._("tcpin.status.connections",{count:0})}); - let srv = net; - let connOpts; - if (n.tls) { - srv = tls; - connOpts = tlsNode.addTLSOptions({}); - } - var server = srv.createServer(connOpts, function (socket) { - socket.setKeepAlive(true,120000); - if (socketTimeout !== null) { socket.setTimeout(socketTimeout); } - node.log(RED._("tcpin.status.connection-from",{host:socket.remoteAddress, port:socket.remotePort})); - socket.on('timeout', function() { - node.log(RED._("tcpin.errors.timeout",{port:node.port})); - socket.end(); - }); - socket.on('data', function(d) { - // console.log("DATA",d) - }); - socket.on('close',function() { - node.log(RED._("tcpin.status.connection-closed",{host:socket.remoteAddress, port:socket.remotePort})); - connectedSockets.splice(connectedSockets.indexOf(socket),1); - node.status({text:RED._("tcpin.status.connections",{count:connectedSockets.length})}); - }); - socket.on('error',function() { - node.log(RED._("tcpin.errors.socket-error",{host:socket.remoteAddress, port:socket.remotePort})); - connectedSockets.splice(connectedSockets.indexOf(socket),1); - node.status({text:RED._("tcpin.status.connections",{count:connectedSockets.length})}); - }); - connectedSockets.push(socket); - node.status({text:RED._("tcpin.status.connections",{count:connectedSockets.length})}); - }); - - node.on("input", function(msg, nodeSend, nodeDone) { - if (msg.payload != null) { - var buffer; - if (Buffer.isBuffer(msg.payload)) { - buffer = msg.payload; - } else if (typeof msg.payload === "string" && node.base64) { - buffer = Buffer.from(msg.payload,'base64'); - } else { - buffer = Buffer.from(""+msg.payload); - } - for (var i = 0; i < connectedSockets.length; i += 1) { - if (node.doend === true) { connectedSockets[i].end(buffer); } - else { connectedSockets[i].write(buffer); } - } - } - nodeDone(); - }); - - server.on('error', function(err) { - if (err) { - node.error(RED._("tcpin.errors.cannot-listen",{port:node.port,error:err.toString()})); - } - }); - - server.listen(node.port, function(err) { - if (err) { - node.error(RED._("tcpin.errors.cannot-listen",{port:node.port,error:err.toString()})); - } else { - node.log(RED._("tcpin.status.listening-port",{port:node.port})); - node.on('close', function() { - for (var c in connectedSockets) { - if (connectedSockets.hasOwnProperty(c)) { - connectedSockets[c].end(); - connectedSockets[c].unref(); - } - } - server.close(); - node.log(RED._("tcpin.status.stopped-listening",{port:node.port})); - }); - } - }); - } - } - RED.nodes.registerType("tcp out",TcpOut); - - - function TcpGet(n) { - RED.nodes.createNode(this,n); - this.server = n.server; - this.port = Number(n.port); - this.out = n.out; - this.ret = n.ret || "buffer"; - this.newline = (n.newline||"").replace("\\n","\n").replace("\\r","\r").replace("\\t","\t"); - this.splitc = n.splitc; - if (n.tls) { - var tlsNode = RED.nodes.getNode(n.tls); - } - - if (this.out === "immed") { this.splitc = -1; this.out = "time"; } - if (this.out !== "char") { this.splitc = Number(this.splitc); } - else { - if (this.splitc[0] == '\\') { - this.splitc = parseInt(this.splitc.replace("\\n",0x0A).replace("\\r",0x0D).replace("\\t",0x09).replace("\\e",0x1B).replace("\\f",0x0C).replace("\\0",0x00)); - } // jshint ignore:line - if (typeof this.splitc == "string") { - if (this.splitc.substr(0,2) == "0x") { - this.splitc = parseInt(this.splitc); - } - else { - this.splitc = this.splitc.charCodeAt(0); - } - } // jshint ignore:line - } - - var node = this; - - var clients = {}; - - this.on("input", function(msg, nodeSend, nodeDone) { - var i = 0; - if ((!Buffer.isBuffer(msg.payload)) && (typeof msg.payload !== "string")) { - msg.payload = msg.payload.toString(); - } - - var host = node.server || msg.host; - var port = node.port || msg.port; - - // Store client information independently - // the clients object will have: - // clients[id].client, clients[id].msg, clients[id].timeout - var connection_id = host + ":" + port; - if (connection_id !== node.last_id) { - node.status({}); - node.last_id = connection_id; - } - clients[connection_id] = clients[connection_id] || { - msgQueue: new Denque(), - connected: false, - connecting: false - }; - enqueue(clients[connection_id].msgQueue, {msg:msg, nodeSend:nodeSend, nodeDone:nodeDone}); - clients[connection_id].lastMsg = msg; - - if (!clients[connection_id].connecting && !clients[connection_id].connected) { - var buf; - if (this.out == "count") { - if (this.splitc === 0) { buf = Buffer.alloc(1); } - else { buf = Buffer.alloc(this.splitc); } - } - else { buf = Buffer.alloc(65536); } // set it to 64k... hopefully big enough for most TCP packets.... but only hopefully - - var connOpts = {host:host, port:port}; - if (n.tls) { - connOpts = tlsNode.addTLSOptions(connOpts); - const allowUnauthorized = getAllowUnauthorized(); - - let options = { - rejectUnauthorized: !allowUnauthorized, - ciphers: tls.DEFAULT_CIPHERS, - checkServerIdentity: tls.checkServerIdentity, - minDHSize: 1024, - ...connOpts - }; - - if (!options.keepAlive) { options.singleUse = true; } - - const context = options.secureContext || tls.createSecureContext(options); - - clients[connection_id].client = new tls.TLSSocket(options.socket, { - allowHalfOpen: options.allowHalfOpen, - pipe: !!options.path, - secureContext: context, - isServer: false, - requestCert: false, // true, - rejectUnauthorized: false, // options.rejectUnauthorized !== false, - session: options.session, - ALPNProtocols: options.ALPNProtocols, - requestOCSP: options.requestOCSP, - enableTrace: options.enableTrace, - pskCallback: options.pskCallback, - highWaterMark: options.highWaterMark, - onread: options.onread, - signal: options.signal, - }); - } - else { - clients[connection_id].client = net.Socket(); - } - if (socketTimeout !== null) { clients[connection_id].client.setTimeout(socketTimeout);} - - if (host && port) { - clients[connection_id].connecting = true; - clients[connection_id].client.connect(connOpts, function() { - //node.log(RED._("tcpin.errors.client-connected")); - node.status({fill:"green",shape:"dot",text:"common.status.connected"}); - if (clients[connection_id] && clients[connection_id].client) { - clients[connection_id].connected = true; - clients[connection_id].connecting = false; - let event; - while (event = dequeue(clients[connection_id].msgQueue)) { - clients[connection_id].client.write(event.msg.payload); - event.nodeDone(); - } - if (node.out === "time" && node.splitc < 0) { - clients[connection_id].connected = clients[connection_id].connecting = false; - clients[connection_id].client.end(); - delete clients[connection_id]; - node.status({}); - } - } - }); - } - else { - node.warn(RED._("tcpin.errors.no-host")); - } - var chunk = ""; - clients[connection_id].client.on('data', function(data) { - if (node.out === "sit") { // if we are staying connected just send the buffer - if (clients[connection_id]) { - const msg = clients[connection_id].lastMsg || {}; - msg.payload = RED.util.cloneMessage(data); - if (node.ret === "string") { - try { - if (node.newline && node.newline !== "" ) { - chunk += msg.payload.toString(); - let parts = chunk.split(node.newline); - for (var p=0; p= node.splitc) { - if (clients[connection_id]) { - const msg = clients[connection_id].lastMsg || {}; - msg.payload = Buffer.alloc(i); - buf.copy(msg.payload,0,0,i); - if (node.ret === "string") { - try { msg.payload = msg.payload.toString(); } - catch(e) { node.error("Failed to create string", msg); } - } - nodeSend(msg); - if (clients[connection_id].client) { - node.status({}); - clients[connection_id].client.destroy(); - delete clients[connection_id]; - } - i = 0; - } - } - } - // look for a char - else { - buf[i] = data[j]; - i += 1; - if (data[j] == node.splitc) { - if (clients[connection_id]) { - const msg = clients[connection_id].lastMsg || {}; - msg.payload = Buffer.alloc(i); - buf.copy(msg.payload,0,0,i); - if (node.ret === "string") { - try { msg.payload = msg.payload.toString(); } - catch(e) { node.error("Failed to create string", msg); } - } - nodeSend(msg); - if (clients[connection_id].client) { - node.status({}); - clients[connection_id].client.destroy(); - delete clients[connection_id]; - } - i = 0; - } - } - } - } - } - }); - - clients[connection_id].client.on('end', function() { - //console.log("END"); - node.status({fill:"grey",shape:"ring",text:"common.status.disconnected"}); - if (clients[connection_id] && clients[connection_id].client) { - clients[connection_id].connected = clients[connection_id].connecting = false; - clients[connection_id].client = null; - } - }); - - clients[connection_id].client.on('close', function() { - //console.log("CLOSE"); - if (clients[connection_id]) { - clients[connection_id].connected = clients[connection_id].connecting = false; - } - - var anyConnected = false; - - for (var client in clients) { - if (clients[client].connected) { - anyConnected = true; - break; - } - } - if (node.doneClose && !anyConnected) { - clients = {}; - node.doneClose(); - } - }); - - clients[connection_id].client.on('error', function() { - //console.log("ERROR"); - node.status({fill:"red",shape:"ring",text:"common.status.error"}); - node.error(RED._("tcpin.errors.connect-fail") + " " + connection_id, msg); - if (clients[connection_id] && clients[connection_id].client) { - clients[connection_id].client.destroy(); - delete clients[connection_id]; - } - }); - - clients[connection_id].client.on('timeout',function() { - //console.log("TIMEOUT"); - if (clients[connection_id]) { - clients[connection_id].connected = clients[connection_id].connecting = false; - node.status({fill:"grey",shape:"dot",text:"tcpin.errors.connect-timeout"}); - //node.warn(RED._("tcpin.errors.connect-timeout")); - if (clients[connection_id].client) { - clients[connection_id].connecting = true; - - var connOpts = {host:host, port:port}; - if (n.tls) { - connOpts = tlsNode.addTLSOptions(connOpts); - } - - clients[connection_id].client.connect(connOpts, function() { - clients[connection_id].connected = true; - clients[connection_id].connecting = false; - node.status({fill:"green",shape:"dot",text:"common.status.connected"}); - }); - } - } - }); - } - else if (!clients[connection_id].connecting && clients[connection_id].connected) { - if (clients[connection_id] && clients[connection_id].client) { - let event = dequeue(clients[connection_id].msgQueue) - clients[connection_id].client.write(event.msg.payload); - event.nodeDone(); - } - } - }); - - this.on("close", function(done) { - node.doneClose = done; - for (var cl in clients) { - if (clients[cl].hasOwnProperty("client")) { - clients[cl].client.destroy(); - } - } - node.status({}); - - // this is probably not necessary and may be removed - var anyConnected = false; - for (var c in clients) { - if (clients[c].connected) { - anyConnected = true; - break; - } - } - if (!anyConnected) { clients = {}; } - done(); - }); - - } - RED.nodes.registerType("tcp request",TcpGet); -} diff --git a/packages/node_modules/@node-red/nodes/core/parsers/70-JSON.js b/packages/node_modules/@node-red/nodes/core/parsers/70-JSON.js deleted file mode 100644 index e16c4ec23..000000000 --- a/packages/node_modules/@node-red/nodes/core/parsers/70-JSON.js +++ /dev/null @@ -1,138 +0,0 @@ -/** - * Copyright JS Foundation and other contributors, http://js.foundation - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - **/ - -module.exports = function(RED) { - "use strict"; - const Ajv = require('ajv'); - const ajv = new Ajv({allErrors: true}); - ajv.addMetaSchema(require('ajv/lib/refs/json-schema-draft-06.json')); - - function JSONNode(n) { - RED.nodes.createNode(this,n); - this.indent = n.pretty ? 4 : 0; - this.action = n.action||""; - this.property = n.property||"payload"; - this.schema = null; - this.compiledSchema = null; - - var node = this; - - this.on("input", function(msg,send,done) { - var validate = false; - if (msg.schema) { - // If input schema is different, re-compile it - if (JSON.stringify(this.schema) != JSON.stringify(msg.schema)) { - try { - this.compiledSchema = ajv.compile(msg.schema); - this.schema = msg.schema; - } catch(e) { - this.schema = null; - this.compiledSchema = null; - done(RED._("json.errors.schema-error-compile")); - return; - } - } - validate = true; - } - var value = RED.util.getMessageProperty(msg,node.property); - if (value !== undefined) { - if (typeof value === "string" || Buffer.isBuffer(value)) { - // if (Buffer.isBuffer(value) && node.action !== "obj") { - // node.warn(RED._("json.errors.dropped")); done(); - // } - // else - if (node.action === "" || node.action === "obj") { - try { - RED.util.setMessageProperty(msg,node.property,JSON.parse(value)); - if (validate) { - if (this.compiledSchema(msg[node.property])) { - delete msg.schema; - send(msg); - done(); - } else { - msg.schemaError = this.compiledSchema.errors; - done(`${RED._("json.errors.schema-error")}: ${ajv.errorsText(this.compiledSchema.errors)}`); - } - } else { - send(msg); - done(); - } - } - catch(e) { done(e.message); } - } else { - // If node.action is str and value is str - if (validate) { - if (this.compiledSchema(JSON.parse(msg[node.property]))) { - delete msg.schema; - send(msg); - done(); - } else { - msg.schemaError = this.compiledSchema.errors; - done(`${RED._("json.errors.schema-error")}: ${ajv.errorsText(this.compiledSchema.errors)}`); - } - } else { - send(msg); - done(); - } - } - } - else if ((typeof value === "object") || (typeof value === "boolean") || (typeof value === "number")) { - if (node.action === "" || node.action === "str") { - if (!Buffer.isBuffer(value)) { - try { - if (validate) { - if (this.compiledSchema(value)) { - RED.util.setMessageProperty(msg,node.property,JSON.stringify(value,null,node.indent)); - delete msg.schema; - send(msg); - done(); - } else { - msg.schemaError = this.compiledSchema.errors; - done(`${RED._("json.errors.schema-error")}: ${ajv.errorsText(this.compiledSchema.errors)}`); - } - } else { - RED.util.setMessageProperty(msg,node.property,JSON.stringify(value,null,node.indent)); - send(msg); - done(); - } - } - catch(e) { done(RED._("json.errors.dropped-error")); } - } - else { node.warn(RED._("json.errors.dropped-object")); done(); } - } else { - // If node.action is obj and value is object - if (validate) { - if (this.compiledSchema(value)) { - delete msg.schema; - send(msg); - done(); - } else { - msg.schemaError = this.compiledSchema.errors; - done(`${RED._("json.errors.schema-error")}: ${ajv.errorsText(this.compiledSchema.errors)}`); - } - } else { - send(msg); - done(); - } - } - } - else { node.warn(RED._("json.errors.dropped")); done(); } - } - else { send(msg); done(); } // If no property - just pass it on. - }); - } - RED.nodes.registerType("json",JSONNode); -} diff --git a/packages/node_modules/@node-red/nodes/icons/guide.svg b/packages/node_modules/@node-red/nodes/icons/guide.svg new file mode 100644 index 000000000..b46237cfb --- /dev/null +++ b/packages/node_modules/@node-red/nodes/icons/guide.svg @@ -0,0 +1 @@ + \ No newline at end of file From cce9173e107a3d027c3f3da5aa5c9765221550b1 Mon Sep 17 00:00:00 2001 From: Jordan McClintock Date: Thu, 24 Feb 2022 12:25:10 -0600 Subject: [PATCH 6/6] Updated flows to use new node types --- data/flows.json | 137 +++++++++--------- .../@node-red/nodes/core/common/task.html | 2 +- 2 files changed, 70 insertions(+), 69 deletions(-) diff --git a/data/flows.json b/data/flows.json index e8985ee9d..3add6c9e2 100644 --- a/data/flows.json +++ b/data/flows.json @@ -62,7 +62,7 @@ }, { "id": "73521b98841c6355", - "type": "comment", + "type": "resource", "z": "0ac7681ed1c2bc4b", "name": "Kubernetes", "info": "# Description\n\n\n## Resources\n- https://kubernetes.io/docs/home/ ***\n- https://www.youtube.com/watch?v=VnvRFRk_51k \n- https://www.youtube.com/watch?v=X48VuDVv0do (long video, covers most topics in this flow)", @@ -79,7 +79,7 @@ }, { "id": "90665185044d3fc2", - "type": "comment", + "type": "resource", "z": "0ac7681ed1c2bc4b", "name": "Kubernetes Objects", "info": "", @@ -94,7 +94,7 @@ }, { "id": "ccf8bad6e9ebfb6a", - "type": "comment", + "type": "resource", "z": "0ac7681ed1c2bc4b", "name": "Kubernetes Networking", "info": "", @@ -106,7 +106,7 @@ }, { "id": "4146a7d5608cc03b", - "type": "comment", + "type": "resource", "z": "0ac7681ed1c2bc4b", "name": "Kubernetes Storage", "info": "", @@ -118,7 +118,7 @@ }, { "id": "418551f904d62b20", - "type": "comment", + "type": "resource", "z": "0ac7681ed1c2bc4b", "name": "Kubernetes App Manifests", "info": "", @@ -130,7 +130,7 @@ }, { "id": "0d309e7b063a4ce2", - "type": "comment", + "type": "resource", "z": "0ac7681ed1c2bc4b", "name": "Configurations", "info": "", @@ -145,7 +145,7 @@ }, { "id": "d810b83f64f0bc5e", - "type": "comment", + "type": "resource", "z": "0ac7681ed1c2bc4b", "name": "Deployments", "info": "", @@ -159,7 +159,7 @@ }, { "id": "752d2d1fc700d27e", - "type": "comment", + "type": "resource", "z": "0ac7681ed1c2bc4b", "name": "Pods", "info": "", @@ -171,7 +171,7 @@ }, { "id": "c53965f3ddc770ad", - "type": "comment", + "type": "resource", "z": "0ac7681ed1c2bc4b", "name": "Configmaps", "info": "", @@ -183,7 +183,7 @@ }, { "id": "e902145181ebd724", - "type": "comment", + "type": "resource", "z": "0ac7681ed1c2bc4b", "name": "Secrets", "info": "", @@ -195,7 +195,7 @@ }, { "id": "5dfd2ba38ec5178d", - "type": "comment", + "type": "resource", "z": "eb7909bcf5fcaf8a", "name": "Containerization", "info": "", @@ -209,7 +209,7 @@ }, { "id": "8c04bec4a15f6702", - "type": "comment", + "type": "resource", "z": "eb7909bcf5fcaf8a", "name": "Helm", "info": "", @@ -223,7 +223,7 @@ }, { "id": "fc01372231b580db", - "type": "comment", + "type": "resource", "z": "eb7909bcf5fcaf8a", "name": "Custom Resource Definitions", "info": "", @@ -237,7 +237,7 @@ }, { "id": "09d8e90d5b4ade12", - "type": "comment", + "type": "resource", "z": "eb7909bcf5fcaf8a", "name": "Kustomization", "info": "", @@ -251,7 +251,7 @@ }, { "id": "71a96ec4058930db", - "type": "comment", + "type": "resource", "z": "eb7909bcf5fcaf8a", "name": "GitOps", "info": "", @@ -265,7 +265,7 @@ }, { "id": "98df2d11adb09046", - "type": "comment", + "type": "resource", "z": "eb7909bcf5fcaf8a", "name": "git", "info": "# Description\n\n[Git](https://git-scm.com/) is a free and open source distributed version control system.\n\n## Resources\n- https://git-scm.com/docs\n\n\n## Examples\n- github.com\n- gitlab.com\n- https://gitea.com/", @@ -279,7 +279,7 @@ }, { "id": "45465f711df6da7e", - "type": "comment", + "type": "resource", "z": "eb7909bcf5fcaf8a", "name": "Flux", "info": "", @@ -293,7 +293,7 @@ }, { "id": "e328f5849309e731", - "type": "comment", + "type": "resource", "z": "eb7909bcf5fcaf8a", "name": "Big Bang", "info": "", @@ -322,7 +322,7 @@ }, { "id": "81348cdecdf51fd9", - "type": "comment", + "type": "resource", "z": "eb7909bcf5fcaf8a", "name": "Operators", "info": "https://www.youtube.com/watch?v=ha3LjlD6g7g", @@ -336,27 +336,28 @@ }, { "id": "40bfe328130d9c41", - "type": "comment", + "type": "guide", "z": "c86af370eff94afa", "name": "Deploy K3d", "info": "Throughout this guide you will be using K3d to deploy and manage kubernetes instances.\n\n## Choose your platform\nThe preferred free VM software is [VirtualBox](https://www.virtualbox.org/); however, it is not compatible with M1 chips! So, if you are using an M1 Mac, we highly recommend you go with the [Cloud](#Cloud) option below\n\n### Cloud\nRecommend using an EC2 instance with the following specs:\n- AMI: Ubuntu Server (64-bit, x86)\n- Instance Type: t3a.2xlarge\n- 100 GB EBS\n- Security group rules for allowing web traffic\n\n### Local VM\nUse [Vagrant](https://www.vagrantup.com/) to spin up a VM with at least the following specs:\n- 10GB RAM\n- 4 CPU cores\n- An IP that can be [accessed](https://www.vagrantup.com/docs/networking/private_network#static-ip) from the host machine. \n\n### Local\nAny Docker installation except a non-WSL2 Windows installation will work with K3d natively.\n\n## K3d setup\n\nSetup instructions for K3d can be found at the link below.\n\nhttps://k3d.io/v5.2.2/\n\n## Cluster creation\n\nOnce you have a host for deploying a k3d cluster - you can configure a cluster for future nodes in this training.\n\nOne possible configuration would be a 3 node cluster with 1 server and 2 agents (to get started).\n\nAnother consideration is exposing applications after the cluster is running and apps have been deployed w/ services and ingresses.\n\nDepending on RAM/CPU availability, you may want to run 2 or more K3d nodes\n\nA possible configuration might look like:\n\n`k3d cluster create -s 1 -a 2 -p \"8081:80@loadbalancer\" dev-cluster`\n\n-s 1 represents 1 server node\n-a 2 represents 2 agent nodes\n\n-p \"8081:80@loadbalancer\" represents mapping 8081 on this k3d host to ports 80 internally.", - "x": 510, - "y": 40, + "x": 360, + "y": 60, "wires": [ [ "691424f6cfd58372", - "1458b18889c13942" + "1458b18889c13942", + "6d2d525b92151db2" ] ] }, { "id": "691424f6cfd58372", - "type": "comment", + "type": "guide", "z": "c86af370eff94afa", "name": "Deploy a pod info application (with Kustomize)", "info": "# Kustomize\n\n\"Kustomize is a command-line configuration manager for Kubernetes objects. Integrated with kubectl since 1.14, it allows you to make declarative changes to your configurations without touching a template.\"\n\n## Recommended Reading\n\n`https://www.mirantis.com/blog/introduction-to-kustomize-part-1-creating-a-kubernetes-app-out-of-multiple-pieces/`\n\nThe above tutorial can be run on the k3d cluster you have created. This is a much more complex example than the podinfo example you will deploy below.\n\n## Podinfo\n\n\"Podinfo is a tiny web application made with Go that showcases best practices of running microservices in Kubernetes\"\n\n### Deployment\n\nNavigate to `https://github.com/stefanprodan/podinfo`\n\nClone the repository to your local machine\n\nFrom within the cloned directory, we can execute kustomize through the built in functionality in `kubectl`.\n\n`kubectl kustomize ./kustomize`\n\nThis will return the built manifest for the application to be deployed. You can then deploy the application to the cluster through `kubectl apply -k ./kustomize`\n\n## Success Criteria\n\n- 2 podinfo pods in the target namespace (default if not specified)\n- A podinfo service\n- A horizontal pod autoscaler\n\nWe can port-forward this applications service and visit it in browser to confirm functionality.\n\n`kubectl port-forward service/podinfo 9898:http`\n\nThis port fowards the podinfo service `http` port (as defined in the service) to the 9898 host port.", - "x": 630, - "y": 130, + "x": 420, + "y": 190, "wires": [ [ "2d66fece0a8f5fdf" @@ -365,12 +366,12 @@ }, { "id": "2d66fece0a8f5fdf", - "type": "comment", + "type": "task", "z": "c86af370eff94afa", "name": "Expose podinfo with an Ingress", "info": "# Ingress\n\nIn the previous exercise, we deployed the podinfo application and confirmed functionality by visiting it in-browser through port-forwarding with kubectl. We can instead use an ingress and the default traefik ingress-controller to handle this functionaity more natively. \n\nOfficial k3d docs: https://k3d.io/v5.0.0/usage/exposing_services/\n\n## Ingress deployment\nDue to the cluster configuration that we executed in the first node (See the -p loadbalancer parameter). we can configure an ingress to expose the application, as is one of a few standard practices for exposing internal applications to external traffic.\n\n### Ingress template\n\nIngress docs: https://kubernetes.io/docs/concepts/services-networking/ingress/\n\nGiven the template from the docs/tutorial we can write an ingress to support this traffic.\n\n## Success Criteria\n\nAfter the ingress is deployed (and given you configured your cluster as described in the first node), then you should be able to access the podinfo application without port-forwarding at `http://localhost:8081` \n\n## Cleanup\n\nThis concludes this deployment of podinfo. You'll want to cleanup the resources we have created. ", - "x": 630, - "y": 200, + "x": 420, + "y": 260, "wires": [ [ "52eb692e4c51108f" @@ -379,12 +380,12 @@ }, { "id": "52eb692e4c51108f", - "type": "comment", + "type": "guide", "z": "c86af370eff94afa", "name": "Create a podinfo helm chart", "info": "# Helm\n\"Helm is the package manager for Kubernetes\"\n\n## Recommended Reading\nhttps://helm.sh/\nhttps://helm.sh/docs/intro/\n\n## Podinfo Helm Chart from Scratch\n\nTODO - Insert content for:\n- deployment\n- service\n- ingress\n- HPA\n* All templated from scratch\n\n## Deploy the official podinfo chart from local files\n\nPreviously we cloned the podinfo repository to our/a local machine. Under the root of the project there is a `charts` directory with a `podinfo` directory that contains the podinfo chart content.\n\n## Basic deployment\n\nLet's create a testing namespace for our target\n`kubectl create ns testing`\n\nWith Helm installed and our k3d cluster still running/configured, we can install the chart in it's vanilla form (without enabling any additional content).\n\n(From the charts directory)\n`helm install podinfo-dev ./podinfo -n testing`\n\nThis will deploy the chart which results in the deployment and service creation in the target namespace.\n\n## Customizations\nWe can inject exposed customizations as outlined in the README/values.yaml for the purpose of configuring the end package being suited for our needs.\n\nWe can make an edit to the values.yaml and upgrade our application.\n\nhpa:\n enabled: true\n \n`helm upgrade podinfo-dev -n testing ./podinfo`\n\nThis should result in an HPA being deployed to our namespace for the application.\n", - "x": 630, - "y": 270, + "x": 420, + "y": 330, "wires": [ [ "5361df412a99db12" @@ -393,12 +394,12 @@ }, { "id": "5361df412a99db12", - "type": "comment", + "type": "guide", "z": "c86af370eff94afa", "name": "Deploy BigBang on a new K3d cluster", "info": "# Big Bang\n\nUsing our machine with k3d, we can instantiate a development/prototype deployment of Big Bang.\n\n## Objective\n\nFollow the qiuckstart here:\nhttps://repo1.dso.mil/platform-one/big-bang/bigbang/-/blob/master/docs/guides/deployment_scenarios/quickstart.md\n\n## Success Criteria\n\nAs noted in step 13 - the web UI's should be resolvable and accessible. All pods should be up and healthy (running). ", - "x": 630, - "y": 340, + "x": 420, + "y": 400, "wires": [ [ "67415f95eb8ab46c" @@ -407,12 +408,12 @@ }, { "id": "67415f95eb8ab46c", - "type": "comment", + "type": "task", "z": "c86af370eff94afa", "name": "Deploy podinfo helmchart in a bigbang cluster", "info": "# Big Bang Extensibility\n\nUp to now - we have configured and deployed k3d clusters, we've used `kustomize` and `Helm` to orchestrate deploying `podinfo` to our cluster.\n\nWe then used flux and it's controllers to deploy bigbang (which is using helm and kustomize under the hood).\n\n## Recommended Reading\n\n## Objective\nNow we will look at extending the big bang deployment to include deploying the podinfo helm chart and ensuring the deployment architecture aligns with the Big Bang \"Core\" technologies.\n\nThis is a precursory step to follow-on nodes in this flow. \n\n## Execution\n\nClone the podinfo repository if not done already.\n\nCreate a namespace with the label:\n`istio-injection: enabled`\n\nDeploy the helm chart for the podinfo applicaiton as we have done previously.\n\n## Success Criteria\nDeploy the podinfo helm chart into your cluster that already has big bang deployed.\n\nThe application should come online and be able to be reached via `kubectl port-forward`\n\nContinue to the next node for extending this with Istio", - "x": 630, - "y": 410, + "x": 420, + "y": 470, "wires": [ [ "9b8fdffdc9b5cc53" @@ -421,12 +422,12 @@ }, { "id": "9b8fdffdc9b5cc53", - "type": "comment", + "type": "task", "z": "c86af370eff94afa", "name": "Add Istio Virtual Service for the podinfo deployment", "info": "# Istio VirtualServices\n\n## Recommended Reading\n\n- https://istio.io/latest/docs/reference/config/networking/virtual-service/\n\n### Example\n- https://repo1.dso.mil/platform-one/big-bang/apps/core/kiali/-/blob/main/chart/values.yaml#:~:text=istio%3A,kiali.%7B%7B%20.Values.hostname%20%7D%7D\n- https://repo1.dso.mil/platform-one/big-bang/apps/core/kiali/-/blob/main/chart/templates/bigbang/virtualservice.yaml\n\n## Objective\nWith the podinfo helm chart deployed (in it's basic state), we will look to leverage some of th technologies that Big Bang has reconciled and configured.\n\nBig Bang exposes cluster applications to external traffic through an Istio Ingress Gateway.\n\nVirtual services are then used to link kubernetes services to traffic from the ingresss gateways.\n\n## Execution\n\n\n\n## Success Criteria\nWrite a virtual service resource definition file for the podinfo application that was deployed as part of the last node.\n\nIf you add the `podinfo.bigbang.dev` endpoint to your hosts file, then it should be resolveable from the browser.\n\n## Solution\n
show\n

\n\n```\napiVersion: networking.istio.io/v1beta1\nkind: VirtualService\nmetadata:\n name: podinfo\n namespace: podinfo\nspec:\n gateways:\n - istio-system/public\n hosts:\n - podinfo.bigbang.dev\n http:\n - route:\n - destination:\n host: podinfo.podinfo.svc.cluster.local\n port:\n number: 9898\n```\n\n

\n
", - "x": 630, - "y": 480, + "x": 420, + "y": 540, "wires": [ [ "339481fd79e107a6" @@ -435,12 +436,12 @@ }, { "id": "339481fd79e107a6", - "type": "comment", + "type": "task", "z": "c86af370eff94afa", "name": "Deploy podinfo as a Flux HelmRelease", "info": "# Flux helm release reconciliation\n\"Big Bang follows a GitOps approach to configuration management, using Flux v2 to reconcile Git with the cluster. Environments (e.g. dev, prod) and packages (e.g. istio) can be fully configured to suit the deployment needs.\"\n\n## Prerequisites\n- Remove all prior content for podinfo from your cluster. \n\n## Recommended Reading\n- https://repo1.dso.mil/platform-one/big-bang/bigbang/-/blob/master/README.md\n\n## Objective\nFollowing the umbrella structure in the Big Bang chart, we can create the templates under a `podinfo` directory (under the templates dir).\n\nNote: there are many ways to accomplish this task - the podinfo directory under the templates directory most-accurately represents how the umbrella structure works.\n\n### Minimum Requirements\n- namespace resource\n- git repository resource\n- helm release resource\n- virtual service resource\n\nThis would meet the bare minimum requirements.\n\n### Additional Content\n- values file (a helper generates a secret resource from this)\n\n## Success Criteria\nIf we run the `helm upgrade` command against the modified Big Bang helm chart, it should deploy the podinfo chart (if properly enabled) with the ability to access/resolve the application through the `Ingress Gateway`.", - "x": 630, - "y": 550, + "x": 420, + "y": 610, "wires": [ [ "0f9889d8e9cb7edb" @@ -449,36 +450,36 @@ }, { "id": "0f9889d8e9cb7edb", - "type": "comment", + "type": "guide", "z": "c86af370eff94afa", "name": "Play DOOM using ZARF", "info": "# Zarf!\n\nZarf is a Defense Unicorns developed tool - please read about it below!\n\n## Recommended Reading\n- https://github.com/defenseunicorns/zarf\n\n\n## Objective\nUsing Zarf, we will follow the guide below in order to play DOOM.\n\nhttps://github.com/defenseunicorns/zarf/tree/master/examples/game\n\n## Success Criteria\nPackaging, Deployment and execution of playing DOOM from within the browser.", - "x": 630, - "y": 620, + "x": 420, + "y": 680, "wires": [ [] ] }, { "id": "1458b18889c13942", - "type": "comment", + "type": "guide", "z": "c86af370eff94afa", "name": "Deploy and Access the Kubernetes Dashboard", "info": "# Description\n\n# Resources\n\n# Unicorn SME(s)\n", - "x": 240, - "y": 130, + "x": 800, + "y": 190, "wires": [ [] ] }, { "id": "6d2d525b92151db2", - "type": "comment", + "type": "resource", "z": "c86af370eff94afa", "name": "Kustomize", "info": "# Description\n\n# Resources\n\n# Unicorn SME(s)\n", - "x": 740, - "y": 40, + "x": 230, + "y": 120, "wires": [ [ "691424f6cfd58372" @@ -487,12 +488,12 @@ }, { "id": "a25127e60aa3afac", - "type": "comment", + "type": "resource", "z": "c86af370eff94afa", "name": "Helm", "info": "# Description\n\n# Resources\n\n# Unicorn SME(s)\n", - "x": 910, - "y": 200, + "x": 150, + "y": 260, "wires": [ [ "52eb692e4c51108f" @@ -501,12 +502,12 @@ }, { "id": "bd30d9f248bb244a", - "type": "comment", + "type": "resource", "z": "c86af370eff94afa", "name": "Big Bang", "info": "# Description\n\n# Resources\n\n# Unicorn SME(s)\n", - "x": 910, - "y": 270, + "x": 150, + "y": 330, "wires": [ [ "5361df412a99db12" @@ -515,12 +516,12 @@ }, { "id": "f17eae05b57f6a2e", - "type": "comment", + "type": "resource", "z": "c86af370eff94afa", "name": "Istio", "info": "# Description\n\n# Resources\n\n# Unicorn SME(s)\n", - "x": 910, - "y": 410, + "x": 150, + "y": 470, "wires": [ [ "9b8fdffdc9b5cc53" @@ -529,12 +530,12 @@ }, { "id": "3a185c296c95de08", - "type": "comment", + "type": "resource", "z": "c86af370eff94afa", "name": "Flux", "info": "# Description\n\n# Resources\n\n# Unicorn SME(s)\n", - "x": 910, - "y": 480, + "x": 150, + "y": 540, "wires": [ [ "339481fd79e107a6" @@ -543,12 +544,12 @@ }, { "id": "14c8378318de0a59", - "type": "comment", + "type": "resource", "z": "c86af370eff94afa", "name": "Traefix Ingress", "info": "# Description\n\n# Resources\n\n# Unicorn SME(s)\n", - "x": 910, - "y": 130, + "x": 150, + "y": 190, "wires": [ [ "2d66fece0a8f5fdf" diff --git a/packages/node_modules/@node-red/nodes/core/common/task.html b/packages/node_modules/@node-red/nodes/core/common/task.html index c1f8ebdac..c59c309b8 100644 --- a/packages/node_modules/@node-red/nodes/core/common/task.html +++ b/packages/node_modules/@node-red/nodes/core/common/task.html @@ -17,7 +17,7 @@