@keload/node-red-contrib-ultimate-toolkit
Version:
A collection of (moderns) useful tools for Node-RED
17 lines (16 loc) • 21.5 kB
HTML
<script type="text/html" data-template-name="main"><div class="keload-node-red-contrib-ultimate-toolkit"><div id="keload-node-red-contrib-ultimate-toolkit-main"><div class="dxp-template-form-row"><label for="node-input-name"><i class="fa fa-tag"></i><span data-i18n="main.name;[title]main.name" title="Name">Name</span></label><div class="content"><input type="text" id="node-input-name" data-i18n="[placeholder]main.name-placeholder" placeholder=""></div></div><div class="dxp-template-form-row"><label for="node-input-entry"><i class="fa fa-arrow-circle-o-right"></i><span data-i18n="main.entry;[title]main.entry" title="Input Data">Input Data</span></label><div class="content"><input type="text" id="node-input-entry" data-i18n="[placeholder]main.entry-placeholder" placeholder=""><input type="hidden" id="node-input-entryType"></div></div><div class="dxp-template-form-row"><label for="node-input-category"><i class="fa fa-list-alt"></i><span data-i18n="main.category;[title]main.category" title="Category">Category</span></label><div class="content"><select id="node-input-category"></select></div></div><div class="dxp-template-form-row"><label for="node-input-function"><i class="fa fa-code"></i><span data-i18n="main.function;[title]main.function" title="Function">Function</span></label><div class="content"><select id="node-input-function"></select></div></div><div class="dxp-template-form-row extra-field additionalMainValue"><label for="node-input-mainValue"><i class="fa fa-plus"></i><span data-i18n="main.mainValue;[title]main.mainValue" title="Value">Value</span></label><div class="content"><input type="text" id="node-input-mainValue" data-i18n="[placeholder]main.mainValue-placeholder" placeholder=""></div></div><div class="dxp-template-form-row extra-field inverseReturnValue"><label for="node-input-inverseReturnValue"><i class="fa fa-arrow-circle-o-right"></i><span data-i18n="main.inverseReturnValue;[title]main.inverseReturnValue" title="Inverse">Inverse</span></label><div class="content"><div class="checkbox"><input type="checkbox" id="node-input-inverseReturnValue"><span class="italic">Inverse the return value (not) of condition</span></div></div></div><div class="dxp-template-form-row extra-field splitBooleanOutputs"><label for="node-input-splitBooleanOutputs"><i class="fa fa-map-signs"></i><span data-i18n="main.splitBooleanOutputs;[title]main.splitBooleanOutputs" title="Split out">Split out</span></label><div class="content"><div class="checkbox"><input type="checkbox" id="node-input-splitBooleanOutputs"><span class="italic">Split outputs in two distinct boolean</span></div></div></div><div class="extra-field dateUtilities_now"><div class="dxp-template-form-row"><label for="node-input-dateUtilities-nowFormat">Format</label><div class="content"><select id="node-input-dateUtilities-nowFormat"><option value="timestamp" selected="selected">timestamp</option><option value="iso8601">iso8601</option><option value="utcString">utcString</option><option value="full">full</option><option value="long">long</option><option value="medium">medium</option><option value="short">short</option></select></div></div><div class="dxp-template-form-row"><label for="node-input-dateUtilities-nowFormatToken"><span data-i18n="main.dateUtilities-nowFormatToken;[title]main.dateUtilities-nowFormatToken" title="Token">Token</span></label><div class="content"><input type="text" id="node-input-dateUtilities-nowFormatToken" data-i18n="[placeholder]main.dateUtilities-nowFormatToken-placeholder" placeholder="YYYY-MM-DD"></div></div></div><div class="extra-field dateUtilities_timeRange"><div class="dxp-template-form-row"><label for="node-input-dateUtilities-rangeStartTime"><i class="fa fa-clock-o"></i><span data-i18n="main.dateUtilities-rangeStartTime;[title]main.dateUtilities-rangeStartTime" title="Start time">Start time</span></label><div class="content"><input type="time" id="node-input-dateUtilities-rangeStartTime" data-i18n="[placeholder]main.dateUtilities-rangeStartTime-placeholder" placeholder=""></div></div><div class="dxp-template-form-row"><label for="node-input-dateUtilities-rangeEndTime"><i class="fa fa-clock-o"></i><span data-i18n="main.dateUtilities-rangeEndTime;[title]main.dateUtilities-rangeEndTime" title="End time">End time</span></label><div class="content"><input type="time" id="node-input-dateUtilities-rangeEndTime" data-i18n="[placeholder]main.dateUtilities-rangeEndTime-placeholder" placeholder=""></div></div></div><div class="extra-field tools_cyclicCounter"><div class="dxp-template-form-row"><label for="node-input-tools-cyclicCounter-maxCount"><i class="fa fa-sort-numeric-asc"></i><span data-i18n="main.tools-cyclicCounter-maxCount;[title]main.tools-cyclicCounter-maxCount" title="Max count">Max count</span></label><div class="content"><input type="number" id="node-input-tools-cyclicCounter-maxCount" data-i18n="[placeholder]main.tools-cyclicCounter-maxCount-placeholder" placeholder=""></div></div><div class="dxp-template-form-row"><label for="node-input-tools-cyclicCounter-resetDelay"><i class="fa fa-clock-o"></i><span data-i18n="main.tools-cyclicCounter-resetDelay;[title]main.tools-cyclicCounter-resetDelay" title="Reset delay">Reset delay</span></label><div class="content"><input type="number" id="node-input-tools-cyclicCounter-resetDelay" data-i18n="[placeholder]main.tools-cyclicCounter-resetDelay-placeholder" placeholder=""><div class="hint max-w-[350px]">Number in ms - Default 0: no reset</div></div></div></div><div class="alert alert-info fn-docs extra-field text-center"></div></div></div></script>
<style>.keload-node-red-contrib-ultimate-toolkit{.\!block{display:block}.block{display:block}.\!hidden{display:none}.hidden{display:none}.max-w-\[350px\]{max-width:350px}.text-center{text-align:center}.\!font-bold{font-weight:700}.font-bold{font-weight:700}.italic{font-style:italic}.alert{border-radius:.5rem;font-size:.875rem;line-height:1.25rem;margin-bottom:1rem;padding:1rem}.alert-info{--tw-bg-opacity:1;background-color:rgb(239 246 255/var(--tw-bg-opacity,1));--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}.dxp-template-form-row{align-items:flex-start;display:flex;margin-bottom:1rem;label{flex:none;margin-right:1rem;overflow:hidden;padding-bottom:.375rem;padding-top:.375rem;position:relative;text-overflow:ellipsis;white-space:nowrap;width:100px}label{i{margin-right:.25rem}}.content{flex:1 1 0%}.content{.red-ui-typedInput-container,input,select,textarea{width:100%}.red-ui-typedInput-container{border:1px solid var(--red-ui-form-input-border-color);.red-ui-typedInput-type-select{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.red-ui-typedInput-type-select{.red-ui-typedInput-type-label{display:inline}.red-ui-typedInput-icon{margin-left:5px}}.red-ui-typedInput-option-trigger{.red-ui-typedInput-option-label{background-color:transparent;margin-top:.5rem}}}div.checkbox{margin-top:.35rem}div.checkbox{input[type=checkbox]{width:auto}}&.force-w-full{>div{width:100%}}}.hint{font-size:.875rem;line-height:1.25rem;margin-top:.25rem;--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity,1))}.hint{&.hint-info{--tw-text-opacity:1;color:rgb(30 64 175/var(--tw-text-opacity,1))}&.hint-danger{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity,1))}&.hint-success{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity,1))}&.hint-warning{--tw-text-opacity:1;color:rgb(133 77 14/var(--tw-text-opacity,1))}}}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: } /*
! tailwindcss v3.4.18 | MIT License | https://tailwindcss.com
*/*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{color:inherit;font-family:inherit;font-feature-settings:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;letter-spacing:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#9ca3af;opacity:1}input::placeholder,textarea::placeholder{color:#9ca3af;opacity:1}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]:where(:not([hidden=until-found])){display:none}}</style>
<script type="application/javascript">(()=>{var N=Object.defineProperty,_=Object.defineProperties;var T=Object.getOwnPropertyDescriptors;var V=Object.getOwnPropertySymbols;var j=Object.prototype.hasOwnProperty,U=Object.prototype.propertyIsEnumerable;var k=(e,t,n)=>t in e?N(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,S=(e,t)=>{for(var n in t||(t={}))j.call(t,n)&&k(e,n,t[n]);if(V)for(var n of V(t))U.call(t,n)&&k(e,n,t[n]);return e},x=(e,t)=>_(e,T(t));function L(e){let t=e.startsWith("$"),n=e.startsWith("$$"),o=e.startsWith("#node-config-input")||e.startsWith("#node-input");return{isNodeIdShortcut:t,isNodeConfigIdShortcut:n,isFullSelector:o,value:t||n||o}}function l(e){let t=L(e);return t.isNodeConfigIdShortcut?`#node-config-input-${e.replace("$$","")}`:t.isNodeIdShortcut?`#node-input-${e.replace("$","")}`:e}function m(e,t,n){let o=l(e),r=t;n!=null&&n.emptyValue&&(r=[{value:"",text:n.emptyValue},...t]),$(o).empty().append(r.map(i=>$("<option>",{value:i.value,text:i.text,selected:i.value===(n==null?void 0:n.selected)})))}function R(e){s(e.selector).typedInput({types:e.types,typeField:l(`${e.selector}Type`)})}function g(e,t,n={additionalEvents:[]}){let o=(Array.isArray(e)?e:[e]).map(l).join(", "),r=["input",...n.additionalEvents];$(o).on(r.join(" "),()=>{t($(o).map(function(){return $(this).val()}).get())})}function s(e){let t=l(e);return $(t)}function w(e){let t=l(e);return document.querySelector(t).checked}function h(e){let t={};return document.querySelectorAll(`[id^="node-input-${e}-"]`).forEach(n=>{let o=n,r=o.id.replace(`node-input-${e}-`,"");o.type==="checkbox"?t[r]=o.checked:t[r]=o.value}),t}function b(e,t){t&&Object.entries(t).forEach(([n,o])=>{let r=document.querySelector(`#node-input-${e}-${n}`);r&&(r.type==="checkbox"?r.checked=!!o:r.value=String(o))})}var d=(e,t,n="asc")=>{if(!e)return[];let o=(i,u)=>`${t(i)}`.localeCompare(t(u)),r=(i,u)=>`${t(u)}`.localeCompare(t(i));return e.slice().sort(n==="desc"?r:o)};var O=e=>{if(!e||e.length===0)return"";let t=e.toLowerCase();return t.substring(0,1).toUpperCase()+t.substring(1,t.length)};var c=e=>e?e.split(/(?=[A-Z])|[\.\-\s_]/).map(t=>t.trim()).filter(t=>!!t).map(t=>O(t.toLowerCase())).join(" "):"";function v(e){return e!=null?e:""}function f(e){return`
\u{1F4D6} <a href="https://radash-docs.vercel.app/docs/${e}" target="_blank">View documentation on <span class="font-bold">Radash</span> <i class="fa fa-external-link"></a></i>
`}function a(e){return`
\u{1F4D6} <a href="https://es-toolkit.slash.page/reference/${e}.html" target="_blank">View documentation on <span class="font-bold">ES Toolkit</span> <i class="fa fa-external-link"></a></i>
`}var p={array_utilities:{toggle:{docs:f("array/toggle")},shuffle:{docs:a("array/shuffle")},groupBy:{mainValue:{label:"Property"},docs:a("array/groupBy")},keyBy:{mainValue:{label:"Property"},docs:a("array/keyBy")},unique:{mainValue:{label:"Property"},docs:f("array/unique")},take:{mainValue:{label:"Count"},docs:a("array/take")},takeRight:{mainValue:{label:"Count"},docs:a("array/takeRight")},getRandomItem:{docs:"Get a random item from input array"}},date_utilities:{now:{description:"Returns the current date with lot of formatting options",docs:"If token is provided, <code>Format</code> will not be used",revealClasses:["dateUtilities_now"],configArgs:"dateUtilities"},format:{description:"Return formatted date from a date",docs:"If token is provided, <code>Format</code> will not be used",revealClasses:["dateUtilities_now"],configArgs:"dateUtilities"},timeRange:{description:"Routes messages depending on the time",docs:"Time range checker that validates if current time is<br>between given start and end times (HH:mm format).",revealClasses:["dateUtilities_timeRange"],configArgs:"dateUtilities",forceSplitBooleanOutputs:!0},currentTimezone:{description:"Returns the current timezone"}},string_utilities:{camelCase:{},capitalize:{},constantCase:{},escape:{},kebabCase:{},lowerCase:{},lowerFirst:{},pascalCase:{},snakeCase:{},startCase:{},trim:{},trimEnd:{},trimStart:{},unescape:{},upperCase:{},upperFirst:{},words:{}},utility_functions:{toNumber:{},toNumberNonStrict:{label:"toNumber (non-strict)",docs:"If the value is not a number, it will return the original value"},toString:{},toSafeInteger:{},toBoolean:{},toBooleanNumber:{},gt:{mainValue:{},canSplitBooleanOutputs:!0,inverseReturnValue:!0},gte:{mainValue:{},canSplitBooleanOutputs:!0,inverseReturnValue:!0},lt:{mainValue:{},canSplitBooleanOutputs:!0,inverseReturnValue:!0},lte:{mainValue:{},canSplitBooleanOutputs:!0,inverseReturnValue:!0},eq:{mainValue:{},canSplitBooleanOutputs:!0,inverseReturnValue:!0},size:{docs:"Returns the size of an array, string, or object."}},predicates:{isBoolean:{canSplitBooleanOutputs:!0,inverseReturnValue:!0},isNaN:{label:"Is NaN",canSplitBooleanOutputs:!0,inverseReturnValue:!0},isNil:{canSplitBooleanOutputs:!0,inverseReturnValue:!0},isNull:{canSplitBooleanOutputs:!0,inverseReturnValue:!0},isNumber:{canSplitBooleanOutputs:!0,inverseReturnValue:!0},isString:{canSplitBooleanOutputs:!0,inverseReturnValue:!0},isUndefined:{canSplitBooleanOutputs:!0,inverseReturnValue:!0},isIp:{canSplitBooleanOutputs:!0,inverseReturnValue:!0},isUrl:{canSplitBooleanOutputs:!0,inverseReturnValue:!0},isBuffer:{canSplitBooleanOutputs:!0,inverseReturnValue:!0}},object_utilities:{getKeys:{docs:f("object/keys")}},network_utilities:{ipInformation:{description:"Fetches detailed information about an IP address",docs:"By default is your current IP address"},ipVersion:{description:"Returns IP version (4, 6, or 0 if invalid) for a given IP address string"},networkInterfaces:{description:"Lists all network interfaces of the current machine (ethernet, wifi, etc.)"}},math_utilities:{abs:{},acos:{},asin:{},atan:{},ceil:{},cos:{},exp:{},floor:{},log:{},max:{},mean:{},min:{},median:{},random:{},round:{},sin:{},sum:{docs:a("math/sum")},tan:{},trunc:{}},async_utilities:{delay:{description:"Delays the message by the specified amount of time",mainValue:{label:"Milliseconds"}}},tools:{cyclicCounter:{description:"A customizable cyclic counter node for Node-RED that iterates through a defined sequence of numbers and can reset after a set timeout. It allows flexible control over the counter's behavior, making it useful in a variety of automation scenarios.",revealClasses:["tools_cyclicCounter"],configArgs:"tools",addNodeIdToConfigArgs:!0}}};var A=d(Object.keys(p),e=>e);function B(e){let t=Object.keys(p[e]).map(n=>{var r;let o=p[e][n];return{key:n,label:o.label||c(n),enabled:(r=o==null?void 0:o.enabled)!=null?r:!0}}).filter(n=>n.enabled);return d(t,n=>n.label)}function y(e,t){var r,i;let n=(i=(r=p)==null?void 0:r[e])==null?void 0:i[t],o=`
${v(n==null?void 0:n.description)}
<br><br>
${v(n==null?void 0:n.docs)}
`.trim();return x(S({},n),{nodeDocs:o})}var P={category:"toolkit",color:"#8EA3A6",paletteLabel:"toolkit",defaults:{name:{value:""},entry:{value:"payload",required:!0},entryType:{value:"msg",required:!0},category:{value:"",required:!0},function:{value:"",required:!0},mainValue:{value:""},splitBooleanOutputs:{value:!1},inverseReturnValue:{value:!1},dateUtilities:{value:{}},tools:{value:{}},outputs:{value:1}},inputs:1,outputs:1,outputLabels:function(e){return this.outputs>1?e===0?"True":"False":null},icon:"font-awesome/fa-wrench",label:function(){return this.name||`${this.inverseReturnValue?"!":""}${this.function}`||"toolkit"},oneditsave:function(){let{forceSplitBooleanOutputs:e=!1}=y(s("$category").val(),s("$function").val());this.outputs=w("$splitBooleanOutputs")||e?2:1,this.dateUtilities=h("dateUtilities"),this.tools=h("tools")},oneditprepare:function(){b("dateUtilities",this.dateUtilities),b("tools",this.tools),R({selector:"$entry",types:["msg","flow","global","str","json","jsonata","env"]}),m("$category",A.map(n=>({value:n,text:c(n)})),{selected:this.category,emptyValue:" "});function e(n,o){let r=n?B(n):[];m("$function",r.map(({key:i,label:u})=>({value:i,text:u})),{selected:o,emptyValue:" "})}function t(n,o){var C;let r=y(n,o);s(".extra-field").addClass("!hidden");let i=r==null?void 0:r.nodeDocs;i.replace(/(<br>|\n)/g,"").trim()&&s(".fn-docs").html(i.replace(/^(<br\s*\/?>|\n)+|(<br\s*\/?>|\n)+$/g,"")).removeClass("!hidden"),!!(r!=null&&r.mainValue)&&(s(".additionalMainValue").removeClass("!hidden"),(C=r==null?void 0:r.mainValue)!=null&&C.label&&s(".additionalMainValue label").text(r.mainValue.label)),!!(r!=null&&r.canSplitBooleanOutputs)?s(".splitBooleanOutputs").removeClass("!hidden"):s("$splitBooleanOutputs").prop("checked",!1),!!(r!=null&&r.inverseReturnValue)?s(".inverseReturnValue").removeClass("!hidden"):s("$inverseReturnValue").prop("checked",!1);let F=((r==null?void 0:r.revealClasses)||[]).map(E=>`.${E}`).join(",");$(F).removeClass("!hidden")}e(this.category,this.function),t(this.category,this.function),g(["$category"],([n])=>{t(n,this.function),e(n)}),g(["$function"],([n])=>{t(s("$category").val(),n)})}},I=P;window.RED.nodes.registerType("main",I);})();</script>
<script type="text/markdown" data-help-name="main">
A collection of utilities to help you build your Node-RED flows.
</script>