Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

node-red-contrib-boolean-logic-ultimate

Package Overview
Dependencies
Maintainers
1
Versions
91
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

node-red-contrib-boolean-logic-ultimate - npm Package Compare versions

Comparing version 1.0.53 to 1.0.54

boolean-logic-ultimate/utils.js

34

boolean-logic-ultimate/BlinkerUltimate.js

@@ -44,5 +44,9 @@ module.exports = function (RED) {

}
if (msg.hasOwnProperty("payload")) {
const utils = require("./utils.js");
let sPayload = utils.fetchFromObject(msg, config.payloadPropName || "payload");
if (sPayload !== undefined) {
// 06/11/2019
if (ToBoolean(msg.payload) === true) {
if (utils.ToBoolean(sPayload) === true) {
if (node.tBlinker !== null) clearInterval(node.tBlinker);

@@ -72,28 +76,2 @@ node.tBlinker = setInterval(handleTimer, node.blinkfrequency); // Start the timer that handles the queue of telegrams

function ToBoolean(value) {
let res = false;
let decimal = /^\s*[+-]{0,1}\s*([\d]+(\.[\d]*)*)\s*$/
if (typeof value === 'boolean') {
res = value;
}
else if (typeof value === 'number' || typeof value === 'string') {
if (typeof value === "string" && value.toLowerCase() === "on") return true;
if (typeof value === "string" && value.toLowerCase() === "off") return false;
// Is it formated as a decimal number?
if (decimal.test(value)) {
res = parseFloat(value) != 0;
}
else {
res = value.toLowerCase() === "true";
}
}
return res;
};
function handleTimer() {

@@ -100,0 +78,0 @@ node.curPayload = !node.curPayload;

@@ -97,11 +97,11 @@ module.exports = function (RED) {

}
// 15/11/2021 inform user about undefined topic or payload
if (!msg.hasOwnProperty("payload") || msg.payload === undefined || msg.payload === null) {
setNodeStatus({ fill: "red", shape: "dot", text: "Received invalid payload from " + msg.topic || "" });
return;
}
var topic = msg.topic;
const utils = require("./utils.js");
let sPayload = utils.fetchFromObject(msg, config.payloadPropName || "payload");
// 12/08/2021 Restrict only to true/false
if (node.restrictinputevaluation) {
if (msg.payload !== true && msg.payload !== false) {
if (sPayload !== true && sPayload !== false) {
setNodeStatus({ fill: "red", shape: "dot", text: "Received non boolean value from " + msg.topic });

@@ -112,6 +112,10 @@ return;

var topic = msg.topic;
var payload = msg.payload;
var value = ToBoolean(payload);
var value = utils.ToBoolean(sPayload);
// 15/11/2021 inform user about undefined topic or payload
if (sPayload === undefined) {
setNodeStatus({ fill: "red", shape: "dot", text: "Received invalid payload from " + msg.topic || "" });
return;
}
// 14/08/2019 if inputs are initialized, remove a "dummy" item from the state's array, as soon as new topic arrives

@@ -282,26 +286,4 @@ if (node.sInitializeWith !== "WaitForPayload") {

function ToBoolean(value) {
let res = false;
let decimal = /^\s*[+-]{0,1}\s*([\d]+(\.[\d]*)*)\s*$/
if (typeof value === 'boolean') {
res = value;
}
else if (typeof value === 'number' || typeof value === 'string') {
if (typeof value === "string" && value.toLowerCase() === "on") return true;
if (typeof value === "string" && value.toLowerCase() === "off") return false;
// Is it formated as a decimal number?
if (decimal.test(value)) {
res = parseFloat(value) != 0;
}
else {
res = value.toLowerCase() === "true";
}
}
return res;
};
function outputResult() {

@@ -308,0 +290,0 @@ let optionalTopic = node.config.topic;

@@ -16,4 +16,7 @@ module.exports = function (RED) {

const utils = require("./utils.js");
let sPayload = utils.fetchFromObject(msg, config.payloadPropName || "payload");
// 15/11/2021 inform user about undefined topic or payload
if (!msg.hasOwnProperty("payload") || msg.payload === undefined || msg.payload === null) {
if (sPayload=== undefined ) {
setNodeStatus({ fill: "red", shape: "dot", text: "Received invalid payload from " + msg.topic || "" });

@@ -23,5 +26,6 @@ return;

var bRes = null;
try {
bRes = ToBoolean(msg.payload);
bRes = utils.ToBoolean(sPayload);
} catch (error) {

@@ -31,3 +35,3 @@ }

if (bRes === undefined || bRes === null) {
setNodeStatus({ fill: "red", shape: "dot", text: "Received non convertible boolean value " + msg.payload + " from " + msg.topic });
setNodeStatus({ fill: "red", shape: "dot", text: "Received non convertible boolean value " + sPayload + " from " + msg.topic });
return;

@@ -50,27 +54,2 @@ }

function ToBoolean(value) {
let res = false;
let decimal = /^\s*[+-]{0,1}\s*([\d]+(\.[\d]*)*)\s*$/
if (typeof value === 'boolean') {
res = value;
}
else if (typeof value === 'number' || typeof value === 'string') {
if (typeof value === "string" && value.toLowerCase() === "on") return true;
if (typeof value === "string" && value.toLowerCase() === "off") return false;
// Is it formated as a decimal number?
if (decimal.test(value)) {
res = parseFloat(value) != 0;
}
else {
res = value.toLowerCase() === "true";
}
}
return res;
};
}

@@ -77,0 +56,0 @@

@@ -93,4 +93,7 @@

this.on('input', function (msg) {
const utils = require("./utils.js");
let sPayload = utils.fetchFromObject(msg, config.payloadPropName || "payload");
if (msg.payload === true) {
if (sPayload === true) {
if (node.isPlaying) {

@@ -102,3 +105,3 @@ node.setNodeStatus({ fill: "yellow", shape: "ring", text: "Already running. Stop me first." });

} else if (msg.payload === false) {
} else if (sPayload === false) {
if (node.timerWait !== null) clearTimeout(node.timerWait);

@@ -105,0 +108,0 @@ node.isPlaying = false;

@@ -46,10 +46,11 @@ module.exports = function (RED) {

const utils = require("./utils.js");
let sPayload = utils.fetchFromObject(msg, config.payloadPropName || "payload");
// 15/11/2021 inform user about undefined topic or payload
if (!msg.hasOwnProperty("payload") || msg.payload === undefined || msg.payload === null) {
if (sPayload === undefined ) {
setNodeStatus({ fill: "red", shape: "dot", text: "Received invalid payload from " + msg.topic || "" });
return;
}
msg.payload = utils.ToBoolean(sPayload); // 15/11/2021 Convert input to boolean.
msg.payload = ToBoolean(msg.payload); // 15/11/2021 Convert input to boolean.
// 28/01/2022 Stop autotoggle

@@ -97,27 +98,2 @@ if (node.timerAutoToggle !== null) clearInterval(node.timerAutoToggle);

function ToBoolean(value) {
let res = false;
let decimal = /^\s*[+-]{0,1}\s*([\d]+(\.[\d]*)*)\s*$/
if (typeof value === 'boolean') {
res = value;
}
else if (typeof value === 'number' || typeof value === 'string') {
if (typeof value === "string" && value.toLowerCase() === "on") return true;
if (typeof value === "string" && value.toLowerCase() === "off") return false;
// Is it formated as a decimal number?
if (decimal.test(value)) {
res = parseFloat(value) != 0;
}
else {
res = value.toLowerCase() === "true";
}
}
return res;
};
}

@@ -124,0 +100,0 @@

@@ -26,5 +26,6 @@ module.exports = function (RED) {

// 11/11/2021 Clone input message and replace only relevant topics
const utils = require("./utils.js");
var bRes = null;
try {
bRes = ToBoolean(msg.payload);
bRes = utils.ToBoolean(msg.payload);
} catch (error) {

@@ -48,30 +49,2 @@ }

function ToBoolean(value) {
let res = false;
let decimal = /^\s*[+-]{0,1}\s*([\d]+(\.[\d]*)*)\s*$/
if (typeof value === 'boolean') {
res = value;
}
else if (typeof value === 'number' || typeof value === 'string') {
if (typeof value === "string" && value.toLowerCase() === "on") return true;
if (typeof value === "string" && value.toLowerCase() === "off") return false;
// Is it formated as a decimal number?
if (decimal.test(value)) {
res = parseFloat(value) != 0;
}
else {
res = value.toLowerCase() === "true";
}
}
return res;
};
}

@@ -78,0 +51,0 @@

@@ -44,10 +44,14 @@ module.exports = function (RED) {

const utils = require("./utils.js");
let sPayload = utils.fetchFromObject(msg, config.payloadPropName || "payload");
// 15/11/2021 inform user about undefined topic or payload
if (!msg.hasOwnProperty("payload") || msg.payload === undefined || msg.payload === null) {
if (sPayload === undefined ) {
setNodeStatus({ fill: "red", shape: "dot", text: "Received invalid payload from " + msg.topic || "" });
return;
}
msg.payload = utils.ToBoolean(sPayload); // 15/11/2021 Convert input to boolean.
msg.payload = ToBoolean(msg.payload); // 15/11/2021 Convert input to boolean.
// 28/01/2022 Stop autotoggle

@@ -74,28 +78,2 @@ if (node.timerAutoToggle !== null) clearInterval(node.timerAutoToggle);

function ToBoolean(value) {
let res = false;
let decimal = /^\s*[+-]{0,1}\s*([\d]+(\.[\d]*)*)\s*$/
if (typeof value === 'boolean') {
res = value;
}
else if (typeof value === 'number' || typeof value === 'string') {
if (typeof value === "string" && value.toLowerCase() === "on") return true;
if (typeof value === "string" && value.toLowerCase() === "off") return false;
// Is it formated as a decimal number?
if (decimal.test(value)) {
res = parseFloat(value) != 0;
}
else {
res = value.toLowerCase() === "true";
}
}
return res;
};
}

@@ -102,0 +80,0 @@

@@ -6,3 +6,4 @@ module.exports = function (RED) {

var node = this;
node.valueToToggle = config.valueToToggle === undefined ? true : ToBoolean(config.valueToToggle);
const utils = require("./utils.js");
node.valueToToggle = config.valueToToggle === undefined ? true : utils.ToBoolean(config.valueToToggle);

@@ -18,5 +19,7 @@ function setNodeStatus({ fill, shape, text }) {

const utils = require("./utils.js");
let sPayload = utils.fetchFromObject(msg, config.payloadPropName || "payload");
// 15/11/2021 inform user about undefined topic or payload
if (!msg.hasOwnProperty("payload") || msg.payload === undefined || msg.payload === null) {
if (sPayload === undefined ) {
setNodeStatus({ fill: "red", shape: "dot", text: "Received invalid payload from " + msg.topic || "" });

@@ -40,29 +43,2 @@ return;

function ToBoolean(value) {
let res = false;
let decimal = /^\s*[+-]{0,1}\s*([\d]+(\.[\d]*)*)\s*$/
if (typeof value === 'boolean') {
res = value;
}
else if (typeof value === 'number' || typeof value === 'string') {
if (typeof value === "string" && value.toLowerCase() === "on") return true;
if (typeof value === "string" && value.toLowerCase() === "off") return false;
// Is it formated as a decimal number?
if (decimal.test(value)) {
res = parseFloat(value) != 0;
}
else {
res = value.toLowerCase() === "true";
}
}
return res;
};
}

@@ -69,0 +45,0 @@

@@ -7,2 +7,8 @@ # node-red-contrib-boolean-logic-ultimate

<p>
<b>Version 1.0.54</b> July 2022<br/>
- NEW: you can now specify the input property name from witch the node picks up the payload.</br>
- NEW: added more Homeassistant string compatibility values.</br>
- Updated the README</br>
</p>
<p>
<b>Version 1.0.53</b> June 2022<br/>

@@ -9,0 +15,0 @@ - NEW: Math Ultimate. The old "Sum" node, now has become a math node, you can peform multipication other than sum.</br>

{
"name": "node-red-contrib-boolean-logic-ultimate",
"version": "1.0.53",
"description": "A set of Node-RED enhanced boolean logic and utility nodes, flow interruption, blinker, invert, filter, toggle etc.., with persistent values after reboot. Compatible also with Homeassistant ON and OFF values.",
"version": "1.0.54",
"description": "A set of Node-RED enhanced boolean logic and utility nodes, flow interruption, blinker, invert, filter, toggle etc.., with persistent values after reboot. Compatible also with Homeassistant values.",
"author": "Supergiovane (https://github.com/Supergiovane)",

@@ -6,0 +6,0 @@ "dependencies": {

@@ -13,3 +13,3 @@ # node-red-contrib-boolean-logic-ultimate

A set of Node-RED enhanced boolean logic and utility nodes, with persistent values after reboot. Compatible also with Homeassistant ON and OFF values.
A set of Node-RED enhanced boolean logic and utility nodes, with persistent values after reboot. Compatible also with Homeassistant values.

@@ -25,2 +25,18 @@ <br/>

### COMPATIBLES INPUT VALUES
Other than true/false, all nodes accepts these strings and convert it to true/false. All nodes are compatible with Homeassistant output strings.
|Input|Translated into|
|--|--|
| "on" | true |
| "off" | false |
| "active" | true |
| "inactive" | false |
| "open" | true |
| "closed" | false |
<br/>
<br/>
# BOOLEAN LOGIC

@@ -58,47 +74,21 @@

You can also set the default values of the topic inputs.<br/>
The node can convert arbitrary input values to true/false. It supports Homeassistant ***"on"*** and ***"off"*** as well. For enabling auto conversion, please be sure to disable **Reject non boolean (true/false) input values** <br/>
The node can convert arbitrary input values to true/false. It supports Homeassistant string to boolean conversion as well. For enabling auto conversion, please be sure to disable **Reject non boolean (true/false) input values** <br/>
### CONFIGURATION
### NODE CONFIGURATION
|Property|Description|
|--|--|
| Inputs count | Set the number of different topics to be evaluated. The node will output a message to the flow, after this number of *different* topics arrives. *Remember: each input topic must be different. For example, if you set this field to 3, the node expects 3 different topics.* |
| Input | Set the property where the input payload is. *By default, it is "payload", but you can also specify other properties, for example "payload.value"* |
| Filter output | **Output both 'true' and 'false'** results: Standard behaviour, the node will output <b>true</b> and <b>false</b> whenever it receives an input and calculate the boolean logics as output. **Output only 'true'** results: whenever the node receives an input, it outputs a payload <b>true</b> only if the result of the logic is true. <b>False</b> results are filtered out. |
| Trigger mode | **All topics**: standard behaviour, the node will evaluate each input topic and ouputs the values. At each input change, it will output a msg on the flow. **Single topic + eval other inputs**: the node evaluates all the input topics, but only whenever it receives a msg input with the **specified topic**, it outputs a msg to the flow.|
| If input states are undefined | Every time you create a node or modify the node, all inputs are set to undefined. This means that the node will wait the arrive of all topics (for example 3 topics, if you've selected 3 topics in the option), before it can output a payload. This can be a problem if your logic must be operative as soon as you deploy the flow. To overcome this problem, you can "initialize" all the undefined inputs with True or False. **Leave undefined**: Standard behaviour, the node will wait all the "undefined" topics to arrive, then starts a flow with the result. **True or False**: The node is immediately operative, by force the initialization of the "undefined" inputs with "true" or "false".|
| Remember latest input values after reboot | If checked, the input values are retained after a node-red reboot. That means, that if you reboot your node-red, you don't need to wait all inputs to arrive and initialize the node, before the node can output a payload. Every time you modify the node's config, <b>the retained values are cleared</b>.|
| Reject non boolean (true/false) input values | If checked, the node will accept only boolean true/false values. Otherwise, it will try to convert the payload value to a logic true/false boolean. |
| Delay evaluation (ms) | Delays the evaluation until this time (in milliseconds) is elapsed. Each time a message or "topic trigger message" (see **Trigger mode**) arrives, the delay is restarted. This option is useful for debouncing pourposes or simply for adding some delay. For example, you can turn on a light if the room is occupied for a long time, allowing people to fast transit repeatedly, without the need of turning the light on. Another example, if you have many sensors changing state rapidly, you can wait until these sensor reach a quiet state, then evaluate the inputs.|
**Inputs count**
<br/>
Set the number of different topics to be evaluated. The node will output a message to the flow, after this number of *different* topics arrives.<br/>
*Remember: each input topic must be different. For example, if you set this field to 3, the node expects 3 different topics.*
**Filter output**
- Output both 'true' and 'false' results: Standard behaviour, the node will output <b>true</b> and <b>false</b> whenever it receives an input and calculate the boolean logics as output.
- Output only 'true' results: whenever the node receives an input, it outputs a payload <b>true</b> only if the result of the logic is true. <b>False</b> results are filtered out.
**Trigger mode**
- All topics: standard behaviour, the node will evaluate each input topic and ouputs the values. At each input change, it will output a msg on the flow.
- Single topic + eval other inputs: the node evaluates all the input topics, but only whenever it receives a msg input with the **specified topic**, it outputs a msg to the flow.
**If input states are undefined**
Every time you create a node or modify the node, all inputs are set to undefined. This means that the node will wait the arrive of all topics (for example 3 topics, if you've selected 3 topics in the option), before it can output a payload. This can be a problem if your logic must be operative as soon as you deploy the flow. To overcome this problem, you can "initialize" all the undefined inputs with True or False.
- Leave undefined: Standard behaviour, the node will wait all the "undefined" topics to arrive, then starts a flow with the result.
- True or False: The node is immediately operative, by force the initialization of the "undefined" inputs with "true" or "false".
**Remember latest input values after reboot**
If checked, the input values are retained after a node-red reboot. That means, that if you reboot your node-red, you don't need to wait all inputs to arrive and initialize the node, before the node can output a payload.<br/>
Every time you modify the node's config, <b>the retained values are cleared</b>.<br/>
**Reject non boolean (true/false) input values**
If checked, the node will accept only boolean true/false values. Otherwise, it will try to convert the payload to a logic value true/false (including "on" and "off" values, sent, for example, from HomeAssistant).<br/>
**Delay evaluation (ms)**
Delays the evaluation until this time (in milliseconds) is elapsed. Each time a message or "topic trigger message" (see **Trigger mode**) arrives, the delay is restarted.<br/>
This option is useful for debouncing pourposes or simply for adding some delay.<br/>
For example, you can turn on a light if the room is occupied for a long time, allowing people to fast transit repeatedly, without the need of turning the light on.<br/>
Another example, if you have many sensors changing state rapidly, you can wait until these sensor reach a quiet state, then evaluate the inputs.<br/>
**INPUT MSG TO THE NODE**

@@ -121,14 +111,18 @@

**Trigger by topic**
### NODE CONFIGURATION
Whenever the node receives a payload = false from this topic,it stops output messages to the flow.<br/>
As soon it receives payload = true from this topic, the output messages start to flow out again. <br/>
The node will output the current stored message plus an added property "isReplay = true", as soon as it receives a ***msg.play = true*** from this topic.<br/>
The node will clear the current stored message, as soon as it receives a ***msg.reset = true*** from this topic.<br/>
The node tries to convert any arbitrary input value to a valid boolean value. It converts Homeassistant ***"on"*** and ***"off"*** to true/false values as well.<br/>
|Property|Description|
|--|--|
| Trigger by topic | Whenever the node receives a payload = false from this topic,it stops output messages to the flow. As soon it receives payload = true from this topic, the output messages start to flow out again. The node will output the current stored message plus an added property "isReplay = true", as soon as it receives a ***msg.play = true*** from this topic. The node will clear the current stored message, as soon as it receives a ***msg.reset = true*** from this topic. |
| With Input | Set the property where the input payload is. *By default, it is "payload", but you can also specify other properties, for example "payload.value"* |
| Then | This property, allow you to auto toggle the selected start state (pass or block) after a timer has elapsed. You can choose from some pre-defined delays. If you have, for example, an Homekit-Bridged nodeset with a thermostat node or security system node in your flow, once node-red restarts, these homekit nodes output a default message to the flow. Just put an InterruptFlow node with a "block at start" behaviour and a toggle delay enabled behind homekit nodes, to temporary stop the chained nodes to receive the unwanted startup message.|
**Then**
This property, allow you to auto toggle the selected start state (pass or block) after a timer has elapsed. You can choose from some pre-defined delays. If you have, for example, an Homekit-Bridged nodeset with a thermostat node or security system node in your flow, once node-red restarts, these homekit nodes output a default message to the flow. Just put an InterruptFlow node with a "block at start" behaviour and a toggle delay enabled behind homekit nodes, to temporary stop the chained nodes to receive the unwanted startup message.</br>
</br>
<br/>
**INPUT MSG WITH "TRIGGER" TOPIC**

@@ -190,5 +184,12 @@

The input message is preserved and passed to the output pin, changing only the topic and the payload. If the input message has it's own topic, it'll be preserved as well.<br/>
The node tries to convert any arbitrary input value to a valid boolean value. It converts Homeassistant ***"on"*** and ***"off"*** to true/false values as well.<br/>
### NODE CONFIGURATION
|Property|Description|
|--|--|
| Input | Set the property where the input payload is. *By default, it is "payload", but you can also specify other properties, for example "payload.value"* |
<br/>
<br/>

@@ -198,2 +199,3 @@ <br/>

<br/>
<br/>

@@ -206,5 +208,12 @@ # FILTER ULTIMATE

The input message is preserved and passed to the output pin, changing only the topic and the payload. If the input message has it's own topic, it'll be preserved as well.<br/>
The node tries to convert any arbitrary input value to a valid boolean value. It converts Homeassistant ***"on"*** and ***"off"*** to true/false values as well.<br/>
### NODE CONFIGURATION
|Property|Description|
|--|--|
| Input | Set the property where the input payload is. *By default, it is "payload", but you can also specify other properties, for example "payload.value"* |
<br/>
<br/>

@@ -214,2 +223,3 @@ <br/>

<br/>
<br/>

@@ -223,2 +233,11 @@ # BLINKER ULTIMATE

### NODE CONFIGURATION
|Property|Description|
|--|--|
| Input | Set the property where the input payload is. *By default, it is "payload", but you can also specify other properties, for example "payload.value"* |
<br/>
Pass <code>msg.payload = true</code> to start blinking</br>

@@ -251,2 +270,11 @@ Pass <code>msg.payload = false</code> to stop blinking</br>

### NODE CONFIGURATION
|Property|Description|
|--|--|
| Input | Set the property where the input payload is. *By default, it is "payload", but you can also specify other properties, for example "payload.value"* |
<br/>
<img src='https://raw.githubusercontent.com/Supergiovane/node-red-contrib-boolean-logic-ultimate/master/img/SimpleOutput.png' width='60%'>

@@ -317,2 +345,11 @@

### NODE CONFIGURATION
|Property|Description|
|--|--|
| Input | Set the property where the input payload is. *By default, it is "payload", but you can also specify other properties, for example "payload.value"* |
<br/>
**Avaiable Commands**<br />

@@ -346,2 +383,3 @@ Commands are to be wrote in the format: command:value. For example ***send:200***, ***wait:2000***. Each row represents a command.<br />

<img src='https://raw.githubusercontent.com/Supergiovane/node-red-contrib-boolean-logic-ultimate/master/img/sum.png' width='60%'>

@@ -354,2 +392,11 @@ <details><summary>CLICK HERE, copy and paste it into your flow</summary>

### NODE CONFIGURATION
|Property|Description|
|--|--|
| Input | Set the property where the input payload is. *By default, it is "payload", but you can also specify other properties, for example "payload.value"* |
<br/>
**INPUT**<br />

@@ -381,5 +428,13 @@

The pourpose of this node is to toggle between true/false the payload of every incoming message.<br />
The pourpose of this node is to toggle between true/false, everytime an inboud message arrives.<br />
### NODE CONFIGURATION
|Property|Description|
|--|--|
| Input | Set the property where the input payload is. *By default, it is "payload", but you can also specify other properties, for example "payload.value"* |
<br/>
**INPUT**<br />

@@ -401,9 +456,14 @@

**Switcher topic**
### NODE CONFIGURATION
Whenever the node receives a payload from this **topic**, it switches the input messages to an output PIN.<br/>
|Property|Description|
|--|--|
| Switcher topic | Whenever the node receives a payload from this **topic**, it switches the input messages to an output PIN. |
| With Input | Set the property where the input payload is. *By default, it is "payload", but you can also specify other properties, for example "payload.value"* |
| Then | This property, allow you to auto toggle the selected start state after some time. |
**Then**
This property, allow you to auto toggle the selected start state after some time.</br>
<br/>
</br>
</br>

@@ -410,0 +470,0 @@ **INPUT MSG WITH "TRIGGER" TOPIC**

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc